language: use internal/language/compact

This exposes all the internal compact IDs within x/text
but not outside.

Change-Id: I3c5e63f26a3e2774e70fdb48390522f444a850ae
Reviewed-on: https://go-review.googlesource.com/96639
Run-TryBot: Marcel van Lohuizen <mpvl@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ross Light <light@google.com>
diff --git a/internal/language/compact/language.go b/internal/language/compact/language.go
index 415b55e..ecae6dd 100644
--- a/internal/language/compact/language.go
+++ b/internal/language/compact/language.go
@@ -19,6 +19,7 @@
 // specific language or locale. All language tag values are guaranteed to be
 // well-formed.
 type Tag struct {
+	// NOTE: exported tags will become part of the public API.
 	language ID
 	locale   ID
 	full     fullTag // always a language.Tag for now.
@@ -135,9 +136,6 @@
 	return t.language, t.full == nil
 }
 
-// TODO: make these functions and methods public once we settle on the API and
-//
-
 // RegionalID returns the ID for the regional variant of this tag. This index is
 // used to indicate region-specific overrides, such as default currency, default
 // calendar and week data, default time cycle, and default measurement system
diff --git a/internal/language/compact/language_test.go b/internal/language/compact/language_test.go
index 4b1eea1..57fd13f 100644
--- a/internal/language/compact/language_test.go
+++ b/internal/language/compact/language_test.go
@@ -27,6 +27,22 @@
 	}
 }
 
+func TestNoPublic(t *testing.T) {
+	noExportedField(t, reflect.TypeOf(Tag{}))
+}
+
+func noExportedField(t *testing.T, typ reflect.Type) {
+	for i := 0; i < typ.NumField(); i++ {
+		f := typ.Field(i)
+		if f.PkgPath == "" {
+			t.Errorf("Tag may not have exported fields, but has field %q", f.Name)
+		}
+		if f.Anonymous {
+			noExportedField(t, f.Type)
+		}
+	}
+}
+
 func TestEquality(t *testing.T) {
 	for i, tt := range parseTests() {
 		s := tt.in
diff --git a/language/compact.go b/language/compact.go
deleted file mode 100644
index a9941cc..0000000
--- a/language/compact.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package language
-
-import (
-	"sort"
-	"strings"
-
-	"golang.org/x/text/internal/language"
-)
-
-type compactID uint16
-
-func getCoreIndex(t language.Tag) (id compactID, ok bool) {
-	cci, ok := language.GetCompactCore(t)
-	if !ok {
-		return 0, false
-	}
-	i := sort.Search(len(coreTags), func(i int) bool {
-		return cci <= coreTags[i]
-	})
-	if i == len(coreTags) || coreTags[i] != cci {
-		return 0, false
-	}
-	return compactID(i), true
-}
-
-func (c compactID) tag() language.Tag {
-	if int(c) >= len(coreTags) {
-		return specialTags[int(c)-len(coreTags)]
-	}
-	return coreTags[c].Tag()
-}
-
-var specialTags []language.Tag
-
-func init() {
-	tags := strings.Split(specialTagsStr, " ")
-	specialTags = make([]language.Tag, len(tags))
-	for i, t := range tags {
-		specialTags[i] = language.MustParse(t)
-	}
-}
diff --git a/language/gen.go b/language/gen.go
index b1a35da..3004eb4 100644
--- a/language/gen.go
+++ b/language/gen.go
@@ -38,13 +38,10 @@
 	w := gen.NewCodeWriter()
 	defer w.WriteGoFile("tables.go", "language")
 
-	fmt.Fprintln(w, `import "golang.org/x/text/internal/language"`)
-
 	b := newBuilder(w)
 	gen.WriteCLDRVersion(w)
 
 	b.writeConstants()
-	b.writeCompactIndex()
 	b.writeMatchData()
 }
 
diff --git a/language/gen_index.go b/language/gen_index.go
deleted file mode 100644
index 2a84a91..0000000
--- a/language/gen_index.go
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package main
-
-// This file generates derivative tables based on the language package itself.
-
-import (
-	"fmt"
-	"log"
-	"sort"
-	"strings"
-
-	"golang.org/x/text/internal/language"
-)
-
-// Compact indices:
-// Note -va-X variants only apply to localization variants.
-// BCP variants only ever apply to language.
-// The only ambiguity between tags is with regions.
-
-func (b *builder) writeCompactIndex() {
-	// Collect all language tags for which we have any data in CLDR.
-	m := map[language.Tag]bool{}
-	for _, lang := range b.data.Locales() {
-		// We include all locales unconditionally to be consistent with en_US.
-		// We want en_US, even though it has no data associated with it.
-
-		// TODO: put any of the languages for which no data exists at the end
-		// of the index. This allows all components based on ICU to use that
-		// as the cutoff point.
-		// if x := data.RawLDML(lang); false ||
-		// 	x.LocaleDisplayNames != nil ||
-		// 	x.Characters != nil ||
-		// 	x.Delimiters != nil ||
-		// 	x.Measurement != nil ||
-		// 	x.Dates != nil ||
-		// 	x.Numbers != nil ||
-		// 	x.Units != nil ||
-		// 	x.ListPatterns != nil ||
-		// 	x.Collations != nil ||
-		// 	x.Segmentations != nil ||
-		// 	x.Rbnf != nil ||
-		// 	x.Annotations != nil ||
-		// 	x.Metadata != nil {
-
-		// TODO: support POSIX natively, albeit non-standard.
-		tag := language.Make(strings.Replace(lang, "_POSIX", "-u-va-posix", 1))
-		m[tag] = true
-		// }
-	}
-	// Include locales for plural rules, which uses a different structure.
-	for _, plurals := range b.supp.Plurals {
-		for _, rules := range plurals.PluralRules {
-			for _, lang := range strings.Split(rules.Locales, " ") {
-				m[language.Make(lang)] = true
-			}
-		}
-	}
-
-	var coreTags []language.CompactCoreInfo
-	var special []string
-
-	for t := range m {
-		if x := t.Extensions(); len(x) != 0 && fmt.Sprint(x) != "[u-va-posix]" {
-			log.Fatalf("Unexpected extension %v in %v", x, t)
-		}
-		if len(t.Variants()) == 0 && len(t.Extensions()) == 0 {
-			cci, ok := language.GetCompactCore(t)
-			if !ok {
-				log.Fatalf("Locale for non-basic language %q", t)
-			}
-			coreTags = append(coreTags, cci)
-		} else {
-			special = append(special, t.String())
-		}
-	}
-
-	w := b.w
-
-	sort.Slice(coreTags, func(i, j int) bool { return coreTags[i] < coreTags[j] })
-	sort.Strings(special)
-
-	w.WriteComment(`
-	NumCompactTags is the number of common tags. The maximum tag is
-	NumCompactTags-1.`)
-	w.WriteConst("NumCompactTags", len(m))
-
-	fmt.Fprintln(w, "const (")
-	for i, t := range coreTags {
-		fmt.Fprintf(w, "%s compactID = %d\n", ident(t.Tag().String()), i)
-	}
-	for i, t := range special {
-		fmt.Fprintf(w, "%s compactID = %d\n", ident(t), i+len(coreTags))
-	}
-	fmt.Fprintln(w, ")")
-
-	w.WriteVar("coreTags", coreTags)
-
-	w.WriteConst("specialTagsStr", strings.Join(special, " "))
-}
-
-func ident(s string) string {
-	return strings.Replace(s, "-", "", -1) + "Index"
-}
diff --git a/language/language.go b/language/language.go
index 25fd210..f892354 100644
--- a/language/language.go
+++ b/language/language.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:generate go run gen.go gen_index.go -output tables.go
+//go:generate go run gen.go -output tables.go
 
 package language
 
@@ -13,67 +13,24 @@
 	"strings"
 
 	"golang.org/x/text/internal/language"
+	"golang.org/x/text/internal/language/compact"
 )
 
 // Tag represents a BCP 47 language tag. It is used to specify an instance of a
 // specific language or locale. All language tag values are guaranteed to be
 // well-formed.
-type Tag struct {
-	language compactID
-	locale   compactID
-	full     fullTag // always a language.Tag for now.
-}
-
-type fullTag interface {
-	IsRoot() bool
-	Parent() language.Tag
-}
+type Tag compact.Tag
 
 func makeTag(t language.Tag) (tag Tag) {
-	if region := t.TypeForKey("rg"); len(region) == 6 && region[2:] == "zzzz" {
-		if r, err := language.ParseRegion(region[:2]); err == nil {
-			tFull := t
-			t, _ = t.SetTypeForKey("rg", "")
-			// TODO: should we not consider "va" for the language tag?
-			var exact1, exact2 bool
-			tag.language, exact1 = compactIndex(t)
-			t.RegionID = r
-			tag.locale, exact2 = compactIndex(t)
-			if !exact1 || !exact2 {
-				tag.full = tFull
-			}
-			return tag
-		}
-	}
-	lang, ok := compactIndex(t)
-	tag.language = lang
-	tag.locale = lang
-	if !ok {
-		tag.full = t
-	}
-	return tag
+	return Tag(compact.Make(t))
 }
 
 func (t *Tag) tag() language.Tag {
-	if t.full != nil {
-		return t.full.(language.Tag)
-	}
-	tag := t.language.tag()
-	if t.language != t.locale {
-		loc := t.locale.tag()
-		tag, _ = tag.SetTypeForKey("rg", strings.ToLower(loc.RegionID.String())+"zzzz")
-	}
-	return tag
+	return (*compact.Tag)(t).Tag()
 }
 
-func (t *Tag) mayHaveVariants() bool {
-	return t.full != nil || int(t.language) >= len(coreTags)
-}
-
-func (t *Tag) mayHaveExtensions() bool {
-	return t.full != nil ||
-		int(t.language) >= len(coreTags) ||
-		t.language != t.locale
+func (t *Tag) isCompact() bool {
+	return (*compact.Tag)(t).IsCompact()
 }
 
 // TODO: improve performance.
@@ -103,10 +60,7 @@
 
 // IsRoot returns true if t is equal to language "und".
 func (t Tag) IsRoot() bool {
-	if t.full != nil {
-		return t.full.IsRoot()
-	}
-	return t.language == _und
+	return compact.Tag(t).IsRoot()
 }
 
 // CanonType can be used to enable or disable various types of canonicalization.
@@ -233,8 +187,8 @@
 // Canonicalize returns the canonicalized equivalent of the tag.
 func (c CanonType) Canonicalize(t Tag) (Tag, error) {
 	// First try fast path.
-	if t.full == nil {
-		if _, changed := canonicalize(c, t.language.tag()); !changed {
+	if t.isCompact() {
+		if _, changed := canonicalize(c, compact.Tag(t).Tag()); !changed {
 			return t, nil
 		}
 	}
@@ -366,7 +320,7 @@
 // Variants returns the variants specified explicitly for this language tag.
 // or nil if no variant was specified.
 func (t Tag) Variants() []Variant {
-	if !t.mayHaveVariants() {
+	if !compact.Tag(t).MayHaveVariants() {
 		return nil
 	}
 	v := []Variant{}
@@ -382,19 +336,7 @@
 // specific language are substituted with fields from the parent language.
 // The parent for a language may change for newer versions of CLDR.
 func (t Tag) Parent() Tag {
-	if t.full != nil {
-		return makeTag(t.full.Parent())
-	}
-	if t.language != t.locale {
-		// Simulate stripping -u-rg-xxxxxx
-		return Tag{language: t.language, locale: t.language}
-	}
-	// TODO: use parent lookup table once cycle from internal package is
-	// removed. Probably by internalizing the table and declaring this fast
-	// enough.
-	// lang := compactID(internal.Parent(uint16(t.language)))
-	lang, _ := compactIndex(t.language.tag().Parent())
-	return Tag{language: lang, locale: lang}
+	return Tag(compact.Tag(t).Parent())
 }
 
 // returns token t and the rest of the string.
@@ -442,7 +384,7 @@
 // false for ok if t does not have the requested extension. The returned
 // extension will be invalid in this case.
 func (t Tag) Extension(x byte) (ext Extension, ok bool) {
-	if !t.mayHaveExtensions() {
+	if !compact.Tag(t).MayHaveExtensions() {
 		return Extension{}, false
 	}
 	e, ok := t.tag().Extension(x)
@@ -451,7 +393,7 @@
 
 // Extensions returns all extensions of t.
 func (t Tag) Extensions() []Extension {
-	if !t.mayHaveExtensions() {
+	if !compact.Tag(t).MayHaveExtensions() {
 		return nil
 	}
 	e := []Extension{}
@@ -466,7 +408,7 @@
 // http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers.
 // TypeForKey will traverse the inheritance chain to get the correct value.
 func (t Tag) TypeForKey(key string) string {
-	if !t.mayHaveExtensions() {
+	if !compact.Tag(t).MayHaveExtensions() {
 		if key != "rg" && key != "va" {
 			return ""
 		}
@@ -483,126 +425,18 @@
 	return makeTag(tt), err
 }
 
+// NumCompactTags is the number of compact tags. The maximum tag is
+// NumCompactTags-1.
+const NumCompactTags = compact.NumCompactTags
+
 // CompactIndex returns an index, where 0 <= index < NumCompactTags, for tags
 // for which data exists in the text repository.The index will change over time
 // and should not be stored in persistent storage. If t does not match a compact
 // index, exact will be false and the compact index will be returned for the
 // first match after repeatedly taking the Parent of t.
 func CompactIndex(t Tag) (index int, exact bool) {
-	return int(t.language), t.full == nil
-}
-
-// TODO: make these functions and methods public once we settle on the API and
-//
-
-// regionalCompactIndex returns the CompactIndex for the regional variant of
-// this tag. This index is used to indicate region-specific overrides, such as
-// default currency, default calendar and week data, default time cycle, and
-// default measurement system and unit preferences.
-//
-// For instance, the tag en-GB-u-rg-uszzzz specifies British English with US
-// settings for currency, number formatting, etc. The CompactIndex for this tag
-// will be that for en-GB, while the regionalCompactIndex will be the one
-// corresponding to en-US.
-func regionalCompactIndex(t Tag) (index int, exact bool) {
-	return int(t.locale), t.full == nil
-}
-
-// languageTag returns t stripped of regional variant indicators.
-//
-// At the moment this means it is stripped of a regional and variant subtag "rg"
-// and "va" in the "u" extension.
-func (t Tag) languageTag() Tag {
-	if t.full == nil {
-		return Tag{language: t.language, locale: t.language}
-	}
-	tt := t.tag()
-	tt.SetTypeForKey("rg", "")
-	tt.SetTypeForKey("va", "")
-	return makeTag(tt)
-}
-
-// regionalTag returns the regional variant of the tag.
-//
-// At the moment this means that the region is set from the regional subtag
-// "rg" in the "u" extension.
-func (t Tag) regionalTag() Tag {
-	rt := Tag{language: t.locale, locale: t.locale}
-	if t.full == nil {
-		return rt
-	}
-	t, _ = Raw.Compose(rt, t.Variants(), t.Extensions())
-	t, _ = t.SetTypeForKey("rg", "")
-	return t
-}
-
-func compactIndex(t language.Tag) (index compactID, exact bool) {
-	// TODO: perhaps give more frequent tags a lower index.
-	// TODO: we could make the indexes stable. This will excluded some
-	//       possibilities for optimization, so don't do this quite yet.
-	exact = true
-
-	b, s, r := t.Raw()
-	switch {
-	case t.HasString():
-		if t.IsPrivateUse() {
-			// We have no entries for user-defined tags.
-			return 0, false
-		}
-		hasExtra := false
-		if t.HasVariants() {
-			if t.HasExtensions() {
-				build := language.Builder{}
-				build.SetTag(language.Tag{LangID: b, ScriptID: s, RegionID: r})
-				build.AddVariant(t.Variants())
-				exact = false
-				t = build.Make()
-			}
-			hasExtra = true
-		} else if _, ok := t.Extension('u'); ok {
-			// TODO: va may mean something else. Consider not considering it.
-			// Strip all but the 'va' entry.
-			old := t
-			variant := t.TypeForKey("va")
-			t = language.Tag{LangID: b, ScriptID: s, RegionID: r}
-			if variant != "" {
-				t, _ = t.SetTypeForKey("va", variant)
-				hasExtra = true
-			}
-			exact = old == t
-		} else {
-			exact = false
-		}
-		if hasExtra {
-			// We have some variants.
-			for i, s := range specialTags {
-				if s == t {
-					return compactID(i + len(coreTags)), exact
-				}
-			}
-			exact = false
-		}
-	}
-	if x, ok := getCoreIndex(t); ok {
-		return x, exact
-	}
-	exact = false
-	if r != 0 && s == 0 {
-		// Deal with cases where an extra script is inserted for the region.
-		t, _ := t.Maximize()
-		if x, ok := getCoreIndex(t); ok {
-			return x, exact
-		}
-	}
-	for t = t.Parent(); t != root; t = t.Parent() {
-		// No variants specified: just compare core components.
-		// The key has the form lllssrrr, where l, s, and r are nibbles for
-		// respectively the langID, scriptID, and regionID.
-		if x, ok := getCoreIndex(t); ok {
-			return x, exact
-		}
-	}
-	return 0, exact
+	id, exact := compact.LanguageID(compact.Tag(t))
+	return int(id), exact
 }
 
 var root = language.Tag{}
diff --git a/language/language_test.go b/language/language_test.go
index 168af38..f7711ba 100644
--- a/language/language_test.go
+++ b/language/language_test.go
@@ -58,77 +58,6 @@
 	}
 }
 
-type compactTest struct {
-	tag   string
-	index compactID
-	ok    bool
-}
-
-var compactTests = []compactTest{
-	// TODO: these values will change with each CLDR update. This issue
-	// will be solved if we decide to fix the indexes.
-	{"und", undIndex, true},
-	{"ca-ES-valencia", caESvalenciaIndex, true},
-	{"ca-ES-valencia-u-va-posix", caESvalenciaIndex, false},
-	{"ca-ES-valencia-u-co-phonebk", caESvalenciaIndex, false},
-	{"ca-ES-valencia-u-co-phonebk-va-posix", caESvalenciaIndex, false},
-	{"x-klingon", 0, false},
-	{"en-US", enUSIndex, true},
-	{"en-US-u-va-posix", enUSuvaposixIndex, true},
-	{"en", enIndex, true},
-	{"en-u-co-phonebk", enIndex, false},
-	{"en-001", en001Index, true},
-	{"zh-Hant-HK", zhHantHKIndex, true},
-	{"zh-HK", zhHantHKIndex, false}, // maximized to zh-Hant-HK
-	{"nl-Beng", 0, false},           // parent skips script
-	{"nl-NO", nlIndex, false},       // region is ignored
-	{"nl-Latn-NO", nlIndex, false},
-	{"nl-Latn-NO-u-co-phonebk", nlIndex, false},
-	{"nl-Latn-NO-valencia", nlIndex, false},
-	{"nl-Latn-NO-oxendict", nlIndex, false},
-	{"sh", shIndex, true}, // From plural rules.
-}
-
-func TestCompactIndex(t *testing.T) {
-	tests := append(compactTests, []compactTest{
-		{"en-GB", enGBIndex, true},
-		{"en-GB-u-rg-uszzzz", enGBIndex, true},
-		{"en-GB-u-rg-USZZZZ", enGBIndex, true},
-		{"en-GB-u-rg-uszzzz-va-posix", enGBIndex, false},
-		{"en-GB-u-co-phonebk-rg-uszzzz", enGBIndex, false},
-		// Invalid region specifications are ignored.
-		{"en-GB-u-rg-usz-va-posix", enGBIndex, false},
-		{"en-GB-u-co-phonebk-rg-usz", enGBIndex, false},
-	}...)
-	for _, tt := range tests {
-		x, ok := CompactIndex(Raw.MustParse(tt.tag))
-		if compactID(x) != tt.index || ok != tt.ok {
-			t.Errorf("%s: got %d, %v; want %d %v", tt.tag, x, ok, tt.index, tt.ok)
-		}
-	}
-}
-
-func TestRegionalCompactIndex(t *testing.T) {
-	tests := append(compactTests, []compactTest{
-		{"en-GB", enGBIndex, true},
-		{"en-GB-u-rg-uszzzz", enUSIndex, true},
-		{"en-GB-u-rg-USZZZZ", enUSIndex, true},
-		// TODO: use different exact values for language and regional tag?
-		{"en-GB-u-rg-uszzzz-va-posix", enUSuvaposixIndex, false},
-		{"en-GB-u-co-phonebk-rg-uszzzz-va-posix", enUSuvaposixIndex, false},
-		{"en-GB-u-co-phonebk-rg-uszzzz", enUSIndex, false},
-		// Invalid region specifications are ignored.
-		{"en-GB-u-rg-usz-va-posix", enGBIndex, false},
-		{"en-GB-u-co-phonebk-rg-usz", enGBIndex, false},
-	}...)
-	for _, tt := range tests {
-		x, ok := regionalCompactIndex(Raw.MustParse(tt.tag))
-		if compactID(x) != tt.index || ok != tt.ok {
-			t.Errorf("%s: got %d, %v; want %d %v", tt.tag, x, ok, tt.index, tt.ok)
-		}
-	}
-}
-
 func TestMarshal(t *testing.T) {
 	testCases := []string{
 		// TODO: these values will change with each CLDR update. This issue
diff --git a/language/tables.go b/language/tables.go
index 1825af6..e228077 100644
--- a/language/tables.go
+++ b/language/tables.go
@@ -2,8 +2,6 @@
 
 package language
 
-import "golang.org/x/text/internal/language"
-
 // CLDRVersion is the CLDR version from which the tables in this package are derived.
 const CLDRVersion = "32"
 
@@ -49,1011 +47,6 @@
 	_Zzzz = 242
 )
 
-// NumCompactTags is the number of common tags. The maximum tag is
-// NumCompactTags-1.
-const NumCompactTags = 775
-const (
-	undIndex          compactID = 0
-	afIndex           compactID = 1
-	afNAIndex         compactID = 2
-	afZAIndex         compactID = 3
-	agqIndex          compactID = 4
-	agqCMIndex        compactID = 5
-	akIndex           compactID = 6
-	akGHIndex         compactID = 7
-	amIndex           compactID = 8
-	amETIndex         compactID = 9
-	arIndex           compactID = 10
-	ar001Index        compactID = 11
-	arAEIndex         compactID = 12
-	arBHIndex         compactID = 13
-	arDJIndex         compactID = 14
-	arDZIndex         compactID = 15
-	arEGIndex         compactID = 16
-	arEHIndex         compactID = 17
-	arERIndex         compactID = 18
-	arILIndex         compactID = 19
-	arIQIndex         compactID = 20
-	arJOIndex         compactID = 21
-	arKMIndex         compactID = 22
-	arKWIndex         compactID = 23
-	arLBIndex         compactID = 24
-	arLYIndex         compactID = 25
-	arMAIndex         compactID = 26
-	arMRIndex         compactID = 27
-	arOMIndex         compactID = 28
-	arPSIndex         compactID = 29
-	arQAIndex         compactID = 30
-	arSAIndex         compactID = 31
-	arSDIndex         compactID = 32
-	arSOIndex         compactID = 33
-	arSSIndex         compactID = 34
-	arSYIndex         compactID = 35
-	arTDIndex         compactID = 36
-	arTNIndex         compactID = 37
-	arYEIndex         compactID = 38
-	arsIndex          compactID = 39
-	asIndex           compactID = 40
-	asINIndex         compactID = 41
-	asaIndex          compactID = 42
-	asaTZIndex        compactID = 43
-	astIndex          compactID = 44
-	astESIndex        compactID = 45
-	azIndex           compactID = 46
-	azCyrlIndex       compactID = 47
-	azCyrlAZIndex     compactID = 48
-	azLatnIndex       compactID = 49
-	azLatnAZIndex     compactID = 50
-	basIndex          compactID = 51
-	basCMIndex        compactID = 52
-	beIndex           compactID = 53
-	beBYIndex         compactID = 54
-	bemIndex          compactID = 55
-	bemZMIndex        compactID = 56
-	bezIndex          compactID = 57
-	bezTZIndex        compactID = 58
-	bgIndex           compactID = 59
-	bgBGIndex         compactID = 60
-	bhIndex           compactID = 61
-	bmIndex           compactID = 62
-	bmMLIndex         compactID = 63
-	bnIndex           compactID = 64
-	bnBDIndex         compactID = 65
-	bnINIndex         compactID = 66
-	boIndex           compactID = 67
-	boCNIndex         compactID = 68
-	boINIndex         compactID = 69
-	brIndex           compactID = 70
-	brFRIndex         compactID = 71
-	brxIndex          compactID = 72
-	brxINIndex        compactID = 73
-	bsIndex           compactID = 74
-	bsCyrlIndex       compactID = 75
-	bsCyrlBAIndex     compactID = 76
-	bsLatnIndex       compactID = 77
-	bsLatnBAIndex     compactID = 78
-	caIndex           compactID = 79
-	caADIndex         compactID = 80
-	caESIndex         compactID = 81
-	caFRIndex         compactID = 82
-	caITIndex         compactID = 83
-	ccpIndex          compactID = 84
-	ccpBDIndex        compactID = 85
-	ccpINIndex        compactID = 86
-	ceIndex           compactID = 87
-	ceRUIndex         compactID = 88
-	cggIndex          compactID = 89
-	cggUGIndex        compactID = 90
-	chrIndex          compactID = 91
-	chrUSIndex        compactID = 92
-	ckbIndex          compactID = 93
-	ckbIQIndex        compactID = 94
-	ckbIRIndex        compactID = 95
-	csIndex           compactID = 96
-	csCZIndex         compactID = 97
-	cuIndex           compactID = 98
-	cuRUIndex         compactID = 99
-	cyIndex           compactID = 100
-	cyGBIndex         compactID = 101
-	daIndex           compactID = 102
-	daDKIndex         compactID = 103
-	daGLIndex         compactID = 104
-	davIndex          compactID = 105
-	davKEIndex        compactID = 106
-	deIndex           compactID = 107
-	deATIndex         compactID = 108
-	deBEIndex         compactID = 109
-	deCHIndex         compactID = 110
-	deDEIndex         compactID = 111
-	deITIndex         compactID = 112
-	deLIIndex         compactID = 113
-	deLUIndex         compactID = 114
-	djeIndex          compactID = 115
-	djeNEIndex        compactID = 116
-	dsbIndex          compactID = 117
-	dsbDEIndex        compactID = 118
-	duaIndex          compactID = 119
-	duaCMIndex        compactID = 120
-	dvIndex           compactID = 121
-	dyoIndex          compactID = 122
-	dyoSNIndex        compactID = 123
-	dzIndex           compactID = 124
-	dzBTIndex         compactID = 125
-	ebuIndex          compactID = 126
-	ebuKEIndex        compactID = 127
-	eeIndex           compactID = 128
-	eeGHIndex         compactID = 129
-	eeTGIndex         compactID = 130
-	elIndex           compactID = 131
-	elCYIndex         compactID = 132
-	elGRIndex         compactID = 133
-	enIndex           compactID = 134
-	en001Index        compactID = 135
-	en150Index        compactID = 136
-	enAGIndex         compactID = 137
-	enAIIndex         compactID = 138
-	enASIndex         compactID = 139
-	enATIndex         compactID = 140
-	enAUIndex         compactID = 141
-	enBBIndex         compactID = 142
-	enBEIndex         compactID = 143
-	enBIIndex         compactID = 144
-	enBMIndex         compactID = 145
-	enBSIndex         compactID = 146
-	enBWIndex         compactID = 147
-	enBZIndex         compactID = 148
-	enCAIndex         compactID = 149
-	enCCIndex         compactID = 150
-	enCHIndex         compactID = 151
-	enCKIndex         compactID = 152
-	enCMIndex         compactID = 153
-	enCXIndex         compactID = 154
-	enCYIndex         compactID = 155
-	enDEIndex         compactID = 156
-	enDGIndex         compactID = 157
-	enDKIndex         compactID = 158
-	enDMIndex         compactID = 159
-	enERIndex         compactID = 160
-	enFIIndex         compactID = 161
-	enFJIndex         compactID = 162
-	enFKIndex         compactID = 163
-	enFMIndex         compactID = 164
-	enGBIndex         compactID = 165
-	enGDIndex         compactID = 166
-	enGGIndex         compactID = 167
-	enGHIndex         compactID = 168
-	enGIIndex         compactID = 169
-	enGMIndex         compactID = 170
-	enGUIndex         compactID = 171
-	enGYIndex         compactID = 172
-	enHKIndex         compactID = 173
-	enIEIndex         compactID = 174
-	enILIndex         compactID = 175
-	enIMIndex         compactID = 176
-	enINIndex         compactID = 177
-	enIOIndex         compactID = 178
-	enJEIndex         compactID = 179
-	enJMIndex         compactID = 180
-	enKEIndex         compactID = 181
-	enKIIndex         compactID = 182
-	enKNIndex         compactID = 183
-	enKYIndex         compactID = 184
-	enLCIndex         compactID = 185
-	enLRIndex         compactID = 186
-	enLSIndex         compactID = 187
-	enMGIndex         compactID = 188
-	enMHIndex         compactID = 189
-	enMOIndex         compactID = 190
-	enMPIndex         compactID = 191
-	enMSIndex         compactID = 192
-	enMTIndex         compactID = 193
-	enMUIndex         compactID = 194
-	enMWIndex         compactID = 195
-	enMYIndex         compactID = 196
-	enNAIndex         compactID = 197
-	enNFIndex         compactID = 198
-	enNGIndex         compactID = 199
-	enNLIndex         compactID = 200
-	enNRIndex         compactID = 201
-	enNUIndex         compactID = 202
-	enNZIndex         compactID = 203
-	enPGIndex         compactID = 204
-	enPHIndex         compactID = 205
-	enPKIndex         compactID = 206
-	enPNIndex         compactID = 207
-	enPRIndex         compactID = 208
-	enPWIndex         compactID = 209
-	enRWIndex         compactID = 210
-	enSBIndex         compactID = 211
-	enSCIndex         compactID = 212
-	enSDIndex         compactID = 213
-	enSEIndex         compactID = 214
-	enSGIndex         compactID = 215
-	enSHIndex         compactID = 216
-	enSIIndex         compactID = 217
-	enSLIndex         compactID = 218
-	enSSIndex         compactID = 219
-	enSXIndex         compactID = 220
-	enSZIndex         compactID = 221
-	enTCIndex         compactID = 222
-	enTKIndex         compactID = 223
-	enTOIndex         compactID = 224
-	enTTIndex         compactID = 225
-	enTVIndex         compactID = 226
-	enTZIndex         compactID = 227
-	enUGIndex         compactID = 228
-	enUMIndex         compactID = 229
-	enUSIndex         compactID = 230
-	enVCIndex         compactID = 231
-	enVGIndex         compactID = 232
-	enVIIndex         compactID = 233
-	enVUIndex         compactID = 234
-	enWSIndex         compactID = 235
-	enZAIndex         compactID = 236
-	enZMIndex         compactID = 237
-	enZWIndex         compactID = 238
-	eoIndex           compactID = 239
-	eo001Index        compactID = 240
-	esIndex           compactID = 241
-	es419Index        compactID = 242
-	esARIndex         compactID = 243
-	esBOIndex         compactID = 244
-	esBRIndex         compactID = 245
-	esBZIndex         compactID = 246
-	esCLIndex         compactID = 247
-	esCOIndex         compactID = 248
-	esCRIndex         compactID = 249
-	esCUIndex         compactID = 250
-	esDOIndex         compactID = 251
-	esEAIndex         compactID = 252
-	esECIndex         compactID = 253
-	esESIndex         compactID = 254
-	esGQIndex         compactID = 255
-	esGTIndex         compactID = 256
-	esHNIndex         compactID = 257
-	esICIndex         compactID = 258
-	esMXIndex         compactID = 259
-	esNIIndex         compactID = 260
-	esPAIndex         compactID = 261
-	esPEIndex         compactID = 262
-	esPHIndex         compactID = 263
-	esPRIndex         compactID = 264
-	esPYIndex         compactID = 265
-	esSVIndex         compactID = 266
-	esUSIndex         compactID = 267
-	esUYIndex         compactID = 268
-	esVEIndex         compactID = 269
-	etIndex           compactID = 270
-	etEEIndex         compactID = 271
-	euIndex           compactID = 272
-	euESIndex         compactID = 273
-	ewoIndex          compactID = 274
-	ewoCMIndex        compactID = 275
-	faIndex           compactID = 276
-	faAFIndex         compactID = 277
-	faIRIndex         compactID = 278
-	ffIndex           compactID = 279
-	ffCMIndex         compactID = 280
-	ffGNIndex         compactID = 281
-	ffMRIndex         compactID = 282
-	ffSNIndex         compactID = 283
-	fiIndex           compactID = 284
-	fiFIIndex         compactID = 285
-	filIndex          compactID = 286
-	filPHIndex        compactID = 287
-	foIndex           compactID = 288
-	foDKIndex         compactID = 289
-	foFOIndex         compactID = 290
-	frIndex           compactID = 291
-	frBEIndex         compactID = 292
-	frBFIndex         compactID = 293
-	frBIIndex         compactID = 294
-	frBJIndex         compactID = 295
-	frBLIndex         compactID = 296
-	frCAIndex         compactID = 297
-	frCDIndex         compactID = 298
-	frCFIndex         compactID = 299
-	frCGIndex         compactID = 300
-	frCHIndex         compactID = 301
-	frCIIndex         compactID = 302
-	frCMIndex         compactID = 303
-	frDJIndex         compactID = 304
-	frDZIndex         compactID = 305
-	frFRIndex         compactID = 306
-	frGAIndex         compactID = 307
-	frGFIndex         compactID = 308
-	frGNIndex         compactID = 309
-	frGPIndex         compactID = 310
-	frGQIndex         compactID = 311
-	frHTIndex         compactID = 312
-	frKMIndex         compactID = 313
-	frLUIndex         compactID = 314
-	frMAIndex         compactID = 315
-	frMCIndex         compactID = 316
-	frMFIndex         compactID = 317
-	frMGIndex         compactID = 318
-	frMLIndex         compactID = 319
-	frMQIndex         compactID = 320
-	frMRIndex         compactID = 321
-	frMUIndex         compactID = 322
-	frNCIndex         compactID = 323
-	frNEIndex         compactID = 324
-	frPFIndex         compactID = 325
-	frPMIndex         compactID = 326
-	frREIndex         compactID = 327
-	frRWIndex         compactID = 328
-	frSCIndex         compactID = 329
-	frSNIndex         compactID = 330
-	frSYIndex         compactID = 331
-	frTDIndex         compactID = 332
-	frTGIndex         compactID = 333
-	frTNIndex         compactID = 334
-	frVUIndex         compactID = 335
-	frWFIndex         compactID = 336
-	frYTIndex         compactID = 337
-	furIndex          compactID = 338
-	furITIndex        compactID = 339
-	fyIndex           compactID = 340
-	fyNLIndex         compactID = 341
-	gaIndex           compactID = 342
-	gaIEIndex         compactID = 343
-	gdIndex           compactID = 344
-	gdGBIndex         compactID = 345
-	glIndex           compactID = 346
-	glESIndex         compactID = 347
-	gswIndex          compactID = 348
-	gswCHIndex        compactID = 349
-	gswFRIndex        compactID = 350
-	gswLIIndex        compactID = 351
-	guIndex           compactID = 352
-	guINIndex         compactID = 353
-	guwIndex          compactID = 354
-	guzIndex          compactID = 355
-	guzKEIndex        compactID = 356
-	gvIndex           compactID = 357
-	gvIMIndex         compactID = 358
-	haIndex           compactID = 359
-	haGHIndex         compactID = 360
-	haNEIndex         compactID = 361
-	haNGIndex         compactID = 362
-	hawIndex          compactID = 363
-	hawUSIndex        compactID = 364
-	heIndex           compactID = 365
-	heILIndex         compactID = 366
-	hiIndex           compactID = 367
-	hiINIndex         compactID = 368
-	hrIndex           compactID = 369
-	hrBAIndex         compactID = 370
-	hrHRIndex         compactID = 371
-	hsbIndex          compactID = 372
-	hsbDEIndex        compactID = 373
-	huIndex           compactID = 374
-	huHUIndex         compactID = 375
-	hyIndex           compactID = 376
-	hyAMIndex         compactID = 377
-	idIndex           compactID = 378
-	idIDIndex         compactID = 379
-	igIndex           compactID = 380
-	igNGIndex         compactID = 381
-	iiIndex           compactID = 382
-	iiCNIndex         compactID = 383
-	inIndex           compactID = 384
-	ioIndex           compactID = 385
-	isIndex           compactID = 386
-	isISIndex         compactID = 387
-	itIndex           compactID = 388
-	itCHIndex         compactID = 389
-	itITIndex         compactID = 390
-	itSMIndex         compactID = 391
-	itVAIndex         compactID = 392
-	iuIndex           compactID = 393
-	iwIndex           compactID = 394
-	jaIndex           compactID = 395
-	jaJPIndex         compactID = 396
-	jboIndex          compactID = 397
-	jgoIndex          compactID = 398
-	jgoCMIndex        compactID = 399
-	jiIndex           compactID = 400
-	jmcIndex          compactID = 401
-	jmcTZIndex        compactID = 402
-	jvIndex           compactID = 403
-	jwIndex           compactID = 404
-	kaIndex           compactID = 405
-	kaGEIndex         compactID = 406
-	kabIndex          compactID = 407
-	kabDZIndex        compactID = 408
-	kajIndex          compactID = 409
-	kamIndex          compactID = 410
-	kamKEIndex        compactID = 411
-	kcgIndex          compactID = 412
-	kdeIndex          compactID = 413
-	kdeTZIndex        compactID = 414
-	keaIndex          compactID = 415
-	keaCVIndex        compactID = 416
-	khqIndex          compactID = 417
-	khqMLIndex        compactID = 418
-	kiIndex           compactID = 419
-	kiKEIndex         compactID = 420
-	kkIndex           compactID = 421
-	kkKZIndex         compactID = 422
-	kkjIndex          compactID = 423
-	kkjCMIndex        compactID = 424
-	klIndex           compactID = 425
-	klGLIndex         compactID = 426
-	klnIndex          compactID = 427
-	klnKEIndex        compactID = 428
-	kmIndex           compactID = 429
-	kmKHIndex         compactID = 430
-	knIndex           compactID = 431
-	knINIndex         compactID = 432
-	koIndex           compactID = 433
-	koKPIndex         compactID = 434
-	koKRIndex         compactID = 435
-	kokIndex          compactID = 436
-	kokINIndex        compactID = 437
-	ksIndex           compactID = 438
-	ksINIndex         compactID = 439
-	ksbIndex          compactID = 440
-	ksbTZIndex        compactID = 441
-	ksfIndex          compactID = 442
-	ksfCMIndex        compactID = 443
-	kshIndex          compactID = 444
-	kshDEIndex        compactID = 445
-	kuIndex           compactID = 446
-	kwIndex           compactID = 447
-	kwGBIndex         compactID = 448
-	kyIndex           compactID = 449
-	kyKGIndex         compactID = 450
-	lagIndex          compactID = 451
-	lagTZIndex        compactID = 452
-	lbIndex           compactID = 453
-	lbLUIndex         compactID = 454
-	lgIndex           compactID = 455
-	lgUGIndex         compactID = 456
-	lktIndex          compactID = 457
-	lktUSIndex        compactID = 458
-	lnIndex           compactID = 459
-	lnAOIndex         compactID = 460
-	lnCDIndex         compactID = 461
-	lnCFIndex         compactID = 462
-	lnCGIndex         compactID = 463
-	loIndex           compactID = 464
-	loLAIndex         compactID = 465
-	lrcIndex          compactID = 466
-	lrcIQIndex        compactID = 467
-	lrcIRIndex        compactID = 468
-	ltIndex           compactID = 469
-	ltLTIndex         compactID = 470
-	luIndex           compactID = 471
-	luCDIndex         compactID = 472
-	luoIndex          compactID = 473
-	luoKEIndex        compactID = 474
-	luyIndex          compactID = 475
-	luyKEIndex        compactID = 476
-	lvIndex           compactID = 477
-	lvLVIndex         compactID = 478
-	masIndex          compactID = 479
-	masKEIndex        compactID = 480
-	masTZIndex        compactID = 481
-	merIndex          compactID = 482
-	merKEIndex        compactID = 483
-	mfeIndex          compactID = 484
-	mfeMUIndex        compactID = 485
-	mgIndex           compactID = 486
-	mgMGIndex         compactID = 487
-	mghIndex          compactID = 488
-	mghMZIndex        compactID = 489
-	mgoIndex          compactID = 490
-	mgoCMIndex        compactID = 491
-	mkIndex           compactID = 492
-	mkMKIndex         compactID = 493
-	mlIndex           compactID = 494
-	mlINIndex         compactID = 495
-	mnIndex           compactID = 496
-	mnMNIndex         compactID = 497
-	moIndex           compactID = 498
-	mrIndex           compactID = 499
-	mrINIndex         compactID = 500
-	msIndex           compactID = 501
-	msBNIndex         compactID = 502
-	msMYIndex         compactID = 503
-	msSGIndex         compactID = 504
-	mtIndex           compactID = 505
-	mtMTIndex         compactID = 506
-	muaIndex          compactID = 507
-	muaCMIndex        compactID = 508
-	myIndex           compactID = 509
-	myMMIndex         compactID = 510
-	mznIndex          compactID = 511
-	mznIRIndex        compactID = 512
-	nahIndex          compactID = 513
-	naqIndex          compactID = 514
-	naqNAIndex        compactID = 515
-	nbIndex           compactID = 516
-	nbNOIndex         compactID = 517
-	nbSJIndex         compactID = 518
-	ndIndex           compactID = 519
-	ndZWIndex         compactID = 520
-	ndsIndex          compactID = 521
-	ndsDEIndex        compactID = 522
-	ndsNLIndex        compactID = 523
-	neIndex           compactID = 524
-	neINIndex         compactID = 525
-	neNPIndex         compactID = 526
-	nlIndex           compactID = 527
-	nlAWIndex         compactID = 528
-	nlBEIndex         compactID = 529
-	nlBQIndex         compactID = 530
-	nlCWIndex         compactID = 531
-	nlNLIndex         compactID = 532
-	nlSRIndex         compactID = 533
-	nlSXIndex         compactID = 534
-	nmgIndex          compactID = 535
-	nmgCMIndex        compactID = 536
-	nnIndex           compactID = 537
-	nnNOIndex         compactID = 538
-	nnhIndex          compactID = 539
-	nnhCMIndex        compactID = 540
-	noIndex           compactID = 541
-	nqoIndex          compactID = 542
-	nrIndex           compactID = 543
-	nsoIndex          compactID = 544
-	nusIndex          compactID = 545
-	nusSSIndex        compactID = 546
-	nyIndex           compactID = 547
-	nynIndex          compactID = 548
-	nynUGIndex        compactID = 549
-	omIndex           compactID = 550
-	omETIndex         compactID = 551
-	omKEIndex         compactID = 552
-	orIndex           compactID = 553
-	orINIndex         compactID = 554
-	osIndex           compactID = 555
-	osGEIndex         compactID = 556
-	osRUIndex         compactID = 557
-	paIndex           compactID = 558
-	paArabIndex       compactID = 559
-	paArabPKIndex     compactID = 560
-	paGuruIndex       compactID = 561
-	paGuruINIndex     compactID = 562
-	papIndex          compactID = 563
-	plIndex           compactID = 564
-	plPLIndex         compactID = 565
-	prgIndex          compactID = 566
-	prg001Index       compactID = 567
-	psIndex           compactID = 568
-	psAFIndex         compactID = 569
-	ptIndex           compactID = 570
-	ptAOIndex         compactID = 571
-	ptBRIndex         compactID = 572
-	ptCHIndex         compactID = 573
-	ptCVIndex         compactID = 574
-	ptGQIndex         compactID = 575
-	ptGWIndex         compactID = 576
-	ptLUIndex         compactID = 577
-	ptMOIndex         compactID = 578
-	ptMZIndex         compactID = 579
-	ptPTIndex         compactID = 580
-	ptSTIndex         compactID = 581
-	ptTLIndex         compactID = 582
-	quIndex           compactID = 583
-	quBOIndex         compactID = 584
-	quECIndex         compactID = 585
-	quPEIndex         compactID = 586
-	rmIndex           compactID = 587
-	rmCHIndex         compactID = 588
-	rnIndex           compactID = 589
-	rnBIIndex         compactID = 590
-	roIndex           compactID = 591
-	roMDIndex         compactID = 592
-	roROIndex         compactID = 593
-	rofIndex          compactID = 594
-	rofTZIndex        compactID = 595
-	ruIndex           compactID = 596
-	ruBYIndex         compactID = 597
-	ruKGIndex         compactID = 598
-	ruKZIndex         compactID = 599
-	ruMDIndex         compactID = 600
-	ruRUIndex         compactID = 601
-	ruUAIndex         compactID = 602
-	rwIndex           compactID = 603
-	rwRWIndex         compactID = 604
-	rwkIndex          compactID = 605
-	rwkTZIndex        compactID = 606
-	sahIndex          compactID = 607
-	sahRUIndex        compactID = 608
-	saqIndex          compactID = 609
-	saqKEIndex        compactID = 610
-	sbpIndex          compactID = 611
-	sbpTZIndex        compactID = 612
-	sdIndex           compactID = 613
-	sdPKIndex         compactID = 614
-	sdhIndex          compactID = 615
-	seIndex           compactID = 616
-	seFIIndex         compactID = 617
-	seNOIndex         compactID = 618
-	seSEIndex         compactID = 619
-	sehIndex          compactID = 620
-	sehMZIndex        compactID = 621
-	sesIndex          compactID = 622
-	sesMLIndex        compactID = 623
-	sgIndex           compactID = 624
-	sgCFIndex         compactID = 625
-	shIndex           compactID = 626
-	shiIndex          compactID = 627
-	shiLatnIndex      compactID = 628
-	shiLatnMAIndex    compactID = 629
-	shiTfngIndex      compactID = 630
-	shiTfngMAIndex    compactID = 631
-	siIndex           compactID = 632
-	siLKIndex         compactID = 633
-	skIndex           compactID = 634
-	skSKIndex         compactID = 635
-	slIndex           compactID = 636
-	slSIIndex         compactID = 637
-	smaIndex          compactID = 638
-	smiIndex          compactID = 639
-	smjIndex          compactID = 640
-	smnIndex          compactID = 641
-	smnFIIndex        compactID = 642
-	smsIndex          compactID = 643
-	snIndex           compactID = 644
-	snZWIndex         compactID = 645
-	soIndex           compactID = 646
-	soDJIndex         compactID = 647
-	soETIndex         compactID = 648
-	soKEIndex         compactID = 649
-	soSOIndex         compactID = 650
-	sqIndex           compactID = 651
-	sqALIndex         compactID = 652
-	sqMKIndex         compactID = 653
-	sqXKIndex         compactID = 654
-	srIndex           compactID = 655
-	srCyrlIndex       compactID = 656
-	srCyrlBAIndex     compactID = 657
-	srCyrlMEIndex     compactID = 658
-	srCyrlRSIndex     compactID = 659
-	srCyrlXKIndex     compactID = 660
-	srLatnIndex       compactID = 661
-	srLatnBAIndex     compactID = 662
-	srLatnMEIndex     compactID = 663
-	srLatnRSIndex     compactID = 664
-	srLatnXKIndex     compactID = 665
-	ssIndex           compactID = 666
-	ssyIndex          compactID = 667
-	stIndex           compactID = 668
-	svIndex           compactID = 669
-	svAXIndex         compactID = 670
-	svFIIndex         compactID = 671
-	svSEIndex         compactID = 672
-	swIndex           compactID = 673
-	swCDIndex         compactID = 674
-	swKEIndex         compactID = 675
-	swTZIndex         compactID = 676
-	swUGIndex         compactID = 677
-	syrIndex          compactID = 678
-	taIndex           compactID = 679
-	taINIndex         compactID = 680
-	taLKIndex         compactID = 681
-	taMYIndex         compactID = 682
-	taSGIndex         compactID = 683
-	teIndex           compactID = 684
-	teINIndex         compactID = 685
-	teoIndex          compactID = 686
-	teoKEIndex        compactID = 687
-	teoUGIndex        compactID = 688
-	tgIndex           compactID = 689
-	tgTJIndex         compactID = 690
-	thIndex           compactID = 691
-	thTHIndex         compactID = 692
-	tiIndex           compactID = 693
-	tiERIndex         compactID = 694
-	tiETIndex         compactID = 695
-	tigIndex          compactID = 696
-	tkIndex           compactID = 697
-	tkTMIndex         compactID = 698
-	tlIndex           compactID = 699
-	tnIndex           compactID = 700
-	toIndex           compactID = 701
-	toTOIndex         compactID = 702
-	trIndex           compactID = 703
-	trCYIndex         compactID = 704
-	trTRIndex         compactID = 705
-	tsIndex           compactID = 706
-	ttIndex           compactID = 707
-	ttRUIndex         compactID = 708
-	twqIndex          compactID = 709
-	twqNEIndex        compactID = 710
-	tzmIndex          compactID = 711
-	tzmMAIndex        compactID = 712
-	ugIndex           compactID = 713
-	ugCNIndex         compactID = 714
-	ukIndex           compactID = 715
-	ukUAIndex         compactID = 716
-	urIndex           compactID = 717
-	urINIndex         compactID = 718
-	urPKIndex         compactID = 719
-	uzIndex           compactID = 720
-	uzArabIndex       compactID = 721
-	uzArabAFIndex     compactID = 722
-	uzCyrlIndex       compactID = 723
-	uzCyrlUZIndex     compactID = 724
-	uzLatnIndex       compactID = 725
-	uzLatnUZIndex     compactID = 726
-	vaiIndex          compactID = 727
-	vaiLatnIndex      compactID = 728
-	vaiLatnLRIndex    compactID = 729
-	vaiVaiiIndex      compactID = 730
-	vaiVaiiLRIndex    compactID = 731
-	veIndex           compactID = 732
-	viIndex           compactID = 733
-	viVNIndex         compactID = 734
-	voIndex           compactID = 735
-	vo001Index        compactID = 736
-	vunIndex          compactID = 737
-	vunTZIndex        compactID = 738
-	waIndex           compactID = 739
-	waeIndex          compactID = 740
-	waeCHIndex        compactID = 741
-	woIndex           compactID = 742
-	woSNIndex         compactID = 743
-	xhIndex           compactID = 744
-	xogIndex          compactID = 745
-	xogUGIndex        compactID = 746
-	yavIndex          compactID = 747
-	yavCMIndex        compactID = 748
-	yiIndex           compactID = 749
-	yi001Index        compactID = 750
-	yoIndex           compactID = 751
-	yoBJIndex         compactID = 752
-	yoNGIndex         compactID = 753
-	yueIndex          compactID = 754
-	yueHansIndex      compactID = 755
-	yueHansCNIndex    compactID = 756
-	yueHantIndex      compactID = 757
-	yueHantHKIndex    compactID = 758
-	zghIndex          compactID = 759
-	zghMAIndex        compactID = 760
-	zhIndex           compactID = 761
-	zhHansIndex       compactID = 762
-	zhHansCNIndex     compactID = 763
-	zhHansHKIndex     compactID = 764
-	zhHansMOIndex     compactID = 765
-	zhHansSGIndex     compactID = 766
-	zhHantIndex       compactID = 767
-	zhHantHKIndex     compactID = 768
-	zhHantMOIndex     compactID = 769
-	zhHantTWIndex     compactID = 770
-	zuIndex           compactID = 771
-	zuZAIndex         compactID = 772
-	caESvalenciaIndex compactID = 773
-	enUSuvaposixIndex compactID = 774
-)
-
-var coreTags = []language.CompactCoreInfo{ // 773 elements
-	// Entry 0 - 1F
-	0x00000000, 0x01600000, 0x016000d2, 0x01600161,
-	0x01c00000, 0x01c00052, 0x02100000, 0x02100080,
-	0x02700000, 0x0270006f, 0x03a00000, 0x03a00001,
-	0x03a00023, 0x03a00039, 0x03a00062, 0x03a00067,
-	0x03a0006b, 0x03a0006c, 0x03a0006d, 0x03a00097,
-	0x03a0009b, 0x03a000a1, 0x03a000a8, 0x03a000ac,
-	0x03a000b0, 0x03a000b9, 0x03a000ba, 0x03a000c9,
-	0x03a000e1, 0x03a000ed, 0x03a000f3, 0x03a00108,
-	// Entry 20 - 3F
-	0x03a0010b, 0x03a00115, 0x03a00117, 0x03a0011c,
-	0x03a00120, 0x03a00128, 0x03a0015e, 0x04000000,
-	0x04300000, 0x04300099, 0x04400000, 0x0440012f,
-	0x04800000, 0x0480006e, 0x05800000, 0x0581f000,
-	0x0581f032, 0x05857000, 0x05857032, 0x05e00000,
-	0x05e00052, 0x07100000, 0x07100047, 0x07500000,
-	0x07500162, 0x07900000, 0x0790012f, 0x07e00000,
-	0x07e00038, 0x08200000, 0x0a000000, 0x0a0000c3,
-	// Entry 40 - 5F
-	0x0a500000, 0x0a500035, 0x0a500099, 0x0a900000,
-	0x0a900053, 0x0a900099, 0x0b200000, 0x0b200078,
-	0x0b500000, 0x0b500099, 0x0b700000, 0x0b71f000,
-	0x0b71f033, 0x0b757000, 0x0b757033, 0x0d700000,
-	0x0d700022, 0x0d70006e, 0x0d700078, 0x0d70009e,
-	0x0db00000, 0x0db00035, 0x0db00099, 0x0dc00000,
-	0x0dc00106, 0x0df00000, 0x0df00131, 0x0e500000,
-	0x0e500135, 0x0e900000, 0x0e90009b, 0x0e90009c,
-	// Entry 60 - 7F
-	0x0fa00000, 0x0fa0005e, 0x0fe00000, 0x0fe00106,
-	0x10000000, 0x1000007b, 0x10100000, 0x10100063,
-	0x10100082, 0x10800000, 0x108000a4, 0x10d00000,
-	0x10d0002e, 0x10d00036, 0x10d0004e, 0x10d00060,
-	0x10d0009e, 0x10d000b2, 0x10d000b7, 0x11700000,
-	0x117000d4, 0x11f00000, 0x11f00060, 0x12400000,
-	0x12400052, 0x12800000, 0x12b00000, 0x12b00114,
-	0x12d00000, 0x12d00043, 0x12f00000, 0x12f000a4,
-	// Entry 80 - 9F
-	0x13000000, 0x13000080, 0x13000122, 0x13600000,
-	0x1360005d, 0x13600087, 0x13900000, 0x13900001,
-	0x1390001a, 0x13900025, 0x13900026, 0x1390002d,
-	0x1390002e, 0x1390002f, 0x13900034, 0x13900036,
-	0x1390003a, 0x1390003d, 0x13900042, 0x13900046,
-	0x13900048, 0x13900049, 0x1390004a, 0x1390004e,
-	0x13900050, 0x13900052, 0x1390005c, 0x1390005d,
-	0x13900060, 0x13900061, 0x13900063, 0x13900064,
-	// Entry A0 - BF
-	0x1390006d, 0x13900072, 0x13900073, 0x13900074,
-	0x13900075, 0x1390007b, 0x1390007c, 0x1390007f,
-	0x13900080, 0x13900081, 0x13900083, 0x1390008a,
-	0x1390008c, 0x1390008d, 0x13900096, 0x13900097,
-	0x13900098, 0x13900099, 0x1390009a, 0x1390009f,
-	0x139000a0, 0x139000a4, 0x139000a7, 0x139000a9,
-	0x139000ad, 0x139000b1, 0x139000b4, 0x139000b5,
-	0x139000bf, 0x139000c0, 0x139000c6, 0x139000c7,
-	// Entry C0 - DF
-	0x139000ca, 0x139000cb, 0x139000cc, 0x139000ce,
-	0x139000d0, 0x139000d2, 0x139000d5, 0x139000d6,
-	0x139000d9, 0x139000dd, 0x139000df, 0x139000e0,
-	0x139000e6, 0x139000e7, 0x139000e8, 0x139000eb,
-	0x139000ec, 0x139000f0, 0x13900107, 0x13900109,
-	0x1390010a, 0x1390010b, 0x1390010c, 0x1390010d,
-	0x1390010e, 0x1390010f, 0x13900112, 0x13900117,
-	0x1390011b, 0x1390011d, 0x1390011f, 0x13900125,
-	// Entry E0 - FF
-	0x13900129, 0x1390012c, 0x1390012d, 0x1390012f,
-	0x13900131, 0x13900133, 0x13900135, 0x13900139,
-	0x1390013c, 0x1390013d, 0x1390013f, 0x13900142,
-	0x13900161, 0x13900162, 0x13900164, 0x13c00000,
-	0x13c00001, 0x13e00000, 0x13e0001f, 0x13e0002c,
-	0x13e0003f, 0x13e00041, 0x13e00048, 0x13e00051,
-	0x13e00054, 0x13e00056, 0x13e00059, 0x13e00065,
-	0x13e00068, 0x13e00069, 0x13e0006e, 0x13e00086,
-	// Entry 100 - 11F
-	0x13e00089, 0x13e0008f, 0x13e00094, 0x13e000cf,
-	0x13e000d8, 0x13e000e2, 0x13e000e4, 0x13e000e7,
-	0x13e000ec, 0x13e000f1, 0x13e0011a, 0x13e00135,
-	0x13e00136, 0x13e0013b, 0x14000000, 0x1400006a,
-	0x14500000, 0x1450006e, 0x14600000, 0x14600052,
-	0x14800000, 0x14800024, 0x1480009c, 0x14e00000,
-	0x14e00052, 0x14e00084, 0x14e000c9, 0x14e00114,
-	0x15100000, 0x15100072, 0x15300000, 0x153000e7,
-	// Entry 120 - 13F
-	0x15800000, 0x15800063, 0x15800076, 0x15e00000,
-	0x15e00036, 0x15e00037, 0x15e0003a, 0x15e0003b,
-	0x15e0003c, 0x15e00049, 0x15e0004b, 0x15e0004c,
-	0x15e0004d, 0x15e0004e, 0x15e0004f, 0x15e00052,
-	0x15e00062, 0x15e00067, 0x15e00078, 0x15e0007a,
-	0x15e0007e, 0x15e00084, 0x15e00085, 0x15e00086,
-	0x15e00091, 0x15e000a8, 0x15e000b7, 0x15e000ba,
-	0x15e000bb, 0x15e000be, 0x15e000bf, 0x15e000c3,
-	// Entry 140 - 15F
-	0x15e000c8, 0x15e000c9, 0x15e000cc, 0x15e000d3,
-	0x15e000d4, 0x15e000e5, 0x15e000ea, 0x15e00102,
-	0x15e00107, 0x15e0010a, 0x15e00114, 0x15e0011c,
-	0x15e00120, 0x15e00122, 0x15e00128, 0x15e0013f,
-	0x15e00140, 0x15e0015f, 0x16900000, 0x1690009e,
-	0x16d00000, 0x16d000d9, 0x16e00000, 0x16e00096,
-	0x17e00000, 0x17e0007b, 0x19000000, 0x1900006e,
-	0x1a300000, 0x1a30004e, 0x1a300078, 0x1a3000b2,
-	// Entry 160 - 17F
-	0x1a400000, 0x1a400099, 0x1a900000, 0x1ab00000,
-	0x1ab000a4, 0x1ac00000, 0x1ac00098, 0x1b400000,
-	0x1b400080, 0x1b4000d4, 0x1b4000d6, 0x1b800000,
-	0x1b800135, 0x1bc00000, 0x1bc00097, 0x1be00000,
-	0x1be00099, 0x1d100000, 0x1d100033, 0x1d100090,
-	0x1d200000, 0x1d200060, 0x1d500000, 0x1d500092,
-	0x1d700000, 0x1d700028, 0x1e100000, 0x1e100095,
-	0x1e700000, 0x1e7000d6, 0x1ea00000, 0x1ea00053,
-	// Entry 180 - 19F
-	0x1f300000, 0x1f500000, 0x1f800000, 0x1f80009d,
-	0x1f900000, 0x1f90004e, 0x1f90009e, 0x1f900113,
-	0x1f900138, 0x1fa00000, 0x1fb00000, 0x20000000,
-	0x200000a2, 0x20300000, 0x20700000, 0x20700052,
-	0x20800000, 0x20a00000, 0x20a0012f, 0x20e00000,
-	0x20f00000, 0x21000000, 0x2100007d, 0x21200000,
-	0x21200067, 0x21600000, 0x21700000, 0x217000a4,
-	0x21f00000, 0x22300000, 0x2230012f, 0x22700000,
-	// Entry 1A0 - 1BF
-	0x2270005a, 0x23400000, 0x234000c3, 0x23900000,
-	0x239000a4, 0x24200000, 0x242000ae, 0x24400000,
-	0x24400052, 0x24500000, 0x24500082, 0x24600000,
-	0x246000a4, 0x24a00000, 0x24a000a6, 0x25100000,
-	0x25100099, 0x25400000, 0x254000aa, 0x254000ab,
-	0x25600000, 0x25600099, 0x26a00000, 0x26a00099,
-	0x26b00000, 0x26b0012f, 0x26d00000, 0x26d00052,
-	0x26e00000, 0x26e00060, 0x27400000, 0x28100000,
-	// Entry 1C0 - 1DF
-	0x2810007b, 0x28a00000, 0x28a000a5, 0x29100000,
-	0x2910012f, 0x29500000, 0x295000b7, 0x2a300000,
-	0x2a300131, 0x2af00000, 0x2af00135, 0x2b500000,
-	0x2b50002a, 0x2b50004b, 0x2b50004c, 0x2b50004d,
-	0x2b800000, 0x2b8000af, 0x2bf00000, 0x2bf0009b,
-	0x2bf0009c, 0x2c000000, 0x2c0000b6, 0x2c200000,
-	0x2c20004b, 0x2c400000, 0x2c4000a4, 0x2c500000,
-	0x2c5000a4, 0x2c700000, 0x2c7000b8, 0x2d100000,
-	// Entry 1E0 - 1FF
-	0x2d1000a4, 0x2d10012f, 0x2e900000, 0x2e9000a4,
-	0x2ed00000, 0x2ed000cc, 0x2f100000, 0x2f1000bf,
-	0x2f200000, 0x2f2000d1, 0x2f400000, 0x2f400052,
-	0x2ff00000, 0x2ff000c2, 0x30400000, 0x30400099,
-	0x30b00000, 0x30b000c5, 0x31000000, 0x31b00000,
-	0x31b00099, 0x31f00000, 0x31f0003e, 0x31f000d0,
-	0x31f0010d, 0x32000000, 0x320000cb, 0x32500000,
-	0x32500052, 0x33100000, 0x331000c4, 0x33a00000,
-	// Entry 200 - 21F
-	0x33a0009c, 0x34100000, 0x34500000, 0x345000d2,
-	0x34700000, 0x347000da, 0x34700110, 0x34e00000,
-	0x34e00164, 0x35000000, 0x35000060, 0x350000d9,
-	0x35100000, 0x35100099, 0x351000db, 0x36700000,
-	0x36700030, 0x36700036, 0x36700040, 0x3670005b,
-	0x367000d9, 0x36700116, 0x3670011b, 0x36800000,
-	0x36800052, 0x36a00000, 0x36a000da, 0x36c00000,
-	0x36c00052, 0x36f00000, 0x37500000, 0x37600000,
-	// Entry 220 - 23F
-	0x37a00000, 0x38000000, 0x38000117, 0x38700000,
-	0x38900000, 0x38900131, 0x39000000, 0x3900006f,
-	0x390000a4, 0x39500000, 0x39500099, 0x39800000,
-	0x3980007d, 0x39800106, 0x39d00000, 0x39d05000,
-	0x39d050e8, 0x39d33000, 0x39d33099, 0x3a100000,
-	0x3b300000, 0x3b3000e9, 0x3bd00000, 0x3bd00001,
-	0x3be00000, 0x3be00024, 0x3c000000, 0x3c00002a,
-	0x3c000041, 0x3c00004e, 0x3c00005a, 0x3c000086,
-	// Entry 240 - 25F
-	0x3c00008b, 0x3c0000b7, 0x3c0000c6, 0x3c0000d1,
-	0x3c0000ee, 0x3c000118, 0x3c000126, 0x3c400000,
-	0x3c40003f, 0x3c400069, 0x3c4000e4, 0x3d400000,
-	0x3d40004e, 0x3d900000, 0x3d90003a, 0x3dc00000,
-	0x3dc000bc, 0x3dc00104, 0x3de00000, 0x3de0012f,
-	0x3e200000, 0x3e200047, 0x3e2000a5, 0x3e2000ae,
-	0x3e2000bc, 0x3e200106, 0x3e200130, 0x3e500000,
-	0x3e500107, 0x3e600000, 0x3e60012f, 0x3eb00000,
-	// Entry 260 - 27F
-	0x3eb00106, 0x3ec00000, 0x3ec000a4, 0x3f300000,
-	0x3f30012f, 0x3fa00000, 0x3fa000e8, 0x3fc00000,
-	0x3fd00000, 0x3fd00072, 0x3fd000da, 0x3fd0010c,
-	0x3ff00000, 0x3ff000d1, 0x40100000, 0x401000c3,
-	0x40200000, 0x4020004c, 0x40700000, 0x40800000,
-	0x40857000, 0x408570ba, 0x408dc000, 0x408dc0ba,
-	0x40c00000, 0x40c000b3, 0x41200000, 0x41200111,
-	0x41600000, 0x4160010f, 0x41c00000, 0x41d00000,
-	// Entry 280 - 29F
-	0x41e00000, 0x41f00000, 0x41f00072, 0x42200000,
-	0x42300000, 0x42300164, 0x42900000, 0x42900062,
-	0x4290006f, 0x429000a4, 0x42900115, 0x43100000,
-	0x43100027, 0x431000c2, 0x4310014d, 0x43200000,
-	0x4321f000, 0x4321f033, 0x4321f0bd, 0x4321f105,
-	0x4321f14d, 0x43257000, 0x43257033, 0x432570bd,
-	0x43257105, 0x4325714d, 0x43700000, 0x43a00000,
-	0x43b00000, 0x44400000, 0x44400031, 0x44400072,
-	// Entry 2A0 - 2BF
-	0x4440010c, 0x44500000, 0x4450004b, 0x445000a4,
-	0x4450012f, 0x44500131, 0x44e00000, 0x45000000,
-	0x45000099, 0x450000b3, 0x450000d0, 0x4500010d,
-	0x46100000, 0x46100099, 0x46400000, 0x464000a4,
-	0x46400131, 0x46700000, 0x46700124, 0x46b00000,
-	0x46b00123, 0x46f00000, 0x46f0006d, 0x46f0006f,
-	0x47100000, 0x47600000, 0x47600127, 0x47a00000,
-	0x48000000, 0x48200000, 0x48200129, 0x48a00000,
-	// Entry 2C0 - 2DF
-	0x48a0005d, 0x48a0012b, 0x48e00000, 0x49400000,
-	0x49400106, 0x4a400000, 0x4a4000d4, 0x4a900000,
-	0x4a9000ba, 0x4ac00000, 0x4ac00053, 0x4ae00000,
-	0x4ae00130, 0x4b400000, 0x4b400099, 0x4b4000e8,
-	0x4bc00000, 0x4bc05000, 0x4bc05024, 0x4bc1f000,
-	0x4bc1f137, 0x4bc57000, 0x4bc57137, 0x4be00000,
-	0x4be57000, 0x4be570b4, 0x4bee3000, 0x4bee30b4,
-	0x4c000000, 0x4c300000, 0x4c30013e, 0x4c900000,
-	// Entry 2E0 - 2FF
-	0x4c900001, 0x4cc00000, 0x4cc0012f, 0x4ce00000,
-	0x4cf00000, 0x4cf0004e, 0x4e500000, 0x4e500114,
-	0x4f200000, 0x4fb00000, 0x4fb00131, 0x50900000,
-	0x50900052, 0x51200000, 0x51200001, 0x51800000,
-	0x5180003b, 0x518000d6, 0x51f00000, 0x51f38000,
-	0x51f38053, 0x51f39000, 0x51f3908d, 0x52800000,
-	0x528000ba, 0x52900000, 0x52938000, 0x52938053,
-	0x5293808d, 0x529380c6, 0x5293810d, 0x52939000,
-	// Entry 300 - 31F
-	0x5293908d, 0x529390c6, 0x5293912e, 0x52f00000,
-	0x52f00161,
-} // Size: 3116 bytes
-
-const specialTagsStr string = "ca-ES-valencia en-US-u-va-posix"
-
 var regionToGroups = []uint8{ // 357 elements
 	// Entry 0 - 3F
 	0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04,
@@ -1302,4 +295,4 @@
 	14: {lang: 0x529, script: 0x39, group: 0x80, distance: 0x5},
 } // Size: 114 bytes
 
-// Total table size 4618 bytes (4KiB); checksum: D161A896
+// Total table size 1471 bytes (1KiB); checksum: 4CB1CD46
diff --git a/language/tags.go b/language/tags.go
index acc482a..42ea792 100644
--- a/language/tags.go
+++ b/language/tags.go
@@ -4,6 +4,8 @@
 
 package language
 
+import "golang.org/x/text/internal/language/compact"
+
 // TODO: Various sets of commonly use tags and regions.
 
 // MustParse is like Parse, but panics if the given BCP 47 tag cannot be parsed.
@@ -61,83 +63,83 @@
 
 	Und Tag = Tag{}
 
-	Afrikaans            Tag = Tag{language: afIndex, locale: afIndex}
-	Amharic              Tag = Tag{language: amIndex, locale: amIndex}
-	Arabic               Tag = Tag{language: arIndex, locale: arIndex}
-	ModernStandardArabic Tag = Tag{language: ar001Index, locale: ar001Index}
-	Azerbaijani          Tag = Tag{language: azIndex, locale: azIndex}
-	Bulgarian            Tag = Tag{language: bgIndex, locale: bgIndex}
-	Bengali              Tag = Tag{language: bnIndex, locale: bnIndex}
-	Catalan              Tag = Tag{language: caIndex, locale: caIndex}
-	Czech                Tag = Tag{language: csIndex, locale: csIndex}
-	Danish               Tag = Tag{language: daIndex, locale: daIndex}
-	German               Tag = Tag{language: deIndex, locale: deIndex}
-	Greek                Tag = Tag{language: elIndex, locale: elIndex}
-	English              Tag = Tag{language: enIndex, locale: enIndex}
-	AmericanEnglish      Tag = Tag{language: enUSIndex, locale: enUSIndex}
-	BritishEnglish       Tag = Tag{language: enGBIndex, locale: enGBIndex}
-	Spanish              Tag = Tag{language: esIndex, locale: esIndex}
-	EuropeanSpanish      Tag = Tag{language: esESIndex, locale: esESIndex}
-	LatinAmericanSpanish Tag = Tag{language: es419Index, locale: es419Index}
-	Estonian             Tag = Tag{language: etIndex, locale: etIndex}
-	Persian              Tag = Tag{language: faIndex, locale: faIndex}
-	Finnish              Tag = Tag{language: fiIndex, locale: fiIndex}
-	Filipino             Tag = Tag{language: filIndex, locale: filIndex}
-	French               Tag = Tag{language: frIndex, locale: frIndex}
-	CanadianFrench       Tag = Tag{language: frCAIndex, locale: frCAIndex}
-	Gujarati             Tag = Tag{language: guIndex, locale: guIndex}
-	Hebrew               Tag = Tag{language: heIndex, locale: heIndex}
-	Hindi                Tag = Tag{language: hiIndex, locale: hiIndex}
-	Croatian             Tag = Tag{language: hrIndex, locale: hrIndex}
-	Hungarian            Tag = Tag{language: huIndex, locale: huIndex}
-	Armenian             Tag = Tag{language: hyIndex, locale: hyIndex}
-	Indonesian           Tag = Tag{language: idIndex, locale: idIndex}
-	Icelandic            Tag = Tag{language: isIndex, locale: isIndex}
-	Italian              Tag = Tag{language: itIndex, locale: itIndex}
-	Japanese             Tag = Tag{language: jaIndex, locale: jaIndex}
-	Georgian             Tag = Tag{language: kaIndex, locale: kaIndex}
-	Kazakh               Tag = Tag{language: kkIndex, locale: kkIndex}
-	Khmer                Tag = Tag{language: kmIndex, locale: kmIndex}
-	Kannada              Tag = Tag{language: knIndex, locale: knIndex}
-	Korean               Tag = Tag{language: koIndex, locale: koIndex}
-	Kirghiz              Tag = Tag{language: kyIndex, locale: kyIndex}
-	Lao                  Tag = Tag{language: loIndex, locale: loIndex}
-	Lithuanian           Tag = Tag{language: ltIndex, locale: ltIndex}
-	Latvian              Tag = Tag{language: lvIndex, locale: lvIndex}
-	Macedonian           Tag = Tag{language: mkIndex, locale: mkIndex}
-	Malayalam            Tag = Tag{language: mlIndex, locale: mlIndex}
-	Mongolian            Tag = Tag{language: mnIndex, locale: mnIndex}
-	Marathi              Tag = Tag{language: mrIndex, locale: mrIndex}
-	Malay                Tag = Tag{language: msIndex, locale: msIndex}
-	Burmese              Tag = Tag{language: myIndex, locale: myIndex}
-	Nepali               Tag = Tag{language: neIndex, locale: neIndex}
-	Dutch                Tag = Tag{language: nlIndex, locale: nlIndex}
-	Norwegian            Tag = Tag{language: noIndex, locale: noIndex}
-	Punjabi              Tag = Tag{language: paIndex, locale: paIndex}
-	Polish               Tag = Tag{language: plIndex, locale: plIndex}
-	Portuguese           Tag = Tag{language: ptIndex, locale: ptIndex}
-	BrazilianPortuguese  Tag = Tag{language: ptBRIndex, locale: ptBRIndex}
-	EuropeanPortuguese   Tag = Tag{language: ptPTIndex, locale: ptPTIndex}
-	Romanian             Tag = Tag{language: roIndex, locale: roIndex}
-	Russian              Tag = Tag{language: ruIndex, locale: ruIndex}
-	Sinhala              Tag = Tag{language: siIndex, locale: siIndex}
-	Slovak               Tag = Tag{language: skIndex, locale: skIndex}
-	Slovenian            Tag = Tag{language: slIndex, locale: slIndex}
-	Albanian             Tag = Tag{language: sqIndex, locale: sqIndex}
-	Serbian              Tag = Tag{language: srIndex, locale: srIndex}
-	SerbianLatin         Tag = Tag{language: srLatnIndex, locale: srLatnIndex}
-	Swedish              Tag = Tag{language: svIndex, locale: svIndex}
-	Swahili              Tag = Tag{language: swIndex, locale: swIndex}
-	Tamil                Tag = Tag{language: taIndex, locale: taIndex}
-	Telugu               Tag = Tag{language: teIndex, locale: teIndex}
-	Thai                 Tag = Tag{language: thIndex, locale: thIndex}
-	Turkish              Tag = Tag{language: trIndex, locale: trIndex}
-	Ukrainian            Tag = Tag{language: ukIndex, locale: ukIndex}
-	Urdu                 Tag = Tag{language: urIndex, locale: urIndex}
-	Uzbek                Tag = Tag{language: uzIndex, locale: uzIndex}
-	Vietnamese           Tag = Tag{language: viIndex, locale: viIndex}
-	Chinese              Tag = Tag{language: zhIndex, locale: zhIndex}
-	SimplifiedChinese    Tag = Tag{language: zhHansIndex, locale: zhHansIndex}
-	TraditionalChinese   Tag = Tag{language: zhHantIndex, locale: zhHantIndex}
-	Zulu                 Tag = Tag{language: zuIndex, locale: zuIndex}
+	Afrikaans            Tag = Tag(compact.Afrikaans)
+	Amharic              Tag = Tag(compact.Amharic)
+	Arabic               Tag = Tag(compact.Arabic)
+	ModernStandardArabic Tag = Tag(compact.ModernStandardArabic)
+	Azerbaijani          Tag = Tag(compact.Azerbaijani)
+	Bulgarian            Tag = Tag(compact.Bulgarian)
+	Bengali              Tag = Tag(compact.Bengali)
+	Catalan              Tag = Tag(compact.Catalan)
+	Czech                Tag = Tag(compact.Czech)
+	Danish               Tag = Tag(compact.Danish)
+	German               Tag = Tag(compact.German)
+	Greek                Tag = Tag(compact.Greek)
+	English              Tag = Tag(compact.English)
+	AmericanEnglish      Tag = Tag(compact.AmericanEnglish)
+	BritishEnglish       Tag = Tag(compact.BritishEnglish)
+	Spanish              Tag = Tag(compact.Spanish)
+	EuropeanSpanish      Tag = Tag(compact.EuropeanSpanish)
+	LatinAmericanSpanish Tag = Tag(compact.LatinAmericanSpanish)
+	Estonian             Tag = Tag(compact.Estonian)
+	Persian              Tag = Tag(compact.Persian)
+	Finnish              Tag = Tag(compact.Finnish)
+	Filipino             Tag = Tag(compact.Filipino)
+	French               Tag = Tag(compact.French)
+	CanadianFrench       Tag = Tag(compact.CanadianFrench)
+	Gujarati             Tag = Tag(compact.Gujarati)
+	Hebrew               Tag = Tag(compact.Hebrew)
+	Hindi                Tag = Tag(compact.Hindi)
+	Croatian             Tag = Tag(compact.Croatian)
+	Hungarian            Tag = Tag(compact.Hungarian)
+	Armenian             Tag = Tag(compact.Armenian)
+	Indonesian           Tag = Tag(compact.Indonesian)
+	Icelandic            Tag = Tag(compact.Icelandic)
+	Italian              Tag = Tag(compact.Italian)
+	Japanese             Tag = Tag(compact.Japanese)
+	Georgian             Tag = Tag(compact.Georgian)
+	Kazakh               Tag = Tag(compact.Kazakh)
+	Khmer                Tag = Tag(compact.Khmer)
+	Kannada              Tag = Tag(compact.Kannada)
+	Korean               Tag = Tag(compact.Korean)
+	Kirghiz              Tag = Tag(compact.Kirghiz)
+	Lao                  Tag = Tag(compact.Lao)
+	Lithuanian           Tag = Tag(compact.Lithuanian)
+	Latvian              Tag = Tag(compact.Latvian)
+	Macedonian           Tag = Tag(compact.Macedonian)
+	Malayalam            Tag = Tag(compact.Malayalam)
+	Mongolian            Tag = Tag(compact.Mongolian)
+	Marathi              Tag = Tag(compact.Marathi)
+	Malay                Tag = Tag(compact.Malay)
+	Burmese              Tag = Tag(compact.Burmese)
+	Nepali               Tag = Tag(compact.Nepali)
+	Dutch                Tag = Tag(compact.Dutch)
+	Norwegian            Tag = Tag(compact.Norwegian)
+	Punjabi              Tag = Tag(compact.Punjabi)
+	Polish               Tag = Tag(compact.Polish)
+	Portuguese           Tag = Tag(compact.Portuguese)
+	BrazilianPortuguese  Tag = Tag(compact.BrazilianPortuguese)
+	EuropeanPortuguese   Tag = Tag(compact.EuropeanPortuguese)
+	Romanian             Tag = Tag(compact.Romanian)
+	Russian              Tag = Tag(compact.Russian)
+	Sinhala              Tag = Tag(compact.Sinhala)
+	Slovak               Tag = Tag(compact.Slovak)
+	Slovenian            Tag = Tag(compact.Slovenian)
+	Albanian             Tag = Tag(compact.Albanian)
+	Serbian              Tag = Tag(compact.Serbian)
+	SerbianLatin         Tag = Tag(compact.SerbianLatin)
+	Swedish              Tag = Tag(compact.Swedish)
+	Swahili              Tag = Tag(compact.Swahili)
+	Tamil                Tag = Tag(compact.Tamil)
+	Telugu               Tag = Tag(compact.Telugu)
+	Thai                 Tag = Tag(compact.Thai)
+	Turkish              Tag = Tag(compact.Turkish)
+	Ukrainian            Tag = Tag(compact.Ukrainian)
+	Urdu                 Tag = Tag(compact.Urdu)
+	Uzbek                Tag = Tag(compact.Uzbek)
+	Vietnamese           Tag = Tag(compact.Vietnamese)
+	Chinese              Tag = Tag(compact.Chinese)
+	SimplifiedChinese    Tag = Tag(compact.SimplifiedChinese)
+	TraditionalChinese   Tag = Tag(compact.TraditionalChinese)
+	Zulu                 Tag = Tag(compact.Zulu)
 )