Attribute VB_Name = "TafqitLib"
'==============================================================================
' InstaWords (tafqit) - numbers to words in Arabic, English and French, for
' Excel. MIT License. https://github.com/sarmadiq9090-coder/tafket
'
' GENERATED by scripts/build-vba.mjs from vba/Tafqit.template.bas, src/lexicon.ts,
' src/lang/en.ts, src/lang/fr.ts, src/errors.ts and data/units.json (106 units).
' Do not edit: edit the template or the sources and run "npm run build:vba".
' Source hash: adc752d67160
'
' Worksheet functions (see vba/README.md):
'   =TAFQIT(Number, [Unit], [HundredsForm], [Prefix], [Suffix], [Decimals], [Language])
'   =TAFQIT_CLEAN(Number)
'
' Port of the TypeScript core (src/engine.ts, src/lang/*.ts, src/normalize.ts,
' src/catalog.ts, src/index.ts); rules in docs/SPEC.md. Output must match the
' core character for character. Text that is not printable ASCII is stored as
' UTF-16 code units (U("0627 ...")) and decoded at run time, so this file stays
' pure ASCII for the VBA editor.
'
' Notes
' - The module is named TafqitLib, not Tafqit: Excel returns #NAME? when a
'   worksheet function has the same name as its module.
' - Amounts are processed as text only; Long is used for 3-digit groups.
' - A numeric cell (Double) is converted with CDec, which keeps 15 significant
'   digits (what Excel displays). Enter long amounts as text for exactness.
' - On error the function returns the Arabic message of ERROR_MESSAGES in
'   src/errors.ts (in every language), without the "(detail)" suffix of the core.
' - Plain arrays only (no Scripting.Dictionary), so it also runs on Excel for Mac.
'
' Keep this code within the VBA subset understood by tests/vba/harness/vba.mjs.
'==============================================================================
Option Explicit

' Languages (src/lang/index.ts): index into the per-language arrays.
Private Const LANG_AR As Long = 0
Private Const LANG_EN As Long = 1
Private Const LANG_FR As Long = 2
Private Const LANG_COUNT As Long = 3

' Index of the Arabic scale forms in mScale(k, f).
Private Const SC_SINGULAR As Long = 0
Private Const SC_DUAL As Long = 1
Private Const SC_PLURAL As Long = 2
Private Const SC_ACCUSATIVE As Long = 3

' Fraction digits accepted with the "none" unit (engine.ts).
Private Const MAX_FRACTION_DIGITS_NONE As Long = 15

' Error codes E_* (src/errors.ts), MAX_INTEGER_DIGITS, UNIT_COUNT, KEY_COUNT:
Private Const E_EMPTY As Long = 1
Private Const E_INVALID_FORMAT As Long = 2
Private Const E_NEGATIVE As Long = 3
Private Const E_TOO_LARGE As Long = 4
Private Const E_TOO_MANY_DECIMALS As Long = 5
Private Const E_FRACTION_NOT_SUPPORTED As Long = 6
Private Const E_UNKNOWN_UNIT As Long = 7
Private Const E_INVALID_OPTION As Long = 8
Private Const E_INVALID_CATALOG As Long = 9
Private Const E_NO_LANGUAGE_FORMS As Long = 10
Private Const ERROR_COUNT As Long = 10
Private Const MAX_INTEGER_DIGITS As Long = 15
Private Const UNIT_COUNT As Long = 106
Private Const KEY_COUNT As Long = 295

Private mReady As Boolean
Private mErr As Long
Private mErrMsg(1 To ERROR_COUNT) As String
Private mLangId(0 To 2) As String
Private mJoiner(0 To 2) As String

' Arabic (src/lexicon.ts). Gender index: 0 = m, 1 = f. Hundreds form: 0 = first, 1 = second.
Private mZero As String
Private mWaw As String
Private mPoint As String
Private mOnes(0 To 1, 0 To 10) As String
Private mTeens(0 To 1, 0 To 9) As String
Private mComp(0 To 1, 0 To 10) As String
Private mTens(0 To 9) As String
Private mHund(0 To 1, 0 To 9) As String
Private mHundDC(0 To 1) As String
Private mHfName(0 To 1) As String
Private mScale(1 To 4, 0 To 3) As String

' English (EN_WORDS in src/lang/en.ts).
Private mEnSmall(0 To 19) As String
Private mEnTens(0 To 9) As String
Private mEnScale(0 To 4) As String
Private mEnHundred As String
Private mEnPoint As String
Private mEnHyphen As String

' French (FR_WORDS in src/lang/fr.ts).
Private mFrSmall(0 To 19) As String
Private mFrTens(0 To 6) As String
Private mFrScale(0 To 4) As String
Private mFrFourTwenty As String
Private mFrCent As String
Private mFrMille As String
Private mFrPoint As String
Private mFrEt As String
Private mFrHyphen As String
Private mFrPluralS As String
Private mFrOneF As String
Private mFrDe As String
Private mFrDeElided As String

' Unit catalog (data/units.json), units 1..UNIT_COUNT. (unit, language) arrays hold the
' forms of each language: Arabic from "forms", English/French from "i18n".
Private mUId() As String
Private mUHasForms() As Boolean
Private mFHas() As Boolean
Private mFSing() As String
Private mFPlur() As String
Private mFOne() As String
Private mFGender() As Long
Private mFDual() As String
Private mFAcc() As String
' Subunit: same layout, plus the number of fraction digits it takes.
Private mUHasSub() As Boolean
Private mUSubDigits() As Long
Private mSHas() As Boolean
Private mSSing() As String
Private mSPlur() As String
Private mSOne() As String
Private mSGender() As Long
Private mSDual() As String
Private mSAcc() As String
' Lookup names (unitKey of id, code, label and aliases) -> unit index.
Private mKeyCount As Long
Private mKeyName() As String
Private mKeyUnit() As Long

'==============================================================================
' Public worksheet functions
'==============================================================================

' Number: a cell, text or number. Unit: id, code, label or alias (default "none").
' HundredsForm: the spelling of 100 in Arabic (default, or "1"/"2"). Prefix / Suffix: free text.
' Decimals: "round" (default, half-up to the subunit) or "error".
' Language: "ar" (default), "en" or "fr".
Public Function TAFQIT(ByVal Number As Variant, Optional ByVal Unit As Variant = "none", _
        Optional ByVal HundredsForm As Variant = "", Optional ByVal Prefix As Variant = "", _
        Optional ByVal Suffix As Variant = "", Optional ByVal Decimals As Variant = "", _
        Optional ByVal Language As Variant = "") As Variant
    Dim vNum As Variant, vUnit As Variant, vHf As Variant
    Dim vPre As Variant, vSuf As Variant, vDec As Variant, vLang As Variant
    Dim ui As Long, hf As Long, lang As Long, code As Long, roundIt As Boolean
    Dim txt As String, ip As String, fp As String, words As String, decText As String

    EnsureInit
    vNum = ArgValue(Number)
    vUnit = ArgValue(Unit)
    vHf = ArgValue(HundredsForm)
    vPre = ArgValue(Prefix)
    vSuf = ArgValue(Suffix)
    vDec = ArgValue(Decimals)
    vLang = ArgValue(Language)
    If IsCellError(vNum) Then
        TAFQIT = vNum
        Exit Function
    End If
    If IsCellError(vUnit) Then
        TAFQIT = vUnit
        Exit Function
    End If
    If IsCellError(vHf) Then
        TAFQIT = vHf
        Exit Function
    End If
    If IsCellError(vPre) Then
        TAFQIT = vPre
        Exit Function
    End If
    If IsCellError(vSuf) Then
        TAFQIT = vSuf
        Exit Function
    End If
    If IsCellError(vDec) Then
        TAFQIT = vDec
        Exit Function
    End If
    If IsCellError(vLang) Then
        TAFQIT = vLang
        Exit Function
    End If

    ' Same order of checks as tafqit() in src/index.ts.
    lang = ResolveLanguage(ArgText(vLang))
    If lang < 0 Then
        TAFQIT = mErrMsg(E_INVALID_OPTION)
        Exit Function
    End If
    ui = FindUnit(ArgText(vUnit))
    If ui = 0 Then
        TAFQIT = mErrMsg(E_UNKNOWN_UNIT)
        Exit Function
    End If
    ' Validated for every language, but only Arabic uses it.
    hf = ResolveHundreds(ArgText(vHf))
    If hf < 0 Then
        TAFQIT = mErrMsg(E_INVALID_OPTION)
        Exit Function
    End If
    code = NumberText(vNum, txt)
    If code = 0 Then code = NormalizeNumber(txt, ip, fp)
    If code <> 0 Then
        TAFQIT = mErrMsg(code)
        Exit Function
    End If
    decText = LowerKey(JsTrim(ArgText(vDec)))
    If decText = "" Or decText = "round" Then
        roundIt = True
    ElseIf decText = "error" Then
        roundIt = False
    Else
        TAFQIT = mErrMsg(E_INVALID_OPTION)
        Exit Function
    End If

    words = Phrase(ui, ip, fp, hf, roundIt, lang)
    If mErr <> 0 Then
        TAFQIT = mErrMsg(mErr)
        Exit Function
    End If
    TAFQIT = JoinParts(JoinParts(JsTrim(ArgText(vPre)), words, " "), JsTrim(ArgText(vSuf)), " ")
End Function

' The number after cleaning (SPEC section 1), e.g. "123.45" for Arabic-Indic input.
Public Function TAFQIT_CLEAN(ByVal Number As Variant) As Variant
    Dim vNum As Variant, code As Long, txt As String, ip As String, fp As String
    EnsureInit
    vNum = ArgValue(Number)
    If IsCellError(vNum) Then
        TAFQIT_CLEAN = vNum
        Exit Function
    End If
    code = NumberText(vNum, txt)
    If code = 0 Then code = NormalizeNumber(txt, ip, fp)
    If code <> 0 Then
        TAFQIT_CLEAN = mErrMsg(code)
    ElseIf fp = "" Then
        TAFQIT_CLEAN = ip
    Else
        TAFQIT_CLEAN = ip & "." & fp
    End If
End Function

'==============================================================================
' Arguments
'==============================================================================

' A cell reference arrives as a Range object: use the value of its first cell.
Private Function ArgValue(ByVal v As Variant) As Variant
    If IsObject(v) Then
        ArgValue = v.Cells(1, 1).Value2
    Else
        ArgValue = v
    End If
End Function

' True for cell errors such as #N/A (they are returned unchanged); False for missing arguments.
Private Function IsCellError(ByVal v As Variant) As Boolean
    If IsError(v) Then
        IsCellError = Not IsMissing(v)
    Else
        IsCellError = False
    End If
End Function

' Text of an option argument. Numbers are converted without the locale (Str, not CStr).
Private Function ArgText(ByVal v As Variant) As String
    Select Case VarType(v)
    Case vbString
        ArgText = v
    Case vbBoolean
        If v Then
            ArgText = "TRUE"
        Else
            ArgText = "FALSE"
        End If
    Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbDecimal, vbByte, 20
        ' 20 = vbLongLong (64-bit Office only).
        ArgText = Trim(Str(CDec(v)))
    Case Else
        ' Empty cell, missing argument, Null.
        ArgText = ""
    End Select
End Function

' Text of the Number argument. Returns an error code (0 = ok).
Private Function NumberText(ByVal v As Variant, ByRef txt As String) As Long
    txt = ""
    NumberText = 0
    Select Case VarType(v)
    Case vbString
        txt = v
    Case vbEmpty, vbNull
        txt = ""
    Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbDecimal, vbByte, 20
        If v < 0 Then
            NumberText = E_NEGATIVE
        ElseIf v >= 1E+15 Then
            ' 16 or more integer digits (also keeps CDec from overflowing).
            NumberText = E_TOO_LARGE
        Else
            ' CDec keeps 15 significant digits of a Double; Str always uses "." as the
            ' decimal point (CStr would follow the regional settings).
            txt = Trim(Str(CDec(v)))
        End If
    Case Else
        ' Boolean, Date and anything else.
        NumberText = E_INVALID_FORMAT
    End Select
End Function

' 0 or 1 for the two hundreds forms (src/lexicon.ts HUNDREDS); -1 when invalid.
Private Function ResolveHundreds(ByVal s As String) As Long
    If s = "" Or s = "1" Then
        ResolveHundreds = 0
    ElseIf s = "2" Then
        ResolveHundreds = 1
    ElseIf s = mHfName(0) Then
        ResolveHundreds = 0
    ElseIf s = mHfName(1) Then
        ResolveHundreds = 1
    Else
        ResolveHundreds = -1
    End If
End Function

' Index of a language id (trimmed, any case; empty = Arabic), or -1 when unknown.
Private Function ResolveLanguage(ByVal s As String) As Long
    Dim t As String, i As Long
    ResolveLanguage = -1
    t = LowerKey(JsTrim(s))
    If t = "" Then
        ResolveLanguage = LANG_AR
        Exit Function
    End If
    For i = 0 To LANG_COUNT - 1
        If t = mLangId(i) Then
            ResolveLanguage = i
            Exit Function
        End If
    Next i
End Function

'==============================================================================
' Unit lookup (src/catalog.ts)
'==============================================================================

' Unit index, or 0 when unknown. An empty name means "none".
Private Function FindUnit(ByVal unitName As String) As Long
    Dim key As String, i As Long
    FindUnit = 0
    If unitName = "" Then unitName = "none"
    key = LowerKey(CollapseSpaces(unitName))
    For i = 1 To mKeyCount
        If mKeyName(i) = key Then
            FindUnit = mKeyUnit(i)
            Exit Function
        End If
    Next i
End Function

' name.trim().replace(/\s+/g, " ")
Private Function CollapseSpaces(ByVal s As String) As String
    Dim i As Long, ch As String, out As String, pending As Boolean
    out = ""
    pending = False
    For i = 1 To Len(s)
        ch = Mid(s, i, 1)
        If IsJsSpace(CharCode(ch)) Then
            If out <> "" Then pending = True
        Else
            If pending Then
                out = out & " "
                pending = False
            End If
            out = out & ch
        End If
    Next i
    CollapseSpaces = out
End Function

' toLowerCase() for the characters that can matter for the catalog keys.
Private Function LowerKey(ByVal s As String) As String
    Dim i As Long, out As String
    out = ""
    For i = 1 To Len(s)
        out = out & LowerChar(Mid(s, i, 1))
    Next i
    LowerKey = out
End Function

' String.prototype.trim()
Private Function JsTrim(ByVal s As String) As String
    Dim a As Long, b As Long
    a = 1
    b = Len(s)
    Do While a <= b
        If Not IsJsSpace(CharCode(Mid(s, a, 1))) Then Exit Do
        a = a + 1
    Loop
    Do While b >= a
        If Not IsJsSpace(CharCode(Mid(s, b, 1))) Then Exit Do
        b = b - 1
    Loop
    JsTrim = Mid(s, a, b - a + 1)
End Function

'==============================================================================
' Input cleaning (src/normalize.ts, SPEC section 1). Returns an error code (0 = ok).
'==============================================================================

Private Function NormalizeNumber(ByVal s As String, ByRef intPart As String, ByRef fracPart As String) As Long
    Dim i As Long, c As Long, t As String, kept As Long
    Dim dots As Long, digitCount As Long, dotPos As Long

    NormalizeNumber = 0
    intPart = ""
    fracPart = ""
    t = ""
    kept = 0
    For i = 1 To Len(s)
        c = CharCode(Mid(s, i, 1))
        Select Case c
        Case 32, 160, 8201, 8239, 9, 13, 10
            ' Spaces (U+0020, U+00A0, U+2009, U+202F, tab, CR, LF): removed.
        Case Else
            kept = kept + 1
            Select Case c
            Case 1632 To 1641
                ' Arabic-Indic digits U+0660..U+0669
                t = t & ChrW(c - 1584)
            Case 1776 To 1785
                ' Persian digits U+06F0..U+06F9
                t = t & ChrW(c - 1728)
            Case 44, 1644
                ' Thousands separators "," and U+066C: removed.
            Case 1643
                ' Arabic decimal separator U+066B
                t = t & "."
            Case Else
                t = t & Mid(s, i, 1)
            End Select
        End Select
    Next i
    If kept = 0 Then
        NormalizeNumber = E_EMPTY
        Exit Function
    End If
    If t <> "" Then
        c = CharCode(Left(t, 1))
        If c = 45 Or c = 8722 Then
            NormalizeNumber = E_NEGATIVE
            Exit Function
        End If
        If c = 43 Then t = Mid(t, 2)
    End If

    ' ^(\d+(\.\d*)?|\.\d+)$  =  only digits and at most one ".", with at least one digit.
    dots = 0
    digitCount = 0
    dotPos = 0
    For i = 1 To Len(t)
        c = CharCode(Mid(t, i, 1))
        If c >= 48 And c <= 57 Then
            digitCount = digitCount + 1
        ElseIf c = 46 Then
            dots = dots + 1
            dotPos = i
        Else
            NormalizeNumber = E_INVALID_FORMAT
            Exit Function
        End If
    Next i
    If dots > 1 Or digitCount = 0 Then
        NormalizeNumber = E_INVALID_FORMAT
        Exit Function
    End If

    If dotPos = 0 Then
        intPart = t
    Else
        intPart = Left(t, dotPos - 1)
        fracPart = Mid(t, dotPos + 1)
    End If
    intPart = StripLeadingZeros(intPart)
    fracPart = StripTrailingZeros(fracPart)
    If Len(intPart) > MAX_INTEGER_DIGITS Then
        NormalizeNumber = E_TOO_LARGE
        intPart = ""
        fracPart = ""
    End If
End Function

'==============================================================================
' Shared pipeline (src/engine.ts, SPEC sections 8-10 and 17)
'==============================================================================

' Full phrase without prefix/suffix. Sets mErr on error.
Private Function Phrase(ByVal ui As Long, ByVal intPart As String, ByVal fracPart As String, _
        ByVal hf As Long, ByVal roundIt As Boolean, ByVal lang As Long) As String
    Dim subPart As String, subDigits As String, subText As String, d As Long

    mErr = 0
    Phrase = ""
    If Not mUHasForms(ui) Then
        If Len(fracPart) > MAX_FRACTION_DIGITS_NONE Then
            mErr = E_TOO_MANY_DECIMALS
        Else
            Phrase = PlainWords(lang, intPart, fracPart, hf)
        End If
        Exit Function
    End If
    If Not mFHas(ui, lang) Then
        mErr = E_NO_LANGUAGE_FORMS
        Exit Function
    End If

    subPart = "0"
    If fracPart <> "" Then
        If Not mUHasSub(ui) Then
            mErr = E_FRACTION_NOT_SUPPORTED
            Exit Function
        End If
        d = mUSubDigits(ui)
        If Len(fracPart) > d Then
            If Not roundIt Then
                mErr = E_TOO_MANY_DECIMALS
                Exit Function
            End If
            ' roundHalfUp: intPart & first d digits, plus one if the next digit is >= 5.
            subDigits = intPart & Left(fracPart, d)
            If Mid(fracPart, d + 1, 1) >= "5" Then subDigits = IncrementDigits(subDigits)
            intPart = StripLeadingZeros(Left(subDigits, Len(subDigits) - d))
            If Len(intPart) > MAX_INTEGER_DIGITS Then
                mErr = E_TOO_LARGE
                Exit Function
            End If
            subDigits = Right(subDigits, d)
        Else
            subDigits = fracPart & String(d - Len(fracPart), "0")
        End If
        subPart = StripLeadingZeros(subDigits)
    End If

    If subPart = "0" Then
        Phrase = CountWords(lang, intPart, ui, False, hf)
        Exit Function
    End If
    If Not mSHas(ui, lang) Then
        mErr = E_NO_LANGUAGE_FORMS
        Exit Function
    End If
    subText = CountWords(lang, subPart, ui, True, hf)
    If intPart = "0" Then
        Phrase = subText
    Else
        Phrase = CountWords(lang, intPart, ui, False, hf) & mJoiner(lang) & subText
    End If
End Function

' A number with no counted noun (LanguageModule.plain).
Private Function PlainWords(ByVal lang As Long, ByVal intPart As String, ByVal fracPart As String, _
        ByVal hf As Long) As String
    Dim s As String, i As Long
    Select Case lang
    Case LANG_EN
        s = EnInteger(intPart)
        If fracPart <> "" Then
            ' Digits after the point are read one by one.
            s = s & " " & mEnPoint
            For i = 1 To Len(fracPart)
                s = s & " " & mEnSmall(DigitsValue(Mid(fracPart, i, 1)))
            Next i
        End If
    Case LANG_FR
        s = FrInteger(intPart, 0)
        If fracPart <> "" Then s = s & " " & mFrPoint & " " & FractionWords(fracPart, hf, LANG_FR)
    Case Else
        s = IntegerWords(intPart, 0, hf, False)
        If fracPart <> "" Then s = s & " " & mPoint & " " & FractionWords(fracPart, hf, LANG_AR)
    End Select
    PlainWords = s
End Function

' A number followed by the unit's (isSub = False) or subunit's noun (LanguageModule.count).
Private Function CountWords(ByVal lang As Long, ByVal digits As String, ByVal ui As Long, _
        ByVal isSub As Boolean, ByVal hf As Long) As String
    Dim sing As String, plur As String, one As String, dual As String, acc As String, gi As Long
    If isSub Then
        sing = mSSing(ui, lang)
        plur = mSPlur(ui, lang)
        one = mSOne(ui, lang)
        gi = mSGender(ui, lang)
        dual = mSDual(ui)
        acc = mSAcc(ui)
    Else
        sing = mFSing(ui, lang)
        plur = mFPlur(ui, lang)
        one = mFOne(ui, lang)
        gi = mFGender(ui, lang)
        dual = mFDual(ui)
        acc = mFAcc(ui)
    End If
    Select Case lang
    Case LANG_EN
        CountWords = EnCount(digits, sing, plur, one)
    Case LANG_FR
        CountWords = FrCount(digits, sing, plur, one, gi)
    Case Else
        CountWords = CountPhrase(digits, sing, dual, plur, acc, one, gi, hf)
    End Select
End Function

' Split a digit string into 3-digit groups, least significant first; returns the count.
Private Function SplitGroups(ByVal digits As String, ByRef grp() As Long) As Long
    Dim n As Long, k As Long, p As Long
    n = (Len(digits) + 2) \ 3
    ReDim grp(0 To n - 1)
    For k = 0 To n - 1
        p = Len(digits) - 3 * k - 2
        If p < 1 Then
            grp(k) = DigitsValue(Left(digits, Len(digits) - 3 * k))
        Else
            grp(k) = DigitsValue(Mid(digits, p, 3))
        End If
    Next k
    SplitGroups = n
End Function

' Leading zeros of a fraction read as the zero word, then the rest as a whole number
' (Arabic SPEC section 10, French 17.2).
Private Function FractionWords(ByVal fraction As String, ByVal hf As Long, ByVal lang As Long) As String
    Dim lead As Long, i As Long, s As String, zero As String
    If lang = LANG_FR Then
        zero = mFrSmall(0)
    Else
        zero = mZero
    End If
    lead = 0
    Do While lead < Len(fraction)
        If Mid(fraction, lead + 1, 1) <> "0" Then Exit Do
        lead = lead + 1
    Loop
    s = ""
    For i = 1 To lead
        s = JoinParts(s, zero, " ")
    Next i
    If lead < Len(fraction) Then
        If lang = LANG_FR Then
            s = JoinParts(s, FrInteger(Mid(fraction, lead + 1), 0), " ")
        Else
            s = JoinParts(s, IntegerWords(Mid(fraction, lead + 1), 0, hf, False), " ")
        End If
    End If
    FractionWords = s
End Function

'==============================================================================
' Arabic (src/lang/ar.ts, SPEC sections 3-7)
'==============================================================================

' SPEC section 5: number + counted noun. one = "" when the unit has no "one" form.
Private Function CountPhrase(ByVal digits As String, ByVal sing As String, ByVal dual As String, _
        ByVal plur As String, ByVal acc As String, ByVal one As String, ByVal gi As Long, _
        ByVal hf As Long) As String
    Dim r As Long, noun As String
    If digits = "0" Then
        CountPhrase = mZero & " " & sing
    ElseIf digits = "1" Then
        If one <> "" Then
            CountPhrase = one
        Else
            CountPhrase = sing & " " & mOnes(gi, 1)
        End If
    ElseIf digits = "2" Then
        CountPhrase = dual
    Else
        r = DigitsValue(Right(digits, 2))
        If r <= 2 Then
            noun = sing
        ElseIf r <= 10 Then
            noun = plur
        Else
            noun = acc
        End If
        CountPhrase = IntegerWords(digits, gi, hf, True) & " " & noun
    End If
End Function

' SPEC section 7: integer words without the counted noun.
Private Function IntegerWords(ByVal digits As String, ByVal gi As Long, ByVal hf As Long, _
        ByVal nounFollows As Boolean) As String
    Dim n As Long, k As Long, lowest As Long, s As String
    Dim grp() As Long

    If digits = "0" Then
        IntegerWords = mZero
        Exit Function
    End If
    n = SplitGroups(digits, grp)
    lowest = -1
    For k = 0 To n - 1
        If lowest = -1 And grp(k) > 0 Then lowest = k
    Next k

    s = ""
    For k = n - 1 To 1 Step -1
        If grp(k) > 0 Then
            ' The lowest non-zero scale is directly followed by the noun (SPEC section 6).
            s = JoinParts(s, ScaleTerm(grp(k), k, hf, (k = lowest) And nounFollows), mWaw)
        End If
    Next k
    If grp(0) > 0 Then s = JoinParts(s, GroupWords(grp(0), gi, hf, False), mWaw)
    IntegerWords = s
End Function

' SPEC sections 4 + 6: a scale group (thousands and up).
Private Function ScaleTerm(ByVal g As Long, ByVal k As Long, ByVal hf As Long, ByVal construct As Boolean) As String
    Dim r As Long, noun As String
    If g = 1 Then
        ScaleTerm = mScale(k, SC_SINGULAR)
        Exit Function
    End If
    If g = 2 Then
        ScaleTerm = mScale(k, SC_DUAL)
        Exit Function
    End If
    r = g Mod 100
    If r <= 2 Then
        noun = mScale(k, SC_SINGULAR)
    ElseIf r <= 10 Then
        noun = mScale(k, SC_PLURAL)
    ElseIf construct Then
        noun = mScale(k, SC_SINGULAR)
    Else
        noun = mScale(k, SC_ACCUSATIVE)
    End If
    ' Hundreds directly before a scale word are always in construct.
    ScaleTerm = GroupWords(g, 0, hf, True) & " " & noun
End Function

' SPEC section 3: words for 1..999.
Private Function GroupWords(ByVal g As Long, ByVal gi As Long, ByVal hf As Long, ByVal construct As Boolean) As String
    Dim h As Long, r As Long, un As Long, t As Long, hs As String, rs As String
    h = g \ 100
    r = g Mod 100
    hs = ""
    rs = ""
    If h > 0 Then
        If h = 2 And r = 0 And construct Then
            hs = mHundDC(hf)
        Else
            hs = mHund(hf, h)
        End If
    End If
    If r >= 1 And r <= 10 Then
        rs = mOnes(gi, r)
    ElseIf r >= 11 And r <= 19 Then
        rs = mTeens(gi, r - 10)
    ElseIf r >= 20 Then
        un = r Mod 10
        t = r \ 10
        If un = 0 Then
            rs = mTens(t)
        Else
            rs = mComp(gi, un) & mWaw & mTens(t)
        End If
    End If
    GroupWords = JoinParts(hs, rs, mWaw)
End Function

'==============================================================================
' English (src/lang/en.ts, SPEC 17.1)
'==============================================================================

Private Function EnCount(ByVal digits As String, ByVal sing As String, ByVal plur As String, _
        ByVal one As String) As String
    If digits = "1" Then
        If one <> "" Then
            EnCount = one
        Else
            EnCount = mEnSmall(1) & " " & sing
        End If
    Else
        EnCount = EnInteger(digits) & " " & plur
    End If
End Function

Private Function EnInteger(ByVal digits As String) As String
    Dim n As Long, k As Long, s As String
    Dim grp() As Long
    If digits = "0" Then
        EnInteger = mEnSmall(0)
        Exit Function
    End If
    n = SplitGroups(digits, grp)
    s = ""
    For k = n - 1 To 0 Step -1
        If grp(k) > 0 Then
            If k = 0 Then
                s = JoinParts(s, EnGroup(grp(k)), " ")
            Else
                s = JoinParts(s, EnGroup(grp(k)) & " " & mEnScale(k), " ")
            End If
        End If
    Next k
    EnInteger = s
End Function

' 1..999: "Two Hundred Five", "Twenty-One".
Private Function EnGroup(ByVal g As Long) As String
    Dim h As Long, r As Long, s As String, t As String
    h = g \ 100
    r = g Mod 100
    s = ""
    If h > 0 Then s = mEnSmall(h) & " " & mEnHundred
    If r > 0 And r < 20 Then
        s = JoinParts(s, mEnSmall(r), " ")
    ElseIf r >= 20 Then
        t = mEnTens(r \ 10)
        If r Mod 10 <> 0 Then t = t & mEnHyphen & mEnSmall(r Mod 10)
        s = JoinParts(s, t, " ")
    End If
    EnGroup = s
End Function

'==============================================================================
' French (src/lang/fr.ts, SPEC 17.2). Gender index: 0 = m, 1 = f.
'==============================================================================

Private Function FrCount(ByVal digits As String, ByVal sing As String, ByVal plur As String, _
        ByVal one As String, ByVal gi As Long) As String
    Dim link As String
    If digits = "0" Then
        FrCount = mFrSmall(0) & " " & sing
    ElseIf digits = "1" Then
        If one <> "" Then
            FrCount = one
        Else
            FrCount = FrOne(gi) & " " & sing
        End If
    Else
        ' Exactly N million/milliard/billion: un million de dirhams, deux milliards d'euros.
        link = ""
        If Right(digits, 6) = "000000" Then
            link = mFrDe
            If plur <> "" Then
                If FrElides(CharCode(Left(plur, 1))) Then link = mFrDeElided
            End If
        End If
        FrCount = FrInteger(digits, gi) & " " & link & plur
    End If
End Function

Private Function FrOne(ByVal gi As Long) As String
    If gi = 1 Then
        FrOne = mFrOneF
    Else
        FrOne = mFrSmall(1)
    End If
End Function

' Integer words; the gender applies to the last group only, higher groups are masculine.
Private Function FrInteger(ByVal digits As String, ByVal gi As Long) As String
    Dim n As Long, k As Long, g As Long, s As String, part As String
    Dim grp() As Long
    If digits = "0" Then
        FrInteger = mFrSmall(0)
        Exit Function
    End If
    n = SplitGroups(digits, grp)
    s = ""
    For k = n - 1 To 1 Step -1
        g = grp(k)
        If g > 0 Then
            If k = 1 Then
                ' mille: invariable, never "un mille"
                If g = 1 Then
                    part = mFrMille
                Else
                    part = FrGroup(g, 0, False) & " " & mFrMille
                End If
            ElseIf g = 1 Then
                part = FrOne(0) & " " & mFrScale(k)
            Else
                part = FrGroup(g, 0, True) & " " & mFrScale(k) & mFrPluralS
            End If
            s = JoinParts(s, part, " ")
        End If
    Next k
    If grp(0) > 0 Then s = JoinParts(s, FrGroup(grp(0), gi, True), " ")
    FrInteger = s
End Function

' 1..999. cent takes s when multiplied and final (nothing after it in the group).
Private Function FrGroup(ByVal g As Long, ByVal gi As Long, ByVal isFinal As Boolean) As String
    Dim h As Long, r As Long, s As String
    h = g \ 100
    r = g Mod 100
    s = ""
    If h = 1 Then
        s = mFrCent
    ElseIf h > 1 Then
        s = mFrSmall(h) & " " & mFrCent
        If r = 0 And isFinal Then s = s & mFrPluralS
    End If
    If r > 0 Then s = JoinParts(s, FrBelow100(r, gi, isFinal), " ")
    FrGroup = s
End Function

' 1..99. isFinal: no other number word follows, then 80 is written quatre-vingts.
Private Function FrBelow100(ByVal n As Long, ByVal gi As Long, ByVal isFinal As Boolean) As String
    Dim t As Long, un As Long, base As String, s As String
    If n = 1 Then
        s = FrOne(gi)
    ElseIf n < 20 Then
        s = mFrSmall(n)
    Else
        t = n \ 10
        un = n Mod 10
        If t = 7 Or t = 9 Then
            If t = 7 Then
                base = mFrTens(6)
            Else
                base = mFrFourTwenty
            End If
            If t = 7 And un = 1 Then
                s = base & mFrEt & mFrSmall(11)
            Else
                s = base & mFrHyphen & mFrSmall(10 + un)
            End If
        ElseIf t = 8 Then
            If un = 0 Then
                s = mFrFourTwenty
                If isFinal Then s = s & mFrPluralS
            ElseIf un = 1 Then
                s = mFrFourTwenty & mFrHyphen & FrOne(gi)
            Else
                s = mFrFourTwenty & mFrHyphen & mFrSmall(un)
            End If
        ElseIf un = 0 Then
            s = mFrTens(t)
        ElseIf un = 1 Then
            s = mFrTens(t) & mFrEt & FrOne(gi)
        Else
            s = mFrTens(t) & mFrHyphen & mFrSmall(un)
        End If
    End If
    FrBelow100 = s
End Function

'==============================================================================
' String helpers
'==============================================================================

Private Function JoinParts(ByVal a As String, ByVal b As String, ByVal sep As String) As String
    If a = "" Then
        JoinParts = b
    ElseIf b = "" Then
        JoinParts = a
    Else
        JoinParts = a & sep & b
    End If
End Function

' Value of a string of 1..9 ASCII digits.
Private Function DigitsValue(ByVal s As String) As Long
    Dim i As Long, n As Long
    n = 0
    For i = 1 To Len(s)
        n = n * 10 + (CharCode(Mid(s, i, 1)) - 48)
    Next i
    DigitsValue = n
End Function

' Add one to a string of ASCII digits.
Private Function IncrementDigits(ByVal s As String) As String
    Dim i As Long, c As Long
    i = Len(s)
    Do While i >= 1
        c = CharCode(Mid(s, i, 1))
        If c <> 57 Then Exit Do
        s = Left(s, i - 1) & "0" & Mid(s, i + 1)
        i = i - 1
    Loop
    If i < 1 Then
        IncrementDigits = "1" & s
    Else
        IncrementDigits = Left(s, i - 1) & ChrW(c + 1) & Mid(s, i + 1)
    End If
End Function

Private Function StripLeadingZeros(ByVal s As String) As String
    Dim i As Long
    i = 1
    Do While i <= Len(s)
        If Mid(s, i, 1) <> "0" Then Exit Do
        i = i + 1
    Loop
    If i > Len(s) Then
        StripLeadingZeros = "0"
    Else
        StripLeadingZeros = Mid(s, i)
    End If
End Function

Private Function StripTrailingZeros(ByVal s As String) As String
    Dim i As Long
    i = Len(s)
    Do While i >= 1
        If Mid(s, i, 1) <> "0" Then Exit Do
        i = i - 1
    Loop
    StripTrailingZeros = Left(s, i)
End Function

' UTF-16 code unit of a character as 0..65535 (AscW is signed).
Private Function CharCode(ByVal ch As String) As Long
    Dim c As Long
    c = AscW(ch)
    If c < 0 Then c = c + 65536
    CharCode = c
End Function

' Decode "0623 0644 0641" (hex UTF-16 code units separated by spaces).
Private Function U(ByVal hexList As String) As String
    Dim i As Long, d As Long, v As Long, inToken As Boolean, out As String
    out = ""
    v = 0
    inToken = False
    For i = 1 To Len(hexList)
        d = InStr(1, "0123456789ABCDEF", UCase(Mid(hexList, i, 1)))
        If d > 0 Then
            v = v * 16 + (d - 1)
            inToken = True
        ElseIf inToken Then
            out = out & ChrW(v)
            v = 0
            inToken = False
        End If
    Next i
    If inToken Then out = out & ChrW(v)
    U = out
End Function

Private Sub EnsureInit()
    If mReady Then Exit Sub
    InitLexicon
    InitWordsEn
    InitWordsFr
    InitCatalog
    mReady = True
End Sub

Private Sub InitLexicon()
    mZero = U("0635 0641 0631") ' sfr
    mWaw = U("0020 0648") '  w
    mPoint = U("0641 0627 0635 0644 0629") ' fasla
    mOnes(0, 1) = U("0648 0627 062D 062F") ' wahd
    mOnes(0, 2) = U("0627 062B 0646 0627 0646") ' athnan
    mOnes(0, 3) = U("062B 0644 0627 062B 0629") ' thlatha
    mOnes(0, 4) = U("0623 0631 0628 0639 0629") ' a?rb'a
    mOnes(0, 5) = U("062E 0645 0633 0629") ' khmsa
    mOnes(0, 6) = U("0633 062A 0629") ' sta
    mOnes(0, 7) = U("0633 0628 0639 0629") ' sb'a
    mOnes(0, 8) = U("062B 0645 0627 0646 064A 0629") ' thmanya
    mOnes(0, 9) = U("062A 0633 0639 0629") ' ts'a
    mOnes(0, 10) = U("0639 0634 0631 0629") ' 'shra
    mTeens(0, 1) = U("0623 062D 062F 0020 0639 0634 0631") ' a?hd 'shr
    mTeens(0, 2) = U("0627 062B 0646 0627 0020 0639 0634 0631") ' athna 'shr
    mTeens(0, 3) = U("062B 0644 0627 062B 0629 0020 0639 0634 0631") ' thlatha 'shr
    mTeens(0, 4) = U("0623 0631 0628 0639 0629 0020 0639 0634 0631") ' a?rb'a 'shr
    mTeens(0, 5) = U("062E 0645 0633 0629 0020 0639 0634 0631") ' khmsa 'shr
    mTeens(0, 6) = U("0633 062A 0629 0020 0639 0634 0631") ' sta 'shr
    mTeens(0, 7) = U("0633 0628 0639 0629 0020 0639 0634 0631") ' sb'a 'shr
    mTeens(0, 8) = U("062B 0645 0627 0646 064A 0629 0020 0639 0634 0631") ' thmanya 'shr
    mTeens(0, 9) = U("062A 0633 0639 0629 0020 0639 0634 0631") ' ts'a 'shr
    mComp(0, 1) = U("0648 0627 062D 062F") ' wahd
    mComp(0, 2) = U("0627 062B 0646 0627 0646") ' athnan
    mComp(0, 3) = U("062B 0644 0627 062B 0629") ' thlatha
    mComp(0, 4) = U("0623 0631 0628 0639 0629") ' a?rb'a
    mComp(0, 5) = U("062E 0645 0633 0629") ' khmsa
    mComp(0, 6) = U("0633 062A 0629") ' sta
    mComp(0, 7) = U("0633 0628 0639 0629") ' sb'a
    mComp(0, 8) = U("062B 0645 0627 0646 064A 0629") ' thmanya
    mComp(0, 9) = U("062A 0633 0639 0629") ' ts'a
    mComp(0, 10) = U("0639 0634 0631 0629") ' 'shra
    mOnes(1, 1) = U("0648 0627 062D 062F 0629") ' wahda
    mOnes(1, 2) = U("0627 062B 0646 062A 0627 0646") ' athntan
    mOnes(1, 3) = U("062B 0644 0627 062B") ' thlath
    mOnes(1, 4) = U("0623 0631 0628 0639") ' a?rb'
    mOnes(1, 5) = U("062E 0645 0633") ' khms
    mOnes(1, 6) = U("0633 062A") ' st
    mOnes(1, 7) = U("0633 0628 0639") ' sb'
    mOnes(1, 8) = U("062B 0645 0627 0646 064A") ' thmany
    mOnes(1, 9) = U("062A 0633 0639") ' ts'
    mOnes(1, 10) = U("0639 0634 0631") ' 'shr
    mTeens(1, 1) = U("0625 062D 062F 0649 0020 0639 0634 0631 0629") ' a?hda 'shra
    mTeens(1, 2) = U("0627 062B 0646 062A 0627 0020 0639 0634 0631 0629") ' athnta 'shra
    mTeens(1, 3) = U("062B 0644 0627 062B 0020 0639 0634 0631 0629") ' thlath 'shra
    mTeens(1, 4) = U("0623 0631 0628 0639 0020 0639 0634 0631 0629") ' a?rb' 'shra
    mTeens(1, 5) = U("062E 0645 0633 0020 0639 0634 0631 0629") ' khms 'shra
    mTeens(1, 6) = U("0633 062A 0020 0639 0634 0631 0629") ' st 'shra
    mTeens(1, 7) = U("0633 0628 0639 0020 0639 0634 0631 0629") ' sb' 'shra
    mTeens(1, 8) = U("062B 0645 0627 0646 064A 0020 0639 0634 0631 0629") ' thmany 'shra
    mTeens(1, 9) = U("062A 0633 0639 0020 0639 0634 0631 0629") ' ts' 'shra
    mComp(1, 1) = U("0625 062D 062F 0649") ' a?hda
    mComp(1, 2) = U("0627 062B 0646 062A 0627 0646") ' athntan
    mComp(1, 3) = U("062B 0644 0627 062B") ' thlath
    mComp(1, 4) = U("0623 0631 0628 0639") ' a?rb'
    mComp(1, 5) = U("062E 0645 0633") ' khms
    mComp(1, 6) = U("0633 062A") ' st
    mComp(1, 7) = U("0633 0628 0639") ' sb'
    mComp(1, 8) = U("062B 0645 0627 0646 064A") ' thmany
    mComp(1, 9) = U("062A 0633 0639") ' ts'
    mTens(2) = U("0639 0634 0631 0648 0646") ' 'shrwn
    mTens(3) = U("062B 0644 0627 062B 0648 0646") ' thlathwn
    mTens(4) = U("0623 0631 0628 0639 0648 0646") ' a?rb'wn
    mTens(5) = U("062E 0645 0633 0648 0646") ' khmswn
    mTens(6) = U("0633 062A 0648 0646") ' stwn
    mTens(7) = U("0633 0628 0639 0648 0646") ' sb'wn
    mTens(8) = U("062B 0645 0627 0646 0648 0646") ' thmanwn
    mTens(9) = U("062A 0633 0639 0648 0646") ' ts'wn
    mHfName(0) = U("0645 0627 0626 0629") ' may?a
    mHund(0, 1) = U("0645 0627 0626 0629") ' may?a
    mHund(0, 2) = U("0645 0627 0626 062A 0627 0646") ' may?tan
    mHund(0, 3) = U("062B 0644 0627 062B 0645 0627 0626 0629") ' thlathmay?a
    mHund(0, 4) = U("0623 0631 0628 0639 0645 0627 0626 0629") ' a?rb'may?a
    mHund(0, 5) = U("062E 0645 0633 0645 0627 0626 0629") ' khmsmay?a
    mHund(0, 6) = U("0633 062A 0645 0627 0626 0629") ' stmay?a
    mHund(0, 7) = U("0633 0628 0639 0645 0627 0626 0629") ' sb'may?a
    mHund(0, 8) = U("062B 0645 0627 0646 0645 0627 0626 0629") ' thmanmay?a
    mHund(0, 9) = U("062A 0633 0639 0645 0627 0626 0629") ' ts'may?a
    mHundDC(0) = U("0645 0627 0626 062A 0627") ' may?ta
    mHfName(1) = U("0645 0626 0629") ' my?a
    mHund(1, 1) = U("0645 0626 0629") ' my?a
    mHund(1, 2) = U("0645 0626 062A 0627 0646") ' my?tan
    mHund(1, 3) = U("062B 0644 0627 062B 0645 0626 0629") ' thlathmy?a
    mHund(1, 4) = U("0623 0631 0628 0639 0645 0626 0629") ' a?rb'my?a
    mHund(1, 5) = U("062E 0645 0633 0645 0626 0629") ' khmsmy?a
    mHund(1, 6) = U("0633 062A 0645 0626 0629") ' stmy?a
    mHund(1, 7) = U("0633 0628 0639 0645 0626 0629") ' sb'my?a
    mHund(1, 8) = U("062B 0645 0627 0646 0645 0626 0629") ' thmanmy?a
    mHund(1, 9) = U("062A 0633 0639 0645 0626 0629") ' ts'my?a
    mHundDC(1) = U("0645 0626 062A 0627") ' my?ta
    mScale(1, SC_SINGULAR) = U("0623 0644 0641") ' a?lf
    mScale(1, SC_DUAL) = U("0623 0644 0641 0627 0646") ' a?lfan
    mScale(1, SC_PLURAL) = U("0622 0644 0627 0641") ' a?laf
    mScale(1, SC_ACCUSATIVE) = U("0623 0644 0641 0627 064B") ' a?lfan
    mScale(2, SC_SINGULAR) = U("0645 0644 064A 0648 0646") ' mlywn
    mScale(2, SC_DUAL) = U("0645 0644 064A 0648 0646 0627 0646") ' mlywnan
    mScale(2, SC_PLURAL) = U("0645 0644 0627 064A 064A 0646") ' mlayyn
    mScale(2, SC_ACCUSATIVE) = U("0645 0644 064A 0648 0646 0627 064B") ' mlywnan
    mScale(3, SC_SINGULAR) = U("0645 0644 064A 0627 0631") ' mlyar
    mScale(3, SC_DUAL) = U("0645 0644 064A 0627 0631 0627 0646") ' mlyaran
    mScale(3, SC_PLURAL) = U("0645 0644 064A 0627 0631 0627 062A") ' mlyarat
    mScale(3, SC_ACCUSATIVE) = U("0645 0644 064A 0627 0631 0627 064B") ' mlyaran
    mScale(4, SC_SINGULAR) = U("062A 0631 064A 0644 064A 0648 0646") ' trylywn
    mScale(4, SC_DUAL) = U("062A 0631 064A 0644 064A 0648 0646 0627 0646") ' trylywnan
    mScale(4, SC_PLURAL) = U("062A 0631 064A 0644 064A 0648 0646 0627 062A") ' trylywnat
    mScale(4, SC_ACCUSATIVE) = U("062A 0631 064A 0644 064A 0648 0646 0627 064B") ' trylywnan
    mErrMsg(E_EMPTY) = U("0627 0644 0631 062C 0627 0621 0020 0625 062F 062E 0627 0644 0020 0631 0642 0645 002E") ' alrja' a?dkhal rqm.
    mErrMsg(E_INVALID_FORMAT) = U("0635 064A 063A 0629 0020 0627 0644 0631 0642 0645 0020 063A 064A 0631 0020 0635 062D 064A 062D 0629 002E") ' sygha alrqm ghyr shyha.
    mErrMsg(E_NEGATIVE) = U("0627 0644 0623 0639 062F 0627 062F 0020 0627 0644 0633 0627 0644 0628 0629 0020 063A 064A 0631 0020 0645 062F 0639 0648 0645 0629 002E") ' ala?'dad alsalba ghyr md'wma.
    mErrMsg(E_TOO_LARGE) = U("0627 0644 0631 0642 0645 0020 0623 0643 0628 0631 0020 0645 0646 0020 0627 0644 062D 062F 0020 0627 0644 0645 0633 0645 0648 062D 0020 0028 0039 0039 0039 0020 062A 0631 064A 0644 064A 0648 0646 0029 002E") ' alrqm a?kbr mn alhd almsmwh (999 trylywn).
    mErrMsg(E_TOO_MANY_DECIMALS) = U("0639 062F 062F 0020 0627 0644 062E 0627 0646 0627 062A 0020 0627 0644 0639 0634 0631 064A 0629 0020 0623 0643 0628 0631 0020 0645 0645 0627 0020 062A 0633 0645 062D 0020 0628 0647 0020 0627 0644 0648 062D 062F 0629 002E") ' 'dd alkhanat al'shrya a?kbr mma tsmh bh alwhda.
    mErrMsg(E_FRACTION_NOT_SUPPORTED) = U("0647 0630 0647 0020 0627 0644 0648 062D 062F 0629 0020 0644 0627 0020 062A 062F 0639 0645 0020 0627 0644 0643 0633 0648 0631 002E") ' hdhh alwhda la td'm alkswr.
    mErrMsg(E_UNKNOWN_UNIT) = U("0627 0644 0648 062D 062F 0629 0020 063A 064A 0631 0020 0645 0639 0631 0648 0641 0629 002E") ' alwhda ghyr m'rwfa.
    mErrMsg(E_INVALID_OPTION) = U("062E 064A 0627 0631 0020 063A 064A 0631 0020 0635 0627 0644 062D 002E") ' khyar ghyr salh.
    mErrMsg(E_INVALID_CATALOG) = U("0645 0644 0641 0020 0627 0644 0648 062D 062F 0627 062A 0020 063A 064A 0631 0020 0635 0627 0644 062D 002E") ' mlf alwhdat ghyr salh.
    mErrMsg(E_NO_LANGUAGE_FORMS) = U("0644 0627 0020 062A 062A 0648 0641 0631 0020 0635 064A 063A 0629 0020 0644 0647 0630 0647 0020 0627 0644 0648 062D 062F 0629 0020 0628 0627 0644 0644 063A 0629 0020 0627 0644 0645 062E 062A 0627 0631 0629 002E") ' la ttwfr sygha lhdhh alwhda ballgha almkhtara.
    mLangId(0) = "ar"
    mLangId(1) = "en"
    mLangId(2) = "fr"
    mJoiner(LANG_AR) = U("0020 0648") '  w
    mJoiner(LANG_EN) = " and "
    mJoiner(LANG_FR) = " et "
End Sub

Private Sub InitWordsEn()
    mEnSmall(0) = "Zero"
    mEnSmall(1) = "One"
    mEnSmall(2) = "Two"
    mEnSmall(3) = "Three"
    mEnSmall(4) = "Four"
    mEnSmall(5) = "Five"
    mEnSmall(6) = "Six"
    mEnSmall(7) = "Seven"
    mEnSmall(8) = "Eight"
    mEnSmall(9) = "Nine"
    mEnSmall(10) = "Ten"
    mEnSmall(11) = "Eleven"
    mEnSmall(12) = "Twelve"
    mEnSmall(13) = "Thirteen"
    mEnSmall(14) = "Fourteen"
    mEnSmall(15) = "Fifteen"
    mEnSmall(16) = "Sixteen"
    mEnSmall(17) = "Seventeen"
    mEnSmall(18) = "Eighteen"
    mEnSmall(19) = "Nineteen"
    mEnTens(2) = "Twenty"
    mEnTens(3) = "Thirty"
    mEnTens(4) = "Forty"
    mEnTens(5) = "Fifty"
    mEnTens(6) = "Sixty"
    mEnTens(7) = "Seventy"
    mEnTens(8) = "Eighty"
    mEnTens(9) = "Ninety"
    mEnScale(1) = "Thousand"
    mEnScale(2) = "Million"
    mEnScale(3) = "Billion"
    mEnScale(4) = "Trillion"
    mEnHundred = "Hundred"
    mEnPoint = "Point"
    mEnHyphen = "-"
End Sub

Private Sub InitWordsFr()
    mFrSmall(0) = U("007A 00E9 0072 006F") ' zero
    mFrSmall(1) = "un"
    mFrSmall(2) = "deux"
    mFrSmall(3) = "trois"
    mFrSmall(4) = "quatre"
    mFrSmall(5) = "cinq"
    mFrSmall(6) = "six"
    mFrSmall(7) = "sept"
    mFrSmall(8) = "huit"
    mFrSmall(9) = "neuf"
    mFrSmall(10) = "dix"
    mFrSmall(11) = "onze"
    mFrSmall(12) = "douze"
    mFrSmall(13) = "treize"
    mFrSmall(14) = "quatorze"
    mFrSmall(15) = "quinze"
    mFrSmall(16) = "seize"
    mFrSmall(17) = "dix-sept"
    mFrSmall(18) = "dix-huit"
    mFrSmall(19) = "dix-neuf"
    mFrTens(2) = "vingt"
    mFrTens(3) = "trente"
    mFrTens(4) = "quarante"
    mFrTens(5) = "cinquante"
    mFrTens(6) = "soixante"
    mFrScale(2) = "million"
    mFrScale(3) = "milliard"
    mFrScale(4) = "billion"
    mFrFourTwenty = "quatre-vingt"
    mFrCent = "cent"
    mFrMille = "mille"
    mFrPoint = "virgule"
    mFrEt = " et "
    mFrHyphen = "-"
    mFrPluralS = "s"
    mFrOneF = "une"
    mFrDe = "de "
    mFrDeElided = "d'"
End Sub

' A French noun starting with this code unit takes d' (FR_WORDS.ELIDES in src/lang/fr.ts).
Private Function FrElides(ByVal c As Long) As Boolean
    Select Case c
    Case 65, 69, 72 To 73, 79, 85, 97, 101, 104 To 105
        FrElides = True
    Case 111, 117, 192, 194, 196, 198, 200 To 203, 206 To 207
        FrElides = True
    Case 212, 214, 219 To 220, 224, 226, 228, 230, 232 To 235
        FrElides = True
    Case 238 To 239, 244, 246, 251 To 252, 338 To 339
        FrElides = True
    Case Else
        FrElides = False
    End Select
End Function

' /\s/ in JavaScript (also what String.prototype.trim removes).
Private Function IsJsSpace(ByVal c As Long) As Boolean
    Select Case c
    Case 9 To 13, 32, 160, 5760, 8192 To 8202, 8232 To 8233, 8239, 8287
        IsJsSpace = True
    Case 12288, 65279
        IsJsSpace = True
    Case Else
        IsJsSpace = False
    End Select
End Function

' toLowerCase() of one character: A-Z, plus the characters whose lower case occurs in a catalog key.
Private Function LowerChar(ByVal ch As String) As String
    Dim c As Long
    c = CharCode(ch)
    Select Case c
    Case 65 To 90
        LowerChar = ChrW(c + 32)
    Case 8490
        LowerChar = "k"
    Case Else
        LowerChar = ch
    End Select
End Function

Private Sub InitCatalog()
    ReDim mUId(1 To UNIT_COUNT)
    ReDim mUHasForms(1 To UNIT_COUNT)
    ReDim mFDual(1 To UNIT_COUNT)
    ReDim mFAcc(1 To UNIT_COUNT)
    ReDim mUHasSub(1 To UNIT_COUNT)
    ReDim mUSubDigits(1 To UNIT_COUNT)
    ReDim mSDual(1 To UNIT_COUNT)
    ReDim mSAcc(1 To UNIT_COUNT)
    ReDim mFHas(1 To UNIT_COUNT, 0 To LANG_COUNT - 1)
    ReDim mFSing(1 To UNIT_COUNT, 0 To LANG_COUNT - 1)
    ReDim mFPlur(1 To UNIT_COUNT, 0 To LANG_COUNT - 1)
    ReDim mFOne(1 To UNIT_COUNT, 0 To LANG_COUNT - 1)
    ReDim mFGender(1 To UNIT_COUNT, 0 To LANG_COUNT - 1)
    ReDim mSHas(1 To UNIT_COUNT, 0 To LANG_COUNT - 1)
    ReDim mSSing(1 To UNIT_COUNT, 0 To LANG_COUNT - 1)
    ReDim mSPlur(1 To UNIT_COUNT, 0 To LANG_COUNT - 1)
    ReDim mSOne(1 To UNIT_COUNT, 0 To LANG_COUNT - 1)
    ReDim mSGender(1 To UNIT_COUNT, 0 To LANG_COUNT - 1)
    ReDim mKeyName(1 To KEY_COUNT)
    ReDim mKeyUnit(1 To KEY_COUNT)
    mKeyCount = 0
    InitCatalog1
    InitCatalog2
    InitCatalog3
    InitCatalog4
    InitCatalog5
    InitCatalog6
    InitCatalog7
    InitCatalog8
    InitCatalog9
    InitCatalog10
    InitCatalog11
    InitCatalog12
    InitCatalog13
    InitCatalog14
    InitCatalog15
    InitCatalog16
    InitCatalog17
    InitCatalog18
End Sub

Private Sub AddKey(ByVal key As String, ByVal ui As Long)
    mKeyCount = mKeyCount + 1
    mKeyName(mKeyCount) = key
    mKeyUnit(mKeyCount) = ui
End Sub

Private Sub InitCatalog1()
    Dim i As Long, s As String
    ' --- none: bdwn whda ---
    i = 1
    mUId(i) = "none"
    AddKey "none", i
    AddKey U("0628 062F 0648 0646 0020 0648 062D 062F 0629"), i ' bdwn whda
    AddKey U("0628 062F 0648 0646"), i ' bdwn
    ' --- SAR: ryal s'wdy ---
    i = 2
    mUId(i) = "SAR"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0631 064A 0627 0644 0020 0633 0639 0648 062F 064A") ' ryal s'wdy
    mFPlur(i, 0) = U("0631 064A 0627 0644 0627 062A 0020 0633 0639 0648 062F 064A 0629") ' ryalat s'wdya
    mFDual(i) = U("0631 064A 0627 0644 0627 0646 0020 0633 0639 0648 062F 064A 0627 0646") ' ryalan s'wdyan
    mFAcc(i) = U("0631 064A 0627 0644 0627 064B 0020 0633 0639 0648 062F 064A 0627 064B") ' ryalan s'wdyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Saudi Riyal"
    mFPlur(i, 1) = "Saudi Riyals"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "riyal saoudien"
    mFPlur(i, 2) = "riyals saoudiens"
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 1
    mSSing(i, 0) = U("0647 0644 0644 0629") ' hlla
    mSPlur(i, 0) = U("0647 0644 0644 0627 062A") ' hllat
    mSDual(i) = U("0647 0644 0644 062A 0627 0646") ' hlltan
    mSAcc(i) = U("0647 0644 0644 0629") ' hlla
    mSHas(i, 1) = True
    mSSing(i, 1) = "Halala"
    mSPlur(i, 1) = "Halalas"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "halala"
    mSPlur(i, 2) = "halalas"
    AddKey "sar", i
    AddKey U("0631 064A 0627 0644 0020 0633 0639 0648 062F 064A"), i ' ryal s'wdy
    ' --- AED: drhm a?maraty ---
    i = 3
    mUId(i) = "AED"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 0631 0647 0645 0020 0625 0645 0627 0631 0627 062A 064A") ' drhm a?maraty
    mFPlur(i, 0) = U("062F 0631 0627 0647 0645 0020 0625 0645 0627 0631 0627 062A 064A 0629") ' drahm a?maratya
    mFDual(i) = U("062F 0631 0647 0645 0627 0646 0020 0625 0645 0627 0631 0627 062A 064A 0627 0646") ' drhman a?maratyan
    mFAcc(i) = U("062F 0631 0647 0645 0627 064B 0020 0625 0645 0627 0631 0627 062A 064A 0627 064B") ' drhman a?maratyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "UAE Dirham"
    mFPlur(i, 1) = "UAE Dirhams"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("0064 0069 0072 0068 0061 006D 0020 00E9 006D 0069 0072 0061 0074 0069") ' dirham emirati
    mFPlur(i, 2) = U("0064 0069 0072 0068 0061 006D 0073 0020 00E9 006D 0069 0072 0061 0074 0069 0073") ' dirhams emiratis
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0641 0644 0633") ' fls
    mSPlur(i, 0) = U("0641 0644 0648 0633") ' flws
    mSDual(i) = U("0641 0644 0633 0627 0646") ' flsan
    mSAcc(i) = U("0641 0644 0633 0627 064B") ' flsan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Fils"
    mSPlur(i, 1) = "Fils"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "fils"
    mSPlur(i, 2) = "fils"
    AddKey "aed", i
    AddKey U("062F 0631 0647 0645 0020 0625 0645 0627 0631 0627 062A 064A"), i ' drhm a?maraty
    AddKey U("062F 002E 0625"), i ' d.a?
    ' --- QAR: ryal qtry ---
    i = 4
    mUId(i) = "QAR"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0631 064A 0627 0644 0020 0642 0637 0631 064A") ' ryal qtry
    mFPlur(i, 0) = U("0631 064A 0627 0644 0627 062A 0020 0642 0637 0631 064A 0629") ' ryalat qtrya
    mFDual(i) = U("0631 064A 0627 0644 0627 0646 0020 0642 0637 0631 064A 0627 0646") ' ryalan qtryan
    mFAcc(i) = U("0631 064A 0627 0644 0627 064B 0020 0642 0637 0631 064A 0627 064B") ' ryalan qtryan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Qatari Riyal"
    mFPlur(i, 1) = "Qatari Riyals"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "riyal qatarien"
    mFPlur(i, 2) = "riyals qatariens"
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("062F 0631 0647 0645") ' drhm
    mSPlur(i, 0) = U("062F 0631 0627 0647 0645") ' drahm
    mSDual(i) = U("062F 0631 0647 0645 0627 0646") ' drhman
    mSAcc(i) = U("062F 0631 0647 0645 0627 064B") ' drhman
    mSHas(i, 1) = True
    mSSing(i, 1) = "Dirham"
    mSPlur(i, 1) = "Dirhams"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "dirham"
    mSPlur(i, 2) = "dirhams"
    AddKey "qar", i
    AddKey U("0631 064A 0627 0644 0020 0642 0637 0631 064A"), i ' ryal qtry
    AddKey U("0631 002E 0642"), i ' r.q
    ' --- KWD: dynar kwyty ---
    i = 5
    mUId(i) = "KWD"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 064A 0646 0627 0631 0020 0643 0648 064A 062A 064A") ' dynar kwyty
    mFPlur(i, 0) = U("062F 0646 0627 0646 064A 0631 0020 0643 0648 064A 062A 064A 0629") ' dnanyr kwytya
    mFDual(i) = U("062F 064A 0646 0627 0631 0627 0646 0020 0643 0648 064A 062A 064A 0627 0646") ' dynaran kwytyan
    mFAcc(i) = U("062F 064A 0646 0627 0631 0627 064B 0020 0643 0648 064A 062A 064A 0627 064B") ' dynaran kwytyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Kuwaiti Dinar"
    mFPlur(i, 1) = "Kuwaiti Dinars"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("0064 0069 006E 0061 0072 0020 006B 006F 0077 0065 00EF 0074 0069 0065 006E") ' dinar koweitien
    mFPlur(i, 2) = U("0064 0069 006E 0061 0072 0073 0020 006B 006F 0077 0065 00EF 0074 0069 0065 006E 0073") ' dinars koweitiens
    mUHasSub(i) = True
    mUSubDigits(i) = 3
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0641 0644 0633") ' fls
    mSPlur(i, 0) = U("0641 0644 0648 0633") ' flws
    mSDual(i) = U("0641 0644 0633 0627 0646") ' flsan
    mSAcc(i) = U("0641 0644 0633 0627 064B") ' flsan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Fils"
    mSPlur(i, 1) = "Fils"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "fils"
    mSPlur(i, 2) = "fils"
    AddKey "kwd", i
    AddKey U("062F 064A 0646 0627 0631 0020 0643 0648 064A 062A 064A"), i ' dynar kwyty
    ' --- BHD: dynar bhryny ---
    i = 6
    mUId(i) = "BHD"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 064A 0646 0627 0631 0020 0628 062D 0631 064A 0646 064A") ' dynar bhryny
    mFPlur(i, 0) = U("062F 0646 0627 0646 064A 0631 0020 0628 062D 0631 064A 0646 064A 0629") ' dnanyr bhrynya
    mFDual(i) = U("062F 064A 0646 0627 0631 0627 0646 0020 0628 062D 0631 064A 0646 064A 0627 0646") ' dynaran bhrynyan
    mFAcc(i) = U("062F 064A 0646 0627 0631 0627 064B 0020 0628 062D 0631 064A 0646 064A 0627 064B") ' dynaran bhrynyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Bahraini Dinar"
    mFPlur(i, 1) = "Bahraini Dinars"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("0064 0069 006E 0061 0072 0020 0062 0061 0068 0072 0065 00EF 006E 0069") ' dinar bahreini
    mFPlur(i, 2) = U("0064 0069 006E 0061 0072 0073 0020 0062 0061 0068 0072 0065 00EF 006E 0069 0073") ' dinars bahreinis
    mUHasSub(i) = True
    mUSubDigits(i) = 3
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0641 0644 0633") ' fls
    mSPlur(i, 0) = U("0641 0644 0648 0633") ' flws
    mSDual(i) = U("0641 0644 0633 0627 0646") ' flsan
    mSAcc(i) = U("0641 0644 0633 0627 064B") ' flsan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Fils"
    mSPlur(i, 1) = "Fils"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "fils"
    mSPlur(i, 2) = "fils"
    AddKey "bhd", i
    AddKey U("062F 064A 0646 0627 0631 0020 0628 062D 0631 064A 0646 064A"), i ' dynar bhryny
End Sub

Private Sub InitCatalog2()
    Dim i As Long, s As String
    ' --- OMR: ryal 'many ---
    i = 7
    mUId(i) = "OMR"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0631 064A 0627 0644 0020 0639 0645 0627 0646 064A") ' ryal 'many
    mFPlur(i, 0) = U("0631 064A 0627 0644 0627 062A 0020 0639 0645 0627 0646 064A 0629") ' ryalat 'manya
    mFDual(i) = U("0631 064A 0627 0644 0627 0646 0020 0639 0645 0627 0646 064A 0627 0646") ' ryalan 'manyan
    mFAcc(i) = U("0631 064A 0627 0644 0627 064B 0020 0639 0645 0627 0646 064A 0627 064B") ' ryalan 'manyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Omani Rial"
    mFPlur(i, 1) = "Omani Rials"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "rial omanais"
    mFPlur(i, 2) = "rials omanais"
    mUHasSub(i) = True
    mUSubDigits(i) = 3
    mSHas(i, 0) = True
    mSGender(i, 0) = 1
    mSSing(i, 0) = U("0628 064A 0633 0629") ' bysa
    mSPlur(i, 0) = U("0628 064A 0633 0627 062A") ' bysat
    mSDual(i) = U("0628 064A 0633 062A 0627 0646") ' bystan
    mSAcc(i) = U("0628 064A 0633 0629") ' bysa
    mSHas(i, 1) = True
    mSSing(i, 1) = "Baisa"
    mSPlur(i, 1) = "Baisa"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = U("0062 0061 00EF 0073 0061") ' baisa
    mSPlur(i, 2) = U("0062 0061 00EF 0073 0061 0073") ' baisas
    AddKey "omr", i
    AddKey U("0631 064A 0627 0644 0020 0639 0645 0627 0646 064A"), i ' ryal 'many
    ' --- IQD: dynar 'raqy ---
    i = 8
    mUId(i) = "IQD"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 064A 0646 0627 0631 0020 0639 0631 0627 0642 064A") ' dynar 'raqy
    mFPlur(i, 0) = U("062F 0646 0627 0646 064A 0631 0020 0639 0631 0627 0642 064A 0629") ' dnanyr 'raqya
    mFDual(i) = U("062F 064A 0646 0627 0631 0627 0646 0020 0639 0631 0627 0642 064A 0627 0646") ' dynaran 'raqyan
    mFAcc(i) = U("062F 064A 0646 0627 0631 0627 064B 0020 0639 0631 0627 0642 064A 0627 064B") ' dynaran 'raqyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Iraqi Dinar"
    mFPlur(i, 1) = "Iraqi Dinars"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "dinar irakien"
    mFPlur(i, 2) = "dinars irakiens"
    mUHasSub(i) = True
    mUSubDigits(i) = 3
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0641 0644 0633") ' fls
    mSPlur(i, 0) = U("0641 0644 0648 0633") ' flws
    mSDual(i) = U("0641 0644 0633 0627 0646") ' flsan
    mSAcc(i) = U("0641 0644 0633 0627 064B") ' flsan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Fils"
    mSPlur(i, 1) = "Fils"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "fils"
    mSPlur(i, 2) = "fils"
    AddKey "iqd", i
    AddKey U("062F 064A 0646 0627 0631 0020 0639 0631 0627 0642 064A"), i ' dynar 'raqy
    ' --- JOD: dynar a?rdny ---
    i = 9
    mUId(i) = "JOD"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 064A 0646 0627 0631 0020 0623 0631 062F 0646 064A") ' dynar a?rdny
    mFPlur(i, 0) = U("062F 0646 0627 0646 064A 0631 0020 0623 0631 062F 0646 064A 0629") ' dnanyr a?rdnya
    mFDual(i) = U("062F 064A 0646 0627 0631 0627 0646 0020 0623 0631 062F 0646 064A 0627 0646") ' dynaran a?rdnyan
    mFAcc(i) = U("062F 064A 0646 0627 0631 0627 064B 0020 0623 0631 062F 0646 064A 0627 064B") ' dynaran a?rdnyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Jordanian Dinar"
    mFPlur(i, 1) = "Jordanian Dinars"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "dinar jordanien"
    mFPlur(i, 2) = "dinars jordaniens"
    mUHasSub(i) = True
    mUSubDigits(i) = 3
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0641 0644 0633") ' fls
    mSPlur(i, 0) = U("0641 0644 0648 0633") ' flws
    mSDual(i) = U("0641 0644 0633 0627 0646") ' flsan
    mSAcc(i) = U("0641 0644 0633 0627 064B") ' flsan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Fils"
    mSPlur(i, 1) = "Fils"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "fils"
    mSPlur(i, 2) = "fils"
    AddKey "jod", i
    AddKey U("062F 064A 0646 0627 0631 0020 0623 0631 062F 0646 064A"), i ' dynar a?rdny
    ' --- EGP: jnyh msry ---
    i = 10
    mUId(i) = "EGP"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062C 0646 064A 0647 0020 0645 0635 0631 064A") ' jnyh msry
    mFPlur(i, 0) = U("062C 0646 064A 0647 0627 062A 0020 0645 0635 0631 064A 0629") ' jnyhat msrya
    mFDual(i) = U("062C 0646 064A 0647 0627 0646 0020 0645 0635 0631 064A 0627 0646") ' jnyhan msryan
    mFAcc(i) = U("062C 0646 064A 0647 0627 064B 0020 0645 0635 0631 064A 0627 064B") ' jnyhan msryan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Egyptian Pound"
    mFPlur(i, 1) = "Egyptian Pounds"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = U("006C 0069 0076 0072 0065 0020 00E9 0067 0079 0070 0074 0069 0065 006E 006E 0065") ' livre egyptienne
    mFPlur(i, 2) = U("006C 0069 0076 0072 0065 0073 0020 00E9 0067 0079 0070 0074 0069 0065 006E 006E 0065 0073") ' livres egyptiennes
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0642 0631 0634") ' qrsh
    mSPlur(i, 0) = U("0642 0631 0648 0634") ' qrwsh
    mSDual(i) = U("0642 0631 0634 0627 0646") ' qrshan
    mSAcc(i) = U("0642 0631 0634 0627 064B") ' qrshan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Piastre"
    mSPlur(i, 1) = "Piastres"
    mSHas(i, 2) = True
    mSGender(i, 2) = 1
    mSSing(i, 2) = "piastre"
    mSPlur(i, 2) = "piastres"
    AddKey "egp", i
    AddKey U("062C 0646 064A 0647 0020 0645 0635 0631 064A"), i ' jnyh msry
    AddKey U("062C 002E 0645"), i ' j.m
    ' --- SDG: jnyh swdany ---
    i = 11
    mUId(i) = "SDG"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062C 0646 064A 0647 0020 0633 0648 062F 0627 0646 064A") ' jnyh swdany
    mFPlur(i, 0) = U("062C 0646 064A 0647 0627 062A 0020 0633 0648 062F 0627 0646 064A 0629") ' jnyhat swdanya
    mFDual(i) = U("062C 0646 064A 0647 0627 0646 0020 0633 0648 062F 0627 0646 064A 0627 0646") ' jnyhan swdanyan
    mFAcc(i) = U("062C 0646 064A 0647 0627 064B 0020 0633 0648 062F 0627 0646 064A 0627 064B") ' jnyhan swdanyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Sudanese Pound"
    mFPlur(i, 1) = "Sudanese Pounds"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "livre soudanaise"
    mFPlur(i, 2) = "livres soudanaises"
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0642 0631 0634") ' qrsh
    mSPlur(i, 0) = U("0642 0631 0648 0634") ' qrwsh
    mSDual(i) = U("0642 0631 0634 0627 0646") ' qrshan
    mSAcc(i) = U("0642 0631 0634 0627 064B") ' qrshan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Piastre"
    mSPlur(i, 1) = "Piastres"
    mSHas(i, 2) = True
    mSGender(i, 2) = 1
    mSSing(i, 2) = "piastre"
    mSPlur(i, 2) = "piastres"
    AddKey "sdg", i
    AddKey U("062C 0646 064A 0647 0020 0633 0648 062F 0627 0646 064A"), i ' jnyh swdany
    AddKey U("062C 002E 0633"), i ' j.s
    ' --- SYP: lyra swrya ---
    i = 12
    mUId(i) = "SYP"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0644 064A 0631 0629 0020 0633 0648 0631 064A 0629") ' lyra swrya
    mFPlur(i, 0) = U("0644 064A 0631 0627 062A 0020 0633 0648 0631 064A 0629") ' lyrat swrya
    mFDual(i) = U("0644 064A 0631 062A 0627 0646 0020 0633 0648 0631 064A 062A 0627 0646") ' lyrtan swrytan
    mFAcc(i) = U("0644 064A 0631 0629 0020 0633 0648 0631 064A 0629") ' lyra swrya
    mFHas(i, 1) = True
    mFSing(i, 1) = "Syrian Pound"
    mFPlur(i, 1) = "Syrian Pounds"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "livre syrienne"
    mFPlur(i, 2) = "livres syriennes"
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0642 0631 0634") ' qrsh
    mSPlur(i, 0) = U("0642 0631 0648 0634") ' qrwsh
    mSDual(i) = U("0642 0631 0634 0627 0646") ' qrshan
    mSAcc(i) = U("0642 0631 0634 0627 064B") ' qrshan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Piastre"
    mSPlur(i, 1) = "Piastres"
    mSHas(i, 2) = True
    mSGender(i, 2) = 1
    mSSing(i, 2) = "piastre"
    mSPlur(i, 2) = "piastres"
    AddKey "syp", i
    AddKey U("0644 064A 0631 0629 0020 0633 0648 0631 064A 0629"), i ' lyra swrya
    AddKey U("0644 002E 0633"), i ' l.s
End Sub

Private Sub InitCatalog3()
    Dim i As Long, s As String
    ' --- LBP: lyra lbnanya ---
    i = 13
    mUId(i) = "LBP"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0644 064A 0631 0629 0020 0644 0628 0646 0627 0646 064A 0629") ' lyra lbnanya
    mFPlur(i, 0) = U("0644 064A 0631 0627 062A 0020 0644 0628 0646 0627 0646 064A 0629") ' lyrat lbnanya
    mFDual(i) = U("0644 064A 0631 062A 0627 0646 0020 0644 0628 0646 0627 0646 064A 062A 0627 0646") ' lyrtan lbnanytan
    mFAcc(i) = U("0644 064A 0631 0629 0020 0644 0628 0646 0627 0646 064A 0629") ' lyra lbnanya
    mFHas(i, 1) = True
    mFSing(i, 1) = "Lebanese Pound"
    mFPlur(i, 1) = "Lebanese Pounds"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "livre libanaise"
    mFPlur(i, 2) = "livres libanaises"
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0642 0631 0634") ' qrsh
    mSPlur(i, 0) = U("0642 0631 0648 0634") ' qrwsh
    mSDual(i) = U("0642 0631 0634 0627 0646") ' qrshan
    mSAcc(i) = U("0642 0631 0634 0627 064B") ' qrshan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Piastre"
    mSPlur(i, 1) = "Piastres"
    mSHas(i, 2) = True
    mSGender(i, 2) = 1
    mSSing(i, 2) = "piastre"
    mSPlur(i, 2) = "piastres"
    AddKey "lbp", i
    AddKey U("0644 064A 0631 0629 0020 0644 0628 0646 0627 0646 064A 0629"), i ' lyra lbnanya
    AddKey U("0644 002E 0644"), i ' l.l
    ' --- YER: ryal ymny ---
    i = 14
    mUId(i) = "YER"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0631 064A 0627 0644 0020 064A 0645 0646 064A") ' ryal ymny
    mFPlur(i, 0) = U("0631 064A 0627 0644 0627 062A 0020 064A 0645 0646 064A 0629") ' ryalat ymnya
    mFDual(i) = U("0631 064A 0627 0644 0627 0646 0020 064A 0645 0646 064A 0627 0646") ' ryalan ymnyan
    mFAcc(i) = U("0631 064A 0627 0644 0627 064B 0020 064A 0645 0646 064A 0627 064B") ' ryalan ymnyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Yemeni Rial"
    mFPlur(i, 1) = "Yemeni Rials"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("0072 0069 0061 006C 0020 0079 00E9 006D 00E9 006E 0069 0074 0065") ' rial yemenite
    mFPlur(i, 2) = U("0072 0069 0061 006C 0073 0020 0079 00E9 006D 00E9 006E 0069 0074 0065 0073") ' rials yemenites
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0641 0644 0633") ' fls
    mSPlur(i, 0) = U("0641 0644 0648 0633") ' flws
    mSDual(i) = U("0641 0644 0633 0627 0646") ' flsan
    mSAcc(i) = U("0641 0644 0633 0627 064B") ' flsan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Fils"
    mSPlur(i, 1) = "Fils"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "fils"
    mSPlur(i, 2) = "fils"
    AddKey "yer", i
    AddKey U("0631 064A 0627 0644 0020 064A 0645 0646 064A"), i ' ryal ymny
    AddKey U("0631 002E 064A"), i ' r.y
    ' --- LYD: dynar lyby ---
    i = 15
    mUId(i) = "LYD"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 064A 0646 0627 0631 0020 0644 064A 0628 064A") ' dynar lyby
    mFPlur(i, 0) = U("062F 0646 0627 0646 064A 0631 0020 0644 064A 0628 064A 0629") ' dnanyr lybya
    mFDual(i) = U("062F 064A 0646 0627 0631 0627 0646 0020 0644 064A 0628 064A 0627 0646") ' dynaran lybyan
    mFAcc(i) = U("062F 064A 0646 0627 0631 0627 064B 0020 0644 064A 0628 064A 0627 064B") ' dynaran lybyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Libyan Dinar"
    mFPlur(i, 1) = "Libyan Dinars"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "dinar libyen"
    mFPlur(i, 2) = "dinars libyens"
    mUHasSub(i) = True
    mUSubDigits(i) = 3
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("062F 0631 0647 0645") ' drhm
    mSPlur(i, 0) = U("062F 0631 0627 0647 0645") ' drahm
    mSDual(i) = U("062F 0631 0647 0645 0627 0646") ' drhman
    mSAcc(i) = U("062F 0631 0647 0645 0627 064B") ' drhman
    mSHas(i, 1) = True
    mSSing(i, 1) = "Dirham"
    mSPlur(i, 1) = "Dirhams"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "dirham"
    mSPlur(i, 2) = "dirhams"
    AddKey "lyd", i
    AddKey U("062F 064A 0646 0627 0631 0020 0644 064A 0628 064A"), i ' dynar lyby
    AddKey U("062F 002E 0644"), i ' d.l
    ' --- TND: dynar twnsy ---
    i = 16
    mUId(i) = "TND"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 064A 0646 0627 0631 0020 062A 0648 0646 0633 064A") ' dynar twnsy
    mFPlur(i, 0) = U("062F 0646 0627 0646 064A 0631 0020 062A 0648 0646 0633 064A 0629") ' dnanyr twnsya
    mFDual(i) = U("062F 064A 0646 0627 0631 0627 0646 0020 062A 0648 0646 0633 064A 0627 0646") ' dynaran twnsyan
    mFAcc(i) = U("062F 064A 0646 0627 0631 0627 064B 0020 062A 0648 0646 0633 064A 0627 064B") ' dynaran twnsyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Tunisian Dinar"
    mFPlur(i, 1) = "Tunisian Dinars"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "dinar tunisien"
    mFPlur(i, 2) = "dinars tunisiens"
    mUHasSub(i) = True
    mUSubDigits(i) = 3
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0645 0644 064A 0645") ' mlym
    mSPlur(i, 0) = U("0645 0644 064A 0645 0627 062A") ' mlymat
    mSDual(i) = U("0645 0644 064A 0645 0627 0646") ' mlyman
    mSAcc(i) = U("0645 0644 064A 0645 0627 064B") ' mlyman
    mSHas(i, 1) = True
    mSSing(i, 1) = "Millime"
    mSPlur(i, 1) = "Millimes"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "millime"
    mSPlur(i, 2) = "millimes"
    AddKey "tnd", i
    AddKey U("062F 064A 0646 0627 0631 0020 062A 0648 0646 0633 064A"), i ' dynar twnsy
    AddKey U("062F 002E 062A"), i ' d.t
    ' --- DZD: dynar jzay?ry ---
    i = 17
    mUId(i) = "DZD"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 064A 0646 0627 0631 0020 062C 0632 0627 0626 0631 064A") ' dynar jzay?ry
    mFPlur(i, 0) = U("062F 0646 0627 0646 064A 0631 0020 062C 0632 0627 0626 0631 064A 0629") ' dnanyr jzay?rya
    mFDual(i) = U("062F 064A 0646 0627 0631 0627 0646 0020 062C 0632 0627 0626 0631 064A 0627 0646") ' dynaran jzay?ryan
    mFAcc(i) = U("062F 064A 0646 0627 0631 0627 064B 0020 062C 0632 0627 0626 0631 064A 0627 064B") ' dynaran jzay?ryan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Algerian Dinar"
    mFPlur(i, 1) = "Algerian Dinars"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("0064 0069 006E 0061 0072 0020 0061 006C 0067 00E9 0072 0069 0065 006E") ' dinar algerien
    mFPlur(i, 2) = U("0064 0069 006E 0061 0072 0073 0020 0061 006C 0067 00E9 0072 0069 0065 006E 0073") ' dinars algeriens
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0633 0646 062A 064A 0645") ' sntym
    mSPlur(i, 0) = U("0633 0646 062A 064A 0645 0627 062A") ' sntymat
    mSDual(i) = U("0633 0646 062A 064A 0645 0627 0646") ' sntyman
    mSAcc(i) = U("0633 0646 062A 064A 0645 0627 064B") ' sntyman
    mSHas(i, 1) = True
    mSSing(i, 1) = "Centime"
    mSPlur(i, 1) = "Centimes"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "centime"
    mSPlur(i, 2) = "centimes"
    AddKey "dzd", i
    AddKey U("062F 064A 0646 0627 0631 0020 062C 0632 0627 0626 0631 064A"), i ' dynar jzay?ry
    AddKey U("062F 002E 062C"), i ' d.j
    ' --- MAD: drhm mghrby ---
    i = 18
    mUId(i) = "MAD"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 0631 0647 0645 0020 0645 063A 0631 0628 064A") ' drhm mghrby
    mFPlur(i, 0) = U("062F 0631 0627 0647 0645 0020 0645 063A 0631 0628 064A 0629") ' drahm mghrbya
    mFDual(i) = U("062F 0631 0647 0645 0627 0646 0020 0645 063A 0631 0628 064A 0627 0646") ' drhman mghrbyan
    mFAcc(i) = U("062F 0631 0647 0645 0627 064B 0020 0645 063A 0631 0628 064A 0627 064B") ' drhman mghrbyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Moroccan Dirham"
    mFPlur(i, 1) = "Moroccan Dirhams"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "dirham marocain"
    mFPlur(i, 2) = "dirhams marocains"
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0633 0646 062A 064A 0645") ' sntym
    mSPlur(i, 0) = U("0633 0646 062A 064A 0645 0627 062A") ' sntymat
    mSDual(i) = U("0633 0646 062A 064A 0645 0627 0646") ' sntyman
    mSAcc(i) = U("0633 0646 062A 064A 0645 0627 064B") ' sntyman
    mSHas(i, 1) = True
    mSSing(i, 1) = "Centime"
    mSPlur(i, 1) = "Centimes"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "centime"
    mSPlur(i, 2) = "centimes"
    AddKey "mad", i
    AddKey U("062F 0631 0647 0645 0020 0645 063A 0631 0628 064A"), i ' drhm mghrby
    AddKey U("062F 002E 0645"), i ' d.m
End Sub

Private Sub InitCatalog4()
    Dim i As Long, s As String
    ' --- MRU: a?wqya mwrytanya ---
    i = 19
    mUId(i) = "MRU"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0623 0648 0642 064A 0629 0020 0645 0648 0631 064A 062A 0627 0646 064A 0629") ' a?wqya mwrytanya
    mFPlur(i, 0) = U("0623 0648 0642 064A 0627 062A 0020 0645 0648 0631 064A 062A 0627 0646 064A 0629") ' a?wqyat mwrytanya
    mFDual(i) = U("0623 0648 0642 064A 062A 0627 0646 0020 0645 0648 0631 064A 062A 0627 0646 064A 062A 0627 0646") ' a?wqytan mwrytanytan
    mFAcc(i) = U("0623 0648 0642 064A 0629 0020 0645 0648 0631 064A 062A 0627 0646 064A 0629") ' a?wqya mwrytanya
    mFHas(i, 1) = True
    mFSing(i, 1) = "Mauritanian Ouguiya"
    mFPlur(i, 1) = "Mauritanian Ouguiyas"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "ouguiya mauritanien"
    mFPlur(i, 2) = "ouguiyas mauritaniens"
    AddKey "mru", i
    AddKey U("0623 0648 0642 064A 0629 0020 0645 0648 0631 064A 062A 0627 0646 064A 0629"), i ' a?wqya mwrytanya
    ' --- SOS: shln swmaly ---
    i = 20
    mUId(i) = "SOS"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0634 0644 0646 0020 0635 0648 0645 0627 0644 064A") ' shln swmaly
    mFPlur(i, 0) = U("0634 0644 0646 0627 062A 0020 0635 0648 0645 0627 0644 064A 0629") ' shlnat swmalya
    mFDual(i) = U("0634 0644 0646 0627 0646 0020 0635 0648 0645 0627 0644 064A 0627 0646") ' shlnan swmalyan
    mFAcc(i) = U("0634 0644 0646 0627 064B 0020 0635 0648 0645 0627 0644 064A 0627 064B") ' shlnan swmalyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Somali Shilling"
    mFPlur(i, 1) = "Somali Shillings"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "shilling somalien"
    mFPlur(i, 2) = "shillings somaliens"
    AddKey "sos", i
    AddKey U("0634 0644 0646 0020 0635 0648 0645 0627 0644 064A"), i ' shln swmaly
    ' --- DJF: frnk jybwty ---
    i = 21
    mUId(i) = "DJF"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0641 0631 0646 0643 0020 062C 064A 0628 0648 062A 064A") ' frnk jybwty
    mFPlur(i, 0) = U("0641 0631 0646 0643 0627 062A 0020 062C 064A 0628 0648 062A 064A 0629") ' frnkat jybwtya
    mFDual(i) = U("0641 0631 0646 0643 0627 0646 0020 062C 064A 0628 0648 062A 064A 0627 0646") ' frnkan jybwtyan
    mFAcc(i) = U("0641 0631 0646 0643 0627 064B 0020 062C 064A 0628 0648 062A 064A 0627 064B") ' frnkan jybwtyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Djiboutian Franc"
    mFPlur(i, 1) = "Djiboutian Francs"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "franc djiboutien"
    mFPlur(i, 2) = "francs djiboutiens"
    AddKey "djf", i
    AddKey U("0641 0631 0646 0643 0020 062C 064A 0628 0648 062A 064A"), i ' frnk jybwty
    ' --- KMF: frnk qmry ---
    i = 22
    mUId(i) = "KMF"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0641 0631 0646 0643 0020 0642 0645 0631 064A") ' frnk qmry
    mFPlur(i, 0) = U("0641 0631 0646 0643 0627 062A 0020 0642 0645 0631 064A 0629") ' frnkat qmrya
    mFDual(i) = U("0641 0631 0646 0643 0627 0646 0020 0642 0645 0631 064A 0627 0646") ' frnkan qmryan
    mFAcc(i) = U("0641 0631 0646 0643 0627 064B 0020 0642 0645 0631 064A 0627 064B") ' frnkan qmryan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Comorian Franc"
    mFPlur(i, 1) = "Comorian Francs"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "franc comorien"
    mFPlur(i, 2) = "francs comoriens"
    AddKey "kmf", i
    AddKey U("0641 0631 0646 0643 0020 0642 0645 0631 064A"), i ' frnk qmry
    ' --- USD: dwlar a?mryky ---
    i = 23
    mUId(i) = "USD"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 0648 0644 0627 0631 0020 0623 0645 0631 064A 0643 064A") ' dwlar a?mryky
    mFPlur(i, 0) = U("062F 0648 0644 0627 0631 0627 062A 0020 0623 0645 0631 064A 0643 064A 0629") ' dwlarat a?mrykya
    mFDual(i) = U("062F 0648 0644 0627 0631 0627 0646 0020 0623 0645 0631 064A 0643 064A 0627 0646") ' dwlaran a?mrykyan
    mFAcc(i) = U("062F 0648 0644 0627 0631 0627 064B 0020 0623 0645 0631 064A 0643 064A 0627 064B") ' dwlaran a?mrykyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "US Dollar"
    mFPlur(i, 1) = "US Dollars"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("0064 006F 006C 006C 0061 0072 0020 0061 006D 00E9 0072 0069 0063 0061 0069 006E") ' dollar americain
    mFPlur(i, 2) = U("0064 006F 006C 006C 0061 0072 0073 0020 0061 006D 00E9 0072 0069 0063 0061 0069 006E 0073") ' dollars americains
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0633 0646 062A") ' snt
    mSPlur(i, 0) = U("0633 0646 062A 0627 062A") ' sntat
    mSDual(i) = U("0633 0646 062A 0627 0646") ' sntan
    mSAcc(i) = U("0633 0646 062A 0627 064B") ' sntan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Cent"
    mSPlur(i, 1) = "Cents"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "cent"
    mSPlur(i, 2) = "cents"
    AddKey "usd", i
    AddKey U("062F 0648 0644 0627 0631 0020 0623 0645 0631 064A 0643 064A"), i ' dwlar a?mryky
    AddKey U("062F 0648 0644 0627 0631 0020 0623 0645 064A 0631 0643 064A"), i ' dwlar a?myrky
    AddKey U("062F 0648 0644 0627 0631 0020 0627 0645 0631 064A 0643 064A"), i ' dwlar amryky
    AddKey "$", i
    ' --- EUR: ywrw a?wrwby ---
    i = 24
    mUId(i) = "EUR"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("064A 0648 0631 0648") ' ywrw
    mFPlur(i, 0) = U("064A 0648 0631 0648") ' ywrw
    mFDual(i) = U("064A 0648 0631 0648 0627 0646") ' ywrwan
    mFAcc(i) = U("064A 0648 0631 0648") ' ywrw
    mFHas(i, 1) = True
    mFSing(i, 1) = "Euro"
    mFPlur(i, 1) = "Euros"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "euro"
    mFPlur(i, 2) = "euros"
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0633 0646 062A") ' snt
    mSPlur(i, 0) = U("0633 0646 062A 0627 062A") ' sntat
    mSDual(i) = U("0633 0646 062A 0627 0646") ' sntan
    mSAcc(i) = U("0633 0646 062A 0627 064B") ' sntan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Cent"
    mSPlur(i, 1) = "Cents"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "centime"
    mSPlur(i, 2) = "centimes"
    AddKey "eur", i
    AddKey U("064A 0648 0631 0648 0020 0623 0648 0631 0648 0628 064A"), i ' ywrw a?wrwby
    AddKey U("20AC"), i ' ?
End Sub

Private Sub InitCatalog5()
    Dim i As Long, s As String
    ' --- GBP: jnyh a?strlyny ---
    i = 25
    mUId(i) = "GBP"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062C 0646 064A 0647 0020 0625 0633 062A 0631 0644 064A 0646 064A") ' jnyh a?strlyny
    mFPlur(i, 0) = U("062C 0646 064A 0647 0627 062A 0020 0625 0633 062A 0631 0644 064A 0646 064A 0629") ' jnyhat a?strlynya
    mFDual(i) = U("062C 0646 064A 0647 0627 0646 0020 0625 0633 062A 0631 0644 064A 0646 064A 0627 0646") ' jnyhan a?strlynyan
    mFAcc(i) = U("062C 0646 064A 0647 0627 064B 0020 0625 0633 062A 0631 0644 064A 0646 064A 0627 064B") ' jnyhan a?strlynyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Pound Sterling"
    mFPlur(i, 1) = "Pounds Sterling"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "livre sterling"
    mFPlur(i, 2) = "livres sterling"
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0628 0646 0633") ' bns
    mSPlur(i, 0) = U("0628 0646 0633 0627 062A") ' bnsat
    mSDual(i) = U("0628 0646 0633 0627 0646") ' bnsan
    mSAcc(i) = U("0628 0646 0633 0627 064B") ' bnsan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Penny"
    mSPlur(i, 1) = "Pence"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "penny"
    mSPlur(i, 2) = "pence"
    AddKey "gbp", i
    AddKey U("062C 0646 064A 0647 0020 0625 0633 062A 0631 0644 064A 0646 064A"), i ' jnyh a?strlyny
    AddKey U("062C 0646 064A 0647 0020 0627 0633 062A 0631 0644 064A 0646 064A"), i ' jnyh astrlyny
    AddKey U("00A3"), i ' ?
    ' --- JPY: yn yabany ---
    i = 26
    mUId(i) = "JPY"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("064A 0646 0020 064A 0627 0628 0627 0646 064A") ' yn yabany
    mFPlur(i, 0) = U("064A 0646 0627 062A 0020 064A 0627 0628 0627 0646 064A 0629") ' ynat yabanya
    mFDual(i) = U("064A 0646 0627 0646 0020 064A 0627 0628 0627 0646 064A 0627 0646") ' ynan yabanyan
    mFAcc(i) = U("064A 0646 0627 064B 0020 064A 0627 0628 0627 0646 064A 0627 064B") ' ynan yabanyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Japanese Yen"
    mFPlur(i, 1) = "Japanese Yen"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "yen japonais"
    mFPlur(i, 2) = "yens japonais"
    AddKey "jpy", i
    AddKey U("064A 0646 0020 064A 0627 0628 0627 0646 064A"), i ' yn yabany
    ' --- CNY: ywan syny ---
    i = 27
    mUId(i) = "CNY"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("064A 0648 0627 0646 0020 0635 064A 0646 064A") ' ywan syny
    mFPlur(i, 0) = U("064A 0648 0627 0646 0627 062A 0020 0635 064A 0646 064A 0629") ' ywanat synya
    mFDual(i) = U("064A 0648 0627 0646 0627 0646 0020 0635 064A 0646 064A 0627 0646") ' ywanan synyan
    mFAcc(i) = U("064A 0648 0627 0646 0627 064B 0020 0635 064A 0646 064A 0627 064B") ' ywanan synyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Chinese Yuan"
    mFPlur(i, 1) = "Chinese Yuan"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "yuan chinois"
    mFPlur(i, 2) = "yuans chinois"
    AddKey "cny", i
    AddKey U("064A 0648 0627 0646 0020 0635 064A 0646 064A"), i ' ywan syny
    AddKey U("0631 0646 0645 064A 0646 0628 064A"), i ' rnmynby
    ' --- CHF: frnk swysry ---
    i = 28
    mUId(i) = "CHF"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0641 0631 0646 0643 0020 0633 0648 064A 0633 0631 064A") ' frnk swysry
    mFPlur(i, 0) = U("0641 0631 0646 0643 0627 062A 0020 0633 0648 064A 0633 0631 064A 0629") ' frnkat swysrya
    mFDual(i) = U("0641 0631 0646 0643 0627 0646 0020 0633 0648 064A 0633 0631 064A 0627 0646") ' frnkan swysryan
    mFAcc(i) = U("0641 0631 0646 0643 0627 064B 0020 0633 0648 064A 0633 0631 064A 0627 064B") ' frnkan swysryan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Swiss Franc"
    mFPlur(i, 1) = "Swiss Francs"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "franc suisse"
    mFPlur(i, 2) = "francs suisses"
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0633 0646 062A 064A 0645") ' sntym
    mSPlur(i, 0) = U("0633 0646 062A 064A 0645 0627 062A") ' sntymat
    mSDual(i) = U("0633 0646 062A 064A 0645 0627 0646") ' sntyman
    mSAcc(i) = U("0633 0646 062A 064A 0645 0627 064B") ' sntyman
    mSHas(i, 1) = True
    mSSing(i, 1) = "Centime"
    mSPlur(i, 1) = "Centimes"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "centime"
    mSPlur(i, 2) = "centimes"
    AddKey "chf", i
    AddKey U("0641 0631 0646 0643 0020 0633 0648 064A 0633 0631 064A"), i ' frnk swysry
    ' --- CAD: dwlar kndy ---
    i = 29
    mUId(i) = "CAD"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 0648 0644 0627 0631 0020 0643 0646 062F 064A") ' dwlar kndy
    mFPlur(i, 0) = U("062F 0648 0644 0627 0631 0627 062A 0020 0643 0646 062F 064A 0629") ' dwlarat kndya
    mFDual(i) = U("062F 0648 0644 0627 0631 0627 0646 0020 0643 0646 062F 064A 0627 0646") ' dwlaran kndyan
    mFAcc(i) = U("062F 0648 0644 0627 0631 0627 064B 0020 0643 0646 062F 064A 0627 064B") ' dwlaran kndyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Canadian Dollar"
    mFPlur(i, 1) = "Canadian Dollars"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "dollar canadien"
    mFPlur(i, 2) = "dollars canadiens"
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0633 0646 062A") ' snt
    mSPlur(i, 0) = U("0633 0646 062A 0627 062A") ' sntat
    mSDual(i) = U("0633 0646 062A 0627 0646") ' sntan
    mSAcc(i) = U("0633 0646 062A 0627 064B") ' sntan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Cent"
    mSPlur(i, 1) = "Cents"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "cent"
    mSPlur(i, 2) = "cents"
    AddKey "cad", i
    AddKey U("062F 0648 0644 0627 0631 0020 0643 0646 062F 064A"), i ' dwlar kndy
    ' --- AUD: dwlar a?straly ---
    i = 30
    mUId(i) = "AUD"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 0648 0644 0627 0631 0020 0623 0633 062A 0631 0627 0644 064A") ' dwlar a?straly
    mFPlur(i, 0) = U("062F 0648 0644 0627 0631 0627 062A 0020 0623 0633 062A 0631 0627 0644 064A 0629") ' dwlarat a?stralya
    mFDual(i) = U("062F 0648 0644 0627 0631 0627 0646 0020 0623 0633 062A 0631 0627 0644 064A 0627 0646") ' dwlaran a?stralyan
    mFAcc(i) = U("062F 0648 0644 0627 0631 0627 064B 0020 0623 0633 062A 0631 0627 0644 064A 0627 064B") ' dwlaran a?stralyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Australian Dollar"
    mFPlur(i, 1) = "Australian Dollars"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "dollar australien"
    mFPlur(i, 2) = "dollars australiens"
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0633 0646 062A") ' snt
    mSPlur(i, 0) = U("0633 0646 062A 0627 062A") ' sntat
    mSDual(i) = U("0633 0646 062A 0627 0646") ' sntan
    mSAcc(i) = U("0633 0646 062A 0627 064B") ' sntan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Cent"
    mSPlur(i, 1) = "Cents"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "cent"
    mSPlur(i, 2) = "cents"
    AddKey "aud", i
    AddKey U("062F 0648 0644 0627 0631 0020 0623 0633 062A 0631 0627 0644 064A"), i ' dwlar a?straly
    AddKey U("062F 0648 0644 0627 0631 0020 0627 0633 062A 0631 0627 0644 064A"), i ' dwlar astraly
End Sub

Private Sub InitCatalog6()
    Dim i As Long, s As String
    ' --- SGD: dwlar snghafwry ---
    i = 31
    mUId(i) = "SGD"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 0648 0644 0627 0631 0020 0633 0646 063A 0627 0641 0648 0631 064A") ' dwlar snghafwry
    mFPlur(i, 0) = U("062F 0648 0644 0627 0631 0627 062A 0020 0633 0646 063A 0627 0641 0648 0631 064A 0629") ' dwlarat snghafwrya
    mFDual(i) = U("062F 0648 0644 0627 0631 0627 0646 0020 0633 0646 063A 0627 0641 0648 0631 064A 0627 0646") ' dwlaran snghafwryan
    mFAcc(i) = U("062F 0648 0644 0627 0631 0627 064B 0020 0633 0646 063A 0627 0641 0648 0631 064A 0627 064B") ' dwlaran snghafwryan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Singapore Dollar"
    mFPlur(i, 1) = "Singapore Dollars"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "dollar de Singapour"
    mFPlur(i, 2) = "dollars de Singapour"
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0633 0646 062A") ' snt
    mSPlur(i, 0) = U("0633 0646 062A 0627 062A") ' sntat
    mSDual(i) = U("0633 0646 062A 0627 0646") ' sntan
    mSAcc(i) = U("0633 0646 062A 0627 064B") ' sntan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Cent"
    mSPlur(i, 1) = "Cents"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "cent"
    mSPlur(i, 2) = "cents"
    AddKey "sgd", i
    AddKey U("062F 0648 0644 0627 0631 0020 0633 0646 063A 0627 0641 0648 0631 064A"), i ' dwlar snghafwry
    ' --- INR: rwbya hndya ---
    i = 32
    mUId(i) = "INR"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0631 0648 0628 064A 0629 0020 0647 0646 062F 064A 0629") ' rwbya hndya
    mFPlur(i, 0) = U("0631 0648 0628 064A 0627 062A 0020 0647 0646 062F 064A 0629") ' rwbyat hndya
    mFDual(i) = U("0631 0648 0628 064A 062A 0627 0646 0020 0647 0646 062F 064A 062A 0627 0646") ' rwbytan hndytan
    mFAcc(i) = U("0631 0648 0628 064A 0629 0020 0647 0646 062F 064A 0629") ' rwbya hndya
    mFHas(i, 1) = True
    mFSing(i, 1) = "Indian Rupee"
    mFPlur(i, 1) = "Indian Rupees"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "roupie indienne"
    mFPlur(i, 2) = "roupies indiennes"
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 1
    mSSing(i, 0) = U("0628 064A 0633 0629") ' bysa
    mSPlur(i, 0) = U("0628 064A 0633 0627 062A") ' bysat
    mSDual(i) = U("0628 064A 0633 062A 0627 0646") ' bystan
    mSAcc(i) = U("0628 064A 0633 0629") ' bysa
    mSHas(i, 1) = True
    mSSing(i, 1) = "Paisa"
    mSPlur(i, 1) = "Paise"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "paisa"
    mSPlur(i, 2) = "paisas"
    AddKey "inr", i
    AddKey U("0631 0648 0628 064A 0629 0020 0647 0646 062F 064A 0629"), i ' rwbya hndya
    ' --- PKR: rwbya bakstanya ---
    i = 33
    mUId(i) = "PKR"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0631 0648 0628 064A 0629 0020 0628 0627 0643 0633 062A 0627 0646 064A 0629") ' rwbya bakstanya
    mFPlur(i, 0) = U("0631 0648 0628 064A 0627 062A 0020 0628 0627 0643 0633 062A 0627 0646 064A 0629") ' rwbyat bakstanya
    mFDual(i) = U("0631 0648 0628 064A 062A 0627 0646 0020 0628 0627 0643 0633 062A 0627 0646 064A 062A 0627 0646") ' rwbytan bakstanytan
    mFAcc(i) = U("0631 0648 0628 064A 0629 0020 0628 0627 0643 0633 062A 0627 0646 064A 0629") ' rwbya bakstanya
    mFHas(i, 1) = True
    mFSing(i, 1) = "Pakistani Rupee"
    mFPlur(i, 1) = "Pakistani Rupees"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "roupie pakistanaise"
    mFPlur(i, 2) = "roupies pakistanaises"
    AddKey "pkr", i
    AddKey U("0631 0648 0628 064A 0629 0020 0628 0627 0643 0633 062A 0627 0646 064A 0629"), i ' rwbya bakstanya
    ' --- TRY: lyra trkya ---
    i = 34
    mUId(i) = "TRY"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0644 064A 0631 0629 0020 062A 0631 0643 064A 0629") ' lyra trkya
    mFPlur(i, 0) = U("0644 064A 0631 0627 062A 0020 062A 0631 0643 064A 0629") ' lyrat trkya
    mFDual(i) = U("0644 064A 0631 062A 0627 0646 0020 062A 0631 0643 064A 062A 0627 0646") ' lyrtan trkytan
    mFAcc(i) = U("0644 064A 0631 0629 0020 062A 0631 0643 064A 0629") ' lyra trkya
    mFHas(i, 1) = True
    mFSing(i, 1) = "Turkish Lira"
    mFPlur(i, 1) = "Turkish Lira"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "livre turque"
    mFPlur(i, 2) = "livres turques"
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0642 0631 0634") ' qrsh
    mSPlur(i, 0) = U("0642 0631 0648 0634") ' qrwsh
    mSDual(i) = U("0642 0631 0634 0627 0646") ' qrshan
    mSAcc(i) = U("0642 0631 0634 0627 064B") ' qrshan
    mSHas(i, 1) = True
    mSSing(i, 1) = U("004B 0075 0072 0075 015F") ' Kurus
    mSPlur(i, 1) = U("004B 0075 0072 0075 015F") ' Kurus
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = U("006B 0075 0072 0075 015F") ' kurus
    mSPlur(i, 2) = U("006B 0075 0072 0075 015F") ' kurus
    AddKey "try", i
    AddKey U("0644 064A 0631 0629 0020 062A 0631 0643 064A 0629"), i ' lyra trkya
    ' --- RUB: rwbl rwsy ---
    i = 35
    mUId(i) = "RUB"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0631 0648 0628 0644 0020 0631 0648 0633 064A") ' rwbl rwsy
    mFPlur(i, 0) = U("0631 0648 0628 0644 0627 062A 0020 0631 0648 0633 064A 0629") ' rwblat rwsya
    mFDual(i) = U("0631 0648 0628 0644 0627 0646 0020 0631 0648 0633 064A 0627 0646") ' rwblan rwsyan
    mFAcc(i) = U("0631 0648 0628 0644 0627 064B 0020 0631 0648 0633 064A 0627 064B") ' rwblan rwsyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Russian Ruble"
    mFPlur(i, 1) = "Russian Rubles"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "rouble russe"
    mFPlur(i, 2) = "roubles russes"
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0643 0648 0628 064A 0643") ' kwbyk
    mSPlur(i, 0) = U("0643 0648 0628 064A 0643 0627 062A") ' kwbykat
    mSDual(i) = U("0643 0648 0628 064A 0643 0627 0646") ' kwbykan
    mSAcc(i) = U("0643 0648 0628 064A 0643 0627 064B") ' kwbykan
    mSHas(i, 1) = True
    mSSing(i, 1) = "Kopeck"
    mSPlur(i, 1) = "Kopecks"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "kopeck"
    mSPlur(i, 2) = "kopecks"
    AddKey "rub", i
    AddKey U("0631 0648 0628 0644 0020 0631 0648 0633 064A"), i ' rwbl rwsy
    ' --- IRR: ryal a?yrany ---
    i = 36
    mUId(i) = "IRR"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0631 064A 0627 0644 0020 0625 064A 0631 0627 0646 064A") ' ryal a?yrany
    mFPlur(i, 0) = U("0631 064A 0627 0644 0627 062A 0020 0625 064A 0631 0627 0646 064A 0629") ' ryalat a?yranya
    mFDual(i) = U("0631 064A 0627 0644 0627 0646 0020 0625 064A 0631 0627 0646 064A 0627 0646") ' ryalan a?yranyan
    mFAcc(i) = U("0631 064A 0627 0644 0627 064B 0020 0625 064A 0631 0627 0646 064A 0627 064B") ' ryalan a?yranyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Iranian Rial"
    mFPlur(i, 1) = "Iranian Rials"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "rial iranien"
    mFPlur(i, 2) = "rials iraniens"
    AddKey "irr", i
    AddKey U("0631 064A 0627 0644 0020 0625 064A 0631 0627 0646 064A"), i ' ryal a?yrany
End Sub

Private Sub InitCatalog7()
    Dim i As Long, s As String
    ' --- MYR: rynghyt malyzy ---
    i = 37
    mUId(i) = "MYR"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0631 064A 0646 063A 064A 062A 0020 0645 0627 0644 064A 0632 064A") ' rynghyt malyzy
    mFPlur(i, 0) = U("0631 064A 0646 063A 064A 062A 0627 062A 0020 0645 0627 0644 064A 0632 064A 0629") ' rynghytat malyzya
    mFDual(i) = U("0631 064A 0646 063A 064A 062A 0627 0646 0020 0645 0627 0644 064A 0632 064A 0627 0646") ' rynghytan malyzyan
    mFAcc(i) = U("0631 064A 0646 063A 064A 062A 0627 064B 0020 0645 0627 0644 064A 0632 064A 0627 064B") ' rynghytan malyzyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Malaysian Ringgit"
    mFPlur(i, 1) = "Malaysian Ringgit"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "ringgit malaisien"
    mFPlur(i, 2) = "ringgits malaisiens"
    AddKey "myr", i
    AddKey U("0631 064A 0646 063A 064A 062A 0020 0645 0627 0644 064A 0632 064A"), i ' rynghyt malyzy
    ' --- IDR: rwbya a?ndwnysya ---
    i = 38
    mUId(i) = "IDR"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0631 0648 0628 064A 0629 0020 0625 0646 062F 0648 0646 064A 0633 064A 0629") ' rwbya a?ndwnysya
    mFPlur(i, 0) = U("0631 0648 0628 064A 0627 062A 0020 0625 0646 062F 0648 0646 064A 0633 064A 0629") ' rwbyat a?ndwnysya
    mFDual(i) = U("0631 0648 0628 064A 062A 0627 0646 0020 0625 0646 062F 0648 0646 064A 0633 064A 062A 0627 0646") ' rwbytan a?ndwnysytan
    mFAcc(i) = U("0631 0648 0628 064A 0629 0020 0625 0646 062F 0648 0646 064A 0633 064A 0629") ' rwbya a?ndwnysya
    mFHas(i, 1) = True
    mFSing(i, 1) = "Indonesian Rupiah"
    mFPlur(i, 1) = "Indonesian Rupiah"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = U("0072 006F 0075 0070 0069 0065 0020 0069 006E 0064 006F 006E 00E9 0073 0069 0065 006E 006E 0065") ' roupie indonesienne
    mFPlur(i, 2) = U("0072 006F 0075 0070 0069 0065 0073 0020 0069 006E 0064 006F 006E 00E9 0073 0069 0065 006E 006E 0065 0073") ' roupies indonesiennes
    AddKey "idr", i
    AddKey U("0631 0648 0628 064A 0629 0020 0625 0646 062F 0648 0646 064A 0633 064A 0629"), i ' rwbya a?ndwnysya
    ' --- KRW: wwn kwry jnwby ---
    i = 39
    mUId(i) = "KRW"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0648 0648 0646 0020 0643 0648 0631 064A 0020 062C 0646 0648 0628 064A") ' wwn kwry jnwby
    mFPlur(i, 0) = U("0648 0648 0646 0627 062A 0020 0643 0648 0631 064A 0629 0020 062C 0646 0648 0628 064A 0629") ' wwnat kwrya jnwbya
    mFDual(i) = U("0648 0648 0646 0627 0646 0020 0643 0648 0631 064A 0627 0646 0020 062C 0646 0648 0628 064A 0627 0646") ' wwnan kwryan jnwbyan
    mFAcc(i) = U("0648 0648 0646 0627 064B 0020 0643 0648 0631 064A 0627 064B 0020 062C 0646 0648 0628 064A 0627 064B") ' wwnan kwryan jnwbyan
    mFHas(i, 1) = True
    mFSing(i, 1) = "South Korean Won"
    mFPlur(i, 1) = "South Korean Won"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("0077 006F 006E 0020 0073 0075 0064 002D 0063 006F 0072 00E9 0065 006E") ' won sud-coreen
    mFPlur(i, 2) = U("0077 006F 006E 0073 0020 0073 0075 0064 002D 0063 006F 0072 00E9 0065 006E 0073") ' wons sud-coreens
    AddKey "krw", i
    AddKey U("0648 0648 0646 0020 0643 0648 0631 064A 0020 062C 0646 0648 0628 064A"), i ' wwn kwry jnwby
    AddKey U("0648 0648 0646 0020 0643 0648 0631 064A"), i ' wwn kwry
    ' --- SEK: krwna swydya ---
    i = 40
    mUId(i) = "SEK"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0643 0631 0648 0646 0629 0020 0633 0648 064A 062F 064A 0629") ' krwna swydya
    mFPlur(i, 0) = U("0643 0631 0648 0646 0627 062A 0020 0633 0648 064A 062F 064A 0629") ' krwnat swydya
    mFDual(i) = U("0643 0631 0648 0646 062A 0627 0646 0020 0633 0648 064A 062F 064A 062A 0627 0646") ' krwntan swydytan
    mFAcc(i) = U("0643 0631 0648 0646 0629 0020 0633 0648 064A 062F 064A 0629") ' krwna swydya
    mFHas(i, 1) = True
    mFSing(i, 1) = "Swedish Krona"
    mFPlur(i, 1) = "Swedish Kronor"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = U("0063 006F 0075 0072 006F 006E 006E 0065 0020 0073 0075 00E9 0064 006F 0069 0073 0065") ' couronne suedoise
    mFPlur(i, 2) = U("0063 006F 0075 0072 006F 006E 006E 0065 0073 0020 0073 0075 00E9 0064 006F 0069 0073 0065 0073") ' couronnes suedoises
    AddKey "sek", i
    AddKey U("0643 0631 0648 0646 0629 0020 0633 0648 064A 062F 064A 0629"), i ' krwna swydya
    ' --- NOK: krwna nrwyjya ---
    i = 41
    mUId(i) = "NOK"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0643 0631 0648 0646 0629 0020 0646 0631 0648 064A 062C 064A 0629") ' krwna nrwyjya
    mFPlur(i, 0) = U("0643 0631 0648 0646 0627 062A 0020 0646 0631 0648 064A 062C 064A 0629") ' krwnat nrwyjya
    mFDual(i) = U("0643 0631 0648 0646 062A 0627 0646 0020 0646 0631 0648 064A 062C 064A 062A 0627 0646") ' krwntan nrwyjytan
    mFAcc(i) = U("0643 0631 0648 0646 0629 0020 0646 0631 0648 064A 062C 064A 0629") ' krwna nrwyjya
    mFHas(i, 1) = True
    mFSing(i, 1) = "Norwegian Krone"
    mFPlur(i, 1) = "Norwegian Kroner"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = U("0063 006F 0075 0072 006F 006E 006E 0065 0020 006E 006F 0072 0076 00E9 0067 0069 0065 006E 006E 0065") ' couronne norvegienne
    mFPlur(i, 2) = U("0063 006F 0075 0072 006F 006E 006E 0065 0073 0020 006E 006F 0072 0076 00E9 0067 0069 0065 006E 006E 0065 0073") ' couronnes norvegiennes
    AddKey "nok", i
    AddKey U("0643 0631 0648 0646 0629 0020 0646 0631 0648 064A 062C 064A 0629"), i ' krwna nrwyjya
    ' --- DKK: krwna dnmarkya ---
    i = 42
    mUId(i) = "DKK"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0643 0631 0648 0646 0629 0020 062F 0646 0645 0627 0631 0643 064A 0629") ' krwna dnmarkya
    mFPlur(i, 0) = U("0643 0631 0648 0646 0627 062A 0020 062F 0646 0645 0627 0631 0643 064A 0629") ' krwnat dnmarkya
    mFDual(i) = U("0643 0631 0648 0646 062A 0627 0646 0020 062F 0646 0645 0627 0631 0643 064A 062A 0627 0646") ' krwntan dnmarkytan
    mFAcc(i) = U("0643 0631 0648 0646 0629 0020 062F 0646 0645 0627 0631 0643 064A 0629") ' krwna dnmarkya
    mFHas(i, 1) = True
    mFSing(i, 1) = "Danish Krone"
    mFPlur(i, 1) = "Danish Kroner"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "couronne danoise"
    mFPlur(i, 2) = "couronnes danoises"
    AddKey "dkk", i
    AddKey U("0643 0631 0648 0646 0629 0020 062F 0646 0645 0627 0631 0643 064A 0629"), i ' krwna dnmarkya
End Sub

Private Sub InitCatalog8()
    Dim i As Long, s As String
    ' --- BTC: bytkwyn ---
    i = 43
    mUId(i) = "BTC"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0628 064A 062A 0643 0648 064A 0646") ' bytkwyn
    mFPlur(i, 0) = U("0628 064A 062A 0643 0648 064A 0646 0627 062A") ' bytkwynat
    mFDual(i) = U("0628 064A 062A 0643 0648 064A 0646 0627 0646") ' bytkwynan
    mFAcc(i) = U("0628 064A 062A 0643 0648 064A 0646 0627 064B") ' bytkwynan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Bitcoin"
    mFPlur(i, 1) = "Bitcoins"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "bitcoin"
    mFPlur(i, 2) = "bitcoins"
    mUHasSub(i) = True
    mUSubDigits(i) = 8
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0633 0627 062A 0648 0634 064A") ' satwshy
    mSPlur(i, 0) = U("0633 0627 062A 0648 0634 064A") ' satwshy
    mSDual(i) = U("0633 0627 062A 0648 0634 064A 0627 0646") ' satwshyan
    mSAcc(i) = U("0633 0627 062A 0648 0634 064A") ' satwshy
    mSHas(i, 1) = True
    mSSing(i, 1) = "Satoshi"
    mSPlur(i, 1) = "Satoshis"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "satoshi"
    mSPlur(i, 2) = "satoshis"
    AddKey "btc", i
    AddKey U("0628 064A 062A 0643 0648 064A 0646"), i ' bytkwyn
    AddKey U("0628 062A 0643 0648 064A 0646"), i ' btkwyn
    ' --- ETH: a?ythyrywm ---
    i = 44
    mUId(i) = "ETH"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0625 064A 062B 064A 0631 064A 0648 0645") ' a?ythyrywm
    mFPlur(i, 0) = U("0625 064A 062B 064A 0631 064A 0648 0645 0627 062A") ' a?ythyrywmat
    mFDual(i) = U("0625 064A 062B 064A 0631 064A 0648 0645 0627 0646") ' a?ythyrywman
    mFAcc(i) = U("0625 064A 062B 064A 0631 064A 0648 0645 0627 064B") ' a?ythyrywman
    mFHas(i, 1) = True
    mFSing(i, 1) = "Ether"
    mFPlur(i, 1) = "Ether"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "ether"
    mFPlur(i, 2) = "ethers"
    AddKey "eth", i
    AddKey U("0625 064A 062B 064A 0631 064A 0648 0645"), i ' a?ythyrywm
    AddKey U("0625 064A 062B 0631 064A 0648 0645"), i ' a?ythrywm
    AddKey U("0625 064A 062B 0631"), i ' a?ythr
    ' --- USDT: tythr ---
    i = 45
    mUId(i) = "USDT"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062A 064A 062B 0631") ' tythr
    mFPlur(i, 0) = U("062A 064A 062B 0631 0627 062A") ' tythrat
    mFDual(i) = U("062A 064A 062B 0631 0627 0646") ' tythran
    mFAcc(i) = U("062A 064A 062B 0631 0627 064B") ' tythran
    mFHas(i, 1) = True
    mFSing(i, 1) = "Tether"
    mFPlur(i, 1) = "Tether"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "tether"
    mFPlur(i, 2) = "tethers"
    AddKey "usdt", i
    AddKey U("062A 064A 062B 0631"), i ' tythr
    ' --- pound: jnyh ---
    i = 46
    mUId(i) = "pound"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062C 0646 064A 0647") ' jnyh
    mFPlur(i, 0) = U("062C 0646 064A 0647 0627 062A") ' jnyhat
    mFDual(i) = U("062C 0646 064A 0647 0627 0646") ' jnyhan
    mFAcc(i) = U("062C 0646 064A 0647 0627 064B") ' jnyhan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Pound"
    mFPlur(i, 1) = "Pounds"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "livre"
    mFPlur(i, 2) = "livres"
    AddKey "pound", i
    AddKey U("062C 0646 064A 0647"), i ' jnyh
    ' --- dinar: dynar ---
    i = 47
    mUId(i) = "dinar"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 064A 0646 0627 0631") ' dynar
    mFPlur(i, 0) = U("062F 0646 0627 0646 064A 0631") ' dnanyr
    mFDual(i) = U("062F 064A 0646 0627 0631 0627 0646") ' dynaran
    mFAcc(i) = U("062F 064A 0646 0627 0631 0627 064B") ' dynaran
    mFHas(i, 1) = True
    mFSing(i, 1) = "Dinar"
    mFPlur(i, 1) = "Dinars"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "dinar"
    mFPlur(i, 2) = "dinars"
    AddKey "dinar", i
    AddKey U("062F 064A 0646 0627 0631"), i ' dynar
    ' --- riyal: ryal ---
    i = 48
    mUId(i) = "riyal"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0631 064A 0627 0644") ' ryal
    mFPlur(i, 0) = U("0631 064A 0627 0644 0627 062A") ' ryalat
    mFDual(i) = U("0631 064A 0627 0644 0627 0646") ' ryalan
    mFAcc(i) = U("0631 064A 0627 0644 0627 064B") ' ryalan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Riyal"
    mFPlur(i, 1) = "Riyals"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "riyal"
    mFPlur(i, 2) = "riyals"
    AddKey "riyal", i
    AddKey U("0631 064A 0627 0644"), i ' ryal
End Sub

Private Sub InitCatalog9()
    Dim i As Long, s As String
    ' --- dirham: drhm ---
    i = 49
    mUId(i) = "dirham"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 0631 0647 0645") ' drhm
    mFPlur(i, 0) = U("062F 0631 0627 0647 0645") ' drahm
    mFDual(i) = U("062F 0631 0647 0645 0627 0646") ' drhman
    mFAcc(i) = U("062F 0631 0647 0645 0627 064B") ' drhman
    mFHas(i, 1) = True
    mFSing(i, 1) = "Dirham"
    mFPlur(i, 1) = "Dirhams"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "dirham"
    mFPlur(i, 2) = "dirhams"
    AddKey "dirham", i
    AddKey U("062F 0631 0647 0645"), i ' drhm
    ' --- lira: lyra ---
    i = 50
    mUId(i) = "lira"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0644 064A 0631 0629") ' lyra
    mFPlur(i, 0) = U("0644 064A 0631 0627 062A") ' lyrat
    mFDual(i) = U("0644 064A 0631 062A 0627 0646") ' lyrtan
    mFAcc(i) = U("0644 064A 0631 0629") ' lyra
    mFHas(i, 1) = True
    mFSing(i, 1) = "Lira"
    mFPlur(i, 1) = "Lira"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "livre"
    mFPlur(i, 2) = "livres"
    AddKey "lira", i
    AddKey U("0644 064A 0631 0629"), i ' lyra
    ' --- dollar: dwlar ---
    i = 51
    mUId(i) = "dollar"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 0648 0644 0627 0631") ' dwlar
    mFPlur(i, 0) = U("062F 0648 0644 0627 0631 0627 062A") ' dwlarat
    mFDual(i) = U("062F 0648 0644 0627 0631 0627 0646") ' dwlaran
    mFAcc(i) = U("062F 0648 0644 0627 0631 0627 064B") ' dwlaran
    mFHas(i, 1) = True
    mFSing(i, 1) = "Dollar"
    mFPlur(i, 1) = "Dollars"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "dollar"
    mFPlur(i, 2) = "dollars"
    AddKey "dollar", i
    AddKey U("062F 0648 0644 0627 0631"), i ' dwlar
    ' --- franc: frnk ---
    i = 52
    mUId(i) = "franc"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0641 0631 0646 0643") ' frnk
    mFPlur(i, 0) = U("0641 0631 0646 0643 0627 062A") ' frnkat
    mFDual(i) = U("0641 0631 0646 0643 0627 0646") ' frnkan
    mFAcc(i) = U("0641 0631 0646 0643 0627 064B") ' frnkan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Franc"
    mFPlur(i, 1) = "Francs"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "franc"
    mFPlur(i, 2) = "francs"
    AddKey "franc", i
    AddKey U("0641 0631 0646 0643"), i ' frnk
    ' --- rupee: rwbya ---
    i = 53
    mUId(i) = "rupee"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0631 0648 0628 064A 0629") ' rwbya
    mFPlur(i, 0) = U("0631 0648 0628 064A 0627 062A") ' rwbyat
    mFDual(i) = U("0631 0648 0628 064A 062A 0627 0646") ' rwbytan
    mFAcc(i) = U("0631 0648 0628 064A 0629") ' rwbya
    mFHas(i, 1) = True
    mFSing(i, 1) = "Rupee"
    mFPlur(i, 1) = "Rupees"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "roupie"
    mFPlur(i, 2) = "roupies"
    AddKey "rupee", i
    AddKey U("0631 0648 0628 064A 0629"), i ' rwbya
    ' --- euro: ywrw ---
    i = 54
    mUId(i) = "euro"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("064A 0648 0631 0648") ' ywrw
    mFPlur(i, 0) = U("064A 0648 0631 0648") ' ywrw
    mFDual(i) = U("064A 0648 0631 0648 0627 0646") ' ywrwan
    mFAcc(i) = U("064A 0648 0631 0648") ' ywrw
    mFHas(i, 1) = True
    mFSing(i, 1) = "Euro"
    mFPlur(i, 1) = "Euros"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "euro"
    mFPlur(i, 2) = "euros"
    AddKey "euro", i
    AddKey U("064A 0648 0631 0648"), i ' ywrw
End Sub

Private Sub InitCatalog10()
    Dim i As Long, s As String
    ' --- yen: yn ---
    i = 55
    mUId(i) = "yen"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("064A 0646") ' yn
    mFPlur(i, 0) = U("064A 0646 0627 062A") ' ynat
    mFDual(i) = U("064A 0646 0627 0646") ' ynan
    mFAcc(i) = U("064A 0646 0627 064B") ' ynan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Yen"
    mFPlur(i, 1) = "Yen"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "yen"
    mFPlur(i, 2) = "yens"
    AddKey "yen", i
    AddKey U("064A 0646"), i ' yn
    ' --- gram: ghram ---
    i = 56
    mUId(i) = "gram"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("063A 0631 0627 0645") ' ghram
    mFPlur(i, 0) = U("063A 0631 0627 0645 0627 062A") ' ghramat
    mFDual(i) = U("063A 0631 0627 0645 0627 0646") ' ghraman
    mFAcc(i) = U("063A 0631 0627 0645 0627 064B") ' ghraman
    mFHas(i, 1) = True
    mFSing(i, 1) = "Gram"
    mFPlur(i, 1) = "Grams"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "gramme"
    mFPlur(i, 2) = "grammes"
    AddKey "gram", i
    AddKey U("063A 0631 0627 0645"), i ' ghram
    AddKey U("062C 0631 0627 0645"), i ' jram
    AddKey U("063A"), i ' gh
    AddKey U("062C 0645"), i ' jm
    AddKey "g", i
    ' --- kilogram: kylwghram ---
    i = 57
    mUId(i) = "kilogram"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0643 064A 0644 0648 063A 0631 0627 0645") ' kylwghram
    mFPlur(i, 0) = U("0643 064A 0644 0648 063A 0631 0627 0645 0627 062A") ' kylwghramat
    mFDual(i) = U("0643 064A 0644 0648 063A 0631 0627 0645 0627 0646") ' kylwghraman
    mFAcc(i) = U("0643 064A 0644 0648 063A 0631 0627 0645 0627 064B") ' kylwghraman
    mFHas(i, 1) = True
    mFSing(i, 1) = "Kilogram"
    mFPlur(i, 1) = "Kilograms"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "kilogramme"
    mFPlur(i, 2) = "kilogrammes"
    mUHasSub(i) = True
    mUSubDigits(i) = 3
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("063A 0631 0627 0645") ' ghram
    mSPlur(i, 0) = U("063A 0631 0627 0645 0627 062A") ' ghramat
    mSDual(i) = U("063A 0631 0627 0645 0627 0646") ' ghraman
    mSAcc(i) = U("063A 0631 0627 0645 0627 064B") ' ghraman
    mSHas(i, 1) = True
    mSSing(i, 1) = "Gram"
    mSPlur(i, 1) = "Grams"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "gramme"
    mSPlur(i, 2) = "grammes"
    AddKey "kilogram", i
    AddKey U("0643 064A 0644 0648 063A 0631 0627 0645"), i ' kylwghram
    AddKey U("0643 063A"), i ' kgh
    AddKey "kg", i
    ' --- ton: tn ---
    i = 58
    mUId(i) = "ton"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0637 0646") ' tn
    mFPlur(i, 0) = U("0623 0637 0646 0627 0646") ' a?tnan
    mFDual(i) = U("0637 0646 0627 0646") ' tnan
    mFAcc(i) = U("0637 0646 0627 064B") ' tnan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Tonne"
    mFPlur(i, 1) = "Tonnes"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "tonne"
    mFPlur(i, 2) = "tonnes"
    AddKey "ton", i
    AddKey U("0637 0646"), i ' tn
    AddKey "t", i
    ' --- milligram: mllyghram ---
    i = 59
    mUId(i) = "milligram"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0645 0644 0644 064A 063A 0631 0627 0645") ' mllyghram
    mFPlur(i, 0) = U("0645 0644 0644 064A 063A 0631 0627 0645 0627 062A") ' mllyghramat
    mFDual(i) = U("0645 0644 0644 064A 063A 0631 0627 0645 0627 0646") ' mllyghraman
    mFAcc(i) = U("0645 0644 0644 064A 063A 0631 0627 0645 0627 064B") ' mllyghraman
    mFHas(i, 1) = True
    mFSing(i, 1) = "Milligram"
    mFPlur(i, 1) = "Milligrams"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "milligramme"
    mFPlur(i, 2) = "milligrammes"
    AddKey "milligram", i
    AddKey U("0645 0644 0644 064A 063A 0631 0627 0645"), i ' mllyghram
    AddKey U("0645 0644 064A 063A 0631 0627 0645"), i ' mlyghram
    AddKey U("0645 0644 063A"), i ' mlgh
    AddKey "mg", i
    ' --- ounce: a?wnsa ---
    i = 60
    mUId(i) = "ounce"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0623 0648 0646 0635 0629") ' a?wnsa
    mFPlur(i, 0) = U("0623 0648 0646 0635 0627 062A") ' a?wnsat
    mFDual(i) = U("0623 0648 0646 0635 062A 0627 0646") ' a?wnstan
    mFAcc(i) = U("0623 0648 0646 0635 0629") ' a?wnsa
    mFHas(i, 1) = True
    mFSing(i, 1) = "Ounce"
    mFPlur(i, 1) = "Ounces"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "once"
    mFPlur(i, 2) = "onces"
    AddKey "ounce", i
    AddKey U("0623 0648 0646 0635 0629"), i ' a?wnsa
    AddKey U("0623 0648 0642 064A 0629"), i ' a?wqya
    AddKey "oz", i
End Sub

Private Sub InitCatalog11()
    Dim i As Long, s As String
    ' --- pound_weight: rtl ---
    i = 61
    mUId(i) = "pound_weight"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0631 0637 0644") ' rtl
    mFPlur(i, 0) = U("0623 0631 0637 0627 0644") ' a?rtal
    mFDual(i) = U("0631 0637 0644 0627 0646") ' rtlan
    mFAcc(i) = U("0631 0637 0644 0627 064B") ' rtlan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Pound"
    mFPlur(i, 1) = "Pounds"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "livre"
    mFPlur(i, 2) = "livres"
    AddKey "pound_weight", i
    AddKey U("0631 0637 0644"), i ' rtl
    AddKey "lb", i
    ' --- carat: qyrat ---
    i = 62
    mUId(i) = "carat"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0642 064A 0631 0627 0637") ' qyrat
    mFPlur(i, 0) = U("0642 0631 0627 0631 064A 0637") ' qraryt
    mFDual(i) = U("0642 064A 0631 0627 0637 0627 0646") ' qyratan
    mFAcc(i) = U("0642 064A 0631 0627 0637 0627 064B") ' qyratan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Carat"
    mFPlur(i, 1) = "Carats"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "carat"
    mFPlur(i, 2) = "carats"
    AddKey "carat", i
    AddKey U("0642 064A 0631 0627 0637"), i ' qyrat
    AddKey "ct", i
    ' --- liter: ltr ---
    i = 63
    mUId(i) = "liter"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0644 062A 0631") ' ltr
    mFPlur(i, 0) = U("0644 062A 0631 0627 062A") ' ltrat
    mFDual(i) = U("0644 062A 0631 0627 0646") ' ltran
    mFAcc(i) = U("0644 062A 0631 0627 064B") ' ltran
    mFHas(i, 1) = True
    mFSing(i, 1) = "Litre"
    mFPlur(i, 1) = "Litres"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "litre"
    mFPlur(i, 2) = "litres"
    mUHasSub(i) = True
    mUSubDigits(i) = 3
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0645 0644 064A 0644 062A 0631") ' mlyltr
    mSPlur(i, 0) = U("0645 0644 064A 0644 062A 0631 0627 062A") ' mlyltrat
    mSDual(i) = U("0645 0644 064A 0644 062A 0631 0627 0646") ' mlyltran
    mSAcc(i) = U("0645 0644 064A 0644 062A 0631 0627 064B") ' mlyltran
    mSHas(i, 1) = True
    mSSing(i, 1) = "Millilitre"
    mSPlur(i, 1) = "Millilitres"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = "millilitre"
    mSPlur(i, 2) = "millilitres"
    AddKey "liter", i
    AddKey U("0644 062A 0631"), i ' ltr
    AddKey U("0644 064A 062A 0631"), i ' lytr
    AddKey "l", i
    ' --- cubic_meter: mtr mk'b ---
    i = 64
    mUId(i) = "cubic_meter"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0645 062A 0631 0020 0645 0643 0639 0628") ' mtr mk'b
    mFPlur(i, 0) = U("0623 0645 062A 0627 0631 0020 0645 0643 0639 0628 0629") ' a?mtar mk'ba
    mFDual(i) = U("0645 062A 0631 0627 0646 0020 0645 0643 0639 0628 0627 0646") ' mtran mk'ban
    mFAcc(i) = U("0645 062A 0631 0627 064B 0020 0645 0643 0639 0628 0627 064B") ' mtran mk'ban
    mFHas(i, 1) = True
    mFSing(i, 1) = "Cubic Metre"
    mFPlur(i, 1) = "Cubic Metres"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("006D 00E8 0074 0072 0065 0020 0063 0075 0062 0065") ' metre cube
    mFPlur(i, 2) = U("006D 00E8 0074 0072 0065 0073 0020 0063 0075 0062 0065 0073") ' metres cubes
    AddKey "cubic_meter", i
    AddKey U("0645 062A 0631 0020 0645 0643 0639 0628"), i ' mtr mk'b
    AddKey U("0645 0033"), i ' m3
    AddKey "m3", i
    ' --- gallon: ghalwn ---
    i = 65
    mUId(i) = "gallon"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("063A 0627 0644 0648 0646") ' ghalwn
    mFPlur(i, 0) = U("063A 0627 0644 0648 0646 0627 062A") ' ghalwnat
    mFDual(i) = U("063A 0627 0644 0648 0646 0627 0646") ' ghalwnan
    mFAcc(i) = U("063A 0627 0644 0648 0646 0627 064B") ' ghalwnan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Gallon"
    mFPlur(i, 1) = "Gallons"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "gallon"
    mFPlur(i, 2) = "gallons"
    AddKey "gallon", i
    AddKey U("063A 0627 0644 0648 0646"), i ' ghalwn
    AddKey U("062C 0627 0644 0648 0646"), i ' jalwn
    AddKey "gal", i
    ' --- barrel: brmyl ---
    i = 66
    mUId(i) = "barrel"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0628 0631 0645 064A 0644") ' brmyl
    mFPlur(i, 0) = U("0628 0631 0627 0645 064A 0644") ' bramyl
    mFDual(i) = U("0628 0631 0645 064A 0644 0627 0646") ' brmylan
    mFAcc(i) = U("0628 0631 0645 064A 0644 0627 064B") ' brmylan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Barrel"
    mFPlur(i, 1) = "Barrels"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "baril"
    mFPlur(i, 2) = "barils"
    AddKey "barrel", i
    AddKey U("0628 0631 0645 064A 0644"), i ' brmyl
    AddKey "bbl", i
End Sub

Private Sub InitCatalog12()
    Dim i As Long, s As String
    ' --- meter: mtr ---
    i = 67
    mUId(i) = "meter"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0645 062A 0631") ' mtr
    mFPlur(i, 0) = U("0623 0645 062A 0627 0631") ' a?mtar
    mFDual(i) = U("0645 062A 0631 0627 0646") ' mtran
    mFAcc(i) = U("0645 062A 0631 0627 064B") ' mtran
    mFHas(i, 1) = True
    mFSing(i, 1) = "Metre"
    mFPlur(i, 1) = "Metres"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("006D 00E8 0074 0072 0065") ' metre
    mFPlur(i, 2) = U("006D 00E8 0074 0072 0065 0073") ' metres
    mUHasSub(i) = True
    mUSubDigits(i) = 2
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0633 0646 062A 064A 0645 062A 0631") ' sntymtr
    mSPlur(i, 0) = U("0633 0646 062A 064A 0645 062A 0631 0627 062A") ' sntymtrat
    mSDual(i) = U("0633 0646 062A 064A 0645 062A 0631 0627 0646") ' sntymtran
    mSAcc(i) = U("0633 0646 062A 064A 0645 062A 0631 0627 064B") ' sntymtran
    mSHas(i, 1) = True
    mSSing(i, 1) = "Centimetre"
    mSPlur(i, 1) = "Centimetres"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = U("0063 0065 006E 0074 0069 006D 00E8 0074 0072 0065") ' centimetre
    mSPlur(i, 2) = U("0063 0065 006E 0074 0069 006D 00E8 0074 0072 0065 0073") ' centimetres
    AddKey "meter", i
    AddKey U("0645 062A 0631"), i ' mtr
    AddKey U("0645"), i ' m
    AddKey "m", i
    ' --- centimeter: sntymtr ---
    i = 68
    mUId(i) = "centimeter"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0633 0646 062A 064A 0645 062A 0631") ' sntymtr
    mFPlur(i, 0) = U("0633 0646 062A 064A 0645 062A 0631 0627 062A") ' sntymtrat
    mFDual(i) = U("0633 0646 062A 064A 0645 062A 0631 0627 0646") ' sntymtran
    mFAcc(i) = U("0633 0646 062A 064A 0645 062A 0631 0627 064B") ' sntymtran
    mFHas(i, 1) = True
    mFSing(i, 1) = "Centimetre"
    mFPlur(i, 1) = "Centimetres"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("0063 0065 006E 0074 0069 006D 00E8 0074 0072 0065") ' centimetre
    mFPlur(i, 2) = U("0063 0065 006E 0074 0069 006D 00E8 0074 0072 0065 0073") ' centimetres
    AddKey "centimeter", i
    AddKey U("0633 0646 062A 064A 0645 062A 0631"), i ' sntymtr
    AddKey U("0633 0646 062A 0645 062A 0631"), i ' sntmtr
    AddKey U("0633 0645"), i ' sm
    AddKey "cm", i
    ' --- millimeter: mlymtr ---
    i = 69
    mUId(i) = "millimeter"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0645 0644 064A 0645 062A 0631") ' mlymtr
    mFPlur(i, 0) = U("0645 0644 064A 0645 062A 0631 0627 062A") ' mlymtrat
    mFDual(i) = U("0645 0644 064A 0645 062A 0631 0627 0646") ' mlymtran
    mFAcc(i) = U("0645 0644 064A 0645 062A 0631 0627 064B") ' mlymtran
    mFHas(i, 1) = True
    mFSing(i, 1) = "Millimetre"
    mFPlur(i, 1) = "Millimetres"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("006D 0069 006C 006C 0069 006D 00E8 0074 0072 0065") ' millimetre
    mFPlur(i, 2) = U("006D 0069 006C 006C 0069 006D 00E8 0074 0072 0065 0073") ' millimetres
    AddKey "millimeter", i
    AddKey U("0645 0644 064A 0645 062A 0631"), i ' mlymtr
    AddKey U("0645 0644 0645"), i ' mlm
    AddKey U("0645 0645"), i ' mm
    AddKey "mm", i
    ' --- kilometer: kylwmtr ---
    i = 70
    mUId(i) = "kilometer"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0643 064A 0644 0648 0645 062A 0631") ' kylwmtr
    mFPlur(i, 0) = U("0643 064A 0644 0648 0645 062A 0631 0627 062A") ' kylwmtrat
    mFDual(i) = U("0643 064A 0644 0648 0645 062A 0631 0627 0646") ' kylwmtran
    mFAcc(i) = U("0643 064A 0644 0648 0645 062A 0631 0627 064B") ' kylwmtran
    mFHas(i, 1) = True
    mFSing(i, 1) = "Kilometre"
    mFPlur(i, 1) = "Kilometres"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("006B 0069 006C 006F 006D 00E8 0074 0072 0065") ' kilometre
    mFPlur(i, 2) = U("006B 0069 006C 006F 006D 00E8 0074 0072 0065 0073") ' kilometres
    mUHasSub(i) = True
    mUSubDigits(i) = 3
    mSHas(i, 0) = True
    mSGender(i, 0) = 0
    mSSing(i, 0) = U("0645 062A 0631") ' mtr
    mSPlur(i, 0) = U("0623 0645 062A 0627 0631") ' a?mtar
    mSDual(i) = U("0645 062A 0631 0627 0646") ' mtran
    mSAcc(i) = U("0645 062A 0631 0627 064B") ' mtran
    mSHas(i, 1) = True
    mSSing(i, 1) = "Metre"
    mSPlur(i, 1) = "Metres"
    mSHas(i, 2) = True
    mSGender(i, 2) = 0
    mSSing(i, 2) = U("006D 00E8 0074 0072 0065") ' metre
    mSPlur(i, 2) = U("006D 00E8 0074 0072 0065 0073") ' metres
    AddKey "kilometer", i
    AddKey U("0643 064A 0644 0648 0645 062A 0631"), i ' kylwmtr
    AddKey U("0643 0645"), i ' km
    AddKey "km", i
    ' --- mile: myl ---
    i = 71
    mUId(i) = "mile"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0645 064A 0644") ' myl
    mFPlur(i, 0) = U("0623 0645 064A 0627 0644") ' a?myal
    mFDual(i) = U("0645 064A 0644 0627 0646") ' mylan
    mFAcc(i) = U("0645 064A 0644 0627 064B") ' mylan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Mile"
    mFPlur(i, 1) = "Miles"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "mile"
    mFPlur(i, 2) = "miles"
    AddKey "mile", i
    AddKey U("0645 064A 0644"), i ' myl
    AddKey "mi", i
    ' --- foot: qdm ---
    i = 72
    mUId(i) = "foot"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0642 062F 0645") ' qdm
    mFPlur(i, 0) = U("0623 0642 062F 0627 0645") ' a?qdam
    mFDual(i) = U("0642 062F 0645 0627 0646") ' qdman
    mFAcc(i) = U("0642 062F 0645 0627 064B") ' qdman
    mFHas(i, 1) = True
    mFSing(i, 1) = "Foot"
    mFPlur(i, 1) = "Feet"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "pied"
    mFPlur(i, 2) = "pieds"
    AddKey "foot", i
    AddKey U("0642 062F 0645"), i ' qdm
    AddKey "ft", i
End Sub

Private Sub InitCatalog13()
    Dim i As Long, s As String
    ' --- inch: bwsa ---
    i = 73
    mUId(i) = "inch"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0628 0648 0635 0629") ' bwsa
    mFPlur(i, 0) = U("0628 0648 0635 0627 062A") ' bwsat
    mFDual(i) = U("0628 0648 0635 062A 0627 0646") ' bwstan
    mFAcc(i) = U("0628 0648 0635 0629") ' bwsa
    mFHas(i, 1) = True
    mFSing(i, 1) = "Inch"
    mFPlur(i, 1) = "Inches"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "pouce"
    mFPlur(i, 2) = "pouces"
    AddKey "inch", i
    AddKey U("0628 0648 0635 0629"), i ' bwsa
    AddKey U("0625 0646 0634"), i ' a?nsh
    AddKey U("0627 0646 0634"), i ' ansh
    AddKey "in", i
    ' --- yard: yarda ---
    i = 74
    mUId(i) = "yard"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("064A 0627 0631 062F 0629") ' yarda
    mFPlur(i, 0) = U("064A 0627 0631 062F 0627 062A") ' yardat
    mFDual(i) = U("064A 0627 0631 062F 062A 0627 0646") ' yardtan
    mFAcc(i) = U("064A 0627 0631 062F 0629") ' yarda
    mFHas(i, 1) = True
    mFSing(i, 1) = "Yard"
    mFPlur(i, 1) = "Yards"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "yard"
    mFPlur(i, 2) = "yards"
    AddKey "yard", i
    AddKey U("064A 0627 0631 062F 0629"), i ' yarda
    AddKey "yd", i
    ' --- square_meter: mtr mrb' ---
    i = 75
    mUId(i) = "square_meter"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0645 062A 0631 0020 0645 0631 0628 0639") ' mtr mrb'
    mFPlur(i, 0) = U("0623 0645 062A 0627 0631 0020 0645 0631 0628 0639 0629") ' a?mtar mrb'a
    mFDual(i) = U("0645 062A 0631 0627 0646 0020 0645 0631 0628 0639 0627 0646") ' mtran mrb'an
    mFAcc(i) = U("0645 062A 0631 0627 064B 0020 0645 0631 0628 0639 0627 064B") ' mtran mrb'an
    mFHas(i, 1) = True
    mFSing(i, 1) = "Square Metre"
    mFPlur(i, 1) = "Square Metres"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("006D 00E8 0074 0072 0065 0020 0063 0061 0072 0072 00E9") ' metre carre
    mFPlur(i, 2) = U("006D 00E8 0074 0072 0065 0073 0020 0063 0061 0072 0072 00E9 0073") ' metres carres
    AddKey "square_meter", i
    AddKey U("0645 062A 0631 0020 0645 0631 0628 0639"), i ' mtr mrb'
    AddKey U("0645 0032"), i ' m2
    AddKey "m2", i
    ' --- square_kilometer: kylwmtr mrb' ---
    i = 76
    mUId(i) = "square_kilometer"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0643 064A 0644 0648 0645 062A 0631 0020 0645 0631 0628 0639") ' kylwmtr mrb'
    mFPlur(i, 0) = U("0643 064A 0644 0648 0645 062A 0631 0627 062A 0020 0645 0631 0628 0639 0629") ' kylwmtrat mrb'a
    mFDual(i) = U("0643 064A 0644 0648 0645 062A 0631 0627 0646 0020 0645 0631 0628 0639 0627 0646") ' kylwmtran mrb'an
    mFAcc(i) = U("0643 064A 0644 0648 0645 062A 0631 0627 064B 0020 0645 0631 0628 0639 0627 064B") ' kylwmtran mrb'an
    mFHas(i, 1) = True
    mFSing(i, 1) = "Square Kilometre"
    mFPlur(i, 1) = "Square Kilometres"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("006B 0069 006C 006F 006D 00E8 0074 0072 0065 0020 0063 0061 0072 0072 00E9") ' kilometre carre
    mFPlur(i, 2) = U("006B 0069 006C 006F 006D 00E8 0074 0072 0065 0073 0020 0063 0061 0072 0072 00E9 0073") ' kilometres carres
    AddKey "square_kilometer", i
    AddKey U("0643 064A 0644 0648 0645 062A 0631 0020 0645 0631 0628 0639"), i ' kylwmtr mrb'
    AddKey U("0643 0645 0032"), i ' km2
    AddKey "km2", i
    ' --- dunam: dwnm ---
    i = 77
    mUId(i) = "dunam"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062F 0648 0646 0645") ' dwnm
    mFPlur(i, 0) = U("062F 0648 0646 0645 0627 062A") ' dwnmat
    mFDual(i) = U("062F 0648 0646 0645 0627 0646") ' dwnman
    mFAcc(i) = U("062F 0648 0646 0645 0627 064B") ' dwnman
    mFHas(i, 1) = True
    mFSing(i, 1) = "Dunam"
    mFPlur(i, 1) = "Dunams"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "dounam"
    mFPlur(i, 2) = "dounams"
    AddKey "dunam", i
    AddKey U("062F 0648 0646 0645"), i ' dwnm
    ' --- feddan: fdan ---
    i = 78
    mUId(i) = "feddan"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0641 062F 0627 0646") ' fdan
    mFPlur(i, 0) = U("0623 0641 062F 0646 0629") ' a?fdna
    mFDual(i) = U("0641 062F 0627 0646 0627 0646") ' fdanan
    mFAcc(i) = U("0641 062F 0627 0646 0627 064B") ' fdanan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Feddan"
    mFPlur(i, 1) = "Feddans"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "feddan"
    mFPlur(i, 2) = "feddans"
    AddKey "feddan", i
    AddKey U("0641 062F 0627 0646"), i ' fdan
End Sub

Private Sub InitCatalog14()
    Dim i As Long, s As String
    ' --- hectare: hktar ---
    i = 79
    mUId(i) = "hectare"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0647 0643 062A 0627 0631") ' hktar
    mFPlur(i, 0) = U("0647 0643 062A 0627 0631 0627 062A") ' hktarat
    mFDual(i) = U("0647 0643 062A 0627 0631 0627 0646") ' hktaran
    mFAcc(i) = U("0647 0643 062A 0627 0631 0627 064B") ' hktaran
    mFHas(i, 1) = True
    mFSing(i, 1) = "Hectare"
    mFPlur(i, 1) = "Hectares"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "hectare"
    mFPlur(i, 2) = "hectares"
    AddKey "hectare", i
    AddKey U("0647 0643 062A 0627 0631"), i ' hktar
    AddKey "ha", i
    ' --- second: thanya ---
    i = 80
    mUId(i) = "second"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("062B 0627 0646 064A 0629") ' thanya
    mFPlur(i, 0) = U("062B 0648 0627 0646") ' thwan
    mFDual(i) = U("062B 0627 0646 064A 062A 0627 0646") ' thanytan
    mFAcc(i) = U("062B 0627 0646 064A 0629") ' thanya
    mFHas(i, 1) = True
    mFSing(i, 1) = "Second"
    mFPlur(i, 1) = "Seconds"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "seconde"
    mFPlur(i, 2) = "secondes"
    AddKey "second", i
    AddKey U("062B 0627 0646 064A 0629"), i ' thanya
    AddKey "s", i
    ' --- minute: dqyqa ---
    i = 81
    mUId(i) = "minute"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("062F 0642 064A 0642 0629") ' dqyqa
    mFPlur(i, 0) = U("062F 0642 0627 0626 0642") ' dqay?q
    mFDual(i) = U("062F 0642 064A 0642 062A 0627 0646") ' dqyqtan
    mFAcc(i) = U("062F 0642 064A 0642 0629") ' dqyqa
    mFHas(i, 1) = True
    mFSing(i, 1) = "Minute"
    mFPlur(i, 1) = "Minutes"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "minute"
    mFPlur(i, 2) = "minutes"
    AddKey "minute", i
    AddKey U("062F 0642 064A 0642 0629"), i ' dqyqa
    AddKey "min", i
    ' --- hour: sa'a ---
    i = 82
    mUId(i) = "hour"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0633 0627 0639 0629") ' sa'a
    mFPlur(i, 0) = U("0633 0627 0639 0627 062A") ' sa'at
    mFDual(i) = U("0633 0627 0639 062A 0627 0646") ' sa'tan
    mFAcc(i) = U("0633 0627 0639 0629") ' sa'a
    mFHas(i, 1) = True
    mFSing(i, 1) = "Hour"
    mFPlur(i, 1) = "Hours"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "heure"
    mFPlur(i, 2) = "heures"
    AddKey "hour", i
    AddKey U("0633 0627 0639 0629"), i ' sa'a
    AddKey "h", i
    ' --- day: ywm ---
    i = 83
    mUId(i) = "day"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("064A 0648 0645") ' ywm
    mFPlur(i, 0) = U("0623 064A 0627 0645") ' a?yam
    mFDual(i) = U("064A 0648 0645 0627 0646") ' ywman
    mFAcc(i) = U("064A 0648 0645 0627 064B") ' ywman
    mFHas(i, 1) = True
    mFSing(i, 1) = "Day"
    mFPlur(i, 1) = "Days"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "jour"
    mFPlur(i, 2) = "jours"
    AddKey "day", i
    AddKey U("064A 0648 0645"), i ' ywm
    ' --- week: a?sbw' ---
    i = 84
    mUId(i) = "week"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0623 0633 0628 0648 0639") ' a?sbw'
    mFPlur(i, 0) = U("0623 0633 0627 0628 064A 0639") ' a?saby'
    mFDual(i) = U("0623 0633 0628 0648 0639 0627 0646") ' a?sbw'an
    mFAcc(i) = U("0623 0633 0628 0648 0639 0627 064B") ' a?sbw'an
    mFHas(i, 1) = True
    mFSing(i, 1) = "Week"
    mFPlur(i, 1) = "Weeks"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "semaine"
    mFPlur(i, 2) = "semaines"
    AddKey "week", i
    AddKey U("0623 0633 0628 0648 0639"), i ' a?sbw'
End Sub

Private Sub InitCatalog15()
    Dim i As Long, s As String
    ' --- month: shhr ---
    i = 85
    mUId(i) = "month"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0634 0647 0631") ' shhr
    mFPlur(i, 0) = U("0623 0634 0647 0631") ' a?shhr
    mFDual(i) = U("0634 0647 0631 0627 0646") ' shhran
    mFAcc(i) = U("0634 0647 0631 0627 064B") ' shhran
    mFHas(i, 1) = True
    mFSing(i, 1) = "Month"
    mFPlur(i, 1) = "Months"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "mois"
    mFPlur(i, 2) = "mois"
    AddKey "month", i
    AddKey U("0634 0647 0631"), i ' shhr
    ' --- year: sna ---
    i = 86
    mUId(i) = "year"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0633 0646 0629") ' sna
    mFPlur(i, 0) = U("0633 0646 0648 0627 062A") ' snwat
    mFDual(i) = U("0633 0646 062A 0627 0646") ' sntan
    mFAcc(i) = U("0633 0646 0629") ' sna
    mFHas(i, 1) = True
    mFSing(i, 1) = "Year"
    mFPlur(i, 1) = "Years"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "an"
    mFPlur(i, 2) = "ans"
    AddKey "year", i
    AddKey U("0633 0646 0629"), i ' sna
    ' --- piece: qt'a ---
    i = 87
    mUId(i) = "piece"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0642 0637 0639 0629") ' qt'a
    mFPlur(i, 0) = U("0642 0637 0639") ' qt'
    mFDual(i) = U("0642 0637 0639 062A 0627 0646") ' qt'tan
    mFAcc(i) = U("0642 0637 0639 0629") ' qt'a
    mFHas(i, 1) = True
    mFSing(i, 1) = "Piece"
    mFPlur(i, 1) = "Pieces"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = U("0070 0069 00E8 0063 0065") ' piece
    mFPlur(i, 2) = U("0070 0069 00E8 0063 0065 0073") ' pieces
    AddKey "piece", i
    AddKey U("0642 0637 0639 0629"), i ' qt'a
    ' --- item: hba ---
    i = 88
    mUId(i) = "item"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("062D 0628 0629") ' hba
    mFPlur(i, 0) = U("062D 0628 0627 062A") ' hbat
    mFDual(i) = U("062D 0628 062A 0627 0646") ' hbtan
    mFAcc(i) = U("062D 0628 0629") ' hba
    mFHas(i, 1) = True
    mFSing(i, 1) = "Item"
    mFPlur(i, 1) = "Items"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = U("0075 006E 0069 0074 00E9") ' unite
    mFPlur(i, 2) = U("0075 006E 0069 0074 00E9 0073") ' unites
    AddKey "item", i
    AddKey U("062D 0628 0629"), i ' hba
    ' --- pack: 'lba ---
    i = 89
    mUId(i) = "pack"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0639 0644 0628 0629") ' 'lba
    mFPlur(i, 0) = U("0639 0644 0628") ' 'lb
    mFDual(i) = U("0639 0644 0628 062A 0627 0646") ' 'lbtan
    mFAcc(i) = U("0639 0644 0628 0629") ' 'lba
    mFHas(i, 1) = True
    mFSing(i, 1) = "Pack"
    mFPlur(i, 1) = "Packs"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "paquet"
    mFPlur(i, 2) = "paquets"
    AddKey "pack", i
    AddKey U("0639 0644 0628 0629"), i ' 'lba
    ' --- box: sndwq ---
    i = 90
    mUId(i) = "box"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0635 0646 062F 0648 0642") ' sndwq
    mFPlur(i, 0) = U("0635 0646 0627 062F 064A 0642") ' snadyq
    mFDual(i) = U("0635 0646 062F 0648 0642 0627 0646") ' sndwqan
    mFAcc(i) = U("0635 0646 062F 0648 0642 0627 064B") ' sndwqan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Box"
    mFPlur(i, 1) = "Boxes"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = U("0062 006F 00EE 0074 0065") ' boite
    mFPlur(i, 2) = U("0062 006F 00EE 0074 0065 0073") ' boites
    AddKey "box", i
    AddKey U("0635 0646 062F 0648 0642"), i ' sndwq
End Sub

Private Sub InitCatalog16()
    Dim i As Long, s As String
    ' --- carton: krtwna ---
    i = 91
    mUId(i) = "carton"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0643 0631 062A 0648 0646 0629") ' krtwna
    mFPlur(i, 0) = U("0643 0631 0627 062A 064A 0646") ' kratyn
    mFDual(i) = U("0643 0631 062A 0648 0646 062A 0627 0646") ' krtwntan
    mFAcc(i) = U("0643 0631 062A 0648 0646 0629") ' krtwna
    mFHas(i, 1) = True
    mFSing(i, 1) = "Carton"
    mFPlur(i, 1) = "Cartons"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "carton"
    mFPlur(i, 2) = "cartons"
    AddKey "carton", i
    AddKey U("0643 0631 062A 0648 0646 0629"), i ' krtwna
    ' --- pallet: tblya ---
    i = 92
    mUId(i) = "pallet"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0637 0628 0644 064A 0629") ' tblya
    mFPlur(i, 0) = U("0637 0628 0644 064A 0627 062A") ' tblyat
    mFDual(i) = U("0637 0628 0644 064A 062A 0627 0646") ' tblytan
    mFAcc(i) = U("0637 0628 0644 064A 0629") ' tblya
    mFHas(i, 1) = True
    mFSing(i, 1) = "Pallet"
    mFPlur(i, 1) = "Pallets"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "palette"
    mFPlur(i, 2) = "palettes"
    AddKey "pallet", i
    AddKey U("0637 0628 0644 064A 0629"), i ' tblya
    ' --- dozen: dsta ---
    i = 93
    mUId(i) = "dozen"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("062F 0633 062A 0629") ' dsta
    mFPlur(i, 0) = U("062F 0633 062A 0627 062A") ' dstat
    mFDual(i) = U("062F 0633 062A 062A 0627 0646") ' dsttan
    mFAcc(i) = U("062F 0633 062A 0629") ' dsta
    mFHas(i, 1) = True
    mFSing(i, 1) = "Dozen"
    mFPlur(i, 1) = "Dozen"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "douzaine"
    mFPlur(i, 2) = "douzaines"
    AddKey "dozen", i
    AddKey U("062F 0633 062A 0629"), i ' dsta
    AddKey U("062F 0631 0632 0646"), i ' drzn
    AddKey U("062F 0632 064A 0646 0629"), i ' dzyna
    ' --- bag: kys ---
    i = 94
    mUId(i) = "bag"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0643 064A 0633") ' kys
    mFPlur(i, 0) = U("0623 0643 064A 0627 0633") ' a?kyas
    mFDual(i) = U("0643 064A 0633 0627 0646") ' kysan
    mFAcc(i) = U("0643 064A 0633 0627 064B") ' kysan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Bag"
    mFPlur(i, 1) = "Bags"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "sac"
    mFPlur(i, 2) = "sacs"
    AddKey "bag", i
    AddKey U("0643 064A 0633"), i ' kys
    ' --- roll: lfa ---
    i = 95
    mUId(i) = "roll"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0644 0641 0629") ' lfa
    mFPlur(i, 0) = U("0644 0641 0627 062A") ' lfat
    mFDual(i) = U("0644 0641 062A 0627 0646") ' lftan
    mFAcc(i) = U("0644 0641 0629") ' lfa
    mFHas(i, 1) = True
    mFSing(i, 1) = "Roll"
    mFPlur(i, 1) = "Rolls"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "rouleau"
    mFPlur(i, 2) = "rouleaux"
    AddKey "roll", i
    AddKey U("0644 0641 0629"), i ' lfa
    ' --- pair: zwj ---
    i = 96
    mUId(i) = "pair"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0632 0648 062C") ' zwj
    mFPlur(i, 0) = U("0623 0632 0648 0627 062C") ' a?zwaj
    mFDual(i) = U("0632 0648 062C 0627 0646") ' zwjan
    mFAcc(i) = U("0632 0648 062C 0627 064B") ' zwjan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Pair"
    mFPlur(i, 1) = "Pairs"
    mFHas(i, 2) = True
    mFGender(i, 2) = 1
    mFSing(i, 2) = "paire"
    mFPlur(i, 2) = "paires"
    AddKey "pair", i
    AddKey U("0632 0648 062C"), i ' zwj
End Sub

Private Sub InitCatalog17()
    Dim i As Long, s As String
    ' --- byte: bayt ---
    i = 97
    mUId(i) = "byte"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0628 0627 064A 062A") ' bayt
    mFPlur(i, 0) = U("0628 0627 064A 062A 0627 062A") ' baytat
    mFDual(i) = U("0628 0627 064A 062A 0627 0646") ' baytan
    mFAcc(i) = U("0628 0627 064A 062A 0627 064B") ' baytan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Byte"
    mFPlur(i, 1) = "Bytes"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "octet"
    mFPlur(i, 2) = "octets"
    AddKey "byte", i
    AddKey U("0628 0627 064A 062A"), i ' bayt
    AddKey "b", i
    ' --- kilobyte: kylwbayt ---
    i = 98
    mUId(i) = "kilobyte"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0643 064A 0644 0648 0628 0627 064A 062A") ' kylwbayt
    mFPlur(i, 0) = U("0643 064A 0644 0648 0628 0627 064A 062A 0627 062A") ' kylwbaytat
    mFDual(i) = U("0643 064A 0644 0648 0628 0627 064A 062A 0627 0646") ' kylwbaytan
    mFAcc(i) = U("0643 064A 0644 0648 0628 0627 064A 062A 0627 064B") ' kylwbaytan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Kilobyte"
    mFPlur(i, 1) = "Kilobytes"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "kilooctet"
    mFPlur(i, 2) = "kilooctets"
    AddKey "kilobyte", i
    AddKey U("0643 064A 0644 0648 0628 0627 064A 062A"), i ' kylwbayt
    AddKey "kb", i
    ' --- megabyte: myghabayt ---
    i = 99
    mUId(i) = "megabyte"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0645 064A 063A 0627 0628 0627 064A 062A") ' myghabayt
    mFPlur(i, 0) = U("0645 064A 063A 0627 0628 0627 064A 062A 0627 062A") ' myghabaytat
    mFDual(i) = U("0645 064A 063A 0627 0628 0627 064A 062A 0627 0646") ' myghabaytan
    mFAcc(i) = U("0645 064A 063A 0627 0628 0627 064A 062A 0627 064B") ' myghabaytan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Megabyte"
    mFPlur(i, 1) = "Megabytes"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("006D 00E9 0067 0061 006F 0063 0074 0065 0074") ' megaoctet
    mFPlur(i, 2) = U("006D 00E9 0067 0061 006F 0063 0074 0065 0074 0073") ' megaoctets
    AddKey "megabyte", i
    AddKey U("0645 064A 063A 0627 0628 0627 064A 062A"), i ' myghabayt
    AddKey U("0645 064A 062C 0627 0628 0627 064A 062A"), i ' myjabayt
    AddKey "mb", i
    ' --- gigabyte: ghyghabayt ---
    i = 100
    mUId(i) = "gigabyte"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("063A 064A 063A 0627 0628 0627 064A 062A") ' ghyghabayt
    mFPlur(i, 0) = U("063A 064A 063A 0627 0628 0627 064A 062A 0627 062A") ' ghyghabaytat
    mFDual(i) = U("063A 064A 063A 0627 0628 0627 064A 062A 0627 0646") ' ghyghabaytan
    mFAcc(i) = U("063A 064A 063A 0627 0628 0627 064A 062A 0627 064B") ' ghyghabaytan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Gigabyte"
    mFPlur(i, 1) = "Gigabytes"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "gigaoctet"
    mFPlur(i, 2) = "gigaoctets"
    AddKey "gigabyte", i
    AddKey U("063A 064A 063A 0627 0628 0627 064A 062A"), i ' ghyghabayt
    AddKey U("062C 064A 062C 0627 0628 0627 064A 062A"), i ' jyjabayt
    AddKey "gb", i
    ' --- terabyte: tyrabayt ---
    i = 101
    mUId(i) = "terabyte"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("062A 064A 0631 0627 0628 0627 064A 062A") ' tyrabayt
    mFPlur(i, 0) = U("062A 064A 0631 0627 0628 0627 064A 062A 0627 062A") ' tyrabaytat
    mFDual(i) = U("062A 064A 0631 0627 0628 0627 064A 062A 0627 0646") ' tyrabaytan
    mFAcc(i) = U("062A 064A 0631 0627 0628 0627 064A 062A 0627 064B") ' tyrabaytan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Terabyte"
    mFPlur(i, 1) = "Terabytes"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("0074 00E9 0072 0061 006F 0063 0074 0065 0074") ' teraoctet
    mFPlur(i, 2) = U("0074 00E9 0072 0061 006F 0063 0074 0065 0074 0073") ' teraoctets
    AddKey "terabyte", i
    AddKey U("062A 064A 0631 0627 0628 0627 064A 062A"), i ' tyrabayt
    AddKey "tb", i
    ' --- bit: bt ---
    i = 102
    mUId(i) = "bit"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0628 062A") ' bt
    mFPlur(i, 0) = U("0628 062A 0627 062A") ' btat
    mFDual(i) = U("0628 062A 0627 0646") ' btan
    mFAcc(i) = U("0628 062A 0627 064B") ' btan
    mFHas(i, 1) = True
    mFSing(i, 1) = "Bit"
    mFPlur(i, 1) = "Bits"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "bit"
    mFPlur(i, 2) = "bits"
    AddKey "bit", i
    AddKey U("0628 062A"), i ' bt
End Sub

Private Sub InitCatalog18()
    Dim i As Long, s As String
    ' --- km_per_hour: kylwmtr fy alsa'a ---
    i = 103
    mUId(i) = "km_per_hour"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0643 064A 0644 0648 0645 062A 0631 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' kylwmtr fy alsa'a
    mFPlur(i, 0) = U("0643 064A 0644 0648 0645 062A 0631 0627 062A 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' kylwmtrat fy alsa'a
    mFOne(i, 0) = U("0643 064A 0644 0648 0645 062A 0631 0020 0648 0627 062D 062F 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' kylwmtr wahd fy alsa'a
    mFDual(i) = U("0643 064A 0644 0648 0645 062A 0631 0627 0646 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' kylwmtran fy alsa'a
    mFAcc(i) = U("0643 064A 0644 0648 0645 062A 0631 0627 064B 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' kylwmtran fy alsa'a
    mFHas(i, 1) = True
    mFSing(i, 1) = "Kilometre per Hour"
    mFPlur(i, 1) = "Kilometres per Hour"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("006B 0069 006C 006F 006D 00E8 0074 0072 0065 0020 0070 0061 0072 0020 0068 0065 0075 0072 0065") ' kilometre par heure
    mFPlur(i, 2) = U("006B 0069 006C 006F 006D 00E8 0074 0072 0065 0073 0020 0070 0061 0072 0020 0068 0065 0075 0072 0065") ' kilometres par heure
    AddKey "km_per_hour", i
    AddKey U("0643 064A 0644 0648 0645 062A 0631 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629"), i ' kylwmtr fy alsa'a
    AddKey U("0643 0645 002F 0633"), i ' km/s
    AddKey "km/h", i
    ' --- mile_per_hour: myl fy alsa'a ---
    i = 104
    mUId(i) = "mile_per_hour"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0645 064A 0644 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' myl fy alsa'a
    mFPlur(i, 0) = U("0623 0645 064A 0627 0644 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' a?myal fy alsa'a
    mFOne(i, 0) = U("0645 064A 0644 0020 0648 0627 062D 062F 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' myl wahd fy alsa'a
    mFDual(i) = U("0645 064A 0644 0627 0646 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' mylan fy alsa'a
    mFAcc(i) = U("0645 064A 0644 0627 064B 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' mylan fy alsa'a
    mFHas(i, 1) = True
    mFSing(i, 1) = "Mile per Hour"
    mFPlur(i, 1) = "Miles per Hour"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = "mile par heure"
    mFPlur(i, 2) = "miles par heure"
    AddKey "mile_per_hour", i
    AddKey U("0645 064A 0644 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629"), i ' myl fy alsa'a
    AddKey "mph", i
    ' --- megabit_per_second: myghabt fy althanya ---
    i = 105
    mUId(i) = "megabit_per_second"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 0
    mFSing(i, 0) = U("0645 064A 063A 0627 0628 062A 0020 0641 064A 0020 0627 0644 062B 0627 0646 064A 0629") ' myghabt fy althanya
    mFPlur(i, 0) = U("0645 064A 063A 0627 0628 062A 0627 062A 0020 0641 064A 0020 0627 0644 062B 0627 0646 064A 0629") ' myghabtat fy althanya
    mFOne(i, 0) = U("0645 064A 063A 0627 0628 062A 0020 0648 0627 062D 062F 0020 0641 064A 0020 0627 0644 062B 0627 0646 064A 0629") ' myghabt wahd fy althanya
    mFDual(i) = U("0645 064A 063A 0627 0628 062A 0627 0646 0020 0641 064A 0020 0627 0644 062B 0627 0646 064A 0629") ' myghabtan fy althanya
    mFAcc(i) = U("0645 064A 063A 0627 0628 062A 0627 064B 0020 0641 064A 0020 0627 0644 062B 0627 0646 064A 0629") ' myghabtan fy althanya
    mFHas(i, 1) = True
    mFSing(i, 1) = "Megabit per Second"
    mFPlur(i, 1) = "Megabits per Second"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("006D 00E9 0067 0061 0062 0069 0074 0020 0070 0061 0072 0020 0073 0065 0063 006F 006E 0064 0065") ' megabit par seconde
    mFPlur(i, 2) = U("006D 00E9 0067 0061 0062 0069 0074 0073 0020 0070 0061 0072 0020 0073 0065 0063 006F 006E 0064 0065") ' megabits par seconde
    AddKey "megabit_per_second", i
    AddKey U("0645 064A 063A 0627 0628 062A 0020 0641 064A 0020 0627 0644 062B 0627 0646 064A 0629"), i ' myghabt fy althanya
    AddKey "mbps", i
    ' --- knot: 'qda ---
    i = 106
    mUId(i) = "knot"
    mUHasForms(i) = True
    mFHas(i, 0) = True
    mFGender(i, 0) = 1
    mFSing(i, 0) = U("0639 0642 062F 0629") ' 'qda
    mFPlur(i, 0) = U("0639 0642 062F") ' 'qd
    mFDual(i) = U("0639 0642 062F 062A 0627 0646") ' 'qdtan
    mFAcc(i) = U("0639 0642 062F 0629") ' 'qda
    mFHas(i, 1) = True
    mFSing(i, 1) = "Knot"
    mFPlur(i, 1) = "Knots"
    mFHas(i, 2) = True
    mFGender(i, 2) = 0
    mFSing(i, 2) = U("006E 0153 0075 0064") ' noeud
    mFPlur(i, 2) = U("006E 0153 0075 0064 0073") ' noeuds
    AddKey "knot", i
    AddKey U("0639 0642 062F 0629"), i ' 'qda
    AddKey "kn", i
End Sub
