From 447e934a103d19742116bde22ab70eb6b21340d9 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 11 Apr 2023 11:32:51 -0500 Subject: [PATCH 001/141] Update test credentials for consistency with other projects --- .github/workflows/ci.yml | 4 ++-- dates/date_test.go | 2 +- dbutil/query_test.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 750675b..daa1720 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,8 +17,8 @@ jobs: with: postgresql version: ${{ matrix.pg-version }} postgresql db: gocommon_test - postgresql user: nyaruka - postgresql password: nyaruka + postgresql user: gocommon_test + postgresql password: temba - name: Install Linux packages run: sudo apt install -y --no-install-recommends pandoc diff --git a/dates/date_test.go b/dates/date_test.go index 74d7e36..71be9ea 100644 --- a/dates/date_test.go +++ b/dates/date_test.go @@ -128,5 +128,5 @@ func TestDateDBSerialization(t *testing.T) { // returns an open test database pool func getTestDB() *sqlx.DB { - return sqlx.MustOpen("postgres", "postgres://nyaruka:nyaruka@localhost/gocommon_test?sslmode=disable&Timezone=UTC") + return sqlx.MustOpen("postgres", "postgres://gocommon_test:temba@localhost/gocommon_test?sslmode=disable&Timezone=UTC") } diff --git a/dbutil/query_test.go b/dbutil/query_test.go index 57c1d89..c0f4a10 100644 --- a/dbutil/query_test.go +++ b/dbutil/query_test.go @@ -108,5 +108,5 @@ func TestBulkQuery(t *testing.T) { // returns an open test database pool func getTestDB() *sqlx.DB { - return sqlx.MustOpen("postgres", "postgres://nyaruka:nyaruka@localhost/gocommon_test?sslmode=disable&Timezone=UTC") + return sqlx.MustOpen("postgres", "postgres://gocommon_test:temba@localhost/gocommon_test?sslmode=disable&Timezone=UTC") } From 128236c5a45adfa65328b20d1bb54471026b7504 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 19 Apr 2023 12:10:45 -0500 Subject: [PATCH 002/141] Use services for github CI --- .github/workflows/ci.yml | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index daa1720..c9c8343 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,31 +3,33 @@ on: [push, pull_request] jobs: test: name: Test + runs-on: ubuntu-latest strategy: matrix: - go-version: [1.19.x] - pg-version: ["13", "14"] - runs-on: ubuntu-latest + go-version: [1.19.x, 1.20.x] + + services: + redis: + image: redis:6.2-alpine + ports: + - 6379:6379 + postgres: + image: postgis/postgis:14-3.3-alpine + env: + POSTGRES_DB: gocommon_test + POSTGRES_USER: gocommon_test + POSTGRES_PASSWORD: temba + ports: + - 5432:5432 + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + steps: - name: Checkout code uses: actions/checkout@v3 - - name: Install PostgreSQL - uses: harmon758/postgresql-action@v1 - with: - postgresql version: ${{ matrix.pg-version }} - postgresql db: gocommon_test - postgresql user: gocommon_test - postgresql password: temba - - name: Install Linux packages run: sudo apt install -y --no-install-recommends pandoc - - name: Install Redis - uses: zhulik/redis-action@v1.0.0 - with: - redis version: "6.2" - - name: Install Go uses: actions/setup-go@v3 with: @@ -38,7 +40,7 @@ jobs: - name: Upload coverage if: success() - uses: codecov/codecov-action@v1 + uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true From 2955dd77d08e26b133f00529854cf99b04620491 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 19 Apr 2023 12:19:02 -0500 Subject: [PATCH 003/141] Make test work in both Go 1.19 and 1.20 --- httpx/access_test.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/httpx/access_test.go b/httpx/access_test.go index f0e2349..850d838 100644 --- a/httpx/access_test.go +++ b/httpx/access_test.go @@ -47,7 +47,7 @@ func TestAccessConfig(t *testing.T) { {"https://LOCALHOST:80", "request to LOCALHOST denied"}, {"http://foo.localtest.me", "request to foo.localtest.me denied"}, {"https://127.0.0.1", "request to 127.0.0.1 denied"}, - {"https://127.0.00.1", "request to 127.0.00.1 denied"}, + {"https://127.0.00.1", "?"}, // Go 1.19: "request to 127.0.00.1 denied", Go 1.20: "lookup 127.0.00.1: no such host" {"https://[::1]:80", "request to ::1 denied"}, {"https://[0:0:0:0:0:0:0:1]:80", "request to 0:0:0:0:0:0:0:1 denied"}, {"https://[0000:0000:0000:0000:0000:0000:0000:0001]:80", "request to 0000:0000:0000:0000:0000:0000:0000:0001 denied"}, @@ -63,7 +63,11 @@ func TestAccessConfig(t *testing.T) { _, err := httpx.DoTrace(http.DefaultClient, request, nil, access, -1) if tc.err != "" { - assert.EqualError(t, err, tc.err, "error message mismatch for url %s", tc.url) + if tc.err == "?" { + assert.Error(t, err) + } else { + assert.EqualError(t, err, tc.err, "error message mismatch for url %s", tc.url) + } } else { assert.NoError(t, err) } From 6f71503045d858f86e05b415ad3f38684699c389 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 29 Jun 2023 09:23:17 +0100 Subject: [PATCH 004/141] Storage paths shouldn't need to start with slash --- storage/fs_test.go | 4 ++-- storage/s3.go | 2 +- storage/s3_test.go | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/storage/fs_test.go b/storage/fs_test.go index ef08b0f..a677d8a 100644 --- a/storage/fs_test.go +++ b/storage/fs_test.go @@ -27,11 +27,11 @@ func TestFS(t *testing.T) { require.NoError(t, os.Chmod("_testing", 0777)) - url, err := s.Put(ctx, "/foo/bar.txt", "text/plain", []byte(`hello world`)) + url, err := s.Put(ctx, "foo/bar.txt", "text/plain", []byte(`hello world`)) assert.NoError(t, err) assert.Equal(t, "_testing/foo/bar.txt", url) - _, data, err := s.Get(ctx, "/foo/bar.txt") + _, data, err := s.Get(ctx, "foo/bar.txt") assert.NoError(t, err) assert.Equal(t, []byte(`hello world`), data) diff --git a/storage/s3.go b/storage/s3.go index e26c609..28ad340 100644 --- a/storage/s3.go +++ b/storage/s3.go @@ -16,7 +16,7 @@ import ( "github.com/pkg/errors" ) -var s3BucketURL = "https://%s.s3.%s.amazonaws.com%s" +var s3BucketURL = "https://%s.s3.%s.amazonaws.com/%s" // S3Client provides a mockable subset of the S3 API type S3Client interface { diff --git a/storage/s3_test.go b/storage/s3_test.go index 7e7e807..c4932c5 100644 --- a/storage/s3_test.go +++ b/storage/s3_test.go @@ -71,18 +71,18 @@ func TestS3Get(t *testing.T) { Body: io.NopCloser(bytes.NewReader([]byte(`HELLOWORLD`))), } - contentType, contents, err := s.Get(ctx, "/foo/things") + contentType, contents, err := s.Get(ctx, "foo/things") assert.NoError(t, err) assert.Equal(t, "text/plain", contentType) assert.Equal(t, []byte(`HELLOWORLD`), contents) assert.Len(t, client.getObjectInputs, 1) assert.Equal(t, aws.String("mybucket"), client.getObjectInputs[0].Bucket) - assert.Equal(t, aws.String("/foo/things"), client.getObjectInputs[0].Key) + assert.Equal(t, aws.String("foo/things"), client.getObjectInputs[0].Key) client.returnError = errors.New("boom") - _, _, err = s.Get(ctx, "/foo/things") + _, _, err = s.Get(ctx, "foo/things") assert.EqualError(t, err, "error getting S3 object: boom") } @@ -91,18 +91,18 @@ func TestS3Put(t *testing.T) { client := &testS3Client{} s := storage.NewS3(client, "mybucket", "us-east-1", s3.BucketCannedACLPublicRead, 1) - url, err := s.Put(ctx, "/foo/things", "text/plain", []byte(`HELLOWORLD`)) + url, err := s.Put(ctx, "foo/things", "text/plain", []byte(`HELLOWORLD`)) assert.NoError(t, err) assert.Equal(t, "https://mybucket.s3.us-east-1.amazonaws.com/foo/things", url) assert.Len(t, client.putObjectInputs, 1) assert.Equal(t, aws.String("mybucket"), client.putObjectInputs[0].Bucket) - assert.Equal(t, aws.String("/foo/things"), client.putObjectInputs[0].Key) + assert.Equal(t, aws.String("foo/things"), client.putObjectInputs[0].Key) assert.Equal(t, aws.String(s3.BucketCannedACLPublicRead), client.putObjectInputs[0].ACL) client.returnError = errors.New("boom") - _, err = s.Put(ctx, "/foo/things", "text/plain", []byte(`HELLOWORLD`)) + _, err = s.Put(ctx, "foo/things", "text/plain", []byte(`HELLOWORLD`)) assert.EqualError(t, err, "error putting S3 object: boom") } From c05485048f006fef133a8792f004b6a81bc3e932 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 30 Jun 2023 16:32:57 +0100 Subject: [PATCH 005/141] Add syncx.Batcher --- syncx/batcher.go | 76 +++++++++++++++++++++++++++ syncx/batcher_test.go | 32 +++++++++++ syncx/{sync.go => mutex.go} | 0 syncx/{sync_test.go => mutex_test.go} | 0 4 files changed, 108 insertions(+) create mode 100644 syncx/batcher.go create mode 100644 syncx/batcher_test.go rename syncx/{sync.go => mutex.go} (100%) rename syncx/{sync_test.go => mutex_test.go} (100%) diff --git a/syncx/batcher.go b/syncx/batcher.go new file mode 100644 index 0000000..698a1b3 --- /dev/null +++ b/syncx/batcher.go @@ -0,0 +1,76 @@ +package syncx + +import ( + "sync" + "time" +) + +// Batcher allows values to be queued and processed in a background thread. +type Batcher[T any] struct { + process func(batch []T) + timeout time.Duration + wg *sync.WaitGroup + buffer chan T + stop chan bool +} + +// NewBatcher creates a new batcher. +func NewBatcher[T any](process func(batch []T), timeout time.Duration, capacity int, wg *sync.WaitGroup) *Batcher[T] { + return &Batcher[T]{ + process: process, + timeout: timeout, + wg: wg, + buffer: make(chan T, capacity), + stop: make(chan bool), + } +} + +// Start starts this batcher's background processing, returning immediately. +func (b *Batcher[T]) Start() { + b.wg.Add(1) + + go func() { + defer b.wg.Done() + + for { + select { + case <-b.stop: + for len(b.buffer) > 0 { + b.flush() + } + return + + case <-time.After(b.timeout): + b.flush() + } + } + }() +} + +// Queue queues the given value, potentially blocking. Returns the new free capacity. +func (b *Batcher[T]) Queue(value T) int { + b.buffer <- value + + return cap(b.buffer) - len(b.buffer) +} + +// Stop stops this batcher. +func (b *Batcher[T]) Stop() { + close(b.stop) +} + +// processes all values currently in the buffer +func (b *Batcher[T]) flush() { + count := len(b.buffer) + if count <= 0 { + return + } + + batch := make([]T, count) + for i := 0; i < count; i++ { + v := <-b.buffer + batch[i] = v + } + + b.process(batch) +} diff --git a/syncx/batcher_test.go b/syncx/batcher_test.go new file mode 100644 index 0000000..6533b23 --- /dev/null +++ b/syncx/batcher_test.go @@ -0,0 +1,32 @@ +package syncx_test + +import ( + "sync" + "testing" + "time" + + "github.com/nyaruka/gocommon/syncx" + "github.com/stretchr/testify/assert" +) + +func TestBatcher(t *testing.T) { + batches := make([][]int, 0, 5) + + wg := &sync.WaitGroup{} + b := syncx.NewBatcher(func(batch []int) { + batches = append(batches, batch) + }, time.Second, 3, wg) + + b.Start() + + assert.Equal(t, 2, b.Queue(1)) + assert.Equal(t, 1, b.Queue(2)) + assert.Equal(t, 0, b.Queue(3)) + assert.Equal(t, 2, b.Queue(4)) // blocks until 1,2,3 processed + assert.Equal(t, 1, b.Queue(5)) + + b.Stop() + wg.Wait() + + assert.Equal(t, [][]int{{1, 2, 3}, {4, 5}}, batches) +} diff --git a/syncx/sync.go b/syncx/mutex.go similarity index 100% rename from syncx/sync.go rename to syncx/mutex.go diff --git a/syncx/sync_test.go b/syncx/mutex_test.go similarity index 100% rename from syncx/sync_test.go rename to syncx/mutex_test.go From d24273ecee5497a35384512a753d1c05d4556d8b Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 30 Jun 2023 16:37:11 +0100 Subject: [PATCH 006/141] Update CHANGELOG.md for v1.36.0 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 220b7b6..c796ce5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +v1.36.0 (2023-06-30) +------------------------- + * Add syncx.Batcher + * Use services for github CI + v1.35.0 (2023-02-18) ------------------------- * bump golang.org/x/net from 0.5.0 to 0.7.0 From a8fda03260423ddc0a12aa58d09572a18f09b2a7 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 20 Jul 2023 15:22:04 -0500 Subject: [PATCH 007/141] Update CHANGELOG.md for v1.37.0 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c796ce5..4e08ac2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.37.0 (2023-07-20) +------------------------- + * Storage paths shouldn't need to start with slash + v1.36.0 (2023-06-30) ------------------------- * Add syncx.Batcher From 9a33b69877555bc57b80e3685ee1be0b1ffd0367 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 7 Aug 2023 13:37:19 -0500 Subject: [PATCH 008/141] Add confusables implementation to stringsx --- stringsx/confusables.go | 70 + stringsx/confusables.txt | 9274 ++++++++++++++++++++++++++++++++++ stringsx/confusables_test.go | 25 + 3 files changed, 9369 insertions(+) create mode 100644 stringsx/confusables.go create mode 100644 stringsx/confusables.txt create mode 100644 stringsx/confusables_test.go diff --git a/stringsx/confusables.go b/stringsx/confusables.go new file mode 100644 index 0000000..d724a03 --- /dev/null +++ b/stringsx/confusables.go @@ -0,0 +1,70 @@ +package stringsx + +import ( + "bufio" + "bytes" + _ "embed" + "regexp" + "strconv" + "strings" + + "golang.org/x/text/unicode/norm" +) + +// Loads confusables mapping from https://www.unicode.org/Public/security/8.0.0/confusables.txt +// +//go:embed confusables.txt +var confusablesSrc []byte +var confusables map[rune]string +var confusablesPattern = regexp.MustCompile(`^([[:xdigit:]]{4,8})\s*;\s*((?:[[:xdigit:]]{4,8}\s+)+);\s*(\w+)\s+.*$`) + +func init() { + parseHex := func(s string) rune { + cp, err := strconv.ParseUint(s, 16, 64) + if err != nil { + panic(err) + } + return rune(cp) + } + + confusables = make(map[rune]string, 1000) + scanner := bufio.NewScanner(bytes.NewReader(confusablesSrc)) + for scanner.Scan() { + // trim whitespace or BOM + line := strings.TrimPrefix(strings.TrimSpace(scanner.Text()), "\uFEFF") + + // ignore comments and empty lines + if line == "" || strings.HasPrefix(line, "#") { + continue + } + + groups := confusablesPattern.FindStringSubmatch(line) + source := parseHex(groups[1]) + var target []rune + for _, h := range strings.Fields(groups[2]) { + target = append(target, parseHex(h)) + } + + confusables[source] = string(target) + } +} + +// Implements https://www.unicode.org/reports/tr39/#def-skeleton +func Skeleton(s string) string { + var sb strings.Builder + + for _, r := range norm.NFD.String(s) { + if c, ok := confusables[r]; ok { + sb.WriteString(c) + } else { + sb.WriteRune(r) + } + } + + return sb.String() +} + +// Implements https://www.unicode.org/reports/tr39/#def-confusable +func Confusable(x, y string) bool { + return Skeleton(x) == Skeleton(y) +} diff --git a/stringsx/confusables.txt b/stringsx/confusables.txt new file mode 100644 index 0000000..0c77766 --- /dev/null +++ b/stringsx/confusables.txt @@ -0,0 +1,9274 @@ +# Recommended confusable mapping for IDN +# File: confusables.txt +# Version: 8.0.0 +# Generated: 2015-05-17, 03:09:04 GMT +# Checkin: $Revision: 1.32 $ +# +# For documentation and usage, see http://www.unicode.org/reports/tr39/ +# +05AD ; 0596 ; MA # ( ֭ → ֖ ) HEBREW ACCENT DEHI → HEBREW ACCENT TIPEHA # + +05AE ; 0598 ; MA # ( ֮ → ֘ ) HEBREW ACCENT ZINOR → HEBREW ACCENT ZARQA # + +05A8 ; 0599 ; MA # ( ֨ → ֙ ) HEBREW ACCENT QADMA → HEBREW ACCENT PASHTA # + +05A4 ; 059A ; MA # ( ֤ → ֚ ) HEBREW ACCENT MAHAPAKH → HEBREW ACCENT YETIV # + +1AB4 ; 06DB ; MA # ( ᪴ → ۛ ) COMBINING TRIPLE DOT → ARABIC SMALL HIGH THREE DOTS # +20DB ; 06DB ; MA # ( ⃛ → ۛ ) COMBINING THREE DOTS ABOVE → ARABIC SMALL HIGH THREE DOTS # →᪴→ + +0619 ; 0313 ; MA # ( ؙ → ̓ ) ARABIC SMALL DAMMA → COMBINING COMMA ABOVE # →ُ→ +08F3 ; 0313 ; MA # ( ࣳ → ̓ ) ARABIC SMALL HIGH WAW → COMBINING COMMA ABOVE # →ُ→ +0343 ; 0313 ; MA # ( ̓ → ̓ ) COMBINING GREEK KORONIS → COMBINING COMMA ABOVE # +0315 ; 0313 ; MA # ( ̕ → ̓ ) COMBINING COMMA ABOVE RIGHT → COMBINING COMMA ABOVE # +064F ; 0313 ; MA # ( ُ → ̓ ) ARABIC DAMMA → COMBINING COMMA ABOVE # + +065D ; 0314 ; MA # ( ٝ → ̔ ) ARABIC REVERSED DAMMA → COMBINING REVERSED COMMA ABOVE # + +059C ; 0301 ; MA # ( ֜ → ́ ) HEBREW ACCENT GERESH → COMBINING ACUTE ACCENT # +059D ; 0301 ; MA # ( ֝ → ́ ) HEBREW ACCENT GERESH MUQDAM → COMBINING ACUTE ACCENT # →֜→ +0618 ; 0301 ; MA # ( ؘ → ́ ) ARABIC SMALL FATHA → COMBINING ACUTE ACCENT # →َ→ +0747 ; 0301 ; MA # ( ݇ → ́ ) SYRIAC OBLIQUE LINE ABOVE → COMBINING ACUTE ACCENT # +0341 ; 0301 ; MA # ( ́ → ́ ) COMBINING ACUTE TONE MARK → COMBINING ACUTE ACCENT # +0954 ; 0301 ; MA # ( ॔ → ́ ) DEVANAGARI ACUTE ACCENT → COMBINING ACUTE ACCENT # +064E ; 0301 ; MA # ( َ → ́ ) ARABIC FATHA → COMBINING ACUTE ACCENT # + +0340 ; 0300 ; MA # ( ̀ → ̀ ) COMBINING GRAVE TONE MARK → COMBINING GRAVE ACCENT # +0953 ; 0300 ; MA # ( ॓ → ̀ ) DEVANAGARI GRAVE ACCENT → COMBINING GRAVE ACCENT # + +030C ; 0306 ; MA # ( ̌ → ̆ ) COMBINING CARON → COMBINING BREVE # +A67C ; 0306 ; MA # ( ꙼ → ̆ ) COMBINING CYRILLIC KAVYKA → COMBINING BREVE # +0658 ; 0306 ; MA # ( ٘ → ̆ ) ARABIC MARK NOON GHUNNA → COMBINING BREVE # +065A ; 0306 ; MA # ( ٚ → ̆ ) ARABIC VOWEL SIGN SMALL V ABOVE → COMBINING BREVE # →̌→ +036E ; 0306 ; MA # ( ͮ → ̆ ) COMBINING LATIN SMALL LETTER V → COMBINING BREVE # →̌→ + +06E8 ; 0306 0307 ; MA # ( ۨ → ̆̇ ) ARABIC SMALL HIGH NOON → COMBINING BREVE, COMBINING DOT ABOVE # →̐→ +0310 ; 0306 0307 ; MA # ( ̐ → ̆̇ ) COMBINING CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE # +0901 ; 0306 0307 ; MA # ( ँ → ̆̇ ) DEVANAGARI SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE # →̐→ +0981 ; 0306 0307 ; MA # ( ঁ → ̆̇ ) BENGALI SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE # →̐→ +0A81 ; 0306 0307 ; MA # ( ઁ → ̆̇ ) GUJARATI SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE # →̐→ +0B01 ; 0306 0307 ; MA # ( ଁ → ̆̇ ) ORIYA SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE # →̐→ +0C00 ; 0306 0307 ; MA # ( ఀ → ̆̇ ) TELUGU SIGN COMBINING CANDRABINDU ABOVE → COMBINING BREVE, COMBINING DOT ABOVE # →ँ→→̐→ +0C81 ; 0306 0307 ; MA # ( ಁ → ̆̇ ) KANNADA SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE # →ँ→→̐→ +0D01 ; 0306 0307 ; MA # ( ഁ → ̆̇ ) MALAYALAM SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE # →ँ→→̐→ +114BF ; 0306 0307 ; MA # ( 𑒿 → ̆̇ ) TIRHUTA SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE # →ঁ→→̐→ + +1CD0 ; 0302 ; MA # ( ᳐ → ̂ ) VEDIC TONE KARSHANA → COMBINING CIRCUMFLEX ACCENT # +0311 ; 0302 ; MA # ( ̑ → ̂ ) COMBINING INVERTED BREVE → COMBINING CIRCUMFLEX ACCENT # +065B ; 0302 ; MA # ( ٛ → ̂ ) ARABIC VOWEL SIGN INVERTED SMALL V ABOVE → COMBINING CIRCUMFLEX ACCENT # +07EE ; 0302 ; MA # ( ߮ → ̂ ) NKO COMBINING LONG DESCENDING TONE → COMBINING CIRCUMFLEX ACCENT # + +05AF ; 030A ; MA # ( ֯ → ̊ ) HEBREW MARK MASORA CIRCLE → COMBINING RING ABOVE # +06DF ; 030A ; MA # ( ۟ → ̊ ) ARABIC SMALL HIGH ROUNDED ZERO → COMBINING RING ABOVE # →ْ→ +17D3 ; 030A ; MA # ( ៓ → ̊ ) KHMER SIGN BATHAMASAT → COMBINING RING ABOVE # +309A ; 030A ; MA # ( ゚ → ̊ ) COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK → COMBINING RING ABOVE # +0652 ; 030A ; MA # ( ْ → ̊ ) ARABIC SUKUN → COMBINING RING ABOVE # +0B82 ; 030A ; MA # ( ஂ → ̊ ) TAMIL SIGN ANUSVARA → COMBINING RING ABOVE # +1036 ; 030A ; MA # ( ံ → ̊ ) MYANMAR SIGN ANUSVARA → COMBINING RING ABOVE # +17C6 ; 030A ; MA # ( ំ → ̊ ) KHMER SIGN NIKAHIT → COMBINING RING ABOVE # +0E4D ; 030A ; MA # ( ํ → ̊ ) THAI CHARACTER NIKHAHIT → COMBINING RING ABOVE # +0ECD ; 030A ; MA # ( ໍ → ̊ ) LAO NIGGAHITA → COMBINING RING ABOVE # +0366 ; 030A ; MA # ( ͦ → ̊ ) COMBINING LATIN SMALL LETTER O → COMBINING RING ABOVE # + +08EB ; 0308 ; MA # ( ࣫ → ̈ ) ARABIC TONE TWO DOTS ABOVE → COMBINING DIAERESIS # +07F3 ; 0308 ; MA # ( ߳ → ̈ ) NKO COMBINING DOUBLE DOT ABOVE → COMBINING DIAERESIS # + +064B ; 030B ; MA # ( ً → ̋ ) ARABIC FATHATAN → COMBINING DOUBLE ACUTE ACCENT # +08F0 ; 030B ; MA # ( ࣰ → ̋ ) ARABIC OPEN FATHATAN → COMBINING DOUBLE ACUTE ACCENT # →ً→ + +0342 ; 0303 ; MA # ( ͂ → ̃ ) COMBINING GREEK PERISPOMENI → COMBINING TILDE # +0653 ; 0303 ; MA # ( ٓ → ̃ ) ARABIC MADDAH ABOVE → COMBINING TILDE # + +05C4 ; 0307 ; MA # ( ׄ → ̇ ) HEBREW MARK UPPER DOT → COMBINING DOT ABOVE # +06EC ; 0307 ; MA # ( ۬ → ̇ ) ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE → COMBINING DOT ABOVE # +0740 ; 0307 ; MA # ( ݀ → ̇ ) SYRIAC FEMININE DOT → COMBINING DOT ABOVE # →݁→ +08EA ; 0307 ; MA # ( ࣪ → ̇ ) ARABIC TONE ONE DOT ABOVE → COMBINING DOT ABOVE # +0741 ; 0307 ; MA # ( ݁ → ̇ ) SYRIAC QUSHSHAYA → COMBINING DOT ABOVE # +0358 ; 0307 ; MA # ( ͘ → ̇ ) COMBINING DOT ABOVE RIGHT → COMBINING DOT ABOVE # +05B9 ; 0307 ; MA # ( ֹ → ̇ ) HEBREW POINT HOLAM → COMBINING DOT ABOVE # +05BA ; 0307 ; MA # ( ֺ → ̇ ) HEBREW POINT HOLAM HASER FOR VAV → COMBINING DOT ABOVE # →ׁ→ +05C2 ; 0307 ; MA # ( ׂ → ̇ ) HEBREW POINT SIN DOT → COMBINING DOT ABOVE # +05C1 ; 0307 ; MA # ( ׁ → ̇ ) HEBREW POINT SHIN DOT → COMBINING DOT ABOVE # +07ED ; 0307 ; MA # ( ߭ → ̇ ) NKO COMBINING SHORT RISING TONE → COMBINING DOT ABOVE # +0902 ; 0307 ; MA # ( ं → ̇ ) DEVANAGARI SIGN ANUSVARA → COMBINING DOT ABOVE # +0A02 ; 0307 ; MA # ( ਂ → ̇ ) GURMUKHI SIGN BINDI → COMBINING DOT ABOVE # +0A82 ; 0307 ; MA # ( ં → ̇ ) GUJARATI SIGN ANUSVARA → COMBINING DOT ABOVE # +0BCD ; 0307 ; MA # ( ் → ̇ ) TAMIL SIGN VIRAMA → COMBINING DOT ABOVE # + +0337 ; 0338 ; MA # ( ̷ → ̸ ) COMBINING SHORT SOLIDUS OVERLAY → COMBINING LONG SOLIDUS OVERLAY # + +1AB7 ; 0328 ; MA # ( ᪷ → ̨ ) COMBINING OPEN MARK BELOW → COMBINING OGONEK # +0322 ; 0328 ; MA # ( ̢ → ̨ ) COMBINING RETROFLEX HOOK BELOW → COMBINING OGONEK # +0345 ; 0328 ; MA # ( ͅ → ̨ ) COMBINING GREEK YPOGEGRAMMENI → COMBINING OGONEK # + +1CD2 ; 0304 ; MA # ( ᳒ → ̄ ) VEDIC TONE PRENKHA → COMBINING MACRON # +0305 ; 0304 ; MA # ( ̅ → ̄ ) COMBINING OVERLINE → COMBINING MACRON # +0659 ; 0304 ; MA # ( ٙ → ̄ ) ARABIC ZWARAKAY → COMBINING MACRON # +07EB ; 0304 ; MA # ( ߫ → ̄ ) NKO COMBINING SHORT HIGH TONE → COMBINING MACRON # + +1CDA ; 030E ; MA # ( ᳚ → ̎ ) VEDIC TONE DOUBLE SVARITA → COMBINING DOUBLE VERTICAL LINE ABOVE # + +0657 ; 0312 ; MA # ( ٗ → ̒ ) ARABIC INVERTED DAMMA → COMBINING TURNED COMMA ABOVE # + +0357 ; 0350 ; MA # ( ͗ → ͐ ) COMBINING RIGHT HALF RING ABOVE → COMBINING RIGHT ARROWHEAD ABOVE # →ࣿ→→ࣸ→ +08FF ; 0350 ; MA # ( ࣿ → ͐ ) ARABIC MARK SIDEWAYS NOON GHUNNA → COMBINING RIGHT ARROWHEAD ABOVE # →ࣸ→ +08F8 ; 0350 ; MA # ( ࣸ → ͐ ) ARABIC RIGHT ARROWHEAD ABOVE → COMBINING RIGHT ARROWHEAD ABOVE # + +0900 ; 0352 ; MA # ( ऀ → ͒ ) DEVANAGARI SIGN INVERTED CANDRABINDU → COMBINING FERMATA # + +1CED ; 0316 ; MA # ( ᳭ → ̖ ) VEDIC SIGN TIRYAK → COMBINING GRAVE ACCENT BELOW # + +1CDC ; 0329 ; MA # ( ᳜ → ̩ ) VEDIC TONE KATHAKA ANUDATTA → COMBINING VERTICAL LINE BELOW # +0656 ; 0329 ; MA # ( ٖ → ̩ ) ARABIC SUBSCRIPT ALEF → COMBINING VERTICAL LINE BELOW # + +1CD5 ; 032B ; MA # ( ᳕ → ̫ ) VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA → COMBINING INVERTED DOUBLE ARCH BELOW # + +0347 ; 0333 ; MA # ( ͇ → ̳ ) COMBINING EQUALS SIGN BELOW → COMBINING DOUBLE LOW LINE # + +08F9 ; 0354 ; MA # ( ࣹ → ͔ ) ARABIC LEFT ARROWHEAD BELOW → COMBINING LEFT ARROWHEAD BELOW # + +08FA ; 0355 ; MA # ( ࣺ → ͕ ) ARABIC RIGHT ARROWHEAD BELOW → COMBINING RIGHT ARROWHEAD BELOW # + +309B ; FF9E ; MA #* ( ゛ → ゙ ) KATAKANA-HIRAGANA VOICED SOUND MARK → HALFWIDTH KATAKANA VOICED SOUND MARK # + +309C ; FF9F ; MA #* ( ゜ → ゚ ) KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK → HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK # + +0336 ; 0335 ; MA # ( ̶ → ̵ ) COMBINING LONG STROKE OVERLAY → COMBINING SHORT STROKE OVERLAY # + +302C ; 0309 ; MA # ( 〬 → ̉ ) IDEOGRAPHIC DEPARTING TONE MARK → COMBINING HOOK ABOVE # + +05C5 ; 0323 ; MA # ( ׅ → ̣ ) HEBREW MARK LOWER DOT → COMBINING DOT BELOW # +08ED ; 0323 ; MA # ( ࣭ → ̣ ) ARABIC TONE ONE DOT BELOW → COMBINING DOT BELOW # +1CDD ; 0323 ; MA # ( ᳝ → ̣ ) VEDIC TONE DOT BELOW → COMBINING DOT BELOW # +05B4 ; 0323 ; MA # ( ִ → ̣ ) HEBREW POINT HIRIQ → COMBINING DOT BELOW # +065C ; 0323 ; MA # ( ٜ → ̣ ) ARABIC VOWEL SIGN DOT BELOW → COMBINING DOT BELOW # +093C ; 0323 ; MA # ( ़ → ̣ ) DEVANAGARI SIGN NUKTA → COMBINING DOT BELOW # +09BC ; 0323 ; MA # ( ় → ̣ ) BENGALI SIGN NUKTA → COMBINING DOT BELOW # +0A3C ; 0323 ; MA # ( ਼ → ̣ ) GURMUKHI SIGN NUKTA → COMBINING DOT BELOW # +0ABC ; 0323 ; MA # ( ઼ → ̣ ) GUJARATI SIGN NUKTA → COMBINING DOT BELOW # +0B3C ; 0323 ; MA # ( ଼ → ̣ ) ORIYA SIGN NUKTA → COMBINING DOT BELOW # +114C3 ; 0323 ; MA # ( 𑓃 → ̣ ) TIRHUTA SIGN NUKTA → COMBINING DOT BELOW # →়→ +10A3A ; 0323 ; MA # ( 𐨺 → ̣ ) KHAROSHTHI SIGN DOT BELOW → COMBINING DOT BELOW # + +08EE ; 0324 ; MA # ( ࣮ → ̤ ) ARABIC TONE TWO DOTS BELOW → COMBINING DIAERESIS BELOW # +1CDE ; 0324 ; MA # ( ᳞ → ̤ ) VEDIC TONE TWO DOTS BELOW → COMBINING DIAERESIS BELOW # + +302D ; 0325 ; MA # ( 〭 → ̥ ) IDEOGRAPHIC ENTERING TONE MARK → COMBINING RING BELOW # + +0327 ; 0326 ; MA # ( ̧ → ̦ ) COMBINING CEDILLA → COMBINING COMMA BELOW # →̡→ +0321 ; 0326 ; MA # ( ̡ → ̦ ) COMBINING PALATALIZED HOOK BELOW → COMBINING COMMA BELOW # +0339 ; 0326 ; MA # ( ̹ → ̦ ) COMBINING RIGHT HALF RING BELOW → COMBINING COMMA BELOW # →̧→→̡→ + +1CD9 ; 032D ; MA # ( ᳙ → ̭ ) VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER → COMBINING CIRCUMFLEX ACCENT BELOW # + +1CD8 ; 032E ; MA # ( ᳘ → ̮ ) VEDIC TONE CANDRA BELOW → COMBINING BREVE BELOW # + +0952 ; 0331 ; MA # ( ॒ → ̱ ) DEVANAGARI STRESS SIGN ANUDATTA → COMBINING MACRON BELOW # +0320 ; 0331 ; MA # ( ̠ → ̱ ) COMBINING MINUS SIGN BELOW → COMBINING MACRON BELOW # + +08F1 ; 064C ; MA # ( ࣱ → ٌ ) ARABIC OPEN DAMMATAN → ARABIC DAMMATAN # +08E8 ; 064C ; MA # ( ࣨ → ٌ ) ARABIC CURLY DAMMATAN → ARABIC DAMMATAN # +08E5 ; 064C ; MA # ( ࣥ → ٌ ) ARABIC CURLY DAMMA → ARABIC DAMMATAN # + +FC5E ; FE72 0651 ; MA #* ( ‎ﱞ‎ → ‎ﹲّ‎ ) ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM → ARABIC DAMMATAN ISOLATED FORM, ARABIC SHADDA # + +08F2 ; 064D ; MA # ( ࣲ → ٍ ) ARABIC OPEN KASRATAN → ARABIC KASRATAN # + +FC5F ; FE74 0651 ; MA #* ( ‎ﱟ‎ → ‎ﹴّ‎ ) ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM → ARABIC KASRATAN ISOLATED FORM, ARABIC SHADDA # + +FCF2 ; FE77 0651 ; MA # ( ‎ﳲ‎ → ‎ﹷّ‎ ) ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM → ARABIC FATHA MEDIAL FORM, ARABIC SHADDA # + +FC60 ; FE76 0651 ; MA #* ( ‎ﱠ‎ → ‎ﹶّ‎ ) ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM → ARABIC FATHA ISOLATED FORM, ARABIC SHADDA # + +FCF3 ; FE79 0651 ; MA # ( ‎ﳳ‎ → ‎ﹹّ‎ ) ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM → ARABIC DAMMA MEDIAL FORM, ARABIC SHADDA # + +FC61 ; FE78 0651 ; MA #* ( ‎ﱡ‎ → ‎ﹸّ‎ ) ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM → ARABIC DAMMA ISOLATED FORM, ARABIC SHADDA # + +061A ; 0650 ; MA # ( ؚ → ِ ) ARABIC SMALL KASRA → ARABIC KASRA # +0317 ; 0650 ; MA # ( ̗ → ِ ) COMBINING ACUTE ACCENT BELOW → ARABIC KASRA # + +FCF4 ; FE7B 0651 ; MA # ( ‎ﳴ‎ → ‎ﹻّ‎ ) ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM → ARABIC KASRA MEDIAL FORM, ARABIC SHADDA # + +FC62 ; FE7A 0651 ; MA #* ( ‎ﱢ‎ → ‎ﹺّ‎ ) ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM → ARABIC KASRA ISOLATED FORM, ARABIC SHADDA # + +FC63 ; FE7C 0670 ; MA #* ( ‎ﱣ‎ → ‎ﹼٰ‎ ) ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC SHADDA ISOLATED FORM, ARABIC LETTER SUPERSCRIPT ALEF # + +065F ; 0655 ; MA # ( ٟ → ٕ ) ARABIC WAVY HAMZA BELOW → ARABIC HAMZA BELOW # + +030D ; 0670 ; MA # ( ̍ → ٰ ) COMBINING VERTICAL LINE ABOVE → ARABIC LETTER SUPERSCRIPT ALEF # + +0742 ; 073C ; MA # ( ݂ → ܼ ) SYRIAC RUKKAKHA → SYRIAC HBASA-ESASA DOTTED # + +0A03 ; 0983 ; MA # ( ਃ → ঃ ) GURMUKHI SIGN VISARGA → BENGALI SIGN VISARGA # +0C03 ; 0983 ; MA # ( ః → ঃ ) TELUGU SIGN VISARGA → BENGALI SIGN VISARGA # →ਃ→ +0C83 ; 0983 ; MA # ( ಃ → ঃ ) KANNADA SIGN VISARGA → BENGALI SIGN VISARGA # →ః→→ਃ→ +0D03 ; 0983 ; MA # ( ഃ → ঃ ) MALAYALAM SIGN VISARGA → BENGALI SIGN VISARGA # →ಃ→→ః→→ਃ→ +0D83 ; 0983 ; MA # ( ඃ → ঃ ) SINHALA SIGN VISARGAYA → BENGALI SIGN VISARGA # →ഃ→→ಃ→→ః→→ਃ→ +1038 ; 0983 ; MA # ( း → ঃ ) MYANMAR SIGN VISARGA → BENGALI SIGN VISARGA # →ඃ→→ഃ→→ಃ→→ః→→ਃ→ +114C1 ; 0983 ; MA # ( 𑓁 → ঃ ) TIRHUTA SIGN VISARGA → BENGALI SIGN VISARGA # + +17CB ; 0E48 ; MA # ( ់ → ่ ) KHMER SIGN BANTOC → THAI CHARACTER MAI EK # +0EC8 ; 0E48 ; MA # ( ່ → ่ ) LAO TONE MAI EK → THAI CHARACTER MAI EK # + +0EC9 ; 0E49 ; MA # ( ້ → ้ ) LAO TONE MAI THO → THAI CHARACTER MAI THO # + +0ECA ; 0E4A ; MA # ( ໊ → ๊ ) LAO TONE MAI TI → THAI CHARACTER MAI TRI # + +0ECB ; 0E4B ; MA # ( ໋ → ๋ ) LAO TONE MAI CATAWA → THAI CHARACTER MAI CHATTAWA # + +2028 ; 0020 ; MA #* ( → ) LINE SEPARATOR → SPACE # +2029 ; 0020 ; MA #* ( → ) PARAGRAPH SEPARATOR → SPACE # +1680 ; 0020 ; MA #* (   → ) OGHAM SPACE MARK → SPACE # +2000 ; 0020 ; MA #* (   → ) EN QUAD → SPACE # +2001 ; 0020 ; MA #* (   → ) EM QUAD → SPACE # +2002 ; 0020 ; MA #* (   → ) EN SPACE → SPACE # +2003 ; 0020 ; MA #* (   → ) EM SPACE → SPACE # +2004 ; 0020 ; MA #* (   → ) THREE-PER-EM SPACE → SPACE # +2005 ; 0020 ; MA #* (   → ) FOUR-PER-EM SPACE → SPACE # +2006 ; 0020 ; MA #* (   → ) SIX-PER-EM SPACE → SPACE # +2008 ; 0020 ; MA #* (   → ) PUNCTUATION SPACE → SPACE # +2009 ; 0020 ; MA #* (   → ) THIN SPACE → SPACE # +200A ; 0020 ; MA #* (   → ) HAIR SPACE → SPACE # +205F ; 0020 ; MA #* (   → ) MEDIUM MATHEMATICAL SPACE → SPACE # +00A0 ; 0020 ; MA #* (   → ) NO-BREAK SPACE → SPACE # +2007 ; 0020 ; MA #* (   → ) FIGURE SPACE → SPACE # +202F ; 0020 ; MA #* (   → ) NARROW NO-BREAK SPACE → SPACE # + +07FA ; 005F ; MA # ( ‎ߺ‎ → _ ) NKO LAJANYALAN → LOW LINE # +FE4D ; 005F ; MA # ( ﹍ → _ ) DASHED LOW LINE → LOW LINE # +FE4E ; 005F ; MA # ( ﹎ → _ ) CENTRELINE LOW LINE → LOW LINE # +FE4F ; 005F ; MA # ( ﹏ → _ ) WAVY LOW LINE → LOW LINE # + +2010 ; 002D ; MA #* ( ‐ → - ) HYPHEN → HYPHEN-MINUS # +2011 ; 002D ; MA #* ( ‑ → - ) NON-BREAKING HYPHEN → HYPHEN-MINUS # +2012 ; 002D ; MA #* ( ‒ → - ) FIGURE DASH → HYPHEN-MINUS # +2013 ; 002D ; MA #* ( – → - ) EN DASH → HYPHEN-MINUS # +FE58 ; 002D ; MA #* ( ﹘ → - ) SMALL EM DASH → HYPHEN-MINUS # +06D4 ; 002D ; MA #* ( ‎۔‎ → - ) ARABIC FULL STOP → HYPHEN-MINUS # →‐→ +2043 ; 002D ; MA #* ( ⁃ → - ) HYPHEN BULLET → HYPHEN-MINUS # →‐→ +02D7 ; 002D ; MA #* ( ˗ → - ) MODIFIER LETTER MINUS SIGN → HYPHEN-MINUS # +2212 ; 002D ; MA #* ( − → - ) MINUS SIGN → HYPHEN-MINUS # +2796 ; 002D ; MA #* ( ➖ → - ) HEAVY MINUS SIGN → HYPHEN-MINUS # →−→ +2CBA ; 002D ; MA # ( Ⲻ → - ) COPTIC CAPITAL LETTER DIALECT-P NI → HYPHEN-MINUS # →‒→ + +2A29 ; 002D 0313 ; MA #* ( ⨩ → -̓ ) MINUS SIGN WITH COMMA ABOVE → HYPHEN-MINUS, COMBINING COMMA ABOVE # →−̓→ + +2E1A ; 002D 0308 ; MA #* ( ⸚ → -̈ ) HYPHEN WITH DIAERESIS → HYPHEN-MINUS, COMBINING DIAERESIS # + +FB29 ; 002D 0307 ; MA #* ( ﬩ → -̇ ) HEBREW LETTER ALTERNATIVE PLUS SIGN → HYPHEN-MINUS, COMBINING DOT ABOVE # →∸→→−̇→ +2238 ; 002D 0307 ; MA #* ( ∸ → -̇ ) DOT MINUS → HYPHEN-MINUS, COMBINING DOT ABOVE # →−̇→ + +2A2A ; 002D 0323 ; MA #* ( ⨪ → -̣ ) MINUS SIGN WITH DOT BELOW → HYPHEN-MINUS, COMBINING DOT BELOW # →−̣→ + +A4FE ; 002D 002E ; MA #* ( ꓾ → -. ) LISU PUNCTUATION COMMA → HYPHEN-MINUS, FULL STOP # + +FF5E ; 301C ; MA #* ( ~ → 〜 ) FULLWIDTH TILDE → WAVE DASH # + +060D ; 002C ; MA #* ( ‎؍‎ → , ) ARABIC DATE SEPARATOR → COMMA # →‎٫‎→ +066B ; 002C ; MA #* ( ‎٫‎ → , ) ARABIC DECIMAL SEPARATOR → COMMA # +201A ; 002C ; MA #* ( ‚ → , ) SINGLE LOW-9 QUOTATION MARK → COMMA # +00B8 ; 002C ; MA #* ( ¸ → , ) CEDILLA → COMMA # +A4F9 ; 002C ; MA # ( ꓹ → , ) LISU LETTER TONE NA PO → COMMA # + +2E32 ; 060C ; MA #* ( ⸲ → ، ) TURNED COMMA → ARABIC COMMA # +066C ; 060C ; MA #* ( ‎٬‎ → ، ) ARABIC THOUSANDS SEPARATOR → ARABIC COMMA # + +037E ; 003B ; MA #* ( ; → ; ) GREEK QUESTION MARK → SEMICOLON # + +2E35 ; 061B ; MA #* ( ⸵ → ‎؛‎ ) TURNED SEMICOLON → ARABIC SEMICOLON # + +0903 ; 003A ; MA # ( ः → : ) DEVANAGARI SIGN VISARGA → COLON # +0A83 ; 003A ; MA # ( ઃ → : ) GUJARATI SIGN VISARGA → COLON # +FF1A ; 003A ; MA #* ( : → : ) FULLWIDTH COLON → COLON # →︰→ +0589 ; 003A ; MA #* ( ։ → : ) ARMENIAN FULL STOP → COLON # +0703 ; 003A ; MA #* ( ‎܃‎ → : ) SYRIAC SUPRALINEAR COLON → COLON # +0704 ; 003A ; MA #* ( ‎܄‎ → : ) SYRIAC SUBLINEAR COLON → COLON # +16EC ; 003A ; MA #* ( ᛬ → : ) RUNIC MULTIPLE PUNCTUATION → COLON # +FE30 ; 003A ; MA #* ( ︰ → : ) PRESENTATION FORM FOR VERTICAL TWO DOT LEADER → COLON # +1803 ; 003A ; MA #* ( ᠃ → : ) MONGOLIAN FULL STOP → COLON # +1809 ; 003A ; MA #* ( ᠉ → : ) MONGOLIAN MANCHU FULL STOP → COLON # +205A ; 003A ; MA #* ( ⁚ → : ) TWO DOT PUNCTUATION → COLON # +05C3 ; 003A ; MA #* ( ‎׃‎ → : ) HEBREW PUNCTUATION SOF PASUQ → COLON # +02F8 ; 003A ; MA #* ( ˸ → : ) MODIFIER LETTER RAISED COLON → COLON # +A789 ; 003A ; MA #* ( ꞉ → : ) MODIFIER LETTER COLON → COLON # +2236 ; 003A ; MA #* ( ∶ → : ) RATIO → COLON # +02D0 ; 003A ; MA # ( ː → : ) MODIFIER LETTER TRIANGULAR COLON → COLON # +A4FD ; 003A ; MA # ( ꓽ → : ) LISU LETTER TONE MYA JEU → COLON # + +2A74 ; 003A 003A 003D ; MA #* ( ⩴ → ::= ) DOUBLE COLON EQUAL → COLON, COLON, EQUALS SIGN # + +29F4 ; 003A 2192 ; MA #* ( ⧴ → :→ ) RULE-DELAYED → COLON, RIGHTWARDS ARROW # + +FF01 ; 0021 ; MA #* ( ! → ! ) FULLWIDTH EXCLAMATION MARK → EXCLAMATION MARK # →ǃ→ +01C3 ; 0021 ; MA # ( ǃ → ! ) LATIN LETTER RETROFLEX CLICK → EXCLAMATION MARK # +2D51 ; 0021 ; MA # ( ⵑ → ! ) TIFINAGH LETTER TUAREG YANG → EXCLAMATION MARK # + +203C ; 0021 0021 ; MA #* ( ‼ → !! ) DOUBLE EXCLAMATION MARK → EXCLAMATION MARK, EXCLAMATION MARK # + +2049 ; 0021 003F ; MA #* ( ⁉ → !? ) EXCLAMATION QUESTION MARK → EXCLAMATION MARK, QUESTION MARK # + +0294 ; 003F ; MA # ( ʔ → ? ) LATIN LETTER GLOTTAL STOP → QUESTION MARK # +0241 ; 003F ; MA # ( Ɂ → ? ) LATIN CAPITAL LETTER GLOTTAL STOP → QUESTION MARK # →ʔ→ +097D ; 003F ; MA # ( ॽ → ? ) DEVANAGARI LETTER GLOTTAL STOP → QUESTION MARK # +13AE ; 003F ; MA # ( Ꭾ → ? ) CHEROKEE LETTER HE → QUESTION MARK # →Ɂ→→ʔ→ + +2048 ; 003F 0021 ; MA #* ( ⁈ → ?! ) QUESTION EXCLAMATION MARK → QUESTION MARK, EXCLAMATION MARK # + +2047 ; 003F 003F ; MA #* ( ⁇ → ?? ) DOUBLE QUESTION MARK → QUESTION MARK, QUESTION MARK # + +2E2E ; 061F ; MA #* ( ⸮ → ‎؟‎ ) REVERSED QUESTION MARK → ARABIC QUESTION MARK # + +1D16D ; 002E ; MA # ( 𝅭 → . ) MUSICAL SYMBOL COMBINING AUGMENTATION DOT → FULL STOP # +2024 ; 002E ; MA #* ( ․ → . ) ONE DOT LEADER → FULL STOP # +0701 ; 002E ; MA #* ( ‎܁‎ → . ) SYRIAC SUPRALINEAR FULL STOP → FULL STOP # +0702 ; 002E ; MA #* ( ‎܂‎ → . ) SYRIAC SUBLINEAR FULL STOP → FULL STOP # +A60E ; 002E ; MA #* ( ꘎ → . ) VAI FULL STOP → FULL STOP # +10A50 ; 002E ; MA #* ( ‎𐩐‎ → . ) KHAROSHTHI PUNCTUATION DOT → FULL STOP # +0660 ; 002E ; MA # ( ‎٠‎ → . ) ARABIC-INDIC DIGIT ZERO → FULL STOP # +06F0 ; 002E ; MA # ( ۰ → . ) EXTENDED ARABIC-INDIC DIGIT ZERO → FULL STOP # →‎٠‎→ +A4F8 ; 002E ; MA # ( ꓸ → . ) LISU LETTER TONE MYA TI → FULL STOP # + +A4FB ; 002E 002C ; MA # ( ꓻ → ., ) LISU LETTER TONE MYA BO → FULL STOP, COMMA # + +2025 ; 002E 002E ; MA #* ( ‥ → .. ) TWO DOT LEADER → FULL STOP, FULL STOP # +A4FA ; 002E 002E ; MA # ( ꓺ → .. ) LISU LETTER TONE MYA CYA → FULL STOP, FULL STOP # + +2026 ; 002E 002E 002E ; MA #* ( … → ... ) HORIZONTAL ELLIPSIS → FULL STOP, FULL STOP, FULL STOP # + +30FB ; 00B7 ; MA #* ( ・ → · ) KATAKANA MIDDLE DOT → MIDDLE DOT # →•→ +FF65 ; 00B7 ; MA #* ( ・ → · ) HALFWIDTH KATAKANA MIDDLE DOT → MIDDLE DOT # →•→ +16EB ; 00B7 ; MA #* ( ᛫ → · ) RUNIC SINGLE PUNCTUATION → MIDDLE DOT # +0387 ; 00B7 ; MA # ( · → · ) GREEK ANO TELEIA → MIDDLE DOT # +2E31 ; 00B7 ; MA #* ( ⸱ → · ) WORD SEPARATOR MIDDLE DOT → MIDDLE DOT # +10101 ; 00B7 ; MA #* ( 𐄁 → · ) AEGEAN WORD SEPARATOR DOT → MIDDLE DOT # +2022 ; 00B7 ; MA #* ( • → · ) BULLET → MIDDLE DOT # +2027 ; 00B7 ; MA #* ( ‧ → · ) HYPHENATION POINT → MIDDLE DOT # +2219 ; 00B7 ; MA #* ( ∙ → · ) BULLET OPERATOR → MIDDLE DOT # +22C5 ; 00B7 ; MA #* ( ⋅ → · ) DOT OPERATOR → MIDDLE DOT # +1427 ; 00B7 ; MA # ( ᐧ → · ) CANADIAN SYLLABICS FINAL MIDDLE DOT → MIDDLE DOT # +A78F ; 00B7 ; MA # ( ꞏ → · ) LATIN LETTER SINOLOGICAL DOT → MIDDLE DOT # + +22EF ; 00B7 00B7 00B7 ; MA #* ( ⋯ → ··· ) MIDLINE HORIZONTAL ELLIPSIS → MIDDLE DOT, MIDDLE DOT, MIDDLE DOT # +2D48 ; 00B7 00B7 00B7 ; MA # ( ⵈ → ··· ) TIFINAGH LETTER TUAREG YAQ → MIDDLE DOT, MIDDLE DOT, MIDDLE DOT # →⋯→ + +1444 ; 00B7 003C ; MA # ( ᑄ → ·< ) CANADIAN SYLLABICS PWA → MIDDLE DOT, LESS-THAN SIGN # →ᐧᐸ→ + +22D7 ; 00B7 003E ; MA #* ( ⋗ → ·> ) GREATER-THAN WITH DOT → MIDDLE DOT, GREATER-THAN SIGN # →ᑀ→→ᐧᐳ→ +1437 ; 00B7 003E ; MA # ( ᐷ → ·> ) CANADIAN SYLLABICS CARRIER HI → MIDDLE DOT, GREATER-THAN SIGN # →ᑀ→→ᐧᐳ→ +1440 ; 00B7 003E ; MA # ( ᑀ → ·> ) CANADIAN SYLLABICS PWO → MIDDLE DOT, GREATER-THAN SIGN # →ᐧᐳ→ + +152F ; 00B7 0034 ; MA # ( ᔯ → ·4 ) CANADIAN SYLLABICS YWE → MIDDLE DOT, DIGIT FOUR # →ᐧ4→ + +147A ; 00B7 0064 ; MA # ( ᑺ → ·d ) CANADIAN SYLLABICS KWO → MIDDLE DOT, LATIN SMALL LETTER D # →ᐧᑯ→ + +1498 ; 00B7 004A ; MA # ( ᒘ → ·J ) CANADIAN SYLLABICS CWO → MIDDLE DOT, LATIN CAPITAL LETTER J # →ᐧᒍ→ + +14B6 ; 00B7 004C ; MA # ( ᒶ → ·L ) CANADIAN SYLLABICS MWA → MIDDLE DOT, LATIN CAPITAL LETTER L # →ᐧL→ + +1476 ; 00B7 0050 ; MA # ( ᑶ → ·P ) CANADIAN SYLLABICS KWI → MIDDLE DOT, LATIN CAPITAL LETTER P # →ᐧᑭ→ + +1457 ; 00B7 0055 ; MA # ( ᑗ → ·U ) CANADIAN SYLLABICS TWE → MIDDLE DOT, LATIN CAPITAL LETTER U # →ᐧᑌ→→·ᑌ→ + +143A ; 00B7 0056 ; MA # ( ᐺ → ·V ) CANADIAN SYLLABICS PWE → MIDDLE DOT, LATIN CAPITAL LETTER V # →ᐧᐯ→ + +143C ; 00B7 0245 ; MA # ( ᐼ → ·Ʌ ) CANADIAN SYLLABICS PWI → MIDDLE DOT, LATIN CAPITAL LETTER TURNED V # →ᐧᐱ→→·ᐱ→ + +14AE ; 00B7 0393 ; MA # ( ᒮ → ·Γ ) CANADIAN SYLLABICS MWI → MIDDLE DOT, GREEK CAPITAL LETTER GAMMA # →ᐧᒥ→→·ᒥ→ + +140E ; 00B7 0394 ; MA # ( ᐎ → ·Δ ) CANADIAN SYLLABICS WI → MIDDLE DOT, GREEK CAPITAL LETTER DELTA # →ᐧᐃ→ + +1459 ; 00B7 0548 ; MA # ( ᑙ → ·Ո ) CANADIAN SYLLABICS TWI → MIDDLE DOT, ARMENIAN CAPITAL LETTER VO # →ᐧᑎ→→·ᑎ→ + +140C ; 00B7 1401 ; MA # ( ᐌ → ·ᐁ ) CANADIAN SYLLABICS WE → MIDDLE DOT, CANADIAN SYLLABICS E # →ᐧᐁ→ + +1410 ; 00B7 1404 ; MA # ( ᐐ → ·ᐄ ) CANADIAN SYLLABICS WII → MIDDLE DOT, CANADIAN SYLLABICS II # →ᐧᐄ→ + +1412 ; 00B7 1405 ; MA # ( ᐒ → ·ᐅ ) CANADIAN SYLLABICS WO → MIDDLE DOT, CANADIAN SYLLABICS O # →ᐧᐅ→ + +1414 ; 00B7 1406 ; MA # ( ᐔ → ·ᐆ ) CANADIAN SYLLABICS WOO → MIDDLE DOT, CANADIAN SYLLABICS OO # →ᐧᐆ→ + +1417 ; 00B7 140A ; MA # ( ᐗ → ·ᐊ ) CANADIAN SYLLABICS WA → MIDDLE DOT, CANADIAN SYLLABICS A # →ᐧᐊ→ + +1419 ; 00B7 140B ; MA # ( ᐙ → ·ᐋ ) CANADIAN SYLLABICS WAA → MIDDLE DOT, CANADIAN SYLLABICS AA # →ᐧᐋ→ + +143E ; 00B7 1432 ; MA # ( ᐾ → ·ᐲ ) CANADIAN SYLLABICS PWII → MIDDLE DOT, CANADIAN SYLLABICS PII # →ᐧᐲ→ + +1442 ; 00B7 1434 ; MA # ( ᑂ → ·ᐴ ) CANADIAN SYLLABICS PWOO → MIDDLE DOT, CANADIAN SYLLABICS POO # →ᐧᐴ→ + +1446 ; 00B7 1439 ; MA # ( ᑆ → ·ᐹ ) CANADIAN SYLLABICS PWAA → MIDDLE DOT, CANADIAN SYLLABICS PAA # →ᐧᐹ→ + +145B ; 00B7 144F ; MA # ( ᑛ → ·ᑏ ) CANADIAN SYLLABICS TWII → MIDDLE DOT, CANADIAN SYLLABICS TII # →ᐧᑏ→ + +1454 ; 00B7 1450 ; MA # ( ᑔ → ·ᑐ ) CANADIAN SYLLABICS CARRIER DI → MIDDLE DOT, CANADIAN SYLLABICS TO # →ᑝ→→ᐧᑐ→ +145D ; 00B7 1450 ; MA # ( ᑝ → ·ᑐ ) CANADIAN SYLLABICS TWO → MIDDLE DOT, CANADIAN SYLLABICS TO # →ᐧᑐ→ + +145F ; 00B7 1451 ; MA # ( ᑟ → ·ᑑ ) CANADIAN SYLLABICS TWOO → MIDDLE DOT, CANADIAN SYLLABICS TOO # →ᐧᑑ→ + +1461 ; 00B7 1455 ; MA # ( ᑡ → ·ᑕ ) CANADIAN SYLLABICS TWA → MIDDLE DOT, CANADIAN SYLLABICS TA # →ᐧᑕ→ + +1463 ; 00B7 1456 ; MA # ( ᑣ → ·ᑖ ) CANADIAN SYLLABICS TWAA → MIDDLE DOT, CANADIAN SYLLABICS TAA # →ᐧᑖ→ + +1474 ; 00B7 146B ; MA # ( ᑴ → ·ᑫ ) CANADIAN SYLLABICS KWE → MIDDLE DOT, CANADIAN SYLLABICS KE # →ᐧᑫ→ + +1478 ; 00B7 146E ; MA # ( ᑸ → ·ᑮ ) CANADIAN SYLLABICS KWII → MIDDLE DOT, CANADIAN SYLLABICS KII # →ᐧᑮ→ + +147C ; 00B7 1470 ; MA # ( ᑼ → ·ᑰ ) CANADIAN SYLLABICS KWOO → MIDDLE DOT, CANADIAN SYLLABICS KOO # →ᐧᑰ→ + +147E ; 00B7 1472 ; MA # ( ᑾ → ·ᑲ ) CANADIAN SYLLABICS KWA → MIDDLE DOT, CANADIAN SYLLABICS KA # →ᐧᑲ→ + +1480 ; 00B7 1473 ; MA # ( ᒀ → ·ᑳ ) CANADIAN SYLLABICS KWAA → MIDDLE DOT, CANADIAN SYLLABICS KAA # →ᐧᑳ→ + +1492 ; 00B7 1489 ; MA # ( ᒒ → ·ᒉ ) CANADIAN SYLLABICS CWE → MIDDLE DOT, CANADIAN SYLLABICS CE # →ᐧᒉ→ + +1494 ; 00B7 148B ; MA # ( ᒔ → ·ᒋ ) CANADIAN SYLLABICS CWI → MIDDLE DOT, CANADIAN SYLLABICS CI # →ᐧᒋ→ + +1496 ; 00B7 148C ; MA # ( ᒖ → ·ᒌ ) CANADIAN SYLLABICS CWII → MIDDLE DOT, CANADIAN SYLLABICS CII # →ᐧᒌ→ + +149A ; 00B7 148E ; MA # ( ᒚ → ·ᒎ ) CANADIAN SYLLABICS CWOO → MIDDLE DOT, CANADIAN SYLLABICS COO # →ᐧᒎ→ + +149C ; 00B7 1490 ; MA # ( ᒜ → ·ᒐ ) CANADIAN SYLLABICS CWA → MIDDLE DOT, CANADIAN SYLLABICS CA # →ᐧᒐ→ + +149E ; 00B7 1491 ; MA # ( ᒞ → ·ᒑ ) CANADIAN SYLLABICS CWAA → MIDDLE DOT, CANADIAN SYLLABICS CAA # →ᐧᒑ→ + +14AC ; 00B7 14A3 ; MA # ( ᒬ → ·ᒣ ) CANADIAN SYLLABICS MWE → MIDDLE DOT, CANADIAN SYLLABICS ME # →ᐧᒣ→ + +14B0 ; 00B7 14A6 ; MA # ( ᒰ → ·ᒦ ) CANADIAN SYLLABICS MWII → MIDDLE DOT, CANADIAN SYLLABICS MII # →ᐧᒦ→ + +14B2 ; 00B7 14A7 ; MA # ( ᒲ → ·ᒧ ) CANADIAN SYLLABICS MWO → MIDDLE DOT, CANADIAN SYLLABICS MO # →ᐧᒧ→ + +14B4 ; 00B7 14A8 ; MA # ( ᒴ → ·ᒨ ) CANADIAN SYLLABICS MWOO → MIDDLE DOT, CANADIAN SYLLABICS MOO # →ᐧᒨ→ + +14B8 ; 00B7 14AB ; MA # ( ᒸ → ·ᒫ ) CANADIAN SYLLABICS MWAA → MIDDLE DOT, CANADIAN SYLLABICS MAA # →ᐧᒫ→ + +14C9 ; 00B7 14C0 ; MA # ( ᓉ → ·ᓀ ) CANADIAN SYLLABICS NWE → MIDDLE DOT, CANADIAN SYLLABICS NE # →ᐧᓀ→ + +14CB ; 00B7 14C7 ; MA # ( ᓋ → ·ᓇ ) CANADIAN SYLLABICS NWA → MIDDLE DOT, CANADIAN SYLLABICS NA # →ᐧᓇ→ + +14CD ; 00B7 14C8 ; MA # ( ᓍ → ·ᓈ ) CANADIAN SYLLABICS NWAA → MIDDLE DOT, CANADIAN SYLLABICS NAA # →ᐧᓈ→ + +14DC ; 00B7 14D3 ; MA # ( ᓜ → ·ᓓ ) CANADIAN SYLLABICS LWE → MIDDLE DOT, CANADIAN SYLLABICS LE # →ᐧᓓ→ + +14DE ; 00B7 14D5 ; MA # ( ᓞ → ·ᓕ ) CANADIAN SYLLABICS LWI → MIDDLE DOT, CANADIAN SYLLABICS LI # →ᐧᓕ→ + +14E0 ; 00B7 14D6 ; MA # ( ᓠ → ·ᓖ ) CANADIAN SYLLABICS LWII → MIDDLE DOT, CANADIAN SYLLABICS LII # →ᐧᓖ→ + +14E2 ; 00B7 14D7 ; MA # ( ᓢ → ·ᓗ ) CANADIAN SYLLABICS LWO → MIDDLE DOT, CANADIAN SYLLABICS LO # →ᐧᓗ→ + +14E4 ; 00B7 14D8 ; MA # ( ᓤ → ·ᓘ ) CANADIAN SYLLABICS LWOO → MIDDLE DOT, CANADIAN SYLLABICS LOO # →ᐧᓘ→ + +14E6 ; 00B7 14DA ; MA # ( ᓦ → ·ᓚ ) CANADIAN SYLLABICS LWA → MIDDLE DOT, CANADIAN SYLLABICS LA # →ᐧᓚ→ + +14E8 ; 00B7 14DB ; MA # ( ᓨ → ·ᓛ ) CANADIAN SYLLABICS LWAA → MIDDLE DOT, CANADIAN SYLLABICS LAA # →ᐧᓛ→ + +14F6 ; 00B7 14ED ; MA # ( ᓶ → ·ᓭ ) CANADIAN SYLLABICS SWE → MIDDLE DOT, CANADIAN SYLLABICS SE # →ᐧᓭ→ + +14F8 ; 00B7 14EF ; MA # ( ᓸ → ·ᓯ ) CANADIAN SYLLABICS SWI → MIDDLE DOT, CANADIAN SYLLABICS SI # →ᐧᓯ→ + +14FA ; 00B7 14F0 ; MA # ( ᓺ → ·ᓰ ) CANADIAN SYLLABICS SWII → MIDDLE DOT, CANADIAN SYLLABICS SII # →ᐧᓰ→ + +14FC ; 00B7 14F1 ; MA # ( ᓼ → ·ᓱ ) CANADIAN SYLLABICS SWO → MIDDLE DOT, CANADIAN SYLLABICS SO # →ᐧᓱ→ + +14FE ; 00B7 14F2 ; MA # ( ᓾ → ·ᓲ ) CANADIAN SYLLABICS SWOO → MIDDLE DOT, CANADIAN SYLLABICS SOO # →ᐧᓲ→ + +1500 ; 00B7 14F4 ; MA # ( ᔀ → ·ᓴ ) CANADIAN SYLLABICS SWA → MIDDLE DOT, CANADIAN SYLLABICS SA # →ᐧᓴ→ + +1502 ; 00B7 14F5 ; MA # ( ᔂ → ·ᓵ ) CANADIAN SYLLABICS SWAA → MIDDLE DOT, CANADIAN SYLLABICS SAA # →ᐧᓵ→ + +1517 ; 00B7 1510 ; MA # ( ᔗ → ·ᔐ ) CANADIAN SYLLABICS SHWE → MIDDLE DOT, CANADIAN SYLLABICS SHE # →ᐧᔐ→ + +1519 ; 00B7 1511 ; MA # ( ᔙ → ·ᔑ ) CANADIAN SYLLABICS SHWI → MIDDLE DOT, CANADIAN SYLLABICS SHI # →ᐧᔑ→ + +151B ; 00B7 1512 ; MA # ( ᔛ → ·ᔒ ) CANADIAN SYLLABICS SHWII → MIDDLE DOT, CANADIAN SYLLABICS SHII # →ᐧᔒ→ + +151D ; 00B7 1513 ; MA # ( ᔝ → ·ᔓ ) CANADIAN SYLLABICS SHWO → MIDDLE DOT, CANADIAN SYLLABICS SHO # →ᐧᔓ→ + +151F ; 00B7 1514 ; MA # ( ᔟ → ·ᔔ ) CANADIAN SYLLABICS SHWOO → MIDDLE DOT, CANADIAN SYLLABICS SHOO # →ᐧᔔ→ + +1521 ; 00B7 1515 ; MA # ( ᔡ → ·ᔕ ) CANADIAN SYLLABICS SHWA → MIDDLE DOT, CANADIAN SYLLABICS SHA # →ᐧᔕ→ + +1523 ; 00B7 1516 ; MA # ( ᔣ → ·ᔖ ) CANADIAN SYLLABICS SHWAA → MIDDLE DOT, CANADIAN SYLLABICS SHAA # →ᐧᔖ→ + +1531 ; 00B7 1528 ; MA # ( ᔱ → ·ᔨ ) CANADIAN SYLLABICS YWI → MIDDLE DOT, CANADIAN SYLLABICS YI # →ᐧᔨ→ + +1533 ; 00B7 1529 ; MA # ( ᔳ → ·ᔩ ) CANADIAN SYLLABICS YWII → MIDDLE DOT, CANADIAN SYLLABICS YII # →ᐧᔩ→ + +1535 ; 00B7 152A ; MA # ( ᔵ → ·ᔪ ) CANADIAN SYLLABICS YWO → MIDDLE DOT, CANADIAN SYLLABICS YO # →ᐧᔪ→ + +1537 ; 00B7 152B ; MA # ( ᔷ → ·ᔫ ) CANADIAN SYLLABICS YWOO → MIDDLE DOT, CANADIAN SYLLABICS YOO # →ᐧᔫ→ + +1539 ; 00B7 152D ; MA # ( ᔹ → ·ᔭ ) CANADIAN SYLLABICS YWA → MIDDLE DOT, CANADIAN SYLLABICS YA # →ᐧᔭ→ + +153B ; 00B7 152E ; MA # ( ᔻ → ·ᔮ ) CANADIAN SYLLABICS YWAA → MIDDLE DOT, CANADIAN SYLLABICS YAA # →ᐧᔮ→ + +154E ; 00B7 154C ; MA # ( ᕎ → ·ᕌ ) CANADIAN SYLLABICS RWAA → MIDDLE DOT, CANADIAN SYLLABICS RAA # →ᐧᕌ→ + +155B ; 00B7 155A ; MA # ( ᕛ → ·ᕚ ) CANADIAN SYLLABICS FWAA → MIDDLE DOT, CANADIAN SYLLABICS FAA # →ᐧᕚ→ + +1568 ; 00B7 1567 ; MA # ( ᕨ → ·ᕧ ) CANADIAN SYLLABICS THWAA → MIDDLE DOT, CANADIAN SYLLABICS THAA # →ᐧᕧ→ + +18B3 ; 00B7 18B1 ; MA # ( ᢳ → ·ᢱ ) CANADIAN SYLLABICS WAY → MIDDLE DOT, CANADIAN SYLLABICS AY # →ᐧᢱ→ + +18B6 ; 00B7 18B4 ; MA # ( ᢶ → ·ᢴ ) CANADIAN SYLLABICS PWOY → MIDDLE DOT, CANADIAN SYLLABICS POY # →ᐧᢴ→ + +18B9 ; 00B7 18B8 ; MA # ( ᢹ → ·ᢸ ) CANADIAN SYLLABICS KWAY → MIDDLE DOT, CANADIAN SYLLABICS KAY # →ᐧᢸ→ + +18C2 ; 00B7 18C0 ; MA # ( ᣂ → ·ᣀ ) CANADIAN SYLLABICS SHWOY → MIDDLE DOT, CANADIAN SYLLABICS SHOY # →ᐧᣀ→ + +0965 ; 0964 0964 ; MA #* ( ॥ → ।। ) DEVANAGARI DOUBLE DANDA → DEVANAGARI DANDA, DEVANAGARI DANDA # + +1C3C ; 1C3B 1C3B ; MA #* ( ᰼ → ᰻᰻ ) LEPCHA PUNCTUATION NYET THYOOM TA-ROL → LEPCHA PUNCTUATION TA-ROL, LEPCHA PUNCTUATION TA-ROL # + +104B ; 104A 104A ; MA #* ( ။ → ၊၊ ) MYANMAR SIGN SECTION → MYANMAR SIGN LITTLE SECTION, MYANMAR SIGN LITTLE SECTION # + +1AA9 ; 1AA8 1AA8 ; MA #* ( ᪩ → ᪨᪨ ) TAI THAM SIGN KAANKUU → TAI THAM SIGN KAAN, TAI THAM SIGN KAAN # + +1AAB ; 1AAA 1AA8 ; MA #* ( ᪫ → ᪪᪨ ) TAI THAM SIGN SATKAANKUU → TAI THAM SIGN SATKAAN, TAI THAM SIGN KAAN # + +1B5F ; 1B5E 1B5E ; MA #* ( ᭟ → ᭞᭞ ) BALINESE CARIK PAREREN → BALINESE CARIK SIKI, BALINESE CARIK SIKI # + +10A57 ; 10A56 10A56 ; MA #* ( ‎𐩗‎ → ‎𐩖𐩖‎ ) KHAROSHTHI PUNCTUATION DOUBLE DANDA → KHAROSHTHI PUNCTUATION DANDA, KHAROSHTHI PUNCTUATION DANDA # + +1C7F ; 1C7E 1C7E ; MA #* ( ᱿ → ᱾᱾ ) OL CHIKI PUNCTUATION DOUBLE MUCAAD → OL CHIKI PUNCTUATION MUCAAD, OL CHIKI PUNCTUATION MUCAAD # + +055D ; 0027 ; MA #* ( ՝ → ' ) ARMENIAN COMMA → APOSTROPHE # →ˋ→→`→→‘→ +FF07 ; 0027 ; MA #* ( ' → ' ) FULLWIDTH APOSTROPHE → APOSTROPHE # →’→ +2018 ; 0027 ; MA #* ( ‘ → ' ) LEFT SINGLE QUOTATION MARK → APOSTROPHE # +2019 ; 0027 ; MA #* ( ’ → ' ) RIGHT SINGLE QUOTATION MARK → APOSTROPHE # +201B ; 0027 ; MA #* ( ‛ → ' ) SINGLE HIGH-REVERSED-9 QUOTATION MARK → APOSTROPHE # →′→ +2032 ; 0027 ; MA #* ( ′ → ' ) PRIME → APOSTROPHE # +2035 ; 0027 ; MA #* ( ‵ → ' ) REVERSED PRIME → APOSTROPHE # →ʽ→→‘→ +055A ; 0027 ; MA #* ( ՚ → ' ) ARMENIAN APOSTROPHE → APOSTROPHE # →’→ +05F3 ; 0027 ; MA #* ( ‎׳‎ → ' ) HEBREW PUNCTUATION GERESH → APOSTROPHE # +0060 ; 0027 ; MA #* ( ` → ' ) GRAVE ACCENT → APOSTROPHE # →ˋ→→`→→‘→ +1FEF ; 0027 ; MA #* ( ` → ' ) GREEK VARIA → APOSTROPHE # →ˋ→→`→→‘→ +FF40 ; 0027 ; MA #* ( ` → ' ) FULLWIDTH GRAVE ACCENT → APOSTROPHE # →‘→ +00B4 ; 0027 ; MA #* ( ´ → ' ) ACUTE ACCENT → APOSTROPHE # →΄→→ʹ→ +0384 ; 0027 ; MA #* ( ΄ → ' ) GREEK TONOS → APOSTROPHE # →ʹ→ +1FFD ; 0027 ; MA #* ( ´ → ' ) GREEK OXIA → APOSTROPHE # →´→→΄→→ʹ→ +1FBD ; 0027 ; MA #* ( ᾽ → ' ) GREEK KORONIS → APOSTROPHE # →’→ +1FBF ; 0027 ; MA #* ( ᾿ → ' ) GREEK PSILI → APOSTROPHE # →’→ +1FFE ; 0027 ; MA #* ( ῾ → ' ) GREEK DASIA → APOSTROPHE # →‛→→′→ +02B9 ; 0027 ; MA # ( ʹ → ' ) MODIFIER LETTER PRIME → APOSTROPHE # +0374 ; 0027 ; MA # ( ʹ → ' ) GREEK NUMERAL SIGN → APOSTROPHE # →′→ +02C8 ; 0027 ; MA # ( ˈ → ' ) MODIFIER LETTER VERTICAL LINE → APOSTROPHE # +02CA ; 0027 ; MA # ( ˊ → ' ) MODIFIER LETTER ACUTE ACCENT → APOSTROPHE # →ʹ→→′→ +02CB ; 0027 ; MA # ( ˋ → ' ) MODIFIER LETTER GRAVE ACCENT → APOSTROPHE # →`→→‘→ +02F4 ; 0027 ; MA #* ( ˴ → ' ) MODIFIER LETTER MIDDLE GRAVE ACCENT → APOSTROPHE # →ˋ→→`→→‘→ +02BB ; 0027 ; MA # ( ʻ → ' ) MODIFIER LETTER TURNED COMMA → APOSTROPHE # →‘→ +02BD ; 0027 ; MA # ( ʽ → ' ) MODIFIER LETTER REVERSED COMMA → APOSTROPHE # →‘→ +02BC ; 0027 ; MA # ( ʼ → ' ) MODIFIER LETTER APOSTROPHE → APOSTROPHE # →′→ +02BE ; 0027 ; MA # ( ʾ → ' ) MODIFIER LETTER RIGHT HALF RING → APOSTROPHE # →ʼ→→′→ +A78C ; 0027 ; MA # ( ꞌ → ' ) LATIN SMALL LETTER SALTILLO → APOSTROPHE # +05D9 ; 0027 ; MA # ( ‎י‎ → ' ) HEBREW LETTER YOD → APOSTROPHE # +07F4 ; 0027 ; MA # ( ‎ߴ‎ → ' ) NKO HIGH TONE APOSTROPHE → APOSTROPHE # →’→ +07F5 ; 0027 ; MA # ( ‎ߵ‎ → ' ) NKO LOW TONE APOSTROPHE → APOSTROPHE # →‘→ +144A ; 0027 ; MA # ( ᑊ → ' ) CANADIAN SYLLABICS WEST-CREE P → APOSTROPHE # →ˈ→ +16CC ; 0027 ; MA # ( ᛌ → ' ) RUNIC LETTER SHORT-TWIG-SOL S → APOSTROPHE # + +1CD3 ; 0027 0027 ; MA #* ( ᳓ → '' ) VEDIC SIGN NIHSHVASA → APOSTROPHE, APOSTROPHE # →″→→"→ +0022 ; 0027 0027 ; MA #* ( " → '' ) QUOTATION MARK → APOSTROPHE, APOSTROPHE # +FF02 ; 0027 0027 ; MA #* ( " → '' ) FULLWIDTH QUOTATION MARK → APOSTROPHE, APOSTROPHE # →”→→"→ +201C ; 0027 0027 ; MA #* ( “ → '' ) LEFT DOUBLE QUOTATION MARK → APOSTROPHE, APOSTROPHE # →"→ +201D ; 0027 0027 ; MA #* ( ” → '' ) RIGHT DOUBLE QUOTATION MARK → APOSTROPHE, APOSTROPHE # →"→ +201F ; 0027 0027 ; MA #* ( ‟ → '' ) DOUBLE HIGH-REVERSED-9 QUOTATION MARK → APOSTROPHE, APOSTROPHE # →“→→"→ +2033 ; 0027 0027 ; MA #* ( ″ → '' ) DOUBLE PRIME → APOSTROPHE, APOSTROPHE # →"→ +2036 ; 0027 0027 ; MA #* ( ‶ → '' ) REVERSED DOUBLE PRIME → APOSTROPHE, APOSTROPHE # →‵‵→ +3003 ; 0027 0027 ; MA #* ( 〃 → '' ) DITTO MARK → APOSTROPHE, APOSTROPHE # →″→→"→ +05F4 ; 0027 0027 ; MA #* ( ‎״‎ → '' ) HEBREW PUNCTUATION GERSHAYIM → APOSTROPHE, APOSTROPHE # →"→ +02DD ; 0027 0027 ; MA #* ( ˝ → '' ) DOUBLE ACUTE ACCENT → APOSTROPHE, APOSTROPHE # →"→ +02BA ; 0027 0027 ; MA # ( ʺ → '' ) MODIFIER LETTER DOUBLE PRIME → APOSTROPHE, APOSTROPHE # →"→ +02F6 ; 0027 0027 ; MA #* ( ˶ → '' ) MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT → APOSTROPHE, APOSTROPHE # →˝→→"→ +02EE ; 0027 0027 ; MA # ( ˮ → '' ) MODIFIER LETTER DOUBLE APOSTROPHE → APOSTROPHE, APOSTROPHE # →″→→"→ +05F2 ; 0027 0027 ; MA # ( ‎ײ‎ → '' ) HEBREW LIGATURE YIDDISH DOUBLE YOD → APOSTROPHE, APOSTROPHE # →‎יי‎→ + +2034 ; 0027 0027 0027 ; MA #* ( ‴ → ''' ) TRIPLE PRIME → APOSTROPHE, APOSTROPHE, APOSTROPHE # →′′′→ +2037 ; 0027 0027 0027 ; MA #* ( ‷ → ''' ) REVERSED TRIPLE PRIME → APOSTROPHE, APOSTROPHE, APOSTROPHE # →‵‵‵→ + +2057 ; 0027 0027 0027 0027 ; MA #* ( ⁗ → '''' ) QUADRUPLE PRIME → APOSTROPHE, APOSTROPHE, APOSTROPHE, APOSTROPHE # →′′′′→ + +0181 ; 0027 0042 ; MA # ( Ɓ → 'B ) LATIN CAPITAL LETTER B WITH HOOK → APOSTROPHE, LATIN CAPITAL LETTER B # →ʽB→ + +018A ; 0027 0044 ; MA # ( Ɗ → 'D ) LATIN CAPITAL LETTER D WITH HOOK → APOSTROPHE, LATIN CAPITAL LETTER D # →ʽD→ + +0149 ; 0027 006E ; MA # ( ʼn → 'n ) LATIN SMALL LETTER N PRECEDED BY APOSTROPHE → APOSTROPHE, LATIN SMALL LETTER N # →ʼn→ + +01A4 ; 0027 0050 ; MA # ( Ƥ → 'P ) LATIN CAPITAL LETTER P WITH HOOK → APOSTROPHE, LATIN CAPITAL LETTER P # →ʽP→ + +01AC ; 0027 0054 ; MA # ( Ƭ → 'T ) LATIN CAPITAL LETTER T WITH HOOK → APOSTROPHE, LATIN CAPITAL LETTER T # →ʽT→ + +01B3 ; 0027 0059 ; MA # ( Ƴ → 'Y ) LATIN CAPITAL LETTER Y WITH HOOK → APOSTROPHE, LATIN CAPITAL LETTER Y # →ʽY→ + +FF3B ; 0028 ; MA #* ( [ → ( ) FULLWIDTH LEFT SQUARE BRACKET → LEFT PARENTHESIS # →〔→ +2768 ; 0028 ; MA #* ( ❨ → ( ) MEDIUM LEFT PARENTHESIS ORNAMENT → LEFT PARENTHESIS # +2772 ; 0028 ; MA #* ( ❲ → ( ) LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT → LEFT PARENTHESIS # →〔→ +3014 ; 0028 ; MA #* ( 〔 → ( ) LEFT TORTOISE SHELL BRACKET → LEFT PARENTHESIS # +FD3E ; 0028 ; MA #* ( ﴾ → ( ) ORNATE LEFT PARENTHESIS → LEFT PARENTHESIS # + +2E28 ; 0028 0028 ; MA #* ( ⸨ → (( ) LEFT DOUBLE PARENTHESIS → LEFT PARENTHESIS, LEFT PARENTHESIS # + +3220 ; 0028 30FC 0029 ; MA #* ( ㈠ → (ー) ) PARENTHESIZED IDEOGRAPH ONE → LEFT PARENTHESIS, KATAKANA-HIRAGANA PROLONGED SOUND MARK, RIGHT PARENTHESIS # →(一)→ + +2475 ; 0028 0032 0029 ; MA #* ( ⑵ → (2) ) PARENTHESIZED DIGIT TWO → LEFT PARENTHESIS, DIGIT TWO, RIGHT PARENTHESIS # + +2487 ; 0028 0032 004F 0029 ; MA #* ( ⒇ → (2O) ) PARENTHESIZED NUMBER TWENTY → LEFT PARENTHESIS, DIGIT TWO, LATIN CAPITAL LETTER O, RIGHT PARENTHESIS # →(20)→ + +2476 ; 0028 0033 0029 ; MA #* ( ⑶ → (3) ) PARENTHESIZED DIGIT THREE → LEFT PARENTHESIS, DIGIT THREE, RIGHT PARENTHESIS # + +2477 ; 0028 0034 0029 ; MA #* ( ⑷ → (4) ) PARENTHESIZED DIGIT FOUR → LEFT PARENTHESIS, DIGIT FOUR, RIGHT PARENTHESIS # + +2478 ; 0028 0035 0029 ; MA #* ( ⑸ → (5) ) PARENTHESIZED DIGIT FIVE → LEFT PARENTHESIS, DIGIT FIVE, RIGHT PARENTHESIS # + +2479 ; 0028 0036 0029 ; MA #* ( ⑹ → (6) ) PARENTHESIZED DIGIT SIX → LEFT PARENTHESIS, DIGIT SIX, RIGHT PARENTHESIS # + +247A ; 0028 0037 0029 ; MA #* ( ⑺ → (7) ) PARENTHESIZED DIGIT SEVEN → LEFT PARENTHESIS, DIGIT SEVEN, RIGHT PARENTHESIS # + +247B ; 0028 0038 0029 ; MA #* ( ⑻ → (8) ) PARENTHESIZED DIGIT EIGHT → LEFT PARENTHESIS, DIGIT EIGHT, RIGHT PARENTHESIS # + +247C ; 0028 0039 0029 ; MA #* ( ⑼ → (9) ) PARENTHESIZED DIGIT NINE → LEFT PARENTHESIS, DIGIT NINE, RIGHT PARENTHESIS # + +249C ; 0028 0061 0029 ; MA #* ( ⒜ → (a) ) PARENTHESIZED LATIN SMALL LETTER A → LEFT PARENTHESIS, LATIN SMALL LETTER A, RIGHT PARENTHESIS # + +1F110 ; 0028 0041 0029 ; MA #* ( 🄐 → (A) ) PARENTHESIZED LATIN CAPITAL LETTER A → LEFT PARENTHESIS, LATIN CAPITAL LETTER A, RIGHT PARENTHESIS # + +249D ; 0028 0062 0029 ; MA #* ( ⒝ → (b) ) PARENTHESIZED LATIN SMALL LETTER B → LEFT PARENTHESIS, LATIN SMALL LETTER B, RIGHT PARENTHESIS # + +1F111 ; 0028 0042 0029 ; MA #* ( 🄑 → (B) ) PARENTHESIZED LATIN CAPITAL LETTER B → LEFT PARENTHESIS, LATIN CAPITAL LETTER B, RIGHT PARENTHESIS # + +249E ; 0028 0063 0029 ; MA #* ( ⒞ → (c) ) PARENTHESIZED LATIN SMALL LETTER C → LEFT PARENTHESIS, LATIN SMALL LETTER C, RIGHT PARENTHESIS # + +1F112 ; 0028 0043 0029 ; MA #* ( 🄒 → (C) ) PARENTHESIZED LATIN CAPITAL LETTER C → LEFT PARENTHESIS, LATIN CAPITAL LETTER C, RIGHT PARENTHESIS # + +249F ; 0028 0064 0029 ; MA #* ( ⒟ → (d) ) PARENTHESIZED LATIN SMALL LETTER D → LEFT PARENTHESIS, LATIN SMALL LETTER D, RIGHT PARENTHESIS # + +1F113 ; 0028 0044 0029 ; MA #* ( 🄓 → (D) ) PARENTHESIZED LATIN CAPITAL LETTER D → LEFT PARENTHESIS, LATIN CAPITAL LETTER D, RIGHT PARENTHESIS # + +24A0 ; 0028 0065 0029 ; MA #* ( ⒠ → (e) ) PARENTHESIZED LATIN SMALL LETTER E → LEFT PARENTHESIS, LATIN SMALL LETTER E, RIGHT PARENTHESIS # + +1F114 ; 0028 0045 0029 ; MA #* ( 🄔 → (E) ) PARENTHESIZED LATIN CAPITAL LETTER E → LEFT PARENTHESIS, LATIN CAPITAL LETTER E, RIGHT PARENTHESIS # + +24A1 ; 0028 0066 0029 ; MA #* ( ⒡ → (f) ) PARENTHESIZED LATIN SMALL LETTER F → LEFT PARENTHESIS, LATIN SMALL LETTER F, RIGHT PARENTHESIS # + +1F115 ; 0028 0046 0029 ; MA #* ( 🄕 → (F) ) PARENTHESIZED LATIN CAPITAL LETTER F → LEFT PARENTHESIS, LATIN CAPITAL LETTER F, RIGHT PARENTHESIS # + +24A2 ; 0028 0067 0029 ; MA #* ( ⒢ → (g) ) PARENTHESIZED LATIN SMALL LETTER G → LEFT PARENTHESIS, LATIN SMALL LETTER G, RIGHT PARENTHESIS # + +1F116 ; 0028 0047 0029 ; MA #* ( 🄖 → (G) ) PARENTHESIZED LATIN CAPITAL LETTER G → LEFT PARENTHESIS, LATIN CAPITAL LETTER G, RIGHT PARENTHESIS # + +24A3 ; 0028 0068 0029 ; MA #* ( ⒣ → (h) ) PARENTHESIZED LATIN SMALL LETTER H → LEFT PARENTHESIS, LATIN SMALL LETTER H, RIGHT PARENTHESIS # + +1F117 ; 0028 0048 0029 ; MA #* ( 🄗 → (H) ) PARENTHESIZED LATIN CAPITAL LETTER H → LEFT PARENTHESIS, LATIN CAPITAL LETTER H, RIGHT PARENTHESIS # + +24A4 ; 0028 0069 0029 ; MA #* ( ⒤ → (i) ) PARENTHESIZED LATIN SMALL LETTER I → LEFT PARENTHESIS, LATIN SMALL LETTER I, RIGHT PARENTHESIS # + +24A5 ; 0028 006A 0029 ; MA #* ( ⒥ → (j) ) PARENTHESIZED LATIN SMALL LETTER J → LEFT PARENTHESIS, LATIN SMALL LETTER J, RIGHT PARENTHESIS # + +1F119 ; 0028 004A 0029 ; MA #* ( 🄙 → (J) ) PARENTHESIZED LATIN CAPITAL LETTER J → LEFT PARENTHESIS, LATIN CAPITAL LETTER J, RIGHT PARENTHESIS # + +24A6 ; 0028 006B 0029 ; MA #* ( ⒦ → (k) ) PARENTHESIZED LATIN SMALL LETTER K → LEFT PARENTHESIS, LATIN SMALL LETTER K, RIGHT PARENTHESIS # + +1F11A ; 0028 004B 0029 ; MA #* ( 🄚 → (K) ) PARENTHESIZED LATIN CAPITAL LETTER K → LEFT PARENTHESIS, LATIN CAPITAL LETTER K, RIGHT PARENTHESIS # + +2474 ; 0028 006C 0029 ; MA #* ( ⑴ → (l) ) PARENTHESIZED DIGIT ONE → LEFT PARENTHESIS, LATIN SMALL LETTER L, RIGHT PARENTHESIS # →(1)→ +1F118 ; 0028 006C 0029 ; MA #* ( 🄘 → (l) ) PARENTHESIZED LATIN CAPITAL LETTER I → LEFT PARENTHESIS, LATIN SMALL LETTER L, RIGHT PARENTHESIS # →(I)→ +24A7 ; 0028 006C 0029 ; MA #* ( ⒧ → (l) ) PARENTHESIZED LATIN SMALL LETTER L → LEFT PARENTHESIS, LATIN SMALL LETTER L, RIGHT PARENTHESIS # + +1F11B ; 0028 004C 0029 ; MA #* ( 🄛 → (L) ) PARENTHESIZED LATIN CAPITAL LETTER L → LEFT PARENTHESIS, LATIN CAPITAL LETTER L, RIGHT PARENTHESIS # + +247F ; 0028 006C 0032 0029 ; MA #* ( ⑿ → (l2) ) PARENTHESIZED NUMBER TWELVE → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT TWO, RIGHT PARENTHESIS # →(12)→ + +2480 ; 0028 006C 0033 0029 ; MA #* ( ⒀ → (l3) ) PARENTHESIZED NUMBER THIRTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT THREE, RIGHT PARENTHESIS # →(13)→ + +2481 ; 0028 006C 0034 0029 ; MA #* ( ⒁ → (l4) ) PARENTHESIZED NUMBER FOURTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT FOUR, RIGHT PARENTHESIS # →(14)→ + +2482 ; 0028 006C 0035 0029 ; MA #* ( ⒂ → (l5) ) PARENTHESIZED NUMBER FIFTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT FIVE, RIGHT PARENTHESIS # →(15)→ + +2483 ; 0028 006C 0036 0029 ; MA #* ( ⒃ → (l6) ) PARENTHESIZED NUMBER SIXTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT SIX, RIGHT PARENTHESIS # →(16)→ + +2484 ; 0028 006C 0037 0029 ; MA #* ( ⒄ → (l7) ) PARENTHESIZED NUMBER SEVENTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT SEVEN, RIGHT PARENTHESIS # →(17)→ + +2485 ; 0028 006C 0038 0029 ; MA #* ( ⒅ → (l8) ) PARENTHESIZED NUMBER EIGHTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT EIGHT, RIGHT PARENTHESIS # →(18)→ + +2486 ; 0028 006C 0039 0029 ; MA #* ( ⒆ → (l9) ) PARENTHESIZED NUMBER NINETEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT NINE, RIGHT PARENTHESIS # →(19)→ + +247E ; 0028 006C 006C 0029 ; MA #* ( ⑾ → (ll) ) PARENTHESIZED NUMBER ELEVEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, LATIN SMALL LETTER L, RIGHT PARENTHESIS # →(11)→ + +247D ; 0028 006C 004F 0029 ; MA #* ( ⑽ → (lO) ) PARENTHESIZED NUMBER TEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, RIGHT PARENTHESIS # →(10)→ + +1F11C ; 0028 004D 0029 ; MA #* ( 🄜 → (M) ) PARENTHESIZED LATIN CAPITAL LETTER M → LEFT PARENTHESIS, LATIN CAPITAL LETTER M, RIGHT PARENTHESIS # + +24A9 ; 0028 006E 0029 ; MA #* ( ⒩ → (n) ) PARENTHESIZED LATIN SMALL LETTER N → LEFT PARENTHESIS, LATIN SMALL LETTER N, RIGHT PARENTHESIS # + +1F11D ; 0028 004E 0029 ; MA #* ( 🄝 → (N) ) PARENTHESIZED LATIN CAPITAL LETTER N → LEFT PARENTHESIS, LATIN CAPITAL LETTER N, RIGHT PARENTHESIS # + +24AA ; 0028 006F 0029 ; MA #* ( ⒪ → (o) ) PARENTHESIZED LATIN SMALL LETTER O → LEFT PARENTHESIS, LATIN SMALL LETTER O, RIGHT PARENTHESIS # + +1F11E ; 0028 004F 0029 ; MA #* ( 🄞 → (O) ) PARENTHESIZED LATIN CAPITAL LETTER O → LEFT PARENTHESIS, LATIN CAPITAL LETTER O, RIGHT PARENTHESIS # + +24AB ; 0028 0070 0029 ; MA #* ( ⒫ → (p) ) PARENTHESIZED LATIN SMALL LETTER P → LEFT PARENTHESIS, LATIN SMALL LETTER P, RIGHT PARENTHESIS # + +1F11F ; 0028 0050 0029 ; MA #* ( 🄟 → (P) ) PARENTHESIZED LATIN CAPITAL LETTER P → LEFT PARENTHESIS, LATIN CAPITAL LETTER P, RIGHT PARENTHESIS # + +24AC ; 0028 0071 0029 ; MA #* ( ⒬ → (q) ) PARENTHESIZED LATIN SMALL LETTER Q → LEFT PARENTHESIS, LATIN SMALL LETTER Q, RIGHT PARENTHESIS # + +1F120 ; 0028 0051 0029 ; MA #* ( 🄠 → (Q) ) PARENTHESIZED LATIN CAPITAL LETTER Q → LEFT PARENTHESIS, LATIN CAPITAL LETTER Q, RIGHT PARENTHESIS # + +24AD ; 0028 0072 0029 ; MA #* ( ⒭ → (r) ) PARENTHESIZED LATIN SMALL LETTER R → LEFT PARENTHESIS, LATIN SMALL LETTER R, RIGHT PARENTHESIS # + +1F121 ; 0028 0052 0029 ; MA #* ( 🄡 → (R) ) PARENTHESIZED LATIN CAPITAL LETTER R → LEFT PARENTHESIS, LATIN CAPITAL LETTER R, RIGHT PARENTHESIS # + +24A8 ; 0028 0072 006E 0029 ; MA #* ( ⒨ → (rn) ) PARENTHESIZED LATIN SMALL LETTER M → LEFT PARENTHESIS, LATIN SMALL LETTER R, LATIN SMALL LETTER N, RIGHT PARENTHESIS # →(m)→ + +24AE ; 0028 0073 0029 ; MA #* ( ⒮ → (s) ) PARENTHESIZED LATIN SMALL LETTER S → LEFT PARENTHESIS, LATIN SMALL LETTER S, RIGHT PARENTHESIS # + +1F122 ; 0028 0053 0029 ; MA #* ( 🄢 → (S) ) PARENTHESIZED LATIN CAPITAL LETTER S → LEFT PARENTHESIS, LATIN CAPITAL LETTER S, RIGHT PARENTHESIS # +1F12A ; 0028 0053 0029 ; MA #* ( 🄪 → (S) ) TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S → LEFT PARENTHESIS, LATIN CAPITAL LETTER S, RIGHT PARENTHESIS # →〔S〕→ + +24AF ; 0028 0074 0029 ; MA #* ( ⒯ → (t) ) PARENTHESIZED LATIN SMALL LETTER T → LEFT PARENTHESIS, LATIN SMALL LETTER T, RIGHT PARENTHESIS # + +1F123 ; 0028 0054 0029 ; MA #* ( 🄣 → (T) ) PARENTHESIZED LATIN CAPITAL LETTER T → LEFT PARENTHESIS, LATIN CAPITAL LETTER T, RIGHT PARENTHESIS # + +24B0 ; 0028 0075 0029 ; MA #* ( ⒰ → (u) ) PARENTHESIZED LATIN SMALL LETTER U → LEFT PARENTHESIS, LATIN SMALL LETTER U, RIGHT PARENTHESIS # + +1F124 ; 0028 0055 0029 ; MA #* ( 🄤 → (U) ) PARENTHESIZED LATIN CAPITAL LETTER U → LEFT PARENTHESIS, LATIN CAPITAL LETTER U, RIGHT PARENTHESIS # + +24B1 ; 0028 0076 0029 ; MA #* ( ⒱ → (v) ) PARENTHESIZED LATIN SMALL LETTER V → LEFT PARENTHESIS, LATIN SMALL LETTER V, RIGHT PARENTHESIS # + +1F125 ; 0028 0056 0029 ; MA #* ( 🄥 → (V) ) PARENTHESIZED LATIN CAPITAL LETTER V → LEFT PARENTHESIS, LATIN CAPITAL LETTER V, RIGHT PARENTHESIS # + +24B2 ; 0028 0076 0076 0029 ; MA #* ( ⒲ → (vv) ) PARENTHESIZED LATIN SMALL LETTER W → LEFT PARENTHESIS, LATIN SMALL LETTER V, LATIN SMALL LETTER V, RIGHT PARENTHESIS # →(w)→ + +1F126 ; 0028 0057 0029 ; MA #* ( 🄦 → (W) ) PARENTHESIZED LATIN CAPITAL LETTER W → LEFT PARENTHESIS, LATIN CAPITAL LETTER W, RIGHT PARENTHESIS # + +24B3 ; 0028 0078 0029 ; MA #* ( ⒳ → (x) ) PARENTHESIZED LATIN SMALL LETTER X → LEFT PARENTHESIS, LATIN SMALL LETTER X, RIGHT PARENTHESIS # + +1F127 ; 0028 0058 0029 ; MA #* ( 🄧 → (X) ) PARENTHESIZED LATIN CAPITAL LETTER X → LEFT PARENTHESIS, LATIN CAPITAL LETTER X, RIGHT PARENTHESIS # + +24B4 ; 0028 0079 0029 ; MA #* ( ⒴ → (y) ) PARENTHESIZED LATIN SMALL LETTER Y → LEFT PARENTHESIS, LATIN SMALL LETTER Y, RIGHT PARENTHESIS # + +1F128 ; 0028 0059 0029 ; MA #* ( 🄨 → (Y) ) PARENTHESIZED LATIN CAPITAL LETTER Y → LEFT PARENTHESIS, LATIN CAPITAL LETTER Y, RIGHT PARENTHESIS # + +24B5 ; 0028 007A 0029 ; MA #* ( ⒵ → (z) ) PARENTHESIZED LATIN SMALL LETTER Z → LEFT PARENTHESIS, LATIN SMALL LETTER Z, RIGHT PARENTHESIS # + +1F129 ; 0028 005A 0029 ; MA #* ( 🄩 → (Z) ) PARENTHESIZED LATIN CAPITAL LETTER Z → LEFT PARENTHESIS, LATIN CAPITAL LETTER Z, RIGHT PARENTHESIS # + +3200 ; 0028 1100 0029 ; MA #* ( ㈀ → (ᄀ) ) PARENTHESIZED HANGUL KIYEOK → LEFT PARENTHESIS, HANGUL CHOSEONG KIYEOK, RIGHT PARENTHESIS # + +320E ; 0028 AC00 0029 ; MA #* ( ㈎ → (가) ) PARENTHESIZED HANGUL KIYEOK A → LEFT PARENTHESIS, HANGUL SYLLABLE GA, RIGHT PARENTHESIS # + +3201 ; 0028 1102 0029 ; MA #* ( ㈁ → (ᄂ) ) PARENTHESIZED HANGUL NIEUN → LEFT PARENTHESIS, HANGUL CHOSEONG NIEUN, RIGHT PARENTHESIS # + +320F ; 0028 B098 0029 ; MA #* ( ㈏ → (나) ) PARENTHESIZED HANGUL NIEUN A → LEFT PARENTHESIS, HANGUL SYLLABLE NA, RIGHT PARENTHESIS # + +3202 ; 0028 1103 0029 ; MA #* ( ㈂ → (ᄃ) ) PARENTHESIZED HANGUL TIKEUT → LEFT PARENTHESIS, HANGUL CHOSEONG TIKEUT, RIGHT PARENTHESIS # + +3210 ; 0028 B2E4 0029 ; MA #* ( ㈐ → (다) ) PARENTHESIZED HANGUL TIKEUT A → LEFT PARENTHESIS, HANGUL SYLLABLE DA, RIGHT PARENTHESIS # + +3203 ; 0028 1105 0029 ; MA #* ( ㈃ → (ᄅ) ) PARENTHESIZED HANGUL RIEUL → LEFT PARENTHESIS, HANGUL CHOSEONG RIEUL, RIGHT PARENTHESIS # + +3211 ; 0028 B77C 0029 ; MA #* ( ㈑ → (라) ) PARENTHESIZED HANGUL RIEUL A → LEFT PARENTHESIS, HANGUL SYLLABLE RA, RIGHT PARENTHESIS # + +3204 ; 0028 1106 0029 ; MA #* ( ㈄ → (ᄆ) ) PARENTHESIZED HANGUL MIEUM → LEFT PARENTHESIS, HANGUL CHOSEONG MIEUM, RIGHT PARENTHESIS # + +3212 ; 0028 B9C8 0029 ; MA #* ( ㈒ → (마) ) PARENTHESIZED HANGUL MIEUM A → LEFT PARENTHESIS, HANGUL SYLLABLE MA, RIGHT PARENTHESIS # + +3205 ; 0028 1107 0029 ; MA #* ( ㈅ → (ᄇ) ) PARENTHESIZED HANGUL PIEUP → LEFT PARENTHESIS, HANGUL CHOSEONG PIEUP, RIGHT PARENTHESIS # + +3213 ; 0028 BC14 0029 ; MA #* ( ㈓ → (바) ) PARENTHESIZED HANGUL PIEUP A → LEFT PARENTHESIS, HANGUL SYLLABLE BA, RIGHT PARENTHESIS # + +3206 ; 0028 1109 0029 ; MA #* ( ㈆ → (ᄉ) ) PARENTHESIZED HANGUL SIOS → LEFT PARENTHESIS, HANGUL CHOSEONG SIOS, RIGHT PARENTHESIS # + +3214 ; 0028 C0AC 0029 ; MA #* ( ㈔ → (사) ) PARENTHESIZED HANGUL SIOS A → LEFT PARENTHESIS, HANGUL SYLLABLE SA, RIGHT PARENTHESIS # + +3207 ; 0028 110B 0029 ; MA #* ( ㈇ → (ᄋ) ) PARENTHESIZED HANGUL IEUNG → LEFT PARENTHESIS, HANGUL CHOSEONG IEUNG, RIGHT PARENTHESIS # + +3215 ; 0028 C544 0029 ; MA #* ( ㈕ → (아) ) PARENTHESIZED HANGUL IEUNG A → LEFT PARENTHESIS, HANGUL SYLLABLE A, RIGHT PARENTHESIS # + +321D ; 0028 C624 C804 0029 ; MA #* ( ㈝ → (오전) ) PARENTHESIZED KOREAN CHARACTER OJEON → LEFT PARENTHESIS, HANGUL SYLLABLE O, HANGUL SYLLABLE JEON, RIGHT PARENTHESIS # + +321E ; 0028 C624 D6C4 0029 ; MA #* ( ㈞ → (오후) ) PARENTHESIZED KOREAN CHARACTER O HU → LEFT PARENTHESIS, HANGUL SYLLABLE O, HANGUL SYLLABLE HU, RIGHT PARENTHESIS # + +3208 ; 0028 110C 0029 ; MA #* ( ㈈ → (ᄌ) ) PARENTHESIZED HANGUL CIEUC → LEFT PARENTHESIS, HANGUL CHOSEONG CIEUC, RIGHT PARENTHESIS # + +3216 ; 0028 C790 0029 ; MA #* ( ㈖ → (자) ) PARENTHESIZED HANGUL CIEUC A → LEFT PARENTHESIS, HANGUL SYLLABLE JA, RIGHT PARENTHESIS # + +321C ; 0028 C8FC 0029 ; MA #* ( ㈜ → (주) ) PARENTHESIZED HANGUL CIEUC U → LEFT PARENTHESIS, HANGUL SYLLABLE JU, RIGHT PARENTHESIS # + +3209 ; 0028 110E 0029 ; MA #* ( ㈉ → (ᄎ) ) PARENTHESIZED HANGUL CHIEUCH → LEFT PARENTHESIS, HANGUL CHOSEONG CHIEUCH, RIGHT PARENTHESIS # + +3217 ; 0028 CC28 0029 ; MA #* ( ㈗ → (차) ) PARENTHESIZED HANGUL CHIEUCH A → LEFT PARENTHESIS, HANGUL SYLLABLE CA, RIGHT PARENTHESIS # + +320A ; 0028 110F 0029 ; MA #* ( ㈊ → (ᄏ) ) PARENTHESIZED HANGUL KHIEUKH → LEFT PARENTHESIS, HANGUL CHOSEONG KHIEUKH, RIGHT PARENTHESIS # + +3218 ; 0028 CE74 0029 ; MA #* ( ㈘ → (카) ) PARENTHESIZED HANGUL KHIEUKH A → LEFT PARENTHESIS, HANGUL SYLLABLE KA, RIGHT PARENTHESIS # + +320B ; 0028 1110 0029 ; MA #* ( ㈋ → (ᄐ) ) PARENTHESIZED HANGUL THIEUTH → LEFT PARENTHESIS, HANGUL CHOSEONG THIEUTH, RIGHT PARENTHESIS # + +3219 ; 0028 D0C0 0029 ; MA #* ( ㈙ → (타) ) PARENTHESIZED HANGUL THIEUTH A → LEFT PARENTHESIS, HANGUL SYLLABLE TA, RIGHT PARENTHESIS # + +320C ; 0028 1111 0029 ; MA #* ( ㈌ → (ᄑ) ) PARENTHESIZED HANGUL PHIEUPH → LEFT PARENTHESIS, HANGUL CHOSEONG PHIEUPH, RIGHT PARENTHESIS # + +321A ; 0028 D30C 0029 ; MA #* ( ㈚ → (파) ) PARENTHESIZED HANGUL PHIEUPH A → LEFT PARENTHESIS, HANGUL SYLLABLE PA, RIGHT PARENTHESIS # + +320D ; 0028 1112 0029 ; MA #* ( ㈍ → (ᄒ) ) PARENTHESIZED HANGUL HIEUH → LEFT PARENTHESIS, HANGUL CHOSEONG HIEUH, RIGHT PARENTHESIS # + +321B ; 0028 D558 0029 ; MA #* ( ㈛ → (하) ) PARENTHESIZED HANGUL HIEUH A → LEFT PARENTHESIS, HANGUL SYLLABLE HA, RIGHT PARENTHESIS # + +3226 ; 0028 4E03 0029 ; MA #* ( ㈦ → (七) ) PARENTHESIZED IDEOGRAPH SEVEN → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E03, RIGHT PARENTHESIS # + +3222 ; 0028 4E09 0029 ; MA #* ( ㈢ → (三) ) PARENTHESIZED IDEOGRAPH THREE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E09, RIGHT PARENTHESIS # +1F241 ; 0028 4E09 0029 ; MA #* ( 🉁 → (三) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E09, RIGHT PARENTHESIS # →〔三〕→ + +3228 ; 0028 4E5D 0029 ; MA #* ( ㈨ → (九) ) PARENTHESIZED IDEOGRAPH NINE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E5D, RIGHT PARENTHESIS # + +3221 ; 0028 4E8C 0029 ; MA #* ( ㈡ → (二) ) PARENTHESIZED IDEOGRAPH TWO → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E8C, RIGHT PARENTHESIS # +1F242 ; 0028 4E8C 0029 ; MA #* ( 🉂 → (二) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E8C, RIGHT PARENTHESIS # →〔二〕→ + +3224 ; 0028 4E94 0029 ; MA #* ( ㈤ → (五) ) PARENTHESIZED IDEOGRAPH FIVE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E94, RIGHT PARENTHESIS # + +3239 ; 0028 4EE3 0029 ; MA #* ( ㈹ → (代) ) PARENTHESIZED IDEOGRAPH REPRESENT → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4EE3, RIGHT PARENTHESIS # + +323D ; 0028 4F01 0029 ; MA #* ( ㈽ → (企) ) PARENTHESIZED IDEOGRAPH ENTERPRISE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4F01, RIGHT PARENTHESIS # + +3241 ; 0028 4F11 0029 ; MA #* ( ㉁ → (休) ) PARENTHESIZED IDEOGRAPH REST → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4F11, RIGHT PARENTHESIS # + +3227 ; 0028 516B 0029 ; MA #* ( ㈧ → (八) ) PARENTHESIZED IDEOGRAPH EIGHT → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-516B, RIGHT PARENTHESIS # + +3225 ; 0028 516D 0029 ; MA #* ( ㈥ → (六) ) PARENTHESIZED IDEOGRAPH SIX → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-516D, RIGHT PARENTHESIS # + +3238 ; 0028 52B4 0029 ; MA #* ( ㈸ → (労) ) PARENTHESIZED IDEOGRAPH LABOR → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-52B4, RIGHT PARENTHESIS # + +1F247 ; 0028 52DD 0029 ; MA #* ( 🉇 → (勝) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-52DD, RIGHT PARENTHESIS # →〔勝〕→ + +3229 ; 0028 5341 0029 ; MA #* ( ㈩ → (十) ) PARENTHESIZED IDEOGRAPH TEN → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5341, RIGHT PARENTHESIS # + +323F ; 0028 5354 0029 ; MA #* ( ㈿ → (協) ) PARENTHESIZED IDEOGRAPH ALLIANCE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5354, RIGHT PARENTHESIS # + +3234 ; 0028 540D 0029 ; MA #* ( ㈴ → (名) ) PARENTHESIZED IDEOGRAPH NAME → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-540D, RIGHT PARENTHESIS # + +323A ; 0028 547C 0029 ; MA #* ( ㈺ → (呼) ) PARENTHESIZED IDEOGRAPH CALL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-547C, RIGHT PARENTHESIS # + +3223 ; 0028 56DB 0029 ; MA #* ( ㈣ → (四) ) PARENTHESIZED IDEOGRAPH FOUR → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-56DB, RIGHT PARENTHESIS # + +322F ; 0028 571F 0029 ; MA #* ( ㈯ → (土) ) PARENTHESIZED IDEOGRAPH EARTH → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-571F, RIGHT PARENTHESIS # + +323B ; 0028 5B66 0029 ; MA #* ( ㈻ → (学) ) PARENTHESIZED IDEOGRAPH STUDY → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5B66, RIGHT PARENTHESIS # + +1F243 ; 0028 5B89 0029 ; MA #* ( 🉃 → (安) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5B89, RIGHT PARENTHESIS # →〔安〕→ + +1F245 ; 0028 6253 0029 ; MA #* ( 🉅 → (打) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6253, RIGHT PARENTHESIS # →〔打〕→ + +1F248 ; 0028 6557 0029 ; MA #* ( 🉈 → (敗) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6557, RIGHT PARENTHESIS # →〔敗〕→ + +3230 ; 0028 65E5 0029 ; MA #* ( ㈰ → (日) ) PARENTHESIZED IDEOGRAPH SUN → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-65E5, RIGHT PARENTHESIS # + +322A ; 0028 6708 0029 ; MA #* ( ㈪ → (月) ) PARENTHESIZED IDEOGRAPH MOON → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6708, RIGHT PARENTHESIS # + +3232 ; 0028 6709 0029 ; MA #* ( ㈲ → (有) ) PARENTHESIZED IDEOGRAPH HAVE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6709, RIGHT PARENTHESIS # + +322D ; 0028 6728 0029 ; MA #* ( ㈭ → (木) ) PARENTHESIZED IDEOGRAPH WOOD → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6728, RIGHT PARENTHESIS # + +1F240 ; 0028 672C 0029 ; MA #* ( 🉀 → (本) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-672C, RIGHT PARENTHESIS # →〔本〕→ + +3231 ; 0028 682A 0029 ; MA #* ( ㈱ → (株) ) PARENTHESIZED IDEOGRAPH STOCK → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-682A, RIGHT PARENTHESIS # + +322C ; 0028 6C34 0029 ; MA #* ( ㈬ → (水) ) PARENTHESIZED IDEOGRAPH WATER → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6C34, RIGHT PARENTHESIS # + +322B ; 0028 706B 0029 ; MA #* ( ㈫ → (火) ) PARENTHESIZED IDEOGRAPH FIRE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-706B, RIGHT PARENTHESIS # + +1F244 ; 0028 70B9 0029 ; MA #* ( 🉄 → (点) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-70B9, RIGHT PARENTHESIS # →〔点〕→ + +3235 ; 0028 7279 0029 ; MA #* ( ㈵ → (特) ) PARENTHESIZED IDEOGRAPH SPECIAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-7279, RIGHT PARENTHESIS # + +1F246 ; 0028 76D7 0029 ; MA #* ( 🉆 → (盗) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-76D7, RIGHT PARENTHESIS # →〔盗〕→ + +323C ; 0028 76E3 0029 ; MA #* ( ㈼ → (監) ) PARENTHESIZED IDEOGRAPH SUPERVISE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-76E3, RIGHT PARENTHESIS # + +3233 ; 0028 793E 0029 ; MA #* ( ㈳ → (社) ) PARENTHESIZED IDEOGRAPH SOCIETY → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-793E, RIGHT PARENTHESIS # + +3237 ; 0028 795D 0029 ; MA #* ( ㈷ → (祝) ) PARENTHESIZED IDEOGRAPH CONGRATULATION → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-795D, RIGHT PARENTHESIS # + +3240 ; 0028 796D 0029 ; MA #* ( ㉀ → (祭) ) PARENTHESIZED IDEOGRAPH FESTIVAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-796D, RIGHT PARENTHESIS # + +3242 ; 0028 81EA 0029 ; MA #* ( ㉂ → (自) ) PARENTHESIZED IDEOGRAPH SELF → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-81EA, RIGHT PARENTHESIS # + +3243 ; 0028 81F3 0029 ; MA #* ( ㉃ → (至) ) PARENTHESIZED IDEOGRAPH REACH → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-81F3, RIGHT PARENTHESIS # + +3236 ; 0028 8CA1 0029 ; MA #* ( ㈶ → (財) ) PARENTHESIZED IDEOGRAPH FINANCIAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-8CA1, RIGHT PARENTHESIS # + +323E ; 0028 8CC7 0029 ; MA #* ( ㈾ → (資) ) PARENTHESIZED IDEOGRAPH RESOURCE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-8CC7, RIGHT PARENTHESIS # + +322E ; 0028 91D1 0029 ; MA #* ( ㈮ → (金) ) PARENTHESIZED IDEOGRAPH METAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-91D1, RIGHT PARENTHESIS # + +FF3D ; 0029 ; MA #* ( ] → ) ) FULLWIDTH RIGHT SQUARE BRACKET → RIGHT PARENTHESIS # →〕→ +2769 ; 0029 ; MA #* ( ❩ → ) ) MEDIUM RIGHT PARENTHESIS ORNAMENT → RIGHT PARENTHESIS # +2773 ; 0029 ; MA #* ( ❳ → ) ) LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT → RIGHT PARENTHESIS # →〕→ +3015 ; 0029 ; MA #* ( 〕 → ) ) RIGHT TORTOISE SHELL BRACKET → RIGHT PARENTHESIS # +FD3F ; 0029 ; MA #* ( ﴿ → ) ) ORNATE RIGHT PARENTHESIS → RIGHT PARENTHESIS # + +2E29 ; 0029 0029 ; MA #* ( ⸩ → )) ) RIGHT DOUBLE PARENTHESIS → RIGHT PARENTHESIS, RIGHT PARENTHESIS # + +2774 ; 007B ; MA #* ( ❴ → { ) MEDIUM LEFT CURLY BRACKET ORNAMENT → LEFT CURLY BRACKET # +1D114 ; 007B ; MA #* ( 𝄔 → { ) MUSICAL SYMBOL BRACE → LEFT CURLY BRACKET # + +2775 ; 007D ; MA #* ( ❵ → } ) MEDIUM RIGHT CURLY BRACKET ORNAMENT → RIGHT CURLY BRACKET # + +301A ; 27E6 ; MA #* ( 〚 → ⟦ ) LEFT WHITE SQUARE BRACKET → MATHEMATICAL LEFT WHITE SQUARE BRACKET # + +301B ; 27E7 ; MA #* ( 〛 → ⟧ ) RIGHT WHITE SQUARE BRACKET → MATHEMATICAL RIGHT WHITE SQUARE BRACKET # + +27E8 ; 276C ; MA #* ( ⟨ → ❬ ) MATHEMATICAL LEFT ANGLE BRACKET → MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT # →〈→ +2329 ; 276C ; MA #* ( 〈 → ❬ ) LEFT-POINTING ANGLE BRACKET → MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT # →〈→ +3008 ; 276C ; MA #* ( 〈 → ❬ ) LEFT ANGLE BRACKET → MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT # + +27E9 ; 276D ; MA #* ( ⟩ → ❭ ) MATHEMATICAL RIGHT ANGLE BRACKET → MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT # →〉→ +232A ; 276D ; MA #* ( 〉 → ❭ ) RIGHT-POINTING ANGLE BRACKET → MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT # →〉→ +3009 ; 276D ; MA #* ( 〉 → ❭ ) RIGHT ANGLE BRACKET → MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT # + +FF3E ; FE3F ; MA #* ( ^ → ︿ ) FULLWIDTH CIRCUMFLEX ACCENT → PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET # + +2E3F ; 00B6 ; MA #* ( ⸿ → ¶ ) CAPITULUM → PILCROW SIGN # + +204E ; 002A ; MA #* ( ⁎ → * ) LOW ASTERISK → ASTERISK # +066D ; 002A ; MA #* ( ‎٭‎ → * ) ARABIC FIVE POINTED STAR → ASTERISK # +2217 ; 002A ; MA #* ( ∗ → * ) ASTERISK OPERATOR → ASTERISK # +1031F ; 002A ; MA # ( 𐌟 → * ) OLD ITALIC LETTER ESS → ASTERISK # + +1735 ; 002F ; MA #* ( ᜵ → / ) PHILIPPINE SINGLE PUNCTUATION → SOLIDUS # +2041 ; 002F ; MA #* ( ⁁ → / ) CARET INSERTION POINT → SOLIDUS # +2215 ; 002F ; MA #* ( ∕ → / ) DIVISION SLASH → SOLIDUS # +2044 ; 002F ; MA #* ( ⁄ → / ) FRACTION SLASH → SOLIDUS # +2571 ; 002F ; MA #* ( ╱ → / ) BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT → SOLIDUS # +27CB ; 002F ; MA #* ( ⟋ → / ) MATHEMATICAL RISING DIAGONAL → SOLIDUS # +29F8 ; 002F ; MA #* ( ⧸ → / ) BIG SOLIDUS → SOLIDUS # +31D3 ; 002F ; MA #* ( ㇓ → / ) CJK STROKE SP → SOLIDUS # →⼃→ +3033 ; 002F ; MA # ( 〳 → / ) VERTICAL KANA REPEAT MARK UPPER HALF → SOLIDUS # +2CC6 ; 002F ; MA # ( Ⳇ → / ) COPTIC CAPITAL LETTER OLD COPTIC ESH → SOLIDUS # +4E3F ; 002F ; MA # ( 丿 → / ) CJK UNIFIED IDEOGRAPH-4E3F → SOLIDUS # →⼃→ +2F03 ; 002F ; MA #* ( ⼃ → / ) KANGXI RADICAL SLASH → SOLIDUS # + +29F6 ; 002F 0304 ; MA #* ( ⧶ → /̄ ) SOLIDUS WITH OVERBAR → SOLIDUS, COMBINING MACRON # + +2AFD ; 002F 002F ; MA #* ( ⫽ → // ) DOUBLE SOLIDUS OPERATOR → SOLIDUS, SOLIDUS # + +2AFB ; 002F 002F 002F ; MA #* ( ⫻ → /// ) TRIPLE SOLIDUS BINARY RELATION → SOLIDUS, SOLIDUS, SOLIDUS # + +FF3C ; 005C ; MA #* ( \ → \ ) FULLWIDTH REVERSE SOLIDUS → REVERSE SOLIDUS # →∖→ +FE68 ; 005C ; MA #* ( ﹨ → \ ) SMALL REVERSE SOLIDUS → REVERSE SOLIDUS # →∖→ +2216 ; 005C ; MA #* ( ∖ → \ ) SET MINUS → REVERSE SOLIDUS # +27CD ; 005C ; MA #* ( ⟍ → \ ) MATHEMATICAL FALLING DIAGONAL → REVERSE SOLIDUS # +29F5 ; 005C ; MA #* ( ⧵ → \ ) REVERSE SOLIDUS OPERATOR → REVERSE SOLIDUS # +29F9 ; 005C ; MA #* ( ⧹ → \ ) BIG REVERSE SOLIDUS → REVERSE SOLIDUS # +31D4 ; 005C ; MA #* ( ㇔ → \ ) CJK STROKE D → REVERSE SOLIDUS # →⼂→ +4E36 ; 005C ; MA # ( 丶 → \ ) CJK UNIFIED IDEOGRAPH-4E36 → REVERSE SOLIDUS # →⼂→ +2F02 ; 005C ; MA #* ( ⼂ → \ ) KANGXI RADICAL DOT → REVERSE SOLIDUS # + +2CF9 ; 005C 005C ; MA #* ( ⳹ → \\ ) COPTIC OLD NUBIAN FULL STOP → REVERSE SOLIDUS, REVERSE SOLIDUS # +244A ; 005C 005C ; MA #* ( ⑊ → \\ ) OCR DOUBLE BACKSLASH → REVERSE SOLIDUS, REVERSE SOLIDUS # + +27C8 ; 005C 1455 ; MA #* ( ⟈ → \ᑕ ) REVERSE SOLIDUS PRECEDING SUBSET → REVERSE SOLIDUS, CANADIAN SYLLABICS TA # →\⊂→ + +A778 ; 0026 ; MA # ( ꝸ → & ) LATIN SMALL LETTER UM → AMPERSAND # + +0AF0 ; 0970 ; MA #* ( ૰ → ॰ ) GUJARATI ABBREVIATION SIGN → DEVANAGARI ABBREVIATION SIGN # +110BB ; 0970 ; MA #* ( 𑂻 → ॰ ) KAITHI ABBREVIATION SIGN → DEVANAGARI ABBREVIATION SIGN # +111C7 ; 0970 ; MA #* ( 𑇇 → ॰ ) SHARADA ABBREVIATION SIGN → DEVANAGARI ABBREVIATION SIGN # +26AC ; 0970 ; MA #* ( ⚬ → ॰ ) MEDIUM SMALL WHITE CIRCLE → DEVANAGARI ABBREVIATION SIGN # + +17D9 ; 0E4F ; MA #* ( ៙ → ๏ ) KHMER SIGN PHNAEK MUAN → THAI CHARACTER FONGMAN # + +17D5 ; 0E5A ; MA #* ( ៕ → ๚ ) KHMER SIGN BARIYOOSAN → THAI CHARACTER ANGKHANKHU # + +17DA ; 0E5B ; MA #* ( ៚ → ๛ ) KHMER SIGN KOOMUUT → THAI CHARACTER KHOMUT # + +0F0C ; 0F0B ; MA #* ( ༌ → ་ ) TIBETAN MARK DELIMITER TSHEG BSTAR → TIBETAN MARK INTERSYLLABIC TSHEG # + +0F0E ; 0F0D 0F0D ; MA #* ( ༎ → །། ) TIBETAN MARK NYIS SHAD → TIBETAN MARK SHAD, TIBETAN MARK SHAD # + +02C4 ; 005E ; MA #* ( ˄ → ^ ) MODIFIER LETTER UP ARROWHEAD → CIRCUMFLEX ACCENT # +02C6 ; 005E ; MA # ( ˆ → ^ ) MODIFIER LETTER CIRCUMFLEX ACCENT → CIRCUMFLEX ACCENT # + +A67E ; 02C7 ; MA #* ( ꙾ → ˇ ) CYRILLIC KAVYKA → CARON # →˘→ +02D8 ; 02C7 ; MA #* ( ˘ → ˇ ) BREVE → CARON # + +203E ; 02C9 ; MA #* ( ‾ → ˉ ) OVERLINE → MODIFIER LETTER MACRON # +FE49 ; 02C9 ; MA #* ( ﹉ → ˉ ) DASHED OVERLINE → MODIFIER LETTER MACRON # →‾→ +FE4A ; 02C9 ; MA #* ( ﹊ → ˉ ) CENTRELINE OVERLINE → MODIFIER LETTER MACRON # →‾→ +FE4B ; 02C9 ; MA #* ( ﹋ → ˉ ) WAVY OVERLINE → MODIFIER LETTER MACRON # →‾→ +FE4C ; 02C9 ; MA #* ( ﹌ → ˉ ) DOUBLE WAVY OVERLINE → MODIFIER LETTER MACRON # →‾→ +00AF ; 02C9 ; MA #* ( ¯ → ˉ ) MACRON → MODIFIER LETTER MACRON # +FFE3 ; 02C9 ; MA #* (  ̄ → ˉ ) FULLWIDTH MACRON → MODIFIER LETTER MACRON # →‾→ +2594 ; 02C9 ; MA #* ( ▔ → ˉ ) UPPER ONE EIGHTH BLOCK → MODIFIER LETTER MACRON # →¯→ + +044A ; 02C9 0062 ; MA # ( ъ → ˉb ) CYRILLIC SMALL LETTER HARD SIGN → MODIFIER LETTER MACRON, LATIN SMALL LETTER B # →¯b→ + +0375 ; 02CF ; MA #* ( ͵ → ˏ ) GREEK LOWER NUMERAL SIGN → MODIFIER LETTER LOW ACUTE ACCENT # + +02FB ; 02EA ; MA #* ( ˻ → ˪ ) MODIFIER LETTER BEGIN LOW TONE → MODIFIER LETTER YIN DEPARTING TONE MARK # +A716 ; 02EA ; MA #* ( ꜖ → ˪ ) MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR → MODIFIER LETTER YIN DEPARTING TONE MARK # + +A714 ; 02EB ; MA #* ( ꜔ → ˫ ) MODIFIER LETTER MID LEFT-STEM TONE BAR → MODIFIER LETTER YANG DEPARTING TONE MARK # + +3002 ; 02F3 ; MA #* ( 。 → ˳ ) IDEOGRAPHIC FULL STOP → MODIFIER LETTER LOW RING # + +2E30 ; 00B0 ; MA #* ( ⸰ → ° ) RING POINT → DEGREE SIGN # →∘→ +02DA ; 00B0 ; MA #* ( ˚ → ° ) RING ABOVE → DEGREE SIGN # +2218 ; 00B0 ; MA #* ( ∘ → ° ) RING OPERATOR → DEGREE SIGN # +25CB ; 00B0 ; MA #* ( ○ → ° ) WHITE CIRCLE → DEGREE SIGN # →◦→→∘→ +25E6 ; 00B0 ; MA #* ( ◦ → ° ) WHITE BULLET → DEGREE SIGN # →∘→ + +235C ; 00B0 0332 ; MA #* ( ⍜ → °̲ ) APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR → DEGREE SIGN, COMBINING LOW LINE # →○̲→→∘̲→ + +2364 ; 00B0 0308 ; MA #* ( ⍤ → °̈ ) APL FUNCTIONAL SYMBOL JOT DIAERESIS → DEGREE SIGN, COMBINING DIAERESIS # →◦̈→→∘̈→ + +2103 ; 00B0 0043 ; MA #* ( ℃ → °C ) DEGREE CELSIUS → DEGREE SIGN, LATIN CAPITAL LETTER C # + +2109 ; 00B0 0046 ; MA #* ( ℉ → °F ) DEGREE FAHRENHEIT → DEGREE SIGN, LATIN CAPITAL LETTER F # + +0BF5 ; 0BF3 ; MA #* ( ௵ → ௳ ) TAMIL YEAR SIGN → TAMIL DAY SIGN # + +0F1B ; 0F1A 0F1A ; MA #* ( ༛ → ༚༚ ) TIBETAN SIGN RDEL DKAR GNYIS → TIBETAN SIGN RDEL DKAR GCIG, TIBETAN SIGN RDEL DKAR GCIG # + +0F1F ; 0F1A 0F1D ; MA #* ( ༟ → ༚༝ ) TIBETAN SIGN RDEL DKAR RDEL NAG → TIBETAN SIGN RDEL DKAR GCIG, TIBETAN SIGN RDEL NAG GCIG # + +0FCE ; 0F1D 0F1A ; MA #* ( ࿎ → ༝༚ ) TIBETAN SIGN RDEL NAG RDEL DKAR → TIBETAN SIGN RDEL NAG GCIG, TIBETAN SIGN RDEL DKAR GCIG # + +0F1E ; 0F1D 0F1D ; MA #* ( ༞ → ༝༝ ) TIBETAN SIGN RDEL NAG GNYIS → TIBETAN SIGN RDEL NAG GCIG, TIBETAN SIGN RDEL NAG GCIG # + +24B8 ; 00A9 ; MA #* ( Ⓒ → © ) CIRCLED LATIN CAPITAL LETTER C → COPYRIGHT SIGN # + +24C7 ; 00AE ; MA #* ( Ⓡ → ® ) CIRCLED LATIN CAPITAL LETTER R → REGISTERED SIGN # + +24C5 ; 2117 ; MA #* ( Ⓟ → ℗ ) CIRCLED LATIN CAPITAL LETTER P → SOUND RECORDING COPYRIGHT # + +2BEC ; 219E ; MA #* ( ⯬ → ↞ ) LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS → LEFTWARDS TWO HEADED ARROW # + +2BED ; 219F ; MA #* ( ⯭ → ↟ ) UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS → UPWARDS TWO HEADED ARROW # + +2BEE ; 21A0 ; MA #* ( ⯮ → ↠ ) RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS → RIGHTWARDS TWO HEADED ARROW # + +2BEF ; 21A1 ; MA #* ( ⯯ → ↡ ) DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS → DOWNWARDS TWO HEADED ARROW # + +21B5 ; 21B2 ; MA #* ( ↵ → ↲ ) DOWNWARDS ARROW WITH CORNER LEFTWARDS → DOWNWARDS ARROW WITH TIP LEFTWARDS # + +2965 ; 21C3 21C2 ; MA #* ( ⥥ → ⇃⇂ ) DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT → DOWNWARDS HARPOON WITH BARB LEFTWARDS, DOWNWARDS HARPOON WITH BARB RIGHTWARDS # + +296F ; 21C3 16DA ; MA #* ( ⥯ → ⇃ᛚ ) DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT → DOWNWARDS HARPOON WITH BARB LEFTWARDS, RUNIC LETTER LAUKAZ LAGU LOGR L # →⇃↾→ + +1D6DB ; 2202 ; MA #* ( 𝛛 → ∂ ) MATHEMATICAL BOLD PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL # +1D715 ; 2202 ; MA #* ( 𝜕 → ∂ ) MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL # +1D74F ; 2202 ; MA #* ( 𝝏 → ∂ ) MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL # +1D789 ; 2202 ; MA #* ( 𝞉 → ∂ ) MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL # +1D7C3 ; 2202 ; MA #* ( 𝟃 → ∂ ) MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL # +1E8CC ; 2202 ; MA #* ( ‎𞣌‎ → ∂ ) MENDE KIKAKUI DIGIT SIX → PARTIAL DIFFERENTIAL # + +1E8CD ; 2202 0335 ; MA #* ( ‎𞣍‎ → ∂̵ ) MENDE KIKAKUI DIGIT SEVEN → PARTIAL DIFFERENTIAL, COMBINING SHORT STROKE OVERLAY # →ð→ +00F0 ; 2202 0335 ; MA # ( ð → ∂̵ ) LATIN SMALL LETTER ETH → PARTIAL DIFFERENTIAL, COMBINING SHORT STROKE OVERLAY # + +2300 ; 2205 ; MA #* ( ⌀ → ∅ ) DIAMETER SIGN → EMPTY SET # + +1D6C1 ; 2207 ; MA #* ( 𝛁 → ∇ ) MATHEMATICAL BOLD NABLA → NABLA # +1D6FB ; 2207 ; MA #* ( 𝛻 → ∇ ) MATHEMATICAL ITALIC NABLA → NABLA # +1D735 ; 2207 ; MA #* ( 𝜵 → ∇ ) MATHEMATICAL BOLD ITALIC NABLA → NABLA # +1D76F ; 2207 ; MA #* ( 𝝯 → ∇ ) MATHEMATICAL SANS-SERIF BOLD NABLA → NABLA # +1D7A9 ; 2207 ; MA #* ( 𝞩 → ∇ ) MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA → NABLA # +118A8 ; 2207 ; MA # ( 𑢨 → ∇ ) WARANG CITI CAPITAL LETTER E → NABLA # + +2362 ; 2207 0308 ; MA #* ( ⍢ → ∇̈ ) APL FUNCTIONAL SYMBOL DEL DIAERESIS → NABLA, COMBINING DIAERESIS # + +236B ; 2207 0334 ; MA #* ( ⍫ → ∇̴ ) APL FUNCTIONAL SYMBOL DEL TILDE → NABLA, COMBINING TILDE OVERLAY # + +2588 ; 220E ; MA #* ( █ → ∎ ) FULL BLOCK → END OF PROOF # →■→ +25A0 ; 220E ; MA #* ( ■ → ∎ ) BLACK SQUARE → END OF PROOF # + +2A3F ; 2210 ; MA #* ( ⨿ → ∐ ) AMALGAMATION OR COPRODUCT → N-ARY COPRODUCT # + +16ED ; 002B ; MA #* ( ᛭ → + ) RUNIC CROSS PUNCTUATION → PLUS SIGN # +2795 ; 002B ; MA #* ( ➕ → + ) HEAVY PLUS SIGN → PLUS SIGN # +1029B ; 002B ; MA # ( 𐊛 → + ) LYCIAN LETTER H → PLUS SIGN # + +2A23 ; 002B 0302 ; MA #* ( ⨣ → +̂ ) PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE → PLUS SIGN, COMBINING CIRCUMFLEX ACCENT # + +2A22 ; 002B 030A ; MA #* ( ⨢ → +̊ ) PLUS SIGN WITH SMALL CIRCLE ABOVE → PLUS SIGN, COMBINING RING ABOVE # + +2A24 ; 002B 0303 ; MA #* ( ⨤ → +̃ ) PLUS SIGN WITH TILDE ABOVE → PLUS SIGN, COMBINING TILDE # + +2214 ; 002B 0307 ; MA #* ( ∔ → +̇ ) DOT PLUS → PLUS SIGN, COMBINING DOT ABOVE # + +2A25 ; 002B 0323 ; MA #* ( ⨥ → +̣ ) PLUS SIGN WITH DOT BELOW → PLUS SIGN, COMBINING DOT BELOW # + +2A26 ; 002B 0330 ; MA #* ( ⨦ → +̰ ) PLUS SIGN WITH TILDE BELOW → PLUS SIGN, COMBINING TILDE BELOW # + +2A27 ; 002B 2082 ; MA #* ( ⨧ → +₂ ) PLUS SIGN WITH SUBSCRIPT TWO → PLUS SIGN, SUBSCRIPT TWO # + +2797 ; 00F7 ; MA #* ( ➗ → ÷ ) HEAVY DIVISION SIGN → DIVISION SIGN # + +2039 ; 003C ; MA #* ( ‹ → < ) SINGLE LEFT-POINTING ANGLE QUOTATION MARK → LESS-THAN SIGN # +276E ; 003C ; MA #* ( ❮ → < ) HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT → LESS-THAN SIGN # →‹→ +02C2 ; 003C ; MA #* ( ˂ → < ) MODIFIER LETTER LEFT ARROWHEAD → LESS-THAN SIGN # +1438 ; 003C ; MA # ( ᐸ → < ) CANADIAN SYLLABICS PA → LESS-THAN SIGN # +16B2 ; 003C ; MA # ( ᚲ → < ) RUNIC LETTER KAUNA → LESS-THAN SIGN # + +22D6 ; 003C 00B7 ; MA #* ( ⋖ → <· ) LESS-THAN WITH DOT → LESS-THAN SIGN, MIDDLE DOT # →ᑅ→→ᐸᐧ→ +2CB4 ; 003C 00B7 ; MA # ( Ⲵ → <· ) COPTIC CAPITAL LETTER OLD COPTIC AIN → LESS-THAN SIGN, MIDDLE DOT # →ᑅ→→ᐸᐧ→ +1445 ; 003C 00B7 ; MA # ( ᑅ → <· ) CANADIAN SYLLABICS WEST-CREE PWA → LESS-THAN SIGN, MIDDLE DOT # →ᐸᐧ→ + +226A ; 003C 003C ; MA #* ( ≪ → << ) MUCH LESS-THAN → LESS-THAN SIGN, LESS-THAN SIGN # + +22D8 ; 003C 003C 003C ; MA #* ( ⋘ → <<< ) VERY MUCH LESS-THAN → LESS-THAN SIGN, LESS-THAN SIGN, LESS-THAN SIGN # + +1400 ; 003D ; MA #* ( ᐀ → = ) CANADIAN SYLLABICS HYPHEN → EQUALS SIGN # +2E40 ; 003D ; MA #* ( ⹀ → = ) DOUBLE HYPHEN → EQUALS SIGN # +30A0 ; 003D ; MA #* ( ゠ → = ) KATAKANA-HIRAGANA DOUBLE HYPHEN → EQUALS SIGN # +A4FF ; 003D ; MA #* ( ꓿ → = ) LISU PUNCTUATION FULL STOP → EQUALS SIGN # + +225A ; 003D 0306 ; MA #* ( ≚ → =̆ ) EQUIANGULAR TO → EQUALS SIGN, COMBINING BREVE # →=̌→ + +2259 ; 003D 0302 ; MA #* ( ≙ → =̂ ) ESTIMATES → EQUALS SIGN, COMBINING CIRCUMFLEX ACCENT # + +2257 ; 003D 030A ; MA #* ( ≗ → =̊ ) RING EQUAL TO → EQUALS SIGN, COMBINING RING ABOVE # + +2250 ; 003D 0307 ; MA #* ( ≐ → =̇ ) APPROACHES THE LIMIT → EQUALS SIGN, COMBINING DOT ABOVE # + +2251 ; 003D 0307 0323 ; MA #* ( ≑ → =̣̇ ) GEOMETRICALLY EQUAL TO → EQUALS SIGN, COMBINING DOT ABOVE, COMBINING DOT BELOW # →≐̣→ + +2A6E ; 003D 20F0 ; MA #* ( ⩮ → =⃰ ) EQUALS WITH ASTERISK → EQUALS SIGN, COMBINING ASTERISK ABOVE # + +2A75 ; 003D 003D ; MA #* ( ⩵ → == ) TWO CONSECUTIVE EQUALS SIGNS → EQUALS SIGN, EQUALS SIGN # + +2A76 ; 003D 003D 003D ; MA #* ( ⩶ → === ) THREE CONSECUTIVE EQUALS SIGNS → EQUALS SIGN, EQUALS SIGN, EQUALS SIGN # + +225E ; 003D 036B ; MA #* ( ≞ → =ͫ ) MEASURED BY → EQUALS SIGN, COMBINING LATIN SMALL LETTER M # + +203A ; 003E ; MA #* ( › → > ) SINGLE RIGHT-POINTING ANGLE QUOTATION MARK → GREATER-THAN SIGN # +276F ; 003E ; MA #* ( ❯ → > ) HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT → GREATER-THAN SIGN # →›→ +02C3 ; 003E ; MA #* ( ˃ → > ) MODIFIER LETTER RIGHT ARROWHEAD → GREATER-THAN SIGN # +1433 ; 003E ; MA # ( ᐳ → > ) CANADIAN SYLLABICS PO → GREATER-THAN SIGN # + +1441 ; 003E 00B7 ; MA # ( ᑁ → >· ) CANADIAN SYLLABICS WEST-CREE PWO → GREATER-THAN SIGN, MIDDLE DOT # →ᐳᐧ→ + +2AA5 ; 003E 003C ; MA #* ( ⪥ → >< ) GREATER-THAN BESIDE LESS-THAN → GREATER-THAN SIGN, LESS-THAN SIGN # + +226B ; 003E 003E ; MA #* ( ≫ → >> ) MUCH GREATER-THAN → GREATER-THAN SIGN, GREATER-THAN SIGN # +2A20 ; 003E 003E ; MA #* ( ⨠ → >> ) Z NOTATION SCHEMA PIPING → GREATER-THAN SIGN, GREATER-THAN SIGN # →≫→ + +22D9 ; 003E 003E 003E ; MA #* ( ⋙ → >>> ) VERY MUCH GREATER-THAN → GREATER-THAN SIGN, GREATER-THAN SIGN, GREATER-THAN SIGN # + +2053 ; 007E ; MA #* ( ⁓ → ~ ) SWUNG DASH → TILDE # +02DC ; 007E ; MA #* ( ˜ → ~ ) SMALL TILDE → TILDE # +1FC0 ; 007E ; MA #* ( ῀ → ~ ) GREEK PERISPOMENI → TILDE # →˜→ +223C ; 007E ; MA #* ( ∼ → ~ ) TILDE OPERATOR → TILDE # + +2368 ; 007E 0308 ; MA #* ( ⍨ → ~̈ ) APL FUNCTIONAL SYMBOL TILDE DIAERESIS → TILDE, COMBINING DIAERESIS # + +2E1E ; 007E 0307 ; MA #* ( ⸞ → ~̇ ) TILDE WITH DOT ABOVE → TILDE, COMBINING DOT ABOVE # →⩪→→∼̇→→⁓̇→ +2A6A ; 007E 0307 ; MA #* ( ⩪ → ~̇ ) TILDE OPERATOR WITH DOT ABOVE → TILDE, COMBINING DOT ABOVE # →∼̇→→⁓̇→ + +2E1F ; 007E 0323 ; MA #* ( ⸟ → ~̣ ) TILDE WITH DOT BELOW → TILDE, COMBINING DOT BELOW # + +1E8C8 ; 2220 ; MA #* ( ‎𞣈‎ → ∠ ) MENDE KIKAKUI DIGIT TWO → ANGLE # + +22C0 ; 2227 ; MA #* ( ⋀ → ∧ ) N-ARY LOGICAL AND → LOGICAL AND # + +222F ; 222E 222E ; MA #* ( ∯ → ∮∮ ) SURFACE INTEGRAL → CONTOUR INTEGRAL, CONTOUR INTEGRAL # + +2230 ; 222E 222E 222E ; MA #* ( ∰ → ∮∮∮ ) VOLUME INTEGRAL → CONTOUR INTEGRAL, CONTOUR INTEGRAL, CONTOUR INTEGRAL # + +2E2B ; 2234 ; MA #* ( ⸫ → ∴ ) ONE DOT OVER TWO DOTS PUNCTUATION → THEREFORE # + +2E2A ; 2235 ; MA #* ( ⸪ → ∵ ) TWO DOTS OVER ONE DOT PUNCTUATION → BECAUSE # + +2E2C ; 2237 ; MA #* ( ⸬ → ∷ ) SQUARED FOUR DOT PUNCTUATION → PROPORTION # + +111DE ; 2248 ; MA #* ( 𑇞 → ≈ ) SHARADA SECTION MARK-1 → ALMOST EQUAL TO # + +264E ; 224F ; MA #* ( ♎ → ≏ ) LIBRA → DIFFERENCE BETWEEN # +1F75E ; 224F ; MA #* ( 🝞 → ≏ ) ALCHEMICAL SYMBOL FOR SUBLIMATION → DIFFERENCE BETWEEN # →♎→ + +2263 ; 2261 ; MA #* ( ≣ → ≡ ) STRICTLY EQUIVALENT TO → IDENTICAL TO # + +2A03 ; 228D ; MA #* ( ⨃ → ⊍ ) N-ARY UNION OPERATOR WITH DOT → MULTISET MULTIPLICATION # + +2A04 ; 228E ; MA #* ( ⨄ → ⊎ ) N-ARY UNION OPERATOR WITH PLUS → MULTISET UNION # + +2A05 ; 2293 ; MA #* ( ⨅ → ⊓ ) N-ARY SQUARE INTERSECTION OPERATOR → SQUARE CAP # + +2A06 ; 2294 ; MA #* ( ⨆ → ⊔ ) N-ARY SQUARE UNION OPERATOR → SQUARE CUP # + +2A02 ; 2297 ; MA #* ( ⨂ → ⊗ ) N-ARY CIRCLED TIMES OPERATOR → CIRCLED TIMES # + +235F ; 229B ; MA #* ( ⍟ → ⊛ ) APL FUNCTIONAL SYMBOL CIRCLE STAR → CIRCLED ASTERISK OPERATOR # + +1F771 ; 22A0 ; MA #* ( 🝱 → ⊠ ) ALCHEMICAL SYMBOL FOR MONTH → SQUARED TIMES # + +1F755 ; 22A1 ; MA #* ( 🝕 → ⊡ ) ALCHEMICAL SYMBOL FOR URINE → SQUARED DOT OPERATOR # + +25C1 ; 22B2 ; MA #* ( ◁ → ⊲ ) WHITE LEFT-POINTING TRIANGLE → NORMAL SUBGROUP OF # + +25B7 ; 22B3 ; MA #* ( ▷ → ⊳ ) WHITE RIGHT-POINTING TRIANGLE → CONTAINS AS NORMAL SUBGROUP # + +2363 ; 22C6 0308 ; MA #* ( ⍣ → ⋆̈ ) APL FUNCTIONAL SYMBOL STAR DIAERESIS → STAR OPERATOR, COMBINING DIAERESIS # + +FE34 ; 2307 ; MA # ( ︴ → ⌇ ) PRESENTATION FORM FOR VERTICAL WAVY LOW LINE → WAVY LINE # + +25E0 ; 2312 ; MA #* ( ◠ → ⌒ ) UPPER HALF CIRCLE → ARC # + +2A3D ; 2319 ; MA #* ( ⨽ → ⌙ ) RIGHTHAND INTERIOR PRODUCT → TURNED NOT SIGN # + +2325 ; 2324 ; MA #* ( ⌥ → ⌤ ) OPTION KEY → UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS # + +29C7 ; 233B ; MA #* ( ⧇ → ⌻ ) SQUARED SMALL CIRCLE → APL FUNCTIONAL SYMBOL QUAD JOT # + +25CE ; 233E ; MA #* ( ◎ → ⌾ ) BULLSEYE → APL FUNCTIONAL SYMBOL CIRCLE JOT # →⦾→ +29BE ; 233E ; MA #* ( ⦾ → ⌾ ) CIRCLED WHITE BULLET → APL FUNCTIONAL SYMBOL CIRCLE JOT # + +29C5 ; 2342 ; MA #* ( ⧅ → ⍂ ) SQUARED FALLING DIAGONAL SLASH → APL FUNCTIONAL SYMBOL QUAD BACKSLASH # + +29B0 ; 2349 ; MA #* ( ⦰ → ⍉ ) REVERSED EMPTY SET → APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH # + +23C3 ; 234B ; MA #* ( ⏃ → ⍋ ) DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE → APL FUNCTIONAL SYMBOL DELTA STILE # + +23C2 ; 234E ; MA #* ( ⏂ → ⍎ ) DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE → APL FUNCTIONAL SYMBOL DOWN TACK JOT # + +23C1 ; 2355 ; MA #* ( ⏁ → ⍕ ) DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE → APL FUNCTIONAL SYMBOL UP TACK JOT # + +00D6 ; 2365 ; MA # ( Ö → ⍥ ) LATIN CAPITAL LETTER O WITH DIAERESIS → APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS # +0150 ; 2365 ; MA # ( Ő → ⍥ ) LATIN CAPITAL LETTER O WITH DOUBLE ACUTE → APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS # →Ö→ + +23C6 ; 236D ; MA #* ( ⏆ → ⍭ ) DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE → APL FUNCTIONAL SYMBOL STILE TILDE # + +2638 ; 2388 ; MA #* ( ☸ → ⎈ ) WHEEL OF DHARMA → HELM SYMBOL # + +FE35 ; 23DC ; MA #* ( ︵ → ⏜ ) PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS → TOP PARENTHESIS # + +FE36 ; 23DD ; MA #* ( ︶ → ⏝ ) PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS → BOTTOM PARENTHESIS # + +FE37 ; 23DE ; MA #* ( ︷ → ⏞ ) PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET → TOP CURLY BRACKET # + +FE38 ; 23DF ; MA #* ( ︸ → ⏟ ) PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET → BOTTOM CURLY BRACKET # + +FE39 ; 23E0 ; MA #* ( ︹ → ⏠ ) PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET → TOP TORTOISE SHELL BRACKET # + +FE3A ; 23E1 ; MA #* ( ︺ → ⏡ ) PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET → BOTTOM TORTOISE SHELL BRACKET # + +25B1 ; 23E5 ; MA #* ( ▱ → ⏥ ) WHITE PARALLELOGRAM → FLATNESS # + +FE31 ; 2502 ; MA #* ( ︱ → │ ) PRESENTATION FORM FOR VERTICAL EM DASH → BOX DRAWINGS LIGHT VERTICAL # →|→ +FF5C ; 2502 ; MA #* ( | → │ ) FULLWIDTH VERTICAL LINE → BOX DRAWINGS LIGHT VERTICAL # +2503 ; 2502 ; MA #* ( ┃ → │ ) BOX DRAWINGS HEAVY VERTICAL → BOX DRAWINGS LIGHT VERTICAL # + +250F ; 250C ; MA #* ( ┏ → ┌ ) BOX DRAWINGS HEAVY DOWN AND RIGHT → BOX DRAWINGS LIGHT DOWN AND RIGHT # + +2523 ; 251C ; MA #* ( ┣ → ├ ) BOX DRAWINGS HEAVY VERTICAL AND RIGHT → BOX DRAWINGS LIGHT VERTICAL AND RIGHT # + +2590 ; 258C ; MA #* ( ▐ → ▌ ) RIGHT HALF BLOCK → LEFT HALF BLOCK # + +2597 ; 2596 ; MA #* ( ▗ → ▖ ) QUADRANT LOWER RIGHT → QUADRANT LOWER LEFT # + +259D ; 2598 ; MA #* ( ▝ → ▘ ) QUADRANT UPPER RIGHT → QUADRANT UPPER LEFT # + +2610 ; 25A1 ; MA #* ( ☐ → □ ) BALLOT BOX → WHITE SQUARE # + +FFED ; 25AA ; MA #* ( ■ → ▪ ) HALFWIDTH BLACK SQUARE → BLACK SMALL SQUARE # + +25B8 ; 25B6 ; MA #* ( ▸ → ▶ ) BLACK RIGHT-POINTING SMALL TRIANGLE → BLACK RIGHT-POINTING TRIANGLE # →►→ +25BA ; 25B6 ; MA #* ( ► → ▶ ) BLACK RIGHT-POINTING POINTER → BLACK RIGHT-POINTING TRIANGLE # + +2CE9 ; 2627 ; MA #* ( ⳩ → ☧ ) COPTIC SYMBOL KHI RO → CHI RHO # + +1F70A ; 2629 ; MA #* ( 🜊 → ☩ ) ALCHEMICAL SYMBOL FOR VINEGAR → CROSS OF JERUSALEM # + +1F312 ; 263D ; MA #* ( 🌒 → ☽ ) WAXING CRESCENT MOON SYMBOL → FIRST QUARTER MOON # +1F319 ; 263D ; MA #* ( 🌙 → ☽ ) CRESCENT MOON → FIRST QUARTER MOON # + +1F318 ; 263E ; MA #* ( 🌘 → ☾ ) WANING CRESCENT MOON SYMBOL → LAST QUARTER MOON # + +29D9 ; 299A ; MA #* ( ⧙ → ⦚ ) RIGHT WIGGLY FENCE → VERTICAL ZIGZAG LINE # + +1F73A ; 29DF ; MA #* ( 🜺 → ⧟ ) ALCHEMICAL SYMBOL FOR ARSENIC → DOUBLE-ENDED MULTIMAP # + +2A3E ; 2A1F ; MA #* ( ⨾ → ⨟ ) Z NOTATION RELATIONAL COMPOSITION → Z NOTATION SCHEMA COMPOSITION # + +2669 ; 1D158 1D165 ; MA #* ( ♩ → 𝅘𝅥 ) QUARTER NOTE → MUSICAL SYMBOL NOTEHEAD BLACK, MUSICAL SYMBOL COMBINING STEM # + +266A ; 1D158 1D165 1D16E ; MA #* ( ♪ → 𝅘𝅥𝅮 ) EIGHTH NOTE → MUSICAL SYMBOL NOTEHEAD BLACK, MUSICAL SYMBOL COMBINING STEM, MUSICAL SYMBOL COMBINING FLAG-1 # + +02D9 ; 0971 ; MA #* ( ˙ → ॱ ) DOT ABOVE → DEVANAGARI SIGN HIGH SPACING DOT # +0D4E ; 0971 ; MA # ( ൎ → ॱ ) MALAYALAM LETTER DOT REPH → DEVANAGARI SIGN HIGH SPACING DOT # →˙→ + +FF0D ; 30FC ; MA #* ( - → ー ) FULLWIDTH HYPHEN-MINUS → KATAKANA-HIRAGANA PROLONGED SOUND MARK # +2014 ; 30FC ; MA #* ( — → ー ) EM DASH → KATAKANA-HIRAGANA PROLONGED SOUND MARK # →一→ +2015 ; 30FC ; MA #* ( ― → ー ) HORIZONTAL BAR → KATAKANA-HIRAGANA PROLONGED SOUND MARK # →—→→一→ +2500 ; 30FC ; MA #* ( ─ → ー ) BOX DRAWINGS LIGHT HORIZONTAL → KATAKANA-HIRAGANA PROLONGED SOUND MARK # →━→→—→→一→ +2501 ; 30FC ; MA #* ( ━ → ー ) BOX DRAWINGS HEAVY HORIZONTAL → KATAKANA-HIRAGANA PROLONGED SOUND MARK # →—→→一→ +31D0 ; 30FC ; MA #* ( ㇐ → ー ) CJK STROKE H → KATAKANA-HIRAGANA PROLONGED SOUND MARK # →一→ +A7F7 ; 30FC ; MA # ( ꟷ → ー ) LATIN EPIGRAPHIC LETTER SIDEWAYS I → KATAKANA-HIRAGANA PROLONGED SOUND MARK # →—→→一→ +1173 ; 30FC ; MA # ( ᅳ → ー ) HANGUL JUNGSEONG EU → KATAKANA-HIRAGANA PROLONGED SOUND MARK # →ㅡ→→—→→一→ +3161 ; 30FC ; MA # ( ㅡ → ー ) HANGUL LETTER EU → KATAKANA-HIRAGANA PROLONGED SOUND MARK # →—→→一→ +4E00 ; 30FC ; MA # ( 一 → ー ) CJK UNIFIED IDEOGRAPH-4E00 → KATAKANA-HIRAGANA PROLONGED SOUND MARK # +2F00 ; 30FC ; MA #* ( ⼀ → ー ) KANGXI RADICAL ONE → KATAKANA-HIRAGANA PROLONGED SOUND MARK # →一→ + +1196 ; 30FC 30FC ; MA # ( ᆖ → ーー ) HANGUL JUNGSEONG EU-EU → KATAKANA-HIRAGANA PROLONGED SOUND MARK, KATAKANA-HIRAGANA PROLONGED SOUND MARK # →ᅳᅳ→ + +D7B9 ; 30FC 1161 ; MA # ( ힹ → ーᅡ ) HANGUL JUNGSEONG EU-A → KATAKANA-HIRAGANA PROLONGED SOUND MARK, HANGUL JUNGSEONG A # →ᅳᅡ→ + +D7BA ; 30FC 1165 ; MA # ( ힺ → ーᅥ ) HANGUL JUNGSEONG EU-EO → KATAKANA-HIRAGANA PROLONGED SOUND MARK, HANGUL JUNGSEONG EO # →ᅳᅥ→ + +D7BB ; 30FC 1165 4E28 ; MA # ( ힻ → ーᅥ丨 ) HANGUL JUNGSEONG EU-E → KATAKANA-HIRAGANA PROLONGED SOUND MARK, HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28 # →ᅳᅥᅵ→ + +D7BC ; 30FC 1169 ; MA # ( ힼ → ーᅩ ) HANGUL JUNGSEONG EU-O → KATAKANA-HIRAGANA PROLONGED SOUND MARK, HANGUL JUNGSEONG O # →ᅳᅩ→ + +1195 ; 30FC 116E ; MA # ( ᆕ → ーᅮ ) HANGUL JUNGSEONG EU-U → KATAKANA-HIRAGANA PROLONGED SOUND MARK, HANGUL JUNGSEONG U # →ᅳᅮ→ + +1174 ; 30FC 4E28 ; MA # ( ᅴ → ー丨 ) HANGUL JUNGSEONG YI → KATAKANA-HIRAGANA PROLONGED SOUND MARK, CJK UNIFIED IDEOGRAPH-4E28 # →ᅳᅵ→ +3162 ; 30FC 4E28 ; MA # ( ㅢ → ー丨 ) HANGUL LETTER YI → KATAKANA-HIRAGANA PROLONGED SOUND MARK, CJK UNIFIED IDEOGRAPH-4E28 # →ᅴ→→ᅳᅵ→ + +1197 ; 30FC 4E28 116E ; MA # ( ᆗ → ー丨ᅮ ) HANGUL JUNGSEONG YI-U → KATAKANA-HIRAGANA PROLONGED SOUND MARK, CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG U # →ᅳᅵᅮ→ + +20A4 ; 00A3 ; MA #* ( ₤ → £ ) LIRA SIGN → POUND SIGN # + +3012 ; 20B8 ; MA #* ( 〒 → ₸ ) POSTAL MARK → TENGE SIGN # +3036 ; 20B8 ; MA #* ( 〶 → ₸ ) CIRCLED POSTAL MARK → TENGE SIGN # →〒→ + +1B5C ; 1B50 ; MA #* ( ᭜ → ᭐ ) BALINESE WINDU → BALINESE DIGIT ZERO # + +A9C6 ; A9D0 ; MA #* ( ꧆ → ꧐ ) JAVANESE PADA WINDU → JAVANESE DIGIT ZERO # + +114D1 ; 09E7 ; MA # ( 𑓑 → ১ ) TIRHUTA DIGIT ONE → BENGALI DIGIT ONE # + +0CE7 ; 0C67 ; MA # ( ೧ → ౧ ) KANNADA DIGIT ONE → TELUGU DIGIT ONE # + +1065 ; 1041 ; MA # ( ၥ → ၁ ) MYANMAR LETTER WESTERN PWO KAREN THA → MYANMAR DIGIT ONE # + +2460 ; 2780 ; MA #* ( ① → ➀ ) CIRCLED DIGIT ONE → DINGBAT CIRCLED SANS-SERIF DIGIT ONE # + +2469 ; 2789 ; MA #* ( ⑩ → ➉ ) CIRCLED NUMBER TEN → DINGBAT CIRCLED SANS-SERIF NUMBER TEN # + +23E8 ; 2081 2080 ; MA #* ( ⏨ → ₁₀ ) DECIMAL EXPONENT SYMBOL → SUBSCRIPT ONE, SUBSCRIPT ZERO # + +1D7D0 ; 0032 ; MA # ( 𝟐 → 2 ) MATHEMATICAL BOLD DIGIT TWO → DIGIT TWO # +1D7DA ; 0032 ; MA # ( 𝟚 → 2 ) MATHEMATICAL DOUBLE-STRUCK DIGIT TWO → DIGIT TWO # +1D7E4 ; 0032 ; MA # ( 𝟤 → 2 ) MATHEMATICAL SANS-SERIF DIGIT TWO → DIGIT TWO # +1D7EE ; 0032 ; MA # ( 𝟮 → 2 ) MATHEMATICAL SANS-SERIF BOLD DIGIT TWO → DIGIT TWO # +1D7F8 ; 0032 ; MA # ( 𝟸 → 2 ) MATHEMATICAL MONOSPACE DIGIT TWO → DIGIT TWO # +A75A ; 0032 ; MA # ( Ꝛ → 2 ) LATIN CAPITAL LETTER R ROTUNDA → DIGIT TWO # +01A7 ; 0032 ; MA # ( Ƨ → 2 ) LATIN CAPITAL LETTER TONE TWO → DIGIT TWO # +03E8 ; 0032 ; MA # ( Ϩ → 2 ) COPTIC CAPITAL LETTER HORI → DIGIT TWO # →Ƨ→ +A644 ; 0032 ; MA # ( Ꙅ → 2 ) CYRILLIC CAPITAL LETTER REVERSED DZE → DIGIT TWO # →Ƨ→ +14BF ; 0032 ; MA # ( ᒿ → 2 ) CANADIAN SYLLABICS SAYISI M → DIGIT TWO # + +A9CF ; 0662 ; MA # ( ꧏ → ‎٢‎ ) JAVANESE PANGRANGKEP → ARABIC-INDIC DIGIT TWO # +06F2 ; 0662 ; MA # ( ۲ → ‎٢‎ ) EXTENDED ARABIC-INDIC DIGIT TWO → ARABIC-INDIC DIGIT TWO # + +0AE8 ; 0968 ; MA # ( ૨ → २ ) GUJARATI DIGIT TWO → DEVANAGARI DIGIT TWO # + +114D2 ; 09E8 ; MA # ( 𑓒 → ২ ) TIRHUTA DIGIT TWO → BENGALI DIGIT TWO # + +0CE8 ; 0C68 ; MA # ( ೨ → ౨ ) KANNADA DIGIT TWO → TELUGU DIGIT TWO # + +2461 ; 2781 ; MA #* ( ② → ➁ ) CIRCLED DIGIT TWO → DINGBAT CIRCLED SANS-SERIF DIGIT TWO # + +01BB ; 0032 0335 ; MA # ( ƻ → 2̵ ) LATIN LETTER TWO WITH STROKE → DIGIT TWO, COMBINING SHORT STROKE OVERLAY # + +1F103 ; 0032 002C ; MA #* ( 🄃 → 2, ) DIGIT TWO COMMA → DIGIT TWO, COMMA # + +2489 ; 0032 002E ; MA #* ( ⒉ → 2. ) DIGIT TWO FULL STOP → DIGIT TWO, FULL STOP # + +33F5 ; 0032 0032 65E5 ; MA #* ( ㏵ → 22日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO → DIGIT TWO, DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5 # + +336E ; 0032 0032 70B9 ; MA #* ( ㍮ → 22点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO → DIGIT TWO, DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9 # + +33F6 ; 0032 0033 65E5 ; MA #* ( ㏶ → 23日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE → DIGIT TWO, DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5 # + +336F ; 0032 0033 70B9 ; MA #* ( ㍯ → 23点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE → DIGIT TWO, DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9 # + +33F7 ; 0032 0034 65E5 ; MA #* ( ㏷ → 24日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR → DIGIT TWO, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5 # + +3370 ; 0032 0034 70B9 ; MA #* ( ㍰ → 24点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR → DIGIT TWO, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9 # + +33F8 ; 0032 0035 65E5 ; MA #* ( ㏸ → 25日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE → DIGIT TWO, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5 # + +33F9 ; 0032 0036 65E5 ; MA #* ( ㏹ → 26日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX → DIGIT TWO, DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5 # + +33FA ; 0032 0037 65E5 ; MA #* ( ㏺ → 27日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN → DIGIT TWO, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5 # + +33FB ; 0032 0038 65E5 ; MA #* ( ㏻ → 28日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT → DIGIT TWO, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5 # + +33FC ; 0032 0039 65E5 ; MA #* ( ㏼ → 29日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE → DIGIT TWO, DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5 # + +33F4 ; 0032 006C 65E5 ; MA #* ( ㏴ → 2l日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE → DIGIT TWO, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5 # →21日→ + +336D ; 0032 006C 70B9 ; MA #* ( ㍭ → 2l点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE → DIGIT TWO, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-70B9 # →21点→ + +249B ; 0032 004F 002E ; MA #* ( ⒛ → 2O. ) NUMBER TWENTY FULL STOP → DIGIT TWO, LATIN CAPITAL LETTER O, FULL STOP # →20.→ + +33F3 ; 0032 004F 65E5 ; MA #* ( ㏳ → 2O日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY → DIGIT TWO, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-65E5 # →20日→ + +336C ; 0032 004F 70B9 ; MA #* ( ㍬ → 2O点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY → DIGIT TWO, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-70B9 # →20点→ + +0DE9 ; 0DE8 0DCF ; MA # ( ෩ → ෨ා ) SINHALA LITH DIGIT THREE → SINHALA LITH DIGIT TWO, SINHALA VOWEL SIGN AELA-PILLA # + +0DEF ; 0DE8 0DD3 ; MA # ( ෯ → ෨ී ) SINHALA LITH DIGIT NINE → SINHALA LITH DIGIT TWO, SINHALA VOWEL SIGN DIGA IS-PILLA # + +33E1 ; 0032 65E5 ; MA #* ( ㏡ → 2日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO → DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5 # + +32C1 ; 0032 6708 ; MA #* ( ㋁ → 2月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY → DIGIT TWO, CJK UNIFIED IDEOGRAPH-6708 # + +335A ; 0032 70B9 ; MA #* ( ㍚ → 2点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO → DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9 # + +1D7D1 ; 0033 ; MA # ( 𝟑 → 3 ) MATHEMATICAL BOLD DIGIT THREE → DIGIT THREE # +1D7DB ; 0033 ; MA # ( 𝟛 → 3 ) MATHEMATICAL DOUBLE-STRUCK DIGIT THREE → DIGIT THREE # +1D7E5 ; 0033 ; MA # ( 𝟥 → 3 ) MATHEMATICAL SANS-SERIF DIGIT THREE → DIGIT THREE # +1D7EF ; 0033 ; MA # ( 𝟯 → 3 ) MATHEMATICAL SANS-SERIF BOLD DIGIT THREE → DIGIT THREE # +1D7F9 ; 0033 ; MA # ( 𝟹 → 3 ) MATHEMATICAL MONOSPACE DIGIT THREE → DIGIT THREE # +A7AB ; 0033 ; MA # ( Ɜ → 3 ) LATIN CAPITAL LETTER REVERSED OPEN E → DIGIT THREE # +021C ; 0033 ; MA # ( Ȝ → 3 ) LATIN CAPITAL LETTER YOGH → DIGIT THREE # →Ʒ→ +01B7 ; 0033 ; MA # ( Ʒ → 3 ) LATIN CAPITAL LETTER EZH → DIGIT THREE # +A76A ; 0033 ; MA # ( Ꝫ → 3 ) LATIN CAPITAL LETTER ET → DIGIT THREE # +2CCC ; 0033 ; MA # ( Ⳍ → 3 ) COPTIC CAPITAL LETTER OLD COPTIC HORI → DIGIT THREE # →Ȝ→→Ʒ→ +0417 ; 0033 ; MA # ( З → 3 ) CYRILLIC CAPITAL LETTER ZE → DIGIT THREE # +04E0 ; 0033 ; MA # ( Ӡ → 3 ) CYRILLIC CAPITAL LETTER ABKHASIAN DZE → DIGIT THREE # →Ʒ→ +118CA ; 0033 ; MA # ( 𑣊 → 3 ) WARANG CITI SMALL LETTER ANG → DIGIT THREE # + +06F3 ; 0663 ; MA # ( ۳ → ‎٣‎ ) EXTENDED ARABIC-INDIC DIGIT THREE → ARABIC-INDIC DIGIT THREE # +1E8C9 ; 0663 ; MA #* ( ‎𞣉‎ → ‎٣‎ ) MENDE KIKAKUI DIGIT THREE → ARABIC-INDIC DIGIT THREE # + +0AE9 ; 0969 ; MA # ( ૩ → ३ ) GUJARATI DIGIT THREE → DEVANAGARI DIGIT THREE # + +2462 ; 2782 ; MA #* ( ③ → ➂ ) CIRCLED DIGIT THREE → DINGBAT CIRCLED SANS-SERIF DIGIT THREE # + +0498 ; 0033 0326 ; MA # ( Ҙ → 3̦ ) CYRILLIC CAPITAL LETTER ZE WITH DESCENDER → DIGIT THREE, COMBINING COMMA BELOW # →З̧→ + +1F104 ; 0033 002C ; MA #* ( 🄄 → 3, ) DIGIT THREE COMMA → DIGIT THREE, COMMA # + +248A ; 0033 002E ; MA #* ( ⒊ → 3. ) DIGIT THREE FULL STOP → DIGIT THREE, FULL STOP # + +33FE ; 0033 006C 65E5 ; MA #* ( ㏾ → 3l日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE → DIGIT THREE, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5 # →31日→ + +33FD ; 0033 004F 65E5 ; MA #* ( ㏽ → 3O日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY → DIGIT THREE, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-65E5 # →30日→ + +33E2 ; 0033 65E5 ; MA #* ( ㏢ → 3日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE → DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5 # + +32C2 ; 0033 6708 ; MA #* ( ㋂ → 3月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH → DIGIT THREE, CJK UNIFIED IDEOGRAPH-6708 # + +335B ; 0033 70B9 ; MA #* ( ㍛ → 3点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE → DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9 # + +1D7D2 ; 0034 ; MA # ( 𝟒 → 4 ) MATHEMATICAL BOLD DIGIT FOUR → DIGIT FOUR # +1D7DC ; 0034 ; MA # ( 𝟜 → 4 ) MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR → DIGIT FOUR # +1D7E6 ; 0034 ; MA # ( 𝟦 → 4 ) MATHEMATICAL SANS-SERIF DIGIT FOUR → DIGIT FOUR # +1D7F0 ; 0034 ; MA # ( 𝟰 → 4 ) MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR → DIGIT FOUR # +1D7FA ; 0034 ; MA # ( 𝟺 → 4 ) MATHEMATICAL MONOSPACE DIGIT FOUR → DIGIT FOUR # +13CE ; 0034 ; MA # ( Ꮞ → 4 ) CHEROKEE LETTER SE → DIGIT FOUR # +118AF ; 0034 ; MA # ( 𑢯 → 4 ) WARANG CITI CAPITAL LETTER UC → DIGIT FOUR # + +06F4 ; 0664 ; MA # ( ۴ → ‎٤‎ ) EXTENDED ARABIC-INDIC DIGIT FOUR → ARABIC-INDIC DIGIT FOUR # + +0AEA ; 096A ; MA # ( ૪ → ४ ) GUJARATI DIGIT FOUR → DEVANAGARI DIGIT FOUR # + +2463 ; 2783 ; MA #* ( ④ → ➃ ) CIRCLED DIGIT FOUR → DINGBAT CIRCLED SANS-SERIF DIGIT FOUR # + +1F105 ; 0034 002C ; MA #* ( 🄅 → 4, ) DIGIT FOUR COMMA → DIGIT FOUR, COMMA # + +248B ; 0034 002E ; MA #* ( ⒋ → 4. ) DIGIT FOUR FULL STOP → DIGIT FOUR, FULL STOP # + +1530 ; 0034 00B7 ; MA # ( ᔰ → 4· ) CANADIAN SYLLABICS WEST-CREE YWE → DIGIT FOUR, MIDDLE DOT # →4ᐧ→ + +33E3 ; 0034 65E5 ; MA #* ( ㏣ → 4日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR → DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5 # + +32C3 ; 0034 6708 ; MA #* ( ㋃ → 4月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL → DIGIT FOUR, CJK UNIFIED IDEOGRAPH-6708 # + +335C ; 0034 70B9 ; MA #* ( ㍜ → 4点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR → DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9 # + +1D7D3 ; 0035 ; MA # ( 𝟓 → 5 ) MATHEMATICAL BOLD DIGIT FIVE → DIGIT FIVE # +1D7DD ; 0035 ; MA # ( 𝟝 → 5 ) MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE → DIGIT FIVE # +1D7E7 ; 0035 ; MA # ( 𝟧 → 5 ) MATHEMATICAL SANS-SERIF DIGIT FIVE → DIGIT FIVE # +1D7F1 ; 0035 ; MA # ( 𝟱 → 5 ) MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE → DIGIT FIVE # +1D7FB ; 0035 ; MA # ( 𝟻 → 5 ) MATHEMATICAL MONOSPACE DIGIT FIVE → DIGIT FIVE # +01BC ; 0035 ; MA # ( Ƽ → 5 ) LATIN CAPITAL LETTER TONE FIVE → DIGIT FIVE # +118BB ; 0035 ; MA # ( 𑢻 → 5 ) WARANG CITI CAPITAL LETTER HORR → DIGIT FIVE # + +2464 ; 2784 ; MA #* ( ⑤ → ➄ ) CIRCLED DIGIT FIVE → DINGBAT CIRCLED SANS-SERIF DIGIT FIVE # + +1F106 ; 0035 002C ; MA #* ( 🄆 → 5, ) DIGIT FIVE COMMA → DIGIT FIVE, COMMA # + +248C ; 0035 002E ; MA #* ( ⒌ → 5. ) DIGIT FIVE FULL STOP → DIGIT FIVE, FULL STOP # + +33E4 ; 0035 65E5 ; MA #* ( ㏤ → 5日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE → DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5 # + +32C4 ; 0035 6708 ; MA #* ( ㋄ → 5月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY → DIGIT FIVE, CJK UNIFIED IDEOGRAPH-6708 # + +335D ; 0035 70B9 ; MA #* ( ㍝ → 5点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE → DIGIT FIVE, CJK UNIFIED IDEOGRAPH-70B9 # + +1D7D4 ; 0036 ; MA # ( 𝟔 → 6 ) MATHEMATICAL BOLD DIGIT SIX → DIGIT SIX # +1D7DE ; 0036 ; MA # ( 𝟞 → 6 ) MATHEMATICAL DOUBLE-STRUCK DIGIT SIX → DIGIT SIX # +1D7E8 ; 0036 ; MA # ( 𝟨 → 6 ) MATHEMATICAL SANS-SERIF DIGIT SIX → DIGIT SIX # +1D7F2 ; 0036 ; MA # ( 𝟲 → 6 ) MATHEMATICAL SANS-SERIF BOLD DIGIT SIX → DIGIT SIX # +1D7FC ; 0036 ; MA # ( 𝟼 → 6 ) MATHEMATICAL MONOSPACE DIGIT SIX → DIGIT SIX # +2CD2 ; 0036 ; MA # ( Ⳓ → 6 ) COPTIC CAPITAL LETTER OLD COPTIC HEI → DIGIT SIX # +0431 ; 0036 ; MA # ( б → 6 ) CYRILLIC SMALL LETTER BE → DIGIT SIX # +13EE ; 0036 ; MA # ( Ꮾ → 6 ) CHEROKEE LETTER WV → DIGIT SIX # +118D5 ; 0036 ; MA # ( 𑣕 → 6 ) WARANG CITI SMALL LETTER AT → DIGIT SIX # + +06F6 ; 0666 ; MA # ( ۶ → ‎٦‎ ) EXTENDED ARABIC-INDIC DIGIT SIX → ARABIC-INDIC DIGIT SIX # + +114D6 ; 09EC ; MA # ( 𑓖 → ৬ ) TIRHUTA DIGIT SIX → BENGALI DIGIT SIX # + +2465 ; 2785 ; MA #* ( ⑥ → ➅ ) CIRCLED DIGIT SIX → DINGBAT CIRCLED SANS-SERIF DIGIT SIX # + +1F107 ; 0036 002C ; MA #* ( 🄇 → 6, ) DIGIT SIX COMMA → DIGIT SIX, COMMA # + +248D ; 0036 002E ; MA #* ( ⒍ → 6. ) DIGIT SIX FULL STOP → DIGIT SIX, FULL STOP # + +33E5 ; 0036 65E5 ; MA #* ( ㏥ → 6日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX → DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5 # + +32C5 ; 0036 6708 ; MA #* ( ㋅ → 6月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE → DIGIT SIX, CJK UNIFIED IDEOGRAPH-6708 # + +335E ; 0036 70B9 ; MA #* ( ㍞ → 6点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX → DIGIT SIX, CJK UNIFIED IDEOGRAPH-70B9 # + +1D7D5 ; 0037 ; MA # ( 𝟕 → 7 ) MATHEMATICAL BOLD DIGIT SEVEN → DIGIT SEVEN # +1D7DF ; 0037 ; MA # ( 𝟟 → 7 ) MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN → DIGIT SEVEN # +1D7E9 ; 0037 ; MA # ( 𝟩 → 7 ) MATHEMATICAL SANS-SERIF DIGIT SEVEN → DIGIT SEVEN # +1D7F3 ; 0037 ; MA # ( 𝟳 → 7 ) MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN → DIGIT SEVEN # +1D7FD ; 0037 ; MA # ( 𝟽 → 7 ) MATHEMATICAL MONOSPACE DIGIT SEVEN → DIGIT SEVEN # +118C6 ; 0037 ; MA # ( 𑣆 → 7 ) WARANG CITI SMALL LETTER II → DIGIT SEVEN # + +2466 ; 2786 ; MA #* ( ⑦ → ➆ ) CIRCLED DIGIT SEVEN → DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN # + +1F108 ; 0037 002C ; MA #* ( 🄈 → 7, ) DIGIT SEVEN COMMA → DIGIT SEVEN, COMMA # + +248E ; 0037 002E ; MA #* ( ⒎ → 7. ) DIGIT SEVEN FULL STOP → DIGIT SEVEN, FULL STOP # + +33E6 ; 0037 65E5 ; MA #* ( ㏦ → 7日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN → DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5 # + +32C6 ; 0037 6708 ; MA #* ( ㋆ → 7月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY → DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-6708 # + +335F ; 0037 70B9 ; MA #* ( ㍟ → 7点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN → DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-70B9 # + +0B03 ; 0038 ; MA # ( ଃ → 8 ) ORIYA SIGN VISARGA → DIGIT EIGHT # +09EA ; 0038 ; MA # ( ৪ → 8 ) BENGALI DIGIT FOUR → DIGIT EIGHT # +0A6A ; 0038 ; MA # ( ੪ → 8 ) GURMUKHI DIGIT FOUR → DIGIT EIGHT # +1E8CB ; 0038 ; MA #* ( ‎𞣋‎ → 8 ) MENDE KIKAKUI DIGIT FIVE → DIGIT EIGHT # +1D7D6 ; 0038 ; MA # ( 𝟖 → 8 ) MATHEMATICAL BOLD DIGIT EIGHT → DIGIT EIGHT # +1D7E0 ; 0038 ; MA # ( 𝟠 → 8 ) MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT → DIGIT EIGHT # +1D7EA ; 0038 ; MA # ( 𝟪 → 8 ) MATHEMATICAL SANS-SERIF DIGIT EIGHT → DIGIT EIGHT # +1D7F4 ; 0038 ; MA # ( 𝟴 → 8 ) MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT → DIGIT EIGHT # +1D7FE ; 0038 ; MA # ( 𝟾 → 8 ) MATHEMATICAL MONOSPACE DIGIT EIGHT → DIGIT EIGHT # +0223 ; 0038 ; MA # ( ȣ → 8 ) LATIN SMALL LETTER OU → DIGIT EIGHT # +0222 ; 0038 ; MA # ( Ȣ → 8 ) LATIN CAPITAL LETTER OU → DIGIT EIGHT # +1031A ; 0038 ; MA # ( 𐌚 → 8 ) OLD ITALIC LETTER EF → DIGIT EIGHT # + +0AEE ; 096E ; MA # ( ૮ → ८ ) GUJARATI DIGIT EIGHT → DEVANAGARI DIGIT EIGHT # + +2467 ; 2787 ; MA #* ( ⑧ → ➇ ) CIRCLED DIGIT EIGHT → DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT # + +1F109 ; 0038 002C ; MA #* ( 🄉 → 8, ) DIGIT EIGHT COMMA → DIGIT EIGHT, COMMA # + +248F ; 0038 002E ; MA #* ( ⒏ → 8. ) DIGIT EIGHT FULL STOP → DIGIT EIGHT, FULL STOP # + +33E7 ; 0038 65E5 ; MA #* ( ㏧ → 8日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT → DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5 # + +32C7 ; 0038 6708 ; MA #* ( ㋇ → 8月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST → DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-6708 # + +3360 ; 0038 70B9 ; MA #* ( ㍠ → 8点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT → DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-70B9 # + +0A67 ; 0039 ; MA # ( ੧ → 9 ) GURMUKHI DIGIT ONE → DIGIT NINE # +0B68 ; 0039 ; MA # ( ୨ → 9 ) ORIYA DIGIT TWO → DIGIT NINE # +09ED ; 0039 ; MA # ( ৭ → 9 ) BENGALI DIGIT SEVEN → DIGIT NINE # +1D7D7 ; 0039 ; MA # ( 𝟗 → 9 ) MATHEMATICAL BOLD DIGIT NINE → DIGIT NINE # +1D7E1 ; 0039 ; MA # ( 𝟡 → 9 ) MATHEMATICAL DOUBLE-STRUCK DIGIT NINE → DIGIT NINE # +1D7EB ; 0039 ; MA # ( 𝟫 → 9 ) MATHEMATICAL SANS-SERIF DIGIT NINE → DIGIT NINE # +1D7F5 ; 0039 ; MA # ( 𝟵 → 9 ) MATHEMATICAL SANS-SERIF BOLD DIGIT NINE → DIGIT NINE # +1D7FF ; 0039 ; MA # ( 𝟿 → 9 ) MATHEMATICAL MONOSPACE DIGIT NINE → DIGIT NINE # +A76E ; 0039 ; MA # ( Ꝯ → 9 ) LATIN CAPITAL LETTER CON → DIGIT NINE # +2CCA ; 0039 ; MA # ( Ⳋ → 9 ) COPTIC CAPITAL LETTER DIALECT-P HORI → DIGIT NINE # +118CC ; 0039 ; MA # ( 𑣌 → 9 ) WARANG CITI SMALL LETTER KO → DIGIT NINE # +118AC ; 0039 ; MA # ( 𑢬 → 9 ) WARANG CITI CAPITAL LETTER KO → DIGIT NINE # +118D6 ; 0039 ; MA # ( 𑣖 → 9 ) WARANG CITI SMALL LETTER AM → DIGIT NINE # + +0967 ; 0669 ; MA # ( १ → ‎٩‎ ) DEVANAGARI DIGIT ONE → ARABIC-INDIC DIGIT NINE # +118E4 ; 0669 ; MA # ( 𑣤 → ‎٩‎ ) WARANG CITI DIGIT FOUR → ARABIC-INDIC DIGIT NINE # +06F9 ; 0669 ; MA # ( ۹ → ‎٩‎ ) EXTENDED ARABIC-INDIC DIGIT NINE → ARABIC-INDIC DIGIT NINE # + +0CEF ; 0C6F ; MA # ( ೯ → ౯ ) KANNADA DIGIT NINE → TELUGU DIGIT NINE # + +2468 ; 2788 ; MA #* ( ⑨ → ➈ ) CIRCLED DIGIT NINE → DINGBAT CIRCLED SANS-SERIF DIGIT NINE # + +1F10A ; 0039 002C ; MA #* ( 🄊 → 9, ) DIGIT NINE COMMA → DIGIT NINE, COMMA # + +2490 ; 0039 002E ; MA #* ( ⒐ → 9. ) DIGIT NINE FULL STOP → DIGIT NINE, FULL STOP # + +33E8 ; 0039 65E5 ; MA #* ( ㏨ → 9日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE → DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5 # + +32C8 ; 0039 6708 ; MA #* ( ㋈ → 9月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER → DIGIT NINE, CJK UNIFIED IDEOGRAPH-6708 # + +3361 ; 0039 70B9 ; MA #* ( ㍡ → 9点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE → DIGIT NINE, CJK UNIFIED IDEOGRAPH-70B9 # + +237A ; 0061 ; MA #* ( ⍺ → a ) APL FUNCTIONAL SYMBOL ALPHA → LATIN SMALL LETTER A # →α→ +FF41 ; 0061 ; MA # ( a → a ) FULLWIDTH LATIN SMALL LETTER A → LATIN SMALL LETTER A # →а→ +1D41A ; 0061 ; MA # ( 𝐚 → a ) MATHEMATICAL BOLD SMALL A → LATIN SMALL LETTER A # +1D44E ; 0061 ; MA # ( 𝑎 → a ) MATHEMATICAL ITALIC SMALL A → LATIN SMALL LETTER A # +1D482 ; 0061 ; MA # ( 𝒂 → a ) MATHEMATICAL BOLD ITALIC SMALL A → LATIN SMALL LETTER A # +1D4B6 ; 0061 ; MA # ( 𝒶 → a ) MATHEMATICAL SCRIPT SMALL A → LATIN SMALL LETTER A # +1D4EA ; 0061 ; MA # ( 𝓪 → a ) MATHEMATICAL BOLD SCRIPT SMALL A → LATIN SMALL LETTER A # +1D51E ; 0061 ; MA # ( 𝔞 → a ) MATHEMATICAL FRAKTUR SMALL A → LATIN SMALL LETTER A # +1D552 ; 0061 ; MA # ( 𝕒 → a ) MATHEMATICAL DOUBLE-STRUCK SMALL A → LATIN SMALL LETTER A # +1D586 ; 0061 ; MA # ( 𝖆 → a ) MATHEMATICAL BOLD FRAKTUR SMALL A → LATIN SMALL LETTER A # +1D5BA ; 0061 ; MA # ( 𝖺 → a ) MATHEMATICAL SANS-SERIF SMALL A → LATIN SMALL LETTER A # +1D5EE ; 0061 ; MA # ( 𝗮 → a ) MATHEMATICAL SANS-SERIF BOLD SMALL A → LATIN SMALL LETTER A # +1D622 ; 0061 ; MA # ( 𝘢 → a ) MATHEMATICAL SANS-SERIF ITALIC SMALL A → LATIN SMALL LETTER A # +1D656 ; 0061 ; MA # ( 𝙖 → a ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A → LATIN SMALL LETTER A # +1D68A ; 0061 ; MA # ( 𝚊 → a ) MATHEMATICAL MONOSPACE SMALL A → LATIN SMALL LETTER A # +0251 ; 0061 ; MA # ( ɑ → a ) LATIN SMALL LETTER ALPHA → LATIN SMALL LETTER A # +03B1 ; 0061 ; MA # ( α → a ) GREEK SMALL LETTER ALPHA → LATIN SMALL LETTER A # +1D6C2 ; 0061 ; MA # ( 𝛂 → a ) MATHEMATICAL BOLD SMALL ALPHA → LATIN SMALL LETTER A # →α→ +1D6FC ; 0061 ; MA # ( 𝛼 → a ) MATHEMATICAL ITALIC SMALL ALPHA → LATIN SMALL LETTER A # →α→ +1D736 ; 0061 ; MA # ( 𝜶 → a ) MATHEMATICAL BOLD ITALIC SMALL ALPHA → LATIN SMALL LETTER A # →α→ +1D770 ; 0061 ; MA # ( 𝝰 → a ) MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA → LATIN SMALL LETTER A # →α→ +1D7AA ; 0061 ; MA # ( 𝞪 → a ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA → LATIN SMALL LETTER A # →α→ +0430 ; 0061 ; MA # ( а → a ) CYRILLIC SMALL LETTER A → LATIN SMALL LETTER A # + +FF21 ; 0041 ; MA # ( A → A ) FULLWIDTH LATIN CAPITAL LETTER A → LATIN CAPITAL LETTER A # →А→ +1D400 ; 0041 ; MA # ( 𝐀 → A ) MATHEMATICAL BOLD CAPITAL A → LATIN CAPITAL LETTER A # +1D434 ; 0041 ; MA # ( 𝐴 → A ) MATHEMATICAL ITALIC CAPITAL A → LATIN CAPITAL LETTER A # +1D468 ; 0041 ; MA # ( 𝑨 → A ) MATHEMATICAL BOLD ITALIC CAPITAL A → LATIN CAPITAL LETTER A # +1D49C ; 0041 ; MA # ( 𝒜 → A ) MATHEMATICAL SCRIPT CAPITAL A → LATIN CAPITAL LETTER A # +1D4D0 ; 0041 ; MA # ( 𝓐 → A ) MATHEMATICAL BOLD SCRIPT CAPITAL A → LATIN CAPITAL LETTER A # +1D504 ; 0041 ; MA # ( 𝔄 → A ) MATHEMATICAL FRAKTUR CAPITAL A → LATIN CAPITAL LETTER A # +1D538 ; 0041 ; MA # ( 𝔸 → A ) MATHEMATICAL DOUBLE-STRUCK CAPITAL A → LATIN CAPITAL LETTER A # +1D56C ; 0041 ; MA # ( 𝕬 → A ) MATHEMATICAL BOLD FRAKTUR CAPITAL A → LATIN CAPITAL LETTER A # +1D5A0 ; 0041 ; MA # ( 𝖠 → A ) MATHEMATICAL SANS-SERIF CAPITAL A → LATIN CAPITAL LETTER A # +1D5D4 ; 0041 ; MA # ( 𝗔 → A ) MATHEMATICAL SANS-SERIF BOLD CAPITAL A → LATIN CAPITAL LETTER A # +1D608 ; 0041 ; MA # ( 𝘈 → A ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL A → LATIN CAPITAL LETTER A # +1D63C ; 0041 ; MA # ( 𝘼 → A ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A → LATIN CAPITAL LETTER A # +1D670 ; 0041 ; MA # ( 𝙰 → A ) MATHEMATICAL MONOSPACE CAPITAL A → LATIN CAPITAL LETTER A # +1D00 ; 0041 ; MA # ( ᴀ → A ) LATIN LETTER SMALL CAPITAL A → LATIN CAPITAL LETTER A # +0391 ; 0041 ; MA # ( Α → A ) GREEK CAPITAL LETTER ALPHA → LATIN CAPITAL LETTER A # +1D6A8 ; 0041 ; MA # ( 𝚨 → A ) MATHEMATICAL BOLD CAPITAL ALPHA → LATIN CAPITAL LETTER A # →𝐀→ +1D6E2 ; 0041 ; MA # ( 𝛢 → A ) MATHEMATICAL ITALIC CAPITAL ALPHA → LATIN CAPITAL LETTER A # →Α→ +1D71C ; 0041 ; MA # ( 𝜜 → A ) MATHEMATICAL BOLD ITALIC CAPITAL ALPHA → LATIN CAPITAL LETTER A # →Α→ +1D756 ; 0041 ; MA # ( 𝝖 → A ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA → LATIN CAPITAL LETTER A # →Α→ +1D790 ; 0041 ; MA # ( 𝞐 → A ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA → LATIN CAPITAL LETTER A # →Α→ +0410 ; 0041 ; MA # ( А → A ) CYRILLIC CAPITAL LETTER A → LATIN CAPITAL LETTER A # +13AA ; 0041 ; MA # ( Ꭺ → A ) CHEROKEE LETTER GO → LATIN CAPITAL LETTER A # +15C5 ; 0041 ; MA # ( ᗅ → A ) CANADIAN SYLLABICS CARRIER GHO → LATIN CAPITAL LETTER A # +A4EE ; 0041 ; MA # ( ꓮ → A ) LISU LETTER A → LATIN CAPITAL LETTER A # +102A0 ; 0041 ; MA # ( 𐊠 → A ) CARIAN LETTER A → LATIN CAPITAL LETTER A # + +2376 ; 0061 0332 ; MA #* ( ⍶ → a̲ ) APL FUNCTIONAL SYMBOL ALPHA UNDERBAR → LATIN SMALL LETTER A, COMBINING LOW LINE # →α̲→→ɑ̲→ + +01CE ; 0103 ; MA # ( ǎ → ă ) LATIN SMALL LETTER A WITH CARON → LATIN SMALL LETTER A WITH BREVE # + +01CD ; 0102 ; MA # ( Ǎ → Ă ) LATIN CAPITAL LETTER A WITH CARON → LATIN CAPITAL LETTER A WITH BREVE # + +0227 ; 00E5 ; MA # ( ȧ → å ) LATIN SMALL LETTER A WITH DOT ABOVE → LATIN SMALL LETTER A WITH RING ABOVE # + +0226 ; 00C5 ; MA # ( Ȧ → Å ) LATIN CAPITAL LETTER A WITH DOT ABOVE → LATIN CAPITAL LETTER A WITH RING ABOVE # + +1E9A ; 1EA3 ; MA # ( ẚ → ả ) LATIN SMALL LETTER A WITH RIGHT HALF RING → LATIN SMALL LETTER A WITH HOOK ABOVE # + +2100 ; 0061 002F 0063 ; MA #* ( ℀ → a/c ) ACCOUNT OF → LATIN SMALL LETTER A, SOLIDUS, LATIN SMALL LETTER C # + +2101 ; 0061 002F 0073 ; MA #* ( ℁ → a/s ) ADDRESSED TO THE SUBJECT → LATIN SMALL LETTER A, SOLIDUS, LATIN SMALL LETTER S # + +A733 ; 0061 0061 ; MA # ( ꜳ → aa ) LATIN SMALL LETTER AA → LATIN SMALL LETTER A, LATIN SMALL LETTER A # + +A732 ; 0041 0041 ; MA # ( Ꜳ → AA ) LATIN CAPITAL LETTER AA → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER A # + +00E6 ; 0061 0065 ; MA # ( æ → ae ) LATIN SMALL LETTER AE → LATIN SMALL LETTER A, LATIN SMALL LETTER E # +04D5 ; 0061 0065 ; MA # ( ӕ → ae ) CYRILLIC SMALL LIGATURE A IE → LATIN SMALL LETTER A, LATIN SMALL LETTER E # →ае→ + +00C6 ; 0041 0045 ; MA # ( Æ → AE ) LATIN CAPITAL LETTER AE → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER E # +04D4 ; 0041 0045 ; MA # ( Ӕ → AE ) CYRILLIC CAPITAL LIGATURE A IE → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER E # →Æ→ + +A735 ; 0061 006F ; MA # ( ꜵ → ao ) LATIN SMALL LETTER AO → LATIN SMALL LETTER A, LATIN SMALL LETTER O # + +A734 ; 0041 004F ; MA # ( Ꜵ → AO ) LATIN CAPITAL LETTER AO → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER O # + +1F707 ; 0041 0052 ; MA #* ( 🜇 → AR ) ALCHEMICAL SYMBOL FOR AQUA REGIA-2 → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER R # + +A737 ; 0061 0075 ; MA # ( ꜷ → au ) LATIN SMALL LETTER AU → LATIN SMALL LETTER A, LATIN SMALL LETTER U # + +A736 ; 0041 0055 ; MA # ( Ꜷ → AU ) LATIN CAPITAL LETTER AU → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER U # + +A739 ; 0061 0076 ; MA # ( ꜹ → av ) LATIN SMALL LETTER AV → LATIN SMALL LETTER A, LATIN SMALL LETTER V # +A73B ; 0061 0076 ; MA # ( ꜻ → av ) LATIN SMALL LETTER AV WITH HORIZONTAL BAR → LATIN SMALL LETTER A, LATIN SMALL LETTER V # + +A738 ; 0041 0056 ; MA # ( Ꜹ → AV ) LATIN CAPITAL LETTER AV → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER V # +A73A ; 0041 0056 ; MA # ( Ꜻ → AV ) LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER V # + +A73D ; 0061 0079 ; MA # ( ꜽ → ay ) LATIN SMALL LETTER AY → LATIN SMALL LETTER A, LATIN SMALL LETTER Y # + +A73C ; 0041 0059 ; MA # ( Ꜽ → AY ) LATIN CAPITAL LETTER AY → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER Y # + +2200 ; 2C6F ; MA #* ( ∀ → Ɐ ) FOR ALL → LATIN CAPITAL LETTER TURNED A # +15C4 ; 2C6F ; MA # ( ᗄ → Ɐ ) CANADIAN SYLLABICS CARRIER GHU → LATIN CAPITAL LETTER TURNED A # →∀→ +A4EF ; 2C6F ; MA # ( ꓯ → Ɐ ) LISU LETTER AE → LATIN CAPITAL LETTER TURNED A # + +1041F ; 2C70 ; MA # ( 𐐟 → Ɒ ) DESERET CAPITAL LETTER ESH → LATIN CAPITAL LETTER TURNED ALPHA # + +1D41B ; 0062 ; MA # ( 𝐛 → b ) MATHEMATICAL BOLD SMALL B → LATIN SMALL LETTER B # +1D44F ; 0062 ; MA # ( 𝑏 → b ) MATHEMATICAL ITALIC SMALL B → LATIN SMALL LETTER B # +1D483 ; 0062 ; MA # ( 𝒃 → b ) MATHEMATICAL BOLD ITALIC SMALL B → LATIN SMALL LETTER B # +1D4B7 ; 0062 ; MA # ( 𝒷 → b ) MATHEMATICAL SCRIPT SMALL B → LATIN SMALL LETTER B # +1D4EB ; 0062 ; MA # ( 𝓫 → b ) MATHEMATICAL BOLD SCRIPT SMALL B → LATIN SMALL LETTER B # +1D51F ; 0062 ; MA # ( 𝔟 → b ) MATHEMATICAL FRAKTUR SMALL B → LATIN SMALL LETTER B # +1D553 ; 0062 ; MA # ( 𝕓 → b ) MATHEMATICAL DOUBLE-STRUCK SMALL B → LATIN SMALL LETTER B # +1D587 ; 0062 ; MA # ( 𝖇 → b ) MATHEMATICAL BOLD FRAKTUR SMALL B → LATIN SMALL LETTER B # +1D5BB ; 0062 ; MA # ( 𝖻 → b ) MATHEMATICAL SANS-SERIF SMALL B → LATIN SMALL LETTER B # +1D5EF ; 0062 ; MA # ( 𝗯 → b ) MATHEMATICAL SANS-SERIF BOLD SMALL B → LATIN SMALL LETTER B # +1D623 ; 0062 ; MA # ( 𝘣 → b ) MATHEMATICAL SANS-SERIF ITALIC SMALL B → LATIN SMALL LETTER B # +1D657 ; 0062 ; MA # ( 𝙗 → b ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B → LATIN SMALL LETTER B # +1D68B ; 0062 ; MA # ( 𝚋 → b ) MATHEMATICAL MONOSPACE SMALL B → LATIN SMALL LETTER B # +0184 ; 0062 ; MA # ( Ƅ → b ) LATIN CAPITAL LETTER TONE SIX → LATIN SMALL LETTER B # +042C ; 0062 ; MA # ( Ь → b ) CYRILLIC CAPITAL LETTER SOFT SIGN → LATIN SMALL LETTER B # →Ƅ→ +13CF ; 0062 ; MA # ( Ꮟ → b ) CHEROKEE LETTER SI → LATIN SMALL LETTER B # +15AF ; 0062 ; MA # ( ᖯ → b ) CANADIAN SYLLABICS AIVILIK B → LATIN SMALL LETTER B # + +FF22 ; 0042 ; MA # ( B → B ) FULLWIDTH LATIN CAPITAL LETTER B → LATIN CAPITAL LETTER B # →Β→ +212C ; 0042 ; MA # ( ℬ → B ) SCRIPT CAPITAL B → LATIN CAPITAL LETTER B # +1D401 ; 0042 ; MA # ( 𝐁 → B ) MATHEMATICAL BOLD CAPITAL B → LATIN CAPITAL LETTER B # +1D435 ; 0042 ; MA # ( 𝐵 → B ) MATHEMATICAL ITALIC CAPITAL B → LATIN CAPITAL LETTER B # +1D469 ; 0042 ; MA # ( 𝑩 → B ) MATHEMATICAL BOLD ITALIC CAPITAL B → LATIN CAPITAL LETTER B # +1D4D1 ; 0042 ; MA # ( 𝓑 → B ) MATHEMATICAL BOLD SCRIPT CAPITAL B → LATIN CAPITAL LETTER B # +1D505 ; 0042 ; MA # ( 𝔅 → B ) MATHEMATICAL FRAKTUR CAPITAL B → LATIN CAPITAL LETTER B # +1D539 ; 0042 ; MA # ( 𝔹 → B ) MATHEMATICAL DOUBLE-STRUCK CAPITAL B → LATIN CAPITAL LETTER B # +1D56D ; 0042 ; MA # ( 𝕭 → B ) MATHEMATICAL BOLD FRAKTUR CAPITAL B → LATIN CAPITAL LETTER B # +1D5A1 ; 0042 ; MA # ( 𝖡 → B ) MATHEMATICAL SANS-SERIF CAPITAL B → LATIN CAPITAL LETTER B # +1D5D5 ; 0042 ; MA # ( 𝗕 → B ) MATHEMATICAL SANS-SERIF BOLD CAPITAL B → LATIN CAPITAL LETTER B # +1D609 ; 0042 ; MA # ( 𝘉 → B ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL B → LATIN CAPITAL LETTER B # +1D63D ; 0042 ; MA # ( 𝘽 → B ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B → LATIN CAPITAL LETTER B # +1D671 ; 0042 ; MA # ( 𝙱 → B ) MATHEMATICAL MONOSPACE CAPITAL B → LATIN CAPITAL LETTER B # +0392 ; 0042 ; MA # ( Β → B ) GREEK CAPITAL LETTER BETA → LATIN CAPITAL LETTER B # +1D6A9 ; 0042 ; MA # ( 𝚩 → B ) MATHEMATICAL BOLD CAPITAL BETA → LATIN CAPITAL LETTER B # →Β→ +1D6E3 ; 0042 ; MA # ( 𝛣 → B ) MATHEMATICAL ITALIC CAPITAL BETA → LATIN CAPITAL LETTER B # →Β→ +1D71D ; 0042 ; MA # ( 𝜝 → B ) MATHEMATICAL BOLD ITALIC CAPITAL BETA → LATIN CAPITAL LETTER B # →Β→ +1D757 ; 0042 ; MA # ( 𝝗 → B ) MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA → LATIN CAPITAL LETTER B # →Β→ +1D791 ; 0042 ; MA # ( 𝞑 → B ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA → LATIN CAPITAL LETTER B # →Β→ +0412 ; 0042 ; MA # ( В → B ) CYRILLIC CAPITAL LETTER VE → LATIN CAPITAL LETTER B # +13F4 ; 0042 ; MA # ( Ᏼ → B ) CHEROKEE LETTER YV → LATIN CAPITAL LETTER B # +15F7 ; 0042 ; MA # ( ᗷ → B ) CANADIAN SYLLABICS CARRIER KHE → LATIN CAPITAL LETTER B # +A4D0 ; 0042 ; MA # ( ꓐ → B ) LISU LETTER BA → LATIN CAPITAL LETTER B # +10282 ; 0042 ; MA # ( 𐊂 → B ) LYCIAN LETTER B → LATIN CAPITAL LETTER B # +102A1 ; 0042 ; MA # ( 𐊡 → B ) CARIAN LETTER P2 → LATIN CAPITAL LETTER B # +10301 ; 0042 ; MA # ( 𐌁 → B ) OLD ITALIC LETTER BE → LATIN CAPITAL LETTER B # +A7B4 ; 0042 ; MA # ( Ꞵ → B ) LATIN CAPITAL LETTER BETA → LATIN CAPITAL LETTER B # + +0253 ; 0062 0314 ; MA # ( ɓ → b̔ ) LATIN SMALL LETTER B WITH HOOK → LATIN SMALL LETTER B, COMBINING REVERSED COMMA ABOVE # + +0183 ; 0062 0304 ; MA # ( ƃ → b̄ ) LATIN SMALL LETTER B WITH TOPBAR → LATIN SMALL LETTER B, COMBINING MACRON # +0182 ; 0062 0304 ; MA # ( Ƃ → b̄ ) LATIN CAPITAL LETTER B WITH TOPBAR → LATIN SMALL LETTER B, COMBINING MACRON # +0411 ; 0062 0304 ; MA # ( Б → b̄ ) CYRILLIC CAPITAL LETTER BE → LATIN SMALL LETTER B, COMBINING MACRON # →Ƃ→ + +0180 ; 0062 0335 ; MA # ( ƀ → b̵ ) LATIN SMALL LETTER B WITH STROKE → LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY # +048D ; 0062 0335 ; MA # ( ҍ → b̵ ) CYRILLIC SMALL LETTER SEMISOFT SIGN → LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY # →ѣ→→Ь̵→ +048C ; 0062 0335 ; MA # ( Ҍ → b̵ ) CYRILLIC CAPITAL LETTER SEMISOFT SIGN → LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY # →Ѣ→→Ь̵→ +0463 ; 0062 0335 ; MA # ( ѣ → b̵ ) CYRILLIC SMALL LETTER YAT → LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY # →Ь̵→ +0462 ; 0062 0335 ; MA # ( Ѣ → b̵ ) CYRILLIC CAPITAL LETTER YAT → LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY # →Ь̵→ + +042B ; 0062 006C ; MA # ( Ы → bl ) CYRILLIC CAPITAL LETTER YERU → LATIN SMALL LETTER B, LATIN SMALL LETTER L # →ЬІ→→Ь1→ + +0432 ; 0299 ; MA # ( в → ʙ ) CYRILLIC SMALL LETTER VE → LATIN LETTER SMALL CAPITAL B # + +FF43 ; 0063 ; MA # ( c → c ) FULLWIDTH LATIN SMALL LETTER C → LATIN SMALL LETTER C # →с→ +217D ; 0063 ; MA # ( ⅽ → c ) SMALL ROMAN NUMERAL ONE HUNDRED → LATIN SMALL LETTER C # +1D41C ; 0063 ; MA # ( 𝐜 → c ) MATHEMATICAL BOLD SMALL C → LATIN SMALL LETTER C # +1D450 ; 0063 ; MA # ( 𝑐 → c ) MATHEMATICAL ITALIC SMALL C → LATIN SMALL LETTER C # +1D484 ; 0063 ; MA # ( 𝒄 → c ) MATHEMATICAL BOLD ITALIC SMALL C → LATIN SMALL LETTER C # +1D4B8 ; 0063 ; MA # ( 𝒸 → c ) MATHEMATICAL SCRIPT SMALL C → LATIN SMALL LETTER C # +1D4EC ; 0063 ; MA # ( 𝓬 → c ) MATHEMATICAL BOLD SCRIPT SMALL C → LATIN SMALL LETTER C # +1D520 ; 0063 ; MA # ( 𝔠 → c ) MATHEMATICAL FRAKTUR SMALL C → LATIN SMALL LETTER C # +1D554 ; 0063 ; MA # ( 𝕔 → c ) MATHEMATICAL DOUBLE-STRUCK SMALL C → LATIN SMALL LETTER C # +1D588 ; 0063 ; MA # ( 𝖈 → c ) MATHEMATICAL BOLD FRAKTUR SMALL C → LATIN SMALL LETTER C # +1D5BC ; 0063 ; MA # ( 𝖼 → c ) MATHEMATICAL SANS-SERIF SMALL C → LATIN SMALL LETTER C # +1D5F0 ; 0063 ; MA # ( 𝗰 → c ) MATHEMATICAL SANS-SERIF BOLD SMALL C → LATIN SMALL LETTER C # +1D624 ; 0063 ; MA # ( 𝘤 → c ) MATHEMATICAL SANS-SERIF ITALIC SMALL C → LATIN SMALL LETTER C # +1D658 ; 0063 ; MA # ( 𝙘 → c ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C → LATIN SMALL LETTER C # +1D68C ; 0063 ; MA # ( 𝚌 → c ) MATHEMATICAL MONOSPACE SMALL C → LATIN SMALL LETTER C # +1D04 ; 0063 ; MA # ( ᴄ → c ) LATIN LETTER SMALL CAPITAL C → LATIN SMALL LETTER C # +03F2 ; 0063 ; MA # ( ϲ → c ) GREEK LUNATE SIGMA SYMBOL → LATIN SMALL LETTER C # +2CA5 ; 0063 ; MA # ( ⲥ → c ) COPTIC SMALL LETTER SIMA → LATIN SMALL LETTER C # →ϲ→ +0441 ; 0063 ; MA # ( с → c ) CYRILLIC SMALL LETTER ES → LATIN SMALL LETTER C # +1043D ; 0063 ; MA # ( 𐐽 → c ) DESERET SMALL LETTER CHEE → LATIN SMALL LETTER C # + +1F74C ; 0043 ; MA #* ( 🝌 → C ) ALCHEMICAL SYMBOL FOR CALX → LATIN CAPITAL LETTER C # +118F2 ; 0043 ; MA #* ( 𑣲 → C ) WARANG CITI NUMBER NINETY → LATIN CAPITAL LETTER C # +118E9 ; 0043 ; MA # ( 𑣩 → C ) WARANG CITI DIGIT NINE → LATIN CAPITAL LETTER C # +FF23 ; 0043 ; MA # ( C → C ) FULLWIDTH LATIN CAPITAL LETTER C → LATIN CAPITAL LETTER C # →С→ +216D ; 0043 ; MA # ( Ⅽ → C ) ROMAN NUMERAL ONE HUNDRED → LATIN CAPITAL LETTER C # +2102 ; 0043 ; MA # ( ℂ → C ) DOUBLE-STRUCK CAPITAL C → LATIN CAPITAL LETTER C # +212D ; 0043 ; MA # ( ℭ → C ) BLACK-LETTER CAPITAL C → LATIN CAPITAL LETTER C # +1D402 ; 0043 ; MA # ( 𝐂 → C ) MATHEMATICAL BOLD CAPITAL C → LATIN CAPITAL LETTER C # +1D436 ; 0043 ; MA # ( 𝐶 → C ) MATHEMATICAL ITALIC CAPITAL C → LATIN CAPITAL LETTER C # +1D46A ; 0043 ; MA # ( 𝑪 → C ) MATHEMATICAL BOLD ITALIC CAPITAL C → LATIN CAPITAL LETTER C # +1D49E ; 0043 ; MA # ( 𝒞 → C ) MATHEMATICAL SCRIPT CAPITAL C → LATIN CAPITAL LETTER C # +1D4D2 ; 0043 ; MA # ( 𝓒 → C ) MATHEMATICAL BOLD SCRIPT CAPITAL C → LATIN CAPITAL LETTER C # +1D56E ; 0043 ; MA # ( 𝕮 → C ) MATHEMATICAL BOLD FRAKTUR CAPITAL C → LATIN CAPITAL LETTER C # +1D5A2 ; 0043 ; MA # ( 𝖢 → C ) MATHEMATICAL SANS-SERIF CAPITAL C → LATIN CAPITAL LETTER C # +1D5D6 ; 0043 ; MA # ( 𝗖 → C ) MATHEMATICAL SANS-SERIF BOLD CAPITAL C → LATIN CAPITAL LETTER C # +1D60A ; 0043 ; MA # ( 𝘊 → C ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL C → LATIN CAPITAL LETTER C # +1D63E ; 0043 ; MA # ( 𝘾 → C ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C → LATIN CAPITAL LETTER C # +1D672 ; 0043 ; MA # ( 𝙲 → C ) MATHEMATICAL MONOSPACE CAPITAL C → LATIN CAPITAL LETTER C # +03F9 ; 0043 ; MA # ( Ϲ → C ) GREEK CAPITAL LUNATE SIGMA SYMBOL → LATIN CAPITAL LETTER C # +2CA4 ; 0043 ; MA # ( Ⲥ → C ) COPTIC CAPITAL LETTER SIMA → LATIN CAPITAL LETTER C # →Ϲ→ +0421 ; 0043 ; MA # ( С → C ) CYRILLIC CAPITAL LETTER ES → LATIN CAPITAL LETTER C # +13DF ; 0043 ; MA # ( Ꮯ → C ) CHEROKEE LETTER TLI → LATIN CAPITAL LETTER C # +A4DA ; 0043 ; MA # ( ꓚ → C ) LISU LETTER CA → LATIN CAPITAL LETTER C # +102A2 ; 0043 ; MA # ( 𐊢 → C ) CARIAN LETTER D → LATIN CAPITAL LETTER C # +10302 ; 0043 ; MA # ( 𐌂 → C ) OLD ITALIC LETTER KE → LATIN CAPITAL LETTER C # +10415 ; 0043 ; MA # ( 𐐕 → C ) DESERET CAPITAL LETTER CHEE → LATIN CAPITAL LETTER C # +1051C ; 0043 ; MA # ( 𐔜 → C ) ELBASAN LETTER SHE → LATIN CAPITAL LETTER C # + +00A2 ; 0063 0338 ; MA #* ( ¢ → c̸ ) CENT SIGN → LATIN SMALL LETTER C, COMBINING LONG SOLIDUS OVERLAY # +023C ; 0063 0338 ; MA # ( ȼ → c̸ ) LATIN SMALL LETTER C WITH STROKE → LATIN SMALL LETTER C, COMBINING LONG SOLIDUS OVERLAY # →¢→ + +20A1 ; 0043 20EB ; MA #* ( ₡ → C⃫ ) COLON SIGN → LATIN CAPITAL LETTER C, COMBINING LONG DOUBLE SOLIDUS OVERLAY # + +00E7 ; 0063 0326 ; MA # ( ç → c̦ ) LATIN SMALL LETTER C WITH CEDILLA → LATIN SMALL LETTER C, COMBINING COMMA BELOW # →ҫ→→с̡→ +04AB ; 0063 0326 ; MA # ( ҫ → c̦ ) CYRILLIC SMALL LETTER ES WITH DESCENDER → LATIN SMALL LETTER C, COMBINING COMMA BELOW # →с̡→ + +00C7 ; 0043 0326 ; MA # ( Ç → C̦ ) LATIN CAPITAL LETTER C WITH CEDILLA → LATIN CAPITAL LETTER C, COMBINING COMMA BELOW # →Ҫ→→С̡→ +04AA ; 0043 0326 ; MA # ( Ҫ → C̦ ) CYRILLIC CAPITAL LETTER ES WITH DESCENDER → LATIN CAPITAL LETTER C, COMBINING COMMA BELOW # →С̡→ + +0187 ; 0043 0027 ; MA # ( Ƈ → C' ) LATIN CAPITAL LETTER C WITH HOOK → LATIN CAPITAL LETTER C, APOSTROPHE # →Cʽ→ + +2105 ; 0063 002F 006F ; MA #* ( ℅ → c/o ) CARE OF → LATIN SMALL LETTER C, SOLIDUS, LATIN SMALL LETTER O # + +2106 ; 0063 002F 0075 ; MA #* ( ℆ → c/u ) CADA UNA → LATIN SMALL LETTER C, SOLIDUS, LATIN SMALL LETTER U # + +22F4 ; A793 ; MA #* ( ⋴ → ꞓ ) SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE → LATIN SMALL LETTER C WITH BAR # →ɛ→→є→ +025B ; A793 ; MA # ( ɛ → ꞓ ) LATIN SMALL LETTER OPEN E → LATIN SMALL LETTER C WITH BAR # →є→ +03B5 ; A793 ; MA # ( ε → ꞓ ) GREEK SMALL LETTER EPSILON → LATIN SMALL LETTER C WITH BAR # →є→ +03F5 ; A793 ; MA # ( ϵ → ꞓ ) GREEK LUNATE EPSILON SYMBOL → LATIN SMALL LETTER C WITH BAR # →ε→→є→ +1D6C6 ; A793 ; MA # ( 𝛆 → ꞓ ) MATHEMATICAL BOLD SMALL EPSILON → LATIN SMALL LETTER C WITH BAR # →ε→→є→ +1D6DC ; A793 ; MA # ( 𝛜 → ꞓ ) MATHEMATICAL BOLD EPSILON SYMBOL → LATIN SMALL LETTER C WITH BAR # →ε→→є→ +1D700 ; A793 ; MA # ( 𝜀 → ꞓ ) MATHEMATICAL ITALIC SMALL EPSILON → LATIN SMALL LETTER C WITH BAR # →ε→→є→ +1D716 ; A793 ; MA # ( 𝜖 → ꞓ ) MATHEMATICAL ITALIC EPSILON SYMBOL → LATIN SMALL LETTER C WITH BAR # →ε→→є→ +1D73A ; A793 ; MA # ( 𝜺 → ꞓ ) MATHEMATICAL BOLD ITALIC SMALL EPSILON → LATIN SMALL LETTER C WITH BAR # →ε→→є→ +1D750 ; A793 ; MA # ( 𝝐 → ꞓ ) MATHEMATICAL BOLD ITALIC EPSILON SYMBOL → LATIN SMALL LETTER C WITH BAR # →ε→→є→ +1D774 ; A793 ; MA # ( 𝝴 → ꞓ ) MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON → LATIN SMALL LETTER C WITH BAR # →ε→→є→ +1D78A ; A793 ; MA # ( 𝞊 → ꞓ ) MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL → LATIN SMALL LETTER C WITH BAR # →ε→→є→ +1D7AE ; A793 ; MA # ( 𝞮 → ꞓ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON → LATIN SMALL LETTER C WITH BAR # →ε→→є→ +1D7C4 ; A793 ; MA # ( 𝟄 → ꞓ ) MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL → LATIN SMALL LETTER C WITH BAR # →ε→→є→ +2C89 ; A793 ; MA # ( ⲉ → ꞓ ) COPTIC SMALL LETTER EIE → LATIN SMALL LETTER C WITH BAR # →є→ +0454 ; A793 ; MA # ( є → ꞓ ) CYRILLIC SMALL LETTER UKRAINIAN IE → LATIN SMALL LETTER C WITH BAR # +0511 ; A793 ; MA # ( ԑ → ꞓ ) CYRILLIC SMALL LETTER REVERSED ZE → LATIN SMALL LETTER C WITH BAR # →ε→→є→ +118CE ; A793 ; MA # ( 𑣎 → ꞓ ) WARANG CITI SMALL LETTER YUJ → LATIN SMALL LETTER C WITH BAR # →ε→→є→ +10429 ; A793 ; MA # ( 𐐩 → ꞓ ) DESERET SMALL LETTER LONG E → LATIN SMALL LETTER C WITH BAR # →ɛ→→є→ + +20AC ; A792 ; MA #* ( € → Ꞓ ) EURO SIGN → LATIN CAPITAL LETTER C WITH BAR # →Є→ +2C88 ; A792 ; MA # ( Ⲉ → Ꞓ ) COPTIC CAPITAL LETTER EIE → LATIN CAPITAL LETTER C WITH BAR # →Є→ +0404 ; A792 ; MA # ( Є → Ꞓ ) CYRILLIC CAPITAL LETTER UKRAINIAN IE → LATIN CAPITAL LETTER C WITH BAR # + +2377 ; A793 0332 ; MA #* ( ⍷ → ꞓ̲ ) APL FUNCTIONAL SYMBOL EPSILON UNDERBAR → LATIN SMALL LETTER C WITH BAR, COMBINING LOW LINE # →ε̲→ + +037D ; A73F ; MA # ( ͽ → ꜿ ) GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL → LATIN SMALL LETTER REVERSED C WITH DOT # + +03FF ; A73E ; MA # ( Ͽ → Ꜿ ) GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL → LATIN CAPITAL LETTER REVERSED C WITH DOT # + +217E ; 0064 ; MA # ( ⅾ → d ) SMALL ROMAN NUMERAL FIVE HUNDRED → LATIN SMALL LETTER D # +2146 ; 0064 ; MA # ( ⅆ → d ) DOUBLE-STRUCK ITALIC SMALL D → LATIN SMALL LETTER D # +1D41D ; 0064 ; MA # ( 𝐝 → d ) MATHEMATICAL BOLD SMALL D → LATIN SMALL LETTER D # +1D451 ; 0064 ; MA # ( 𝑑 → d ) MATHEMATICAL ITALIC SMALL D → LATIN SMALL LETTER D # +1D485 ; 0064 ; MA # ( 𝒅 → d ) MATHEMATICAL BOLD ITALIC SMALL D → LATIN SMALL LETTER D # +1D4B9 ; 0064 ; MA # ( 𝒹 → d ) MATHEMATICAL SCRIPT SMALL D → LATIN SMALL LETTER D # +1D4ED ; 0064 ; MA # ( 𝓭 → d ) MATHEMATICAL BOLD SCRIPT SMALL D → LATIN SMALL LETTER D # +1D521 ; 0064 ; MA # ( 𝔡 → d ) MATHEMATICAL FRAKTUR SMALL D → LATIN SMALL LETTER D # +1D555 ; 0064 ; MA # ( 𝕕 → d ) MATHEMATICAL DOUBLE-STRUCK SMALL D → LATIN SMALL LETTER D # +1D589 ; 0064 ; MA # ( 𝖉 → d ) MATHEMATICAL BOLD FRAKTUR SMALL D → LATIN SMALL LETTER D # +1D5BD ; 0064 ; MA # ( 𝖽 → d ) MATHEMATICAL SANS-SERIF SMALL D → LATIN SMALL LETTER D # +1D5F1 ; 0064 ; MA # ( 𝗱 → d ) MATHEMATICAL SANS-SERIF BOLD SMALL D → LATIN SMALL LETTER D # +1D625 ; 0064 ; MA # ( 𝘥 → d ) MATHEMATICAL SANS-SERIF ITALIC SMALL D → LATIN SMALL LETTER D # +1D659 ; 0064 ; MA # ( 𝙙 → d ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D → LATIN SMALL LETTER D # +1D68D ; 0064 ; MA # ( 𝚍 → d ) MATHEMATICAL MONOSPACE SMALL D → LATIN SMALL LETTER D # +0501 ; 0064 ; MA # ( ԁ → d ) CYRILLIC SMALL LETTER KOMI DE → LATIN SMALL LETTER D # +13E7 ; 0064 ; MA # ( Ꮷ → d ) CHEROKEE LETTER TSU → LATIN SMALL LETTER D # +146F ; 0064 ; MA # ( ᑯ → d ) CANADIAN SYLLABICS KO → LATIN SMALL LETTER D # +A4D2 ; 0064 ; MA # ( ꓒ → d ) LISU LETTER PHA → LATIN SMALL LETTER D # + +216E ; 0044 ; MA # ( Ⅾ → D ) ROMAN NUMERAL FIVE HUNDRED → LATIN CAPITAL LETTER D # +2145 ; 0044 ; MA # ( ⅅ → D ) DOUBLE-STRUCK ITALIC CAPITAL D → LATIN CAPITAL LETTER D # +1D403 ; 0044 ; MA # ( 𝐃 → D ) MATHEMATICAL BOLD CAPITAL D → LATIN CAPITAL LETTER D # +1D437 ; 0044 ; MA # ( 𝐷 → D ) MATHEMATICAL ITALIC CAPITAL D → LATIN CAPITAL LETTER D # +1D46B ; 0044 ; MA # ( 𝑫 → D ) MATHEMATICAL BOLD ITALIC CAPITAL D → LATIN CAPITAL LETTER D # +1D49F ; 0044 ; MA # ( 𝒟 → D ) MATHEMATICAL SCRIPT CAPITAL D → LATIN CAPITAL LETTER D # +1D4D3 ; 0044 ; MA # ( 𝓓 → D ) MATHEMATICAL BOLD SCRIPT CAPITAL D → LATIN CAPITAL LETTER D # +1D507 ; 0044 ; MA # ( 𝔇 → D ) MATHEMATICAL FRAKTUR CAPITAL D → LATIN CAPITAL LETTER D # +1D53B ; 0044 ; MA # ( 𝔻 → D ) MATHEMATICAL DOUBLE-STRUCK CAPITAL D → LATIN CAPITAL LETTER D # +1D56F ; 0044 ; MA # ( 𝕯 → D ) MATHEMATICAL BOLD FRAKTUR CAPITAL D → LATIN CAPITAL LETTER D # +1D5A3 ; 0044 ; MA # ( 𝖣 → D ) MATHEMATICAL SANS-SERIF CAPITAL D → LATIN CAPITAL LETTER D # +1D5D7 ; 0044 ; MA # ( 𝗗 → D ) MATHEMATICAL SANS-SERIF BOLD CAPITAL D → LATIN CAPITAL LETTER D # +1D60B ; 0044 ; MA # ( 𝘋 → D ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL D → LATIN CAPITAL LETTER D # +1D63F ; 0044 ; MA # ( 𝘿 → D ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D → LATIN CAPITAL LETTER D # +1D673 ; 0044 ; MA # ( 𝙳 → D ) MATHEMATICAL MONOSPACE CAPITAL D → LATIN CAPITAL LETTER D # +13A0 ; 0044 ; MA # ( Ꭰ → D ) CHEROKEE LETTER A → LATIN CAPITAL LETTER D # +15DE ; 0044 ; MA # ( ᗞ → D ) CANADIAN SYLLABICS CARRIER THE → LATIN CAPITAL LETTER D # +15EA ; 0044 ; MA # ( ᗪ → D ) CANADIAN SYLLABICS CARRIER PE → LATIN CAPITAL LETTER D # →ᗞ→ +A4D3 ; 0044 ; MA # ( ꓓ → D ) LISU LETTER DA → LATIN CAPITAL LETTER D # + +0257 ; 0064 0314 ; MA # ( ɗ → d̔ ) LATIN SMALL LETTER D WITH HOOK → LATIN SMALL LETTER D, COMBINING REVERSED COMMA ABOVE # + +0256 ; 0064 0328 ; MA # ( ɖ → d̨ ) LATIN SMALL LETTER D WITH TAIL → LATIN SMALL LETTER D, COMBINING OGONEK # →d̢→ + +018C ; 0064 0304 ; MA # ( ƌ → d̄ ) LATIN SMALL LETTER D WITH TOPBAR → LATIN SMALL LETTER D, COMBINING MACRON # + +0111 ; 0064 0335 ; MA # ( đ → d̵ ) LATIN SMALL LETTER D WITH STROKE → LATIN SMALL LETTER D, COMBINING SHORT STROKE OVERLAY # + +0110 ; 0044 0335 ; MA # ( Đ → D̵ ) LATIN CAPITAL LETTER D WITH STROKE → LATIN CAPITAL LETTER D, COMBINING SHORT STROKE OVERLAY # +00D0 ; 0044 0335 ; MA # ( Ð → D̵ ) LATIN CAPITAL LETTER ETH → LATIN CAPITAL LETTER D, COMBINING SHORT STROKE OVERLAY # →Đ→ +0189 ; 0044 0335 ; MA # ( Ɖ → D̵ ) LATIN CAPITAL LETTER AFRICAN D → LATIN CAPITAL LETTER D, COMBINING SHORT STROKE OVERLAY # →Đ→ + +20AB ; 0064 0335 0331 ; MA #* ( ₫ → ḏ̵ ) DONG SIGN → LATIN SMALL LETTER D, COMBINING SHORT STROKE OVERLAY, COMBINING MACRON BELOW # →đ̱→ + +A77A ; A779 ; MA # ( ꝺ → Ꝺ ) LATIN SMALL LETTER INSULAR D → LATIN CAPITAL LETTER INSULAR D # + +147B ; 0064 00B7 ; MA # ( ᑻ → d· ) CANADIAN SYLLABICS WEST-CREE KWO → LATIN SMALL LETTER D, MIDDLE DOT # →ᑯᐧ→ + +1487 ; 0064 0027 ; MA # ( ᒇ → d' ) CANADIAN SYLLABICS SOUTH-SLAVEY KOH → LATIN SMALL LETTER D, APOSTROPHE # →ᑯᑊ→ + +02A4 ; 0064 021D ; MA # ( ʤ → dȝ ) LATIN SMALL LETTER DEZH DIGRAPH → LATIN SMALL LETTER D, LATIN SMALL LETTER YOGH # →dʒ→ + +01F3 ; 0064 007A ; MA # ( dz → dz ) LATIN SMALL LETTER DZ → LATIN SMALL LETTER D, LATIN SMALL LETTER Z # +02A3 ; 0064 007A ; MA # ( ʣ → dz ) LATIN SMALL LETTER DZ DIGRAPH → LATIN SMALL LETTER D, LATIN SMALL LETTER Z # + +01F2 ; 0044 007A ; MA # ( Dz → Dz ) LATIN CAPITAL LETTER D WITH SMALL LETTER Z → LATIN CAPITAL LETTER D, LATIN SMALL LETTER Z # + +01F1 ; 0044 005A ; MA # ( DZ → DZ ) LATIN CAPITAL LETTER DZ → LATIN CAPITAL LETTER D, LATIN CAPITAL LETTER Z # + +01C6 ; 0064 017E ; MA # ( dž → dž ) LATIN SMALL LETTER DZ WITH CARON → LATIN SMALL LETTER D, LATIN SMALL LETTER Z WITH CARON # + +01C5 ; 0044 017E ; MA # ( Dž → Dž ) LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON → LATIN CAPITAL LETTER D, LATIN SMALL LETTER Z WITH CARON # + +01C4 ; 0044 017D ; MA # ( DŽ → DŽ ) LATIN CAPITAL LETTER DZ WITH CARON → LATIN CAPITAL LETTER D, LATIN CAPITAL LETTER Z WITH CARON # + +02A5 ; 0064 0291 ; MA # ( ʥ → dʑ ) LATIN SMALL LETTER DZ DIGRAPH WITH CURL → LATIN SMALL LETTER D, LATIN SMALL LETTER Z WITH CURL # + +2E39 ; 1E9F ; MA #* ( ⸹ → ẟ ) TOP HALF SECTION SIGN → LATIN SMALL LETTER DELTA # →δ→ +03B4 ; 1E9F ; MA # ( δ → ẟ ) GREEK SMALL LETTER DELTA → LATIN SMALL LETTER DELTA # +1D6C5 ; 1E9F ; MA # ( 𝛅 → ẟ ) MATHEMATICAL BOLD SMALL DELTA → LATIN SMALL LETTER DELTA # →δ→ +1D6FF ; 1E9F ; MA # ( 𝛿 → ẟ ) MATHEMATICAL ITALIC SMALL DELTA → LATIN SMALL LETTER DELTA # →δ→ +1D739 ; 1E9F ; MA # ( 𝜹 → ẟ ) MATHEMATICAL BOLD ITALIC SMALL DELTA → LATIN SMALL LETTER DELTA # →δ→ +1D773 ; 1E9F ; MA # ( 𝝳 → ẟ ) MATHEMATICAL SANS-SERIF BOLD SMALL DELTA → LATIN SMALL LETTER DELTA # →δ→ +1D7AD ; 1E9F ; MA # ( 𝞭 → ẟ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA → LATIN SMALL LETTER DELTA # →δ→ +056E ; 1E9F ; MA # ( ծ → ẟ ) ARMENIAN SMALL LETTER CA → LATIN SMALL LETTER DELTA # →δ→ +1577 ; 1E9F ; MA # ( ᕷ → ẟ ) CANADIAN SYLLABICS NUNAVIK HO → LATIN SMALL LETTER DELTA # →δ→ + +212E ; 0065 ; MA # ( ℮ → e ) ESTIMATED SYMBOL → LATIN SMALL LETTER E # +FF45 ; 0065 ; MA # ( e → e ) FULLWIDTH LATIN SMALL LETTER E → LATIN SMALL LETTER E # →е→ +212F ; 0065 ; MA # ( ℯ → e ) SCRIPT SMALL E → LATIN SMALL LETTER E # +2147 ; 0065 ; MA # ( ⅇ → e ) DOUBLE-STRUCK ITALIC SMALL E → LATIN SMALL LETTER E # +1D41E ; 0065 ; MA # ( 𝐞 → e ) MATHEMATICAL BOLD SMALL E → LATIN SMALL LETTER E # +1D452 ; 0065 ; MA # ( 𝑒 → e ) MATHEMATICAL ITALIC SMALL E → LATIN SMALL LETTER E # +1D486 ; 0065 ; MA # ( 𝒆 → e ) MATHEMATICAL BOLD ITALIC SMALL E → LATIN SMALL LETTER E # +1D4EE ; 0065 ; MA # ( 𝓮 → e ) MATHEMATICAL BOLD SCRIPT SMALL E → LATIN SMALL LETTER E # +1D522 ; 0065 ; MA # ( 𝔢 → e ) MATHEMATICAL FRAKTUR SMALL E → LATIN SMALL LETTER E # +1D556 ; 0065 ; MA # ( 𝕖 → e ) MATHEMATICAL DOUBLE-STRUCK SMALL E → LATIN SMALL LETTER E # +1D58A ; 0065 ; MA # ( 𝖊 → e ) MATHEMATICAL BOLD FRAKTUR SMALL E → LATIN SMALL LETTER E # +1D5BE ; 0065 ; MA # ( 𝖾 → e ) MATHEMATICAL SANS-SERIF SMALL E → LATIN SMALL LETTER E # +1D5F2 ; 0065 ; MA # ( 𝗲 → e ) MATHEMATICAL SANS-SERIF BOLD SMALL E → LATIN SMALL LETTER E # +1D626 ; 0065 ; MA # ( 𝘦 → e ) MATHEMATICAL SANS-SERIF ITALIC SMALL E → LATIN SMALL LETTER E # +1D65A ; 0065 ; MA # ( 𝙚 → e ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E → LATIN SMALL LETTER E # +1D68E ; 0065 ; MA # ( 𝚎 → e ) MATHEMATICAL MONOSPACE SMALL E → LATIN SMALL LETTER E # +AB32 ; 0065 ; MA # ( ꬲ → e ) LATIN SMALL LETTER BLACKLETTER E → LATIN SMALL LETTER E # +0435 ; 0065 ; MA # ( е → e ) CYRILLIC SMALL LETTER IE → LATIN SMALL LETTER E # +04BD ; 0065 ; MA # ( ҽ → e ) CYRILLIC SMALL LETTER ABKHASIAN CHE → LATIN SMALL LETTER E # + +22FF ; 0045 ; MA #* ( ⋿ → E ) Z NOTATION BAG MEMBERSHIP → LATIN CAPITAL LETTER E # +FF25 ; 0045 ; MA # ( E → E ) FULLWIDTH LATIN CAPITAL LETTER E → LATIN CAPITAL LETTER E # →Ε→ +2130 ; 0045 ; MA # ( ℰ → E ) SCRIPT CAPITAL E → LATIN CAPITAL LETTER E # +1D404 ; 0045 ; MA # ( 𝐄 → E ) MATHEMATICAL BOLD CAPITAL E → LATIN CAPITAL LETTER E # +1D438 ; 0045 ; MA # ( 𝐸 → E ) MATHEMATICAL ITALIC CAPITAL E → LATIN CAPITAL LETTER E # +1D46C ; 0045 ; MA # ( 𝑬 → E ) MATHEMATICAL BOLD ITALIC CAPITAL E → LATIN CAPITAL LETTER E # +1D4D4 ; 0045 ; MA # ( 𝓔 → E ) MATHEMATICAL BOLD SCRIPT CAPITAL E → LATIN CAPITAL LETTER E # +1D508 ; 0045 ; MA # ( 𝔈 → E ) MATHEMATICAL FRAKTUR CAPITAL E → LATIN CAPITAL LETTER E # +1D53C ; 0045 ; MA # ( 𝔼 → E ) MATHEMATICAL DOUBLE-STRUCK CAPITAL E → LATIN CAPITAL LETTER E # +1D570 ; 0045 ; MA # ( 𝕰 → E ) MATHEMATICAL BOLD FRAKTUR CAPITAL E → LATIN CAPITAL LETTER E # +1D5A4 ; 0045 ; MA # ( 𝖤 → E ) MATHEMATICAL SANS-SERIF CAPITAL E → LATIN CAPITAL LETTER E # +1D5D8 ; 0045 ; MA # ( 𝗘 → E ) MATHEMATICAL SANS-SERIF BOLD CAPITAL E → LATIN CAPITAL LETTER E # +1D60C ; 0045 ; MA # ( 𝘌 → E ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL E → LATIN CAPITAL LETTER E # +1D640 ; 0045 ; MA # ( 𝙀 → E ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E → LATIN CAPITAL LETTER E # +1D674 ; 0045 ; MA # ( 𝙴 → E ) MATHEMATICAL MONOSPACE CAPITAL E → LATIN CAPITAL LETTER E # +0395 ; 0045 ; MA # ( Ε → E ) GREEK CAPITAL LETTER EPSILON → LATIN CAPITAL LETTER E # +1D6AC ; 0045 ; MA # ( 𝚬 → E ) MATHEMATICAL BOLD CAPITAL EPSILON → LATIN CAPITAL LETTER E # →𝐄→ +1D6E6 ; 0045 ; MA # ( 𝛦 → E ) MATHEMATICAL ITALIC CAPITAL EPSILON → LATIN CAPITAL LETTER E # →Ε→ +1D720 ; 0045 ; MA # ( 𝜠 → E ) MATHEMATICAL BOLD ITALIC CAPITAL EPSILON → LATIN CAPITAL LETTER E # →Ε→ +1D75A ; 0045 ; MA # ( 𝝚 → E ) MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON → LATIN CAPITAL LETTER E # →Ε→ +1D794 ; 0045 ; MA # ( 𝞔 → E ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON → LATIN CAPITAL LETTER E # →Ε→ +0415 ; 0045 ; MA # ( Е → E ) CYRILLIC CAPITAL LETTER IE → LATIN CAPITAL LETTER E # +2D39 ; 0045 ; MA # ( ⴹ → E ) TIFINAGH LETTER YADD → LATIN CAPITAL LETTER E # +13AC ; 0045 ; MA # ( Ꭼ → E ) CHEROKEE LETTER GV → LATIN CAPITAL LETTER E # +A4F0 ; 0045 ; MA # ( ꓰ → E ) LISU LETTER E → LATIN CAPITAL LETTER E # +118A6 ; 0045 ; MA # ( 𑢦 → E ) WARANG CITI CAPITAL LETTER II → LATIN CAPITAL LETTER E # +118AE ; 0045 ; MA # ( 𑢮 → E ) WARANG CITI CAPITAL LETTER YUJ → LATIN CAPITAL LETTER E # +10286 ; 0045 ; MA # ( 𐊆 → E ) LYCIAN LETTER I → LATIN CAPITAL LETTER E # + +011B ; 0115 ; MA # ( ě → ĕ ) LATIN SMALL LETTER E WITH CARON → LATIN SMALL LETTER E WITH BREVE # + +011A ; 0114 ; MA # ( Ě → Ĕ ) LATIN CAPITAL LETTER E WITH CARON → LATIN CAPITAL LETTER E WITH BREVE # + +0247 ; 0065 0338 ; MA # ( ɇ → e̸ ) LATIN SMALL LETTER E WITH STROKE → LATIN SMALL LETTER E, COMBINING LONG SOLIDUS OVERLAY # →e̷→ + +0246 ; 0045 0338 ; MA # ( Ɇ → E̸ ) LATIN CAPITAL LETTER E WITH STROKE → LATIN CAPITAL LETTER E, COMBINING LONG SOLIDUS OVERLAY # + +04BF ; 0065 0328 ; MA # ( ҿ → ę ) CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER → LATIN SMALL LETTER E, COMBINING OGONEK # →ҽ̢→ + +0259 ; 01DD ; MA # ( ə → ǝ ) LATIN SMALL LETTER SCHWA → LATIN SMALL LETTER TURNED E # +04D9 ; 01DD ; MA # ( ә → ǝ ) CYRILLIC SMALL LETTER SCHWA → LATIN SMALL LETTER TURNED E # + +2203 ; 018E ; MA #* ( ∃ → Ǝ ) THERE EXISTS → LATIN CAPITAL LETTER REVERSED E # +2D3A ; 018E ; MA # ( ⴺ → Ǝ ) TIFINAGH LETTER YADDH → LATIN CAPITAL LETTER REVERSED E # +A4F1 ; 018E ; MA # ( ꓱ → Ǝ ) LISU LETTER EU → LATIN CAPITAL LETTER REVERSED E # + +025A ; 01DD 02DE ; MA # ( ɚ → ǝ˞ ) LATIN SMALL LETTER SCHWA WITH HOOK → LATIN SMALL LETTER TURNED E, MODIFIER LETTER RHOTIC HOOK # →ə˞→ + +1D14 ; 01DD 006F ; MA # ( ᴔ → ǝo ) LATIN SMALL LETTER TURNED OE → LATIN SMALL LETTER TURNED E, LATIN SMALL LETTER O # →əo→ + +04D8 ; 018F ; MA # ( Ә → Ə ) CYRILLIC CAPITAL LETTER SCHWA → LATIN CAPITAL LETTER SCHWA # + +2107 ; 0190 ; MA # ( ℇ → Ɛ ) EULER CONSTANT → LATIN CAPITAL LETTER OPEN E # +0510 ; 0190 ; MA # ( Ԑ → Ɛ ) CYRILLIC CAPITAL LETTER REVERSED ZE → LATIN CAPITAL LETTER OPEN E # +13CB ; 0190 ; MA # ( Ꮛ → Ɛ ) CHEROKEE LETTER QUV → LATIN CAPITAL LETTER OPEN E # +10401 ; 0190 ; MA # ( 𐐁 → Ɛ ) DESERET CAPITAL LETTER LONG E → LATIN CAPITAL LETTER OPEN E # + +1D9F ; 1D4B ; MA # ( ᶟ → ᵋ ) MODIFIER LETTER SMALL REVERSED OPEN E → MODIFIER LETTER SMALL OPEN E # + +1D08 ; 025C ; MA # ( ᴈ → ɜ ) LATIN SMALL LETTER TURNED OPEN E → LATIN SMALL LETTER REVERSED OPEN E # +0437 ; 025C ; MA # ( з → ɜ ) CYRILLIC SMALL LETTER ZE → LATIN SMALL LETTER REVERSED OPEN E # + +0499 ; 025C 0326 ; MA # ( ҙ → ɜ̦ ) CYRILLIC SMALL LETTER ZE WITH DESCENDER → LATIN SMALL LETTER REVERSED OPEN E, COMBINING COMMA BELOW # →з̡→ + +A79D ; 025E ; MA # ( ꞝ → ɞ ) LATIN SMALL LETTER VOLAPUK OE → LATIN SMALL LETTER CLOSED REVERSED OPEN E # +10442 ; 025E ; MA # ( 𐑂 → ɞ ) DESERET SMALL LETTER VEE → LATIN SMALL LETTER CLOSED REVERSED OPEN E # + +1042A ; 029A ; MA # ( 𐐪 → ʚ ) DESERET SMALL LETTER LONG A → LATIN SMALL LETTER CLOSED OPEN E # + +1D41F ; 0066 ; MA # ( 𝐟 → f ) MATHEMATICAL BOLD SMALL F → LATIN SMALL LETTER F # +1D453 ; 0066 ; MA # ( 𝑓 → f ) MATHEMATICAL ITALIC SMALL F → LATIN SMALL LETTER F # +1D487 ; 0066 ; MA # ( 𝒇 → f ) MATHEMATICAL BOLD ITALIC SMALL F → LATIN SMALL LETTER F # +1D4BB ; 0066 ; MA # ( 𝒻 → f ) MATHEMATICAL SCRIPT SMALL F → LATIN SMALL LETTER F # +1D4EF ; 0066 ; MA # ( 𝓯 → f ) MATHEMATICAL BOLD SCRIPT SMALL F → LATIN SMALL LETTER F # +1D523 ; 0066 ; MA # ( 𝔣 → f ) MATHEMATICAL FRAKTUR SMALL F → LATIN SMALL LETTER F # +1D557 ; 0066 ; MA # ( 𝕗 → f ) MATHEMATICAL DOUBLE-STRUCK SMALL F → LATIN SMALL LETTER F # +1D58B ; 0066 ; MA # ( 𝖋 → f ) MATHEMATICAL BOLD FRAKTUR SMALL F → LATIN SMALL LETTER F # +1D5BF ; 0066 ; MA # ( 𝖿 → f ) MATHEMATICAL SANS-SERIF SMALL F → LATIN SMALL LETTER F # +1D5F3 ; 0066 ; MA # ( 𝗳 → f ) MATHEMATICAL SANS-SERIF BOLD SMALL F → LATIN SMALL LETTER F # +1D627 ; 0066 ; MA # ( 𝘧 → f ) MATHEMATICAL SANS-SERIF ITALIC SMALL F → LATIN SMALL LETTER F # +1D65B ; 0066 ; MA # ( 𝙛 → f ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F → LATIN SMALL LETTER F # +1D68F ; 0066 ; MA # ( 𝚏 → f ) MATHEMATICAL MONOSPACE SMALL F → LATIN SMALL LETTER F # +AB35 ; 0066 ; MA # ( ꬵ → f ) LATIN SMALL LETTER LENIS F → LATIN SMALL LETTER F # +A799 ; 0066 ; MA # ( ꞙ → f ) LATIN SMALL LETTER F WITH STROKE → LATIN SMALL LETTER F # +017F ; 0066 ; MA # ( ſ → f ) LATIN SMALL LETTER LONG S → LATIN SMALL LETTER F # +1E9D ; 0066 ; MA # ( ẝ → f ) LATIN SMALL LETTER LONG S WITH HIGH STROKE → LATIN SMALL LETTER F # +0584 ; 0066 ; MA # ( ք → f ) ARMENIAN SMALL LETTER KEH → LATIN SMALL LETTER F # + +2131 ; 0046 ; MA # ( ℱ → F ) SCRIPT CAPITAL F → LATIN CAPITAL LETTER F # +1D405 ; 0046 ; MA # ( 𝐅 → F ) MATHEMATICAL BOLD CAPITAL F → LATIN CAPITAL LETTER F # +1D439 ; 0046 ; MA # ( 𝐹 → F ) MATHEMATICAL ITALIC CAPITAL F → LATIN CAPITAL LETTER F # +1D46D ; 0046 ; MA # ( 𝑭 → F ) MATHEMATICAL BOLD ITALIC CAPITAL F → LATIN CAPITAL LETTER F # +1D4D5 ; 0046 ; MA # ( 𝓕 → F ) MATHEMATICAL BOLD SCRIPT CAPITAL F → LATIN CAPITAL LETTER F # +1D509 ; 0046 ; MA # ( 𝔉 → F ) MATHEMATICAL FRAKTUR CAPITAL F → LATIN CAPITAL LETTER F # +1D53D ; 0046 ; MA # ( 𝔽 → F ) MATHEMATICAL DOUBLE-STRUCK CAPITAL F → LATIN CAPITAL LETTER F # +1D571 ; 0046 ; MA # ( 𝕱 → F ) MATHEMATICAL BOLD FRAKTUR CAPITAL F → LATIN CAPITAL LETTER F # +1D5A5 ; 0046 ; MA # ( 𝖥 → F ) MATHEMATICAL SANS-SERIF CAPITAL F → LATIN CAPITAL LETTER F # +1D5D9 ; 0046 ; MA # ( 𝗙 → F ) MATHEMATICAL SANS-SERIF BOLD CAPITAL F → LATIN CAPITAL LETTER F # +1D60D ; 0046 ; MA # ( 𝘍 → F ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL F → LATIN CAPITAL LETTER F # +1D641 ; 0046 ; MA # ( 𝙁 → F ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F → LATIN CAPITAL LETTER F # +1D675 ; 0046 ; MA # ( 𝙵 → F ) MATHEMATICAL MONOSPACE CAPITAL F → LATIN CAPITAL LETTER F # +A798 ; 0046 ; MA # ( Ꞙ → F ) LATIN CAPITAL LETTER F WITH STROKE → LATIN CAPITAL LETTER F # +03DC ; 0046 ; MA # ( Ϝ → F ) GREEK LETTER DIGAMMA → LATIN CAPITAL LETTER F # +1D7CA ; 0046 ; MA # ( 𝟊 → F ) MATHEMATICAL BOLD CAPITAL DIGAMMA → LATIN CAPITAL LETTER F # →Ϝ→ +15B4 ; 0046 ; MA # ( ᖴ → F ) CANADIAN SYLLABICS BLACKFOOT WE → LATIN CAPITAL LETTER F # +A4DD ; 0046 ; MA # ( ꓝ → F ) LISU LETTER TSA → LATIN CAPITAL LETTER F # +118C2 ; 0046 ; MA # ( 𑣂 → F ) WARANG CITI SMALL LETTER WI → LATIN CAPITAL LETTER F # +118A2 ; 0046 ; MA # ( 𑢢 → F ) WARANG CITI CAPITAL LETTER WI → LATIN CAPITAL LETTER F # +10287 ; 0046 ; MA # ( 𐊇 → F ) LYCIAN LETTER W → LATIN CAPITAL LETTER F # +102A5 ; 0046 ; MA # ( 𐊥 → F ) CARIAN LETTER R → LATIN CAPITAL LETTER F # +10525 ; 0046 ; MA # ( 𐔥 → F ) ELBASAN LETTER GHE → LATIN CAPITAL LETTER F # + +0192 ; 0066 0326 ; MA # ( ƒ → f̦ ) LATIN SMALL LETTER F WITH HOOK → LATIN SMALL LETTER F, COMBINING COMMA BELOW # →f̡→ + +0191 ; 0046 0326 ; MA # ( Ƒ → F̦ ) LATIN CAPITAL LETTER F WITH HOOK → LATIN CAPITAL LETTER F, COMBINING COMMA BELOW # →F̡→ + +1D6E ; 0066 0334 ; MA # ( ᵮ → f̴ ) LATIN SMALL LETTER F WITH MIDDLE TILDE → LATIN SMALL LETTER F, COMBINING TILDE OVERLAY # + +213B ; 0046 0041 0058 ; MA #* ( ℻ → FAX ) FACSIMILE SIGN → LATIN CAPITAL LETTER F, LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER X # + +FB00 ; 0066 0066 ; MA # ( ff → ff ) LATIN SMALL LIGATURE FF → LATIN SMALL LETTER F, LATIN SMALL LETTER F # + +FB03 ; 0066 0066 0069 ; MA # ( ffi → ffi ) LATIN SMALL LIGATURE FFI → LATIN SMALL LETTER F, LATIN SMALL LETTER F, LATIN SMALL LETTER I # + +FB04 ; 0066 0066 006C ; MA # ( ffl → ffl ) LATIN SMALL LIGATURE FFL → LATIN SMALL LETTER F, LATIN SMALL LETTER F, LATIN SMALL LETTER L # + +FB01 ; 0066 0069 ; MA # ( fi → fi ) LATIN SMALL LIGATURE FI → LATIN SMALL LETTER F, LATIN SMALL LETTER I # + +FB02 ; 0066 006C ; MA # ( fl → fl ) LATIN SMALL LIGATURE FL → LATIN SMALL LETTER F, LATIN SMALL LETTER L # + +02A9 ; 0066 014B ; MA # ( ʩ → fŋ ) LATIN SMALL LETTER FENG DIGRAPH → LATIN SMALL LETTER F, LATIN SMALL LETTER ENG # + +15B5 ; 2132 ; MA # ( ᖵ → Ⅎ ) CANADIAN SYLLABICS BLACKFOOT WI → TURNED CAPITAL F # +A4DE ; 2132 ; MA # ( ꓞ → Ⅎ ) LISU LETTER TSHA → TURNED CAPITAL F # + +15B7 ; A7FB ; MA # ( ᖷ → ꟻ ) CANADIAN SYLLABICS BLACKFOOT WA → LATIN EPIGRAPHIC LETTER REVERSED F # + +FF47 ; 0067 ; MA # ( g → g ) FULLWIDTH LATIN SMALL LETTER G → LATIN SMALL LETTER G # →ɡ→ +210A ; 0067 ; MA # ( ℊ → g ) SCRIPT SMALL G → LATIN SMALL LETTER G # +1D420 ; 0067 ; MA # ( 𝐠 → g ) MATHEMATICAL BOLD SMALL G → LATIN SMALL LETTER G # +1D454 ; 0067 ; MA # ( 𝑔 → g ) MATHEMATICAL ITALIC SMALL G → LATIN SMALL LETTER G # +1D488 ; 0067 ; MA # ( 𝒈 → g ) MATHEMATICAL BOLD ITALIC SMALL G → LATIN SMALL LETTER G # +1D4F0 ; 0067 ; MA # ( 𝓰 → g ) MATHEMATICAL BOLD SCRIPT SMALL G → LATIN SMALL LETTER G # +1D524 ; 0067 ; MA # ( 𝔤 → g ) MATHEMATICAL FRAKTUR SMALL G → LATIN SMALL LETTER G # +1D558 ; 0067 ; MA # ( 𝕘 → g ) MATHEMATICAL DOUBLE-STRUCK SMALL G → LATIN SMALL LETTER G # +1D58C ; 0067 ; MA # ( 𝖌 → g ) MATHEMATICAL BOLD FRAKTUR SMALL G → LATIN SMALL LETTER G # +1D5C0 ; 0067 ; MA # ( 𝗀 → g ) MATHEMATICAL SANS-SERIF SMALL G → LATIN SMALL LETTER G # +1D5F4 ; 0067 ; MA # ( 𝗴 → g ) MATHEMATICAL SANS-SERIF BOLD SMALL G → LATIN SMALL LETTER G # +1D628 ; 0067 ; MA # ( 𝘨 → g ) MATHEMATICAL SANS-SERIF ITALIC SMALL G → LATIN SMALL LETTER G # +1D65C ; 0067 ; MA # ( 𝙜 → g ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G → LATIN SMALL LETTER G # +1D690 ; 0067 ; MA # ( 𝚐 → g ) MATHEMATICAL MONOSPACE SMALL G → LATIN SMALL LETTER G # +0261 ; 0067 ; MA # ( ɡ → g ) LATIN SMALL LETTER SCRIPT G → LATIN SMALL LETTER G # +1D83 ; 0067 ; MA # ( ᶃ → g ) LATIN SMALL LETTER G WITH PALATAL HOOK → LATIN SMALL LETTER G # +018D ; 0067 ; MA # ( ƍ → g ) LATIN SMALL LETTER TURNED DELTA → LATIN SMALL LETTER G # +0581 ; 0067 ; MA # ( ց → g ) ARMENIAN SMALL LETTER CO → LATIN SMALL LETTER G # + +1D406 ; 0047 ; MA # ( 𝐆 → G ) MATHEMATICAL BOLD CAPITAL G → LATIN CAPITAL LETTER G # +1D43A ; 0047 ; MA # ( 𝐺 → G ) MATHEMATICAL ITALIC CAPITAL G → LATIN CAPITAL LETTER G # +1D46E ; 0047 ; MA # ( 𝑮 → G ) MATHEMATICAL BOLD ITALIC CAPITAL G → LATIN CAPITAL LETTER G # +1D4A2 ; 0047 ; MA # ( 𝒢 → G ) MATHEMATICAL SCRIPT CAPITAL G → LATIN CAPITAL LETTER G # +1D4D6 ; 0047 ; MA # ( 𝓖 → G ) MATHEMATICAL BOLD SCRIPT CAPITAL G → LATIN CAPITAL LETTER G # +1D50A ; 0047 ; MA # ( 𝔊 → G ) MATHEMATICAL FRAKTUR CAPITAL G → LATIN CAPITAL LETTER G # +1D53E ; 0047 ; MA # ( 𝔾 → G ) MATHEMATICAL DOUBLE-STRUCK CAPITAL G → LATIN CAPITAL LETTER G # +1D572 ; 0047 ; MA # ( 𝕲 → G ) MATHEMATICAL BOLD FRAKTUR CAPITAL G → LATIN CAPITAL LETTER G # +1D5A6 ; 0047 ; MA # ( 𝖦 → G ) MATHEMATICAL SANS-SERIF CAPITAL G → LATIN CAPITAL LETTER G # +1D5DA ; 0047 ; MA # ( 𝗚 → G ) MATHEMATICAL SANS-SERIF BOLD CAPITAL G → LATIN CAPITAL LETTER G # +1D60E ; 0047 ; MA # ( 𝘎 → G ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL G → LATIN CAPITAL LETTER G # +1D642 ; 0047 ; MA # ( 𝙂 → G ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G → LATIN CAPITAL LETTER G # +1D676 ; 0047 ; MA # ( 𝙶 → G ) MATHEMATICAL MONOSPACE CAPITAL G → LATIN CAPITAL LETTER G # +050C ; 0047 ; MA # ( Ԍ → G ) CYRILLIC CAPITAL LETTER KOMI SJE → LATIN CAPITAL LETTER G # +13C0 ; 0047 ; MA # ( Ꮐ → G ) CHEROKEE LETTER NAH → LATIN CAPITAL LETTER G # +13F3 ; 0047 ; MA # ( Ᏻ → G ) CHEROKEE LETTER YU → LATIN CAPITAL LETTER G # +A4D6 ; 0047 ; MA # ( ꓖ → G ) LISU LETTER GA → LATIN CAPITAL LETTER G # + +1DA2 ; 1D4D ; MA # ( ᶢ → ᵍ ) MODIFIER LETTER SMALL SCRIPT G → MODIFIER LETTER SMALL G # + +0260 ; 0067 0314 ; MA # ( ɠ → g̔ ) LATIN SMALL LETTER G WITH HOOK → LATIN SMALL LETTER G, COMBINING REVERSED COMMA ABOVE # + +01E7 ; 011F ; MA # ( ǧ → ğ ) LATIN SMALL LETTER G WITH CARON → LATIN SMALL LETTER G WITH BREVE # + +01E6 ; 011E ; MA # ( Ǧ → Ğ ) LATIN CAPITAL LETTER G WITH CARON → LATIN CAPITAL LETTER G WITH BREVE # + +01F5 ; 0123 ; MA # ( ǵ → ģ ) LATIN SMALL LETTER G WITH ACUTE → LATIN SMALL LETTER G WITH CEDILLA # + +01E5 ; 0067 0335 ; MA # ( ǥ → g̵ ) LATIN SMALL LETTER G WITH STROKE → LATIN SMALL LETTER G, COMBINING SHORT STROKE OVERLAY # + +01E4 ; 0047 0335 ; MA # ( Ǥ → G̵ ) LATIN CAPITAL LETTER G WITH STROKE → LATIN CAPITAL LETTER G, COMBINING SHORT STROKE OVERLAY # + +0193 ; 0047 0027 ; MA # ( Ɠ → G' ) LATIN CAPITAL LETTER G WITH HOOK → LATIN CAPITAL LETTER G, APOSTROPHE # →Gʽ→ + +050D ; 0262 ; MA # ( ԍ → ɢ ) CYRILLIC SMALL LETTER KOMI SJE → LATIN LETTER SMALL CAPITAL G # + +FF48 ; 0068 ; MA # ( h → h ) FULLWIDTH LATIN SMALL LETTER H → LATIN SMALL LETTER H # →һ→ +210E ; 0068 ; MA # ( ℎ → h ) PLANCK CONSTANT → LATIN SMALL LETTER H # +1D421 ; 0068 ; MA # ( 𝐡 → h ) MATHEMATICAL BOLD SMALL H → LATIN SMALL LETTER H # +1D489 ; 0068 ; MA # ( 𝒉 → h ) MATHEMATICAL BOLD ITALIC SMALL H → LATIN SMALL LETTER H # +1D4BD ; 0068 ; MA # ( 𝒽 → h ) MATHEMATICAL SCRIPT SMALL H → LATIN SMALL LETTER H # +1D4F1 ; 0068 ; MA # ( 𝓱 → h ) MATHEMATICAL BOLD SCRIPT SMALL H → LATIN SMALL LETTER H # +1D525 ; 0068 ; MA # ( 𝔥 → h ) MATHEMATICAL FRAKTUR SMALL H → LATIN SMALL LETTER H # +1D559 ; 0068 ; MA # ( 𝕙 → h ) MATHEMATICAL DOUBLE-STRUCK SMALL H → LATIN SMALL LETTER H # +1D58D ; 0068 ; MA # ( 𝖍 → h ) MATHEMATICAL BOLD FRAKTUR SMALL H → LATIN SMALL LETTER H # +1D5C1 ; 0068 ; MA # ( 𝗁 → h ) MATHEMATICAL SANS-SERIF SMALL H → LATIN SMALL LETTER H # +1D5F5 ; 0068 ; MA # ( 𝗵 → h ) MATHEMATICAL SANS-SERIF BOLD SMALL H → LATIN SMALL LETTER H # +1D629 ; 0068 ; MA # ( 𝘩 → h ) MATHEMATICAL SANS-SERIF ITALIC SMALL H → LATIN SMALL LETTER H # +1D65D ; 0068 ; MA # ( 𝙝 → h ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H → LATIN SMALL LETTER H # +1D691 ; 0068 ; MA # ( 𝚑 → h ) MATHEMATICAL MONOSPACE SMALL H → LATIN SMALL LETTER H # +04BB ; 0068 ; MA # ( һ → h ) CYRILLIC SMALL LETTER SHHA → LATIN SMALL LETTER H # +0570 ; 0068 ; MA # ( հ → h ) ARMENIAN SMALL LETTER HO → LATIN SMALL LETTER H # +13C2 ; 0068 ; MA # ( Ꮒ → h ) CHEROKEE LETTER NI → LATIN SMALL LETTER H # + +FF28 ; 0048 ; MA # ( H → H ) FULLWIDTH LATIN CAPITAL LETTER H → LATIN CAPITAL LETTER H # →Η→ +210B ; 0048 ; MA # ( ℋ → H ) SCRIPT CAPITAL H → LATIN CAPITAL LETTER H # +210C ; 0048 ; MA # ( ℌ → H ) BLACK-LETTER CAPITAL H → LATIN CAPITAL LETTER H # +210D ; 0048 ; MA # ( ℍ → H ) DOUBLE-STRUCK CAPITAL H → LATIN CAPITAL LETTER H # +1D407 ; 0048 ; MA # ( 𝐇 → H ) MATHEMATICAL BOLD CAPITAL H → LATIN CAPITAL LETTER H # +1D43B ; 0048 ; MA # ( 𝐻 → H ) MATHEMATICAL ITALIC CAPITAL H → LATIN CAPITAL LETTER H # +1D46F ; 0048 ; MA # ( 𝑯 → H ) MATHEMATICAL BOLD ITALIC CAPITAL H → LATIN CAPITAL LETTER H # +1D4D7 ; 0048 ; MA # ( 𝓗 → H ) MATHEMATICAL BOLD SCRIPT CAPITAL H → LATIN CAPITAL LETTER H # +1D573 ; 0048 ; MA # ( 𝕳 → H ) MATHEMATICAL BOLD FRAKTUR CAPITAL H → LATIN CAPITAL LETTER H # +1D5A7 ; 0048 ; MA # ( 𝖧 → H ) MATHEMATICAL SANS-SERIF CAPITAL H → LATIN CAPITAL LETTER H # +1D5DB ; 0048 ; MA # ( 𝗛 → H ) MATHEMATICAL SANS-SERIF BOLD CAPITAL H → LATIN CAPITAL LETTER H # +1D60F ; 0048 ; MA # ( 𝘏 → H ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL H → LATIN CAPITAL LETTER H # +1D643 ; 0048 ; MA # ( 𝙃 → H ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H → LATIN CAPITAL LETTER H # +1D677 ; 0048 ; MA # ( 𝙷 → H ) MATHEMATICAL MONOSPACE CAPITAL H → LATIN CAPITAL LETTER H # +0397 ; 0048 ; MA # ( Η → H ) GREEK CAPITAL LETTER ETA → LATIN CAPITAL LETTER H # +1D6AE ; 0048 ; MA # ( 𝚮 → H ) MATHEMATICAL BOLD CAPITAL ETA → LATIN CAPITAL LETTER H # →Η→ +1D6E8 ; 0048 ; MA # ( 𝛨 → H ) MATHEMATICAL ITALIC CAPITAL ETA → LATIN CAPITAL LETTER H # →Η→ +1D722 ; 0048 ; MA # ( 𝜢 → H ) MATHEMATICAL BOLD ITALIC CAPITAL ETA → LATIN CAPITAL LETTER H # →𝑯→ +1D75C ; 0048 ; MA # ( 𝝜 → H ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA → LATIN CAPITAL LETTER H # →Η→ +1D796 ; 0048 ; MA # ( 𝞖 → H ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA → LATIN CAPITAL LETTER H # →Η→ +2C8E ; 0048 ; MA # ( Ⲏ → H ) COPTIC CAPITAL LETTER HATE → LATIN CAPITAL LETTER H # →Η→ +041D ; 0048 ; MA # ( Н → H ) CYRILLIC CAPITAL LETTER EN → LATIN CAPITAL LETTER H # +13BB ; 0048 ; MA # ( Ꮋ → H ) CHEROKEE LETTER MI → LATIN CAPITAL LETTER H # +157C ; 0048 ; MA # ( ᕼ → H ) CANADIAN SYLLABICS NUNAVUT H → LATIN CAPITAL LETTER H # +A4E7 ; 0048 ; MA # ( ꓧ → H ) LISU LETTER XA → LATIN CAPITAL LETTER H # +102CF ; 0048 ; MA # ( 𐋏 → H ) CARIAN LETTER E2 → LATIN CAPITAL LETTER H # + +1D78 ; 1D34 ; MA # ( ᵸ → ᴴ ) MODIFIER LETTER CYRILLIC EN → MODIFIER LETTER CAPITAL H # + +0266 ; 0068 0314 ; MA # ( ɦ → h̔ ) LATIN SMALL LETTER H WITH HOOK → LATIN SMALL LETTER H, COMBINING REVERSED COMMA ABOVE # +A695 ; 0068 0314 ; MA # ( ꚕ → h̔ ) CYRILLIC SMALL LETTER HWE → LATIN SMALL LETTER H, COMBINING REVERSED COMMA ABOVE # →ɦ→ +13F2 ; 0068 0314 ; MA # ( Ᏺ → h̔ ) CHEROKEE LETTER YO → LATIN SMALL LETTER H, COMBINING REVERSED COMMA ABOVE # + +2C67 ; 0048 0329 ; MA # ( Ⱨ → H̩ ) LATIN CAPITAL LETTER H WITH DESCENDER → LATIN CAPITAL LETTER H, COMBINING VERTICAL LINE BELOW # →Ң→→Н̩→ +04A2 ; 0048 0329 ; MA # ( Ң → H̩ ) CYRILLIC CAPITAL LETTER EN WITH DESCENDER → LATIN CAPITAL LETTER H, COMBINING VERTICAL LINE BELOW # →Н̩→ + +0127 ; 0068 0335 ; MA # ( ħ → h̵ ) LATIN SMALL LETTER H WITH STROKE → LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY # +210F ; 0068 0335 ; MA # ( ℏ → h̵ ) PLANCK CONSTANT OVER TWO PI → LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY # →ħ→ +045B ; 0068 0335 ; MA # ( ћ → h̵ ) CYRILLIC SMALL LETTER TSHE → LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY # →ħ→ + +0126 ; 0048 0335 ; MA # ( Ħ → H̵ ) LATIN CAPITAL LETTER H WITH STROKE → LATIN CAPITAL LETTER H, COMBINING SHORT STROKE OVERLAY # + +04C9 ; 0048 0326 ; MA # ( Ӊ → H̦ ) CYRILLIC CAPITAL LETTER EN WITH TAIL → LATIN CAPITAL LETTER H, COMBINING COMMA BELOW # →Н̡→ +04C7 ; 0048 0326 ; MA # ( Ӈ → H̦ ) CYRILLIC CAPITAL LETTER EN WITH HOOK → LATIN CAPITAL LETTER H, COMBINING COMMA BELOW # →Н̡→ + +043D ; 029C ; MA # ( н → ʜ ) CYRILLIC SMALL LETTER EN → LATIN LETTER SMALL CAPITAL H # + +04A3 ; 029C 0329 ; MA # ( ң → ʜ̩ ) CYRILLIC SMALL LETTER EN WITH DESCENDER → LATIN LETTER SMALL CAPITAL H, COMBINING VERTICAL LINE BELOW # →н̩→ + +04CA ; 029C 0326 ; MA # ( ӊ → ʜ̦ ) CYRILLIC SMALL LETTER EN WITH TAIL → LATIN LETTER SMALL CAPITAL H, COMBINING COMMA BELOW # →н̡→ +04C8 ; 029C 0326 ; MA # ( ӈ → ʜ̦ ) CYRILLIC SMALL LETTER EN WITH HOOK → LATIN LETTER SMALL CAPITAL H, COMBINING COMMA BELOW # →н̡→ + +050A ; 01F6 ; MA # ( Ԋ → Ƕ ) CYRILLIC CAPITAL LETTER KOMI NJE → LATIN CAPITAL LETTER HWAIR # + +0370 ; 2C75 ; MA # ( Ͱ → Ⱶ ) GREEK CAPITAL LETTER HETA → LATIN CAPITAL LETTER HALF H # →Ꮀ→ +13A8 ; 2C75 ; MA # ( Ꭸ → Ⱶ ) CHEROKEE LETTER GE → LATIN CAPITAL LETTER HALF H # →Ͱ→→Ꮀ→ +13B0 ; 2C75 ; MA # ( Ꮀ → Ⱶ ) CHEROKEE LETTER HO → LATIN CAPITAL LETTER HALF H # + +A795 ; A727 ; MA # ( ꞕ → ꜧ ) LATIN SMALL LETTER H WITH PALATAL HOOK → LATIN SMALL LETTER HENG # + +02DB ; 0069 ; MA #* ( ˛ → i ) OGONEK → LATIN SMALL LETTER I # →ͺ→→ι→→ι→ +2373 ; 0069 ; MA #* ( ⍳ → i ) APL FUNCTIONAL SYMBOL IOTA → LATIN SMALL LETTER I # →ι→ +FF49 ; 0069 ; MA # ( i → i ) FULLWIDTH LATIN SMALL LETTER I → LATIN SMALL LETTER I # →і→ +2170 ; 0069 ; MA # ( ⅰ → i ) SMALL ROMAN NUMERAL ONE → LATIN SMALL LETTER I # +2139 ; 0069 ; MA # ( ℹ → i ) INFORMATION SOURCE → LATIN SMALL LETTER I # +2148 ; 0069 ; MA # ( ⅈ → i ) DOUBLE-STRUCK ITALIC SMALL I → LATIN SMALL LETTER I # +1D422 ; 0069 ; MA # ( 𝐢 → i ) MATHEMATICAL BOLD SMALL I → LATIN SMALL LETTER I # +1D456 ; 0069 ; MA # ( 𝑖 → i ) MATHEMATICAL ITALIC SMALL I → LATIN SMALL LETTER I # +1D48A ; 0069 ; MA # ( 𝒊 → i ) MATHEMATICAL BOLD ITALIC SMALL I → LATIN SMALL LETTER I # +1D4BE ; 0069 ; MA # ( 𝒾 → i ) MATHEMATICAL SCRIPT SMALL I → LATIN SMALL LETTER I # +1D4F2 ; 0069 ; MA # ( 𝓲 → i ) MATHEMATICAL BOLD SCRIPT SMALL I → LATIN SMALL LETTER I # +1D526 ; 0069 ; MA # ( 𝔦 → i ) MATHEMATICAL FRAKTUR SMALL I → LATIN SMALL LETTER I # +1D55A ; 0069 ; MA # ( 𝕚 → i ) MATHEMATICAL DOUBLE-STRUCK SMALL I → LATIN SMALL LETTER I # +1D58E ; 0069 ; MA # ( 𝖎 → i ) MATHEMATICAL BOLD FRAKTUR SMALL I → LATIN SMALL LETTER I # +1D5C2 ; 0069 ; MA # ( 𝗂 → i ) MATHEMATICAL SANS-SERIF SMALL I → LATIN SMALL LETTER I # +1D5F6 ; 0069 ; MA # ( 𝗶 → i ) MATHEMATICAL SANS-SERIF BOLD SMALL I → LATIN SMALL LETTER I # +1D62A ; 0069 ; MA # ( 𝘪 → i ) MATHEMATICAL SANS-SERIF ITALIC SMALL I → LATIN SMALL LETTER I # +1D65E ; 0069 ; MA # ( 𝙞 → i ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I → LATIN SMALL LETTER I # +1D692 ; 0069 ; MA # ( 𝚒 → i ) MATHEMATICAL MONOSPACE SMALL I → LATIN SMALL LETTER I # +0131 ; 0069 ; MA # ( ı → i ) LATIN SMALL LETTER DOTLESS I → LATIN SMALL LETTER I # +1D6A4 ; 0069 ; MA # ( 𝚤 → i ) MATHEMATICAL ITALIC SMALL DOTLESS I → LATIN SMALL LETTER I # →ı→ +026A ; 0069 ; MA # ( ɪ → i ) LATIN LETTER SMALL CAPITAL I → LATIN SMALL LETTER I # →ı→ +0269 ; 0069 ; MA # ( ɩ → i ) LATIN SMALL LETTER IOTA → LATIN SMALL LETTER I # +03B9 ; 0069 ; MA # ( ι → i ) GREEK SMALL LETTER IOTA → LATIN SMALL LETTER I # +1FBE ; 0069 ; MA # ( ι → i ) GREEK PROSGEGRAMMENI → LATIN SMALL LETTER I # →ι→ +037A ; 0069 ; MA #* ( ͺ → i ) GREEK YPOGEGRAMMENI → LATIN SMALL LETTER I # →ι→→ι→ +1D6CA ; 0069 ; MA # ( 𝛊 → i ) MATHEMATICAL BOLD SMALL IOTA → LATIN SMALL LETTER I # →ι→ +1D704 ; 0069 ; MA # ( 𝜄 → i ) MATHEMATICAL ITALIC SMALL IOTA → LATIN SMALL LETTER I # →ι→ +1D73E ; 0069 ; MA # ( 𝜾 → i ) MATHEMATICAL BOLD ITALIC SMALL IOTA → LATIN SMALL LETTER I # →ι→ +1D778 ; 0069 ; MA # ( 𝝸 → i ) MATHEMATICAL SANS-SERIF BOLD SMALL IOTA → LATIN SMALL LETTER I # →ι→ +1D7B2 ; 0069 ; MA # ( 𝞲 → i ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA → LATIN SMALL LETTER I # →ι→ +0456 ; 0069 ; MA # ( і → i ) CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I → LATIN SMALL LETTER I # +A647 ; 0069 ; MA # ( ꙇ → i ) CYRILLIC SMALL LETTER IOTA → LATIN SMALL LETTER I # →ι→ +04CF ; 0069 ; MA # ( ӏ → i ) CYRILLIC SMALL LETTER PALOCHKA → LATIN SMALL LETTER I # →ı→ +13A5 ; 0069 ; MA # ( Ꭵ → i ) CHEROKEE LETTER V → LATIN SMALL LETTER I # +118C3 ; 0069 ; MA # ( 𑣃 → i ) WARANG CITI SMALL LETTER YU → LATIN SMALL LETTER I # →ι→ + +24DB ; 24BE ; MA #* ( ⓛ → Ⓘ ) CIRCLED LATIN SMALL LETTER L → CIRCLED LATIN CAPITAL LETTER I # + +2378 ; 0069 0332 ; MA #* ( ⍸ → i̲ ) APL FUNCTIONAL SYMBOL IOTA UNDERBAR → LATIN SMALL LETTER I, COMBINING LOW LINE # →ι̲→ + +01D0 ; 012D ; MA # ( ǐ → ĭ ) LATIN SMALL LETTER I WITH CARON → LATIN SMALL LETTER I WITH BREVE # + +01CF ; 012C ; MA # ( Ǐ → Ĭ ) LATIN CAPITAL LETTER I WITH CARON → LATIN CAPITAL LETTER I WITH BREVE # + +0268 ; 0069 0335 ; MA # ( ɨ → i̵ ) LATIN SMALL LETTER I WITH STROKE → LATIN SMALL LETTER I, COMBINING SHORT STROKE OVERLAY # +1D7B ; 0069 0335 ; MA # ( ᵻ → i̵ ) LATIN SMALL CAPITAL LETTER I WITH STROKE → LATIN SMALL LETTER I, COMBINING SHORT STROKE OVERLAY # →ɪ̵→ +1D7C ; 0069 0335 ; MA # ( ᵼ → i̵ ) LATIN SMALL LETTER IOTA WITH STROKE → LATIN SMALL LETTER I, COMBINING SHORT STROKE OVERLAY # →ɩ̵→ + +2171 ; 0069 0069 ; MA # ( ⅱ → ii ) SMALL ROMAN NUMERAL TWO → LATIN SMALL LETTER I, LATIN SMALL LETTER I # + +2172 ; 0069 0069 0069 ; MA # ( ⅲ → iii ) SMALL ROMAN NUMERAL THREE → LATIN SMALL LETTER I, LATIN SMALL LETTER I, LATIN SMALL LETTER I # + +0133 ; 0069 006A ; MA # ( ij → ij ) LATIN SMALL LIGATURE IJ → LATIN SMALL LETTER I, LATIN SMALL LETTER J # + +2173 ; 0069 0076 ; MA # ( ⅳ → iv ) SMALL ROMAN NUMERAL FOUR → LATIN SMALL LETTER I, LATIN SMALL LETTER V # + +2178 ; 0069 0078 ; MA # ( ⅸ → ix ) SMALL ROMAN NUMERAL NINE → LATIN SMALL LETTER I, LATIN SMALL LETTER X # + +FF4A ; 006A ; MA # ( j → j ) FULLWIDTH LATIN SMALL LETTER J → LATIN SMALL LETTER J # →ϳ→ +2149 ; 006A ; MA # ( ⅉ → j ) DOUBLE-STRUCK ITALIC SMALL J → LATIN SMALL LETTER J # +1D423 ; 006A ; MA # ( 𝐣 → j ) MATHEMATICAL BOLD SMALL J → LATIN SMALL LETTER J # +1D457 ; 006A ; MA # ( 𝑗 → j ) MATHEMATICAL ITALIC SMALL J → LATIN SMALL LETTER J # +1D48B ; 006A ; MA # ( 𝒋 → j ) MATHEMATICAL BOLD ITALIC SMALL J → LATIN SMALL LETTER J # +1D4BF ; 006A ; MA # ( 𝒿 → j ) MATHEMATICAL SCRIPT SMALL J → LATIN SMALL LETTER J # +1D4F3 ; 006A ; MA # ( 𝓳 → j ) MATHEMATICAL BOLD SCRIPT SMALL J → LATIN SMALL LETTER J # +1D527 ; 006A ; MA # ( 𝔧 → j ) MATHEMATICAL FRAKTUR SMALL J → LATIN SMALL LETTER J # +1D55B ; 006A ; MA # ( 𝕛 → j ) MATHEMATICAL DOUBLE-STRUCK SMALL J → LATIN SMALL LETTER J # +1D58F ; 006A ; MA # ( 𝖏 → j ) MATHEMATICAL BOLD FRAKTUR SMALL J → LATIN SMALL LETTER J # +1D5C3 ; 006A ; MA # ( 𝗃 → j ) MATHEMATICAL SANS-SERIF SMALL J → LATIN SMALL LETTER J # +1D5F7 ; 006A ; MA # ( 𝗷 → j ) MATHEMATICAL SANS-SERIF BOLD SMALL J → LATIN SMALL LETTER J # +1D62B ; 006A ; MA # ( 𝘫 → j ) MATHEMATICAL SANS-SERIF ITALIC SMALL J → LATIN SMALL LETTER J # +1D65F ; 006A ; MA # ( 𝙟 → j ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J → LATIN SMALL LETTER J # +1D693 ; 006A ; MA # ( 𝚓 → j ) MATHEMATICAL MONOSPACE SMALL J → LATIN SMALL LETTER J # +03F3 ; 006A ; MA # ( ϳ → j ) GREEK LETTER YOT → LATIN SMALL LETTER J # +0458 ; 006A ; MA # ( ј → j ) CYRILLIC SMALL LETTER JE → LATIN SMALL LETTER J # + +FF2A ; 004A ; MA # ( J → J ) FULLWIDTH LATIN CAPITAL LETTER J → LATIN CAPITAL LETTER J # →Ј→ +1D409 ; 004A ; MA # ( 𝐉 → J ) MATHEMATICAL BOLD CAPITAL J → LATIN CAPITAL LETTER J # +1D43D ; 004A ; MA # ( 𝐽 → J ) MATHEMATICAL ITALIC CAPITAL J → LATIN CAPITAL LETTER J # +1D471 ; 004A ; MA # ( 𝑱 → J ) MATHEMATICAL BOLD ITALIC CAPITAL J → LATIN CAPITAL LETTER J # +1D4A5 ; 004A ; MA # ( 𝒥 → J ) MATHEMATICAL SCRIPT CAPITAL J → LATIN CAPITAL LETTER J # +1D4D9 ; 004A ; MA # ( 𝓙 → J ) MATHEMATICAL BOLD SCRIPT CAPITAL J → LATIN CAPITAL LETTER J # +1D50D ; 004A ; MA # ( 𝔍 → J ) MATHEMATICAL FRAKTUR CAPITAL J → LATIN CAPITAL LETTER J # +1D541 ; 004A ; MA # ( 𝕁 → J ) MATHEMATICAL DOUBLE-STRUCK CAPITAL J → LATIN CAPITAL LETTER J # +1D575 ; 004A ; MA # ( 𝕵 → J ) MATHEMATICAL BOLD FRAKTUR CAPITAL J → LATIN CAPITAL LETTER J # +1D5A9 ; 004A ; MA # ( 𝖩 → J ) MATHEMATICAL SANS-SERIF CAPITAL J → LATIN CAPITAL LETTER J # +1D5DD ; 004A ; MA # ( 𝗝 → J ) MATHEMATICAL SANS-SERIF BOLD CAPITAL J → LATIN CAPITAL LETTER J # +1D611 ; 004A ; MA # ( 𝘑 → J ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL J → LATIN CAPITAL LETTER J # +1D645 ; 004A ; MA # ( 𝙅 → J ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J → LATIN CAPITAL LETTER J # +1D679 ; 004A ; MA # ( 𝙹 → J ) MATHEMATICAL MONOSPACE CAPITAL J → LATIN CAPITAL LETTER J # +037F ; 004A ; MA # ( Ϳ → J ) GREEK CAPITAL LETTER YOT → LATIN CAPITAL LETTER J # +0408 ; 004A ; MA # ( Ј → J ) CYRILLIC CAPITAL LETTER JE → LATIN CAPITAL LETTER J # +13AB ; 004A ; MA # ( Ꭻ → J ) CHEROKEE LETTER GU → LATIN CAPITAL LETTER J # +148D ; 004A ; MA # ( ᒍ → J ) CANADIAN SYLLABICS CO → LATIN CAPITAL LETTER J # +A4D9 ; 004A ; MA # ( ꓙ → J ) LISU LETTER JA → LATIN CAPITAL LETTER J # +A7B2 ; 004A ; MA # ( Ʝ → J ) LATIN CAPITAL LETTER J WITH CROSSED-TAIL → LATIN CAPITAL LETTER J # + +0249 ; 006A 0335 ; MA # ( ɉ → j̵ ) LATIN SMALL LETTER J WITH STROKE → LATIN SMALL LETTER J, COMBINING SHORT STROKE OVERLAY # + +0248 ; 004A 0335 ; MA # ( Ɉ → J̵ ) LATIN CAPITAL LETTER J WITH STROKE → LATIN CAPITAL LETTER J, COMBINING SHORT STROKE OVERLAY # + +1499 ; 004A 00B7 ; MA # ( ᒙ → J· ) CANADIAN SYLLABICS WEST-CREE CWO → LATIN CAPITAL LETTER J, MIDDLE DOT # →ᒍᐧ→ + +1D6A5 ; 0237 ; MA # ( 𝚥 → ȷ ) MATHEMATICAL ITALIC SMALL DOTLESS J → LATIN SMALL LETTER DOTLESS J # +0575 ; 0237 ; MA # ( յ → ȷ ) ARMENIAN SMALL LETTER YI → LATIN SMALL LETTER DOTLESS J # + +1D424 ; 006B ; MA # ( 𝐤 → k ) MATHEMATICAL BOLD SMALL K → LATIN SMALL LETTER K # +1D458 ; 006B ; MA # ( 𝑘 → k ) MATHEMATICAL ITALIC SMALL K → LATIN SMALL LETTER K # +1D48C ; 006B ; MA # ( 𝒌 → k ) MATHEMATICAL BOLD ITALIC SMALL K → LATIN SMALL LETTER K # +1D4C0 ; 006B ; MA # ( 𝓀 → k ) MATHEMATICAL SCRIPT SMALL K → LATIN SMALL LETTER K # +1D4F4 ; 006B ; MA # ( 𝓴 → k ) MATHEMATICAL BOLD SCRIPT SMALL K → LATIN SMALL LETTER K # +1D528 ; 006B ; MA # ( 𝔨 → k ) MATHEMATICAL FRAKTUR SMALL K → LATIN SMALL LETTER K # +1D55C ; 006B ; MA # ( 𝕜 → k ) MATHEMATICAL DOUBLE-STRUCK SMALL K → LATIN SMALL LETTER K # +1D590 ; 006B ; MA # ( 𝖐 → k ) MATHEMATICAL BOLD FRAKTUR SMALL K → LATIN SMALL LETTER K # +1D5C4 ; 006B ; MA # ( 𝗄 → k ) MATHEMATICAL SANS-SERIF SMALL K → LATIN SMALL LETTER K # +1D5F8 ; 006B ; MA # ( 𝗸 → k ) MATHEMATICAL SANS-SERIF BOLD SMALL K → LATIN SMALL LETTER K # +1D62C ; 006B ; MA # ( 𝘬 → k ) MATHEMATICAL SANS-SERIF ITALIC SMALL K → LATIN SMALL LETTER K # +1D660 ; 006B ; MA # ( 𝙠 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K → LATIN SMALL LETTER K # +1D694 ; 006B ; MA # ( 𝚔 → k ) MATHEMATICAL MONOSPACE SMALL K → LATIN SMALL LETTER K # +1D0B ; 006B ; MA # ( ᴋ → k ) LATIN LETTER SMALL CAPITAL K → LATIN SMALL LETTER K # →к→ +0138 ; 006B ; MA # ( ĸ → k ) LATIN SMALL LETTER KRA → LATIN SMALL LETTER K # →к→ +03BA ; 006B ; MA # ( κ → k ) GREEK SMALL LETTER KAPPA → LATIN SMALL LETTER K # →к→ +03F0 ; 006B ; MA # ( ϰ → k ) GREEK KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→ +1D6CB ; 006B ; MA # ( 𝛋 → k ) MATHEMATICAL BOLD SMALL KAPPA → LATIN SMALL LETTER K # →κ→→к→ +1D6DE ; 006B ; MA # ( 𝛞 → k ) MATHEMATICAL BOLD KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→ +1D705 ; 006B ; MA # ( 𝜅 → k ) MATHEMATICAL ITALIC SMALL KAPPA → LATIN SMALL LETTER K # →κ→→к→ +1D718 ; 006B ; MA # ( 𝜘 → k ) MATHEMATICAL ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→ +1D73F ; 006B ; MA # ( 𝜿 → k ) MATHEMATICAL BOLD ITALIC SMALL KAPPA → LATIN SMALL LETTER K # →κ→→к→ +1D752 ; 006B ; MA # ( 𝝒 → k ) MATHEMATICAL BOLD ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→ +1D779 ; 006B ; MA # ( 𝝹 → k ) MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA → LATIN SMALL LETTER K # →κ→→к→ +1D78C ; 006B ; MA # ( 𝞌 → k ) MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→ +1D7B3 ; 006B ; MA # ( 𝞳 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA → LATIN SMALL LETTER K # →κ→→к→ +1D7C6 ; 006B ; MA # ( 𝟆 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→ +2C95 ; 006B ; MA # ( ⲕ → k ) COPTIC SMALL LETTER KAPA → LATIN SMALL LETTER K # →κ→→к→ +043A ; 006B ; MA # ( к → k ) CYRILLIC SMALL LETTER KA → LATIN SMALL LETTER K # + +212A ; 004B ; MA # ( K → K ) KELVIN SIGN → LATIN CAPITAL LETTER K # +FF2B ; 004B ; MA # ( K → K ) FULLWIDTH LATIN CAPITAL LETTER K → LATIN CAPITAL LETTER K # →Κ→ +1D40A ; 004B ; MA # ( 𝐊 → K ) MATHEMATICAL BOLD CAPITAL K → LATIN CAPITAL LETTER K # +1D43E ; 004B ; MA # ( 𝐾 → K ) MATHEMATICAL ITALIC CAPITAL K → LATIN CAPITAL LETTER K # +1D472 ; 004B ; MA # ( 𝑲 → K ) MATHEMATICAL BOLD ITALIC CAPITAL K → LATIN CAPITAL LETTER K # +1D4A6 ; 004B ; MA # ( 𝒦 → K ) MATHEMATICAL SCRIPT CAPITAL K → LATIN CAPITAL LETTER K # +1D4DA ; 004B ; MA # ( 𝓚 → K ) MATHEMATICAL BOLD SCRIPT CAPITAL K → LATIN CAPITAL LETTER K # +1D50E ; 004B ; MA # ( 𝔎 → K ) MATHEMATICAL FRAKTUR CAPITAL K → LATIN CAPITAL LETTER K # +1D542 ; 004B ; MA # ( 𝕂 → K ) MATHEMATICAL DOUBLE-STRUCK CAPITAL K → LATIN CAPITAL LETTER K # +1D576 ; 004B ; MA # ( 𝕶 → K ) MATHEMATICAL BOLD FRAKTUR CAPITAL K → LATIN CAPITAL LETTER K # +1D5AA ; 004B ; MA # ( 𝖪 → K ) MATHEMATICAL SANS-SERIF CAPITAL K → LATIN CAPITAL LETTER K # +1D5DE ; 004B ; MA # ( 𝗞 → K ) MATHEMATICAL SANS-SERIF BOLD CAPITAL K → LATIN CAPITAL LETTER K # +1D612 ; 004B ; MA # ( 𝘒 → K ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL K → LATIN CAPITAL LETTER K # +1D646 ; 004B ; MA # ( 𝙆 → K ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K → LATIN CAPITAL LETTER K # +1D67A ; 004B ; MA # ( 𝙺 → K ) MATHEMATICAL MONOSPACE CAPITAL K → LATIN CAPITAL LETTER K # +039A ; 004B ; MA # ( Κ → K ) GREEK CAPITAL LETTER KAPPA → LATIN CAPITAL LETTER K # +1D6B1 ; 004B ; MA # ( 𝚱 → K ) MATHEMATICAL BOLD CAPITAL KAPPA → LATIN CAPITAL LETTER K # →Κ→ +1D6EB ; 004B ; MA # ( 𝛫 → K ) MATHEMATICAL ITALIC CAPITAL KAPPA → LATIN CAPITAL LETTER K # →𝐾→ +1D725 ; 004B ; MA # ( 𝜥 → K ) MATHEMATICAL BOLD ITALIC CAPITAL KAPPA → LATIN CAPITAL LETTER K # →𝑲→ +1D75F ; 004B ; MA # ( 𝝟 → K ) MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA → LATIN CAPITAL LETTER K # →Κ→ +1D799 ; 004B ; MA # ( 𝞙 → K ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA → LATIN CAPITAL LETTER K # →Κ→ +2C94 ; 004B ; MA # ( Ⲕ → K ) COPTIC CAPITAL LETTER KAPA → LATIN CAPITAL LETTER K # →Κ→ +041A ; 004B ; MA # ( К → K ) CYRILLIC CAPITAL LETTER KA → LATIN CAPITAL LETTER K # +13E6 ; 004B ; MA # ( Ꮶ → K ) CHEROKEE LETTER TSO → LATIN CAPITAL LETTER K # +16D5 ; 004B ; MA # ( ᛕ → K ) RUNIC LETTER OPEN-P → LATIN CAPITAL LETTER K # +A4D7 ; 004B ; MA # ( ꓗ → K ) LISU LETTER KA → LATIN CAPITAL LETTER K # +10518 ; 004B ; MA # ( 𐔘 → K ) ELBASAN LETTER QE → LATIN CAPITAL LETTER K # + +0199 ; 006B 0314 ; MA # ( ƙ → k̔ ) LATIN SMALL LETTER K WITH HOOK → LATIN SMALL LETTER K, COMBINING REVERSED COMMA ABOVE # + +049B ; 006B 0329 ; MA # ( қ → k̩ ) CYRILLIC SMALL LETTER KA WITH DESCENDER → LATIN SMALL LETTER K, COMBINING VERTICAL LINE BELOW # →к̩→ + +2C69 ; 004B 0329 ; MA # ( Ⱪ → K̩ ) LATIN CAPITAL LETTER K WITH DESCENDER → LATIN CAPITAL LETTER K, COMBINING VERTICAL LINE BELOW # →Қ→→К̩→ +049A ; 004B 0329 ; MA # ( Қ → K̩ ) CYRILLIC CAPITAL LETTER KA WITH DESCENDER → LATIN CAPITAL LETTER K, COMBINING VERTICAL LINE BELOW # →К̩→ + +049F ; 006B 0335 ; MA # ( ҟ → k̵ ) CYRILLIC SMALL LETTER KA WITH STROKE → LATIN SMALL LETTER K, COMBINING SHORT STROKE OVERLAY # →к̵→ + +20AD ; 004B 0335 ; MA #* ( ₭ → K̵ ) KIP SIGN → LATIN CAPITAL LETTER K, COMBINING SHORT STROKE OVERLAY # →K̶→ +A740 ; 004B 0335 ; MA # ( Ꝁ → K̵ ) LATIN CAPITAL LETTER K WITH STROKE → LATIN CAPITAL LETTER K, COMBINING SHORT STROKE OVERLAY # →Ҟ→→К̵→ +049E ; 004B 0335 ; MA # ( Ҟ → K̵ ) CYRILLIC CAPITAL LETTER KA WITH STROKE → LATIN CAPITAL LETTER K, COMBINING SHORT STROKE OVERLAY # →К̵→ + +0198 ; 004B 0027 ; MA # ( Ƙ → K' ) LATIN CAPITAL LETTER K WITH HOOK → LATIN CAPITAL LETTER K, APOSTROPHE # →Kʽ→ + +05C0 ; 006C ; MA #* ( ‎׀‎ → l ) HEBREW PUNCTUATION PASEQ → LATIN SMALL LETTER L # →|→ +007C ; 006C ; MA #* ( | → l ) VERTICAL LINE → LATIN SMALL LETTER L # +2223 ; 006C ; MA #* ( ∣ → l ) DIVIDES → LATIN SMALL LETTER L # →ǀ→ +FFE8 ; 006C ; MA #* ( │ → l ) HALFWIDTH FORMS LIGHT VERTICAL → LATIN SMALL LETTER L # →|→ +0031 ; 006C ; MA # ( 1 → l ) DIGIT ONE → LATIN SMALL LETTER L # +0661 ; 006C ; MA # ( ‎١‎ → l ) ARABIC-INDIC DIGIT ONE → LATIN SMALL LETTER L # →1→ +06F1 ; 006C ; MA # ( ۱ → l ) EXTENDED ARABIC-INDIC DIGIT ONE → LATIN SMALL LETTER L # →1→ +10320 ; 006C ; MA #* ( 𐌠 → l ) OLD ITALIC NUMERAL ONE → LATIN SMALL LETTER L # →𐌉→→I→ +1E8C7 ; 006C ; MA #* ( ‎𞣇‎ → l ) MENDE KIKAKUI DIGIT ONE → LATIN SMALL LETTER L # +1D7CF ; 006C ; MA # ( 𝟏 → l ) MATHEMATICAL BOLD DIGIT ONE → LATIN SMALL LETTER L # →1→ +1D7D9 ; 006C ; MA # ( 𝟙 → l ) MATHEMATICAL DOUBLE-STRUCK DIGIT ONE → LATIN SMALL LETTER L # →1→ +1D7E3 ; 006C ; MA # ( 𝟣 → l ) MATHEMATICAL SANS-SERIF DIGIT ONE → LATIN SMALL LETTER L # →1→ +1D7ED ; 006C ; MA # ( 𝟭 → l ) MATHEMATICAL SANS-SERIF BOLD DIGIT ONE → LATIN SMALL LETTER L # →1→ +1D7F7 ; 006C ; MA # ( 𝟷 → l ) MATHEMATICAL MONOSPACE DIGIT ONE → LATIN SMALL LETTER L # →1→ +0049 ; 006C ; MA # ( I → l ) LATIN CAPITAL LETTER I → LATIN SMALL LETTER L # +FF29 ; 006C ; MA # ( I → l ) FULLWIDTH LATIN CAPITAL LETTER I → LATIN SMALL LETTER L # →Ӏ→ +2160 ; 006C ; MA # ( Ⅰ → l ) ROMAN NUMERAL ONE → LATIN SMALL LETTER L # →Ӏ→ +2110 ; 006C ; MA # ( ℐ → l ) SCRIPT CAPITAL I → LATIN SMALL LETTER L # →I→ +2111 ; 006C ; MA # ( ℑ → l ) BLACK-LETTER CAPITAL I → LATIN SMALL LETTER L # →I→ +1D408 ; 006C ; MA # ( 𝐈 → l ) MATHEMATICAL BOLD CAPITAL I → LATIN SMALL LETTER L # →I→ +1D43C ; 006C ; MA # ( 𝐼 → l ) MATHEMATICAL ITALIC CAPITAL I → LATIN SMALL LETTER L # →I→ +1D470 ; 006C ; MA # ( 𝑰 → l ) MATHEMATICAL BOLD ITALIC CAPITAL I → LATIN SMALL LETTER L # →I→ +1D4D8 ; 006C ; MA # ( 𝓘 → l ) MATHEMATICAL BOLD SCRIPT CAPITAL I → LATIN SMALL LETTER L # →I→ +1D540 ; 006C ; MA # ( 𝕀 → l ) MATHEMATICAL DOUBLE-STRUCK CAPITAL I → LATIN SMALL LETTER L # →I→ +1D574 ; 006C ; MA # ( 𝕴 → l ) MATHEMATICAL BOLD FRAKTUR CAPITAL I → LATIN SMALL LETTER L # →I→ +1D5A8 ; 006C ; MA # ( 𝖨 → l ) MATHEMATICAL SANS-SERIF CAPITAL I → LATIN SMALL LETTER L # →I→ +1D5DC ; 006C ; MA # ( 𝗜 → l ) MATHEMATICAL SANS-SERIF BOLD CAPITAL I → LATIN SMALL LETTER L # →I→ +1D610 ; 006C ; MA # ( 𝘐 → l ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL I → LATIN SMALL LETTER L # →I→ +1D644 ; 006C ; MA # ( 𝙄 → l ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I → LATIN SMALL LETTER L # →I→ +1D678 ; 006C ; MA # ( 𝙸 → l ) MATHEMATICAL MONOSPACE CAPITAL I → LATIN SMALL LETTER L # →I→ +0196 ; 006C ; MA # ( Ɩ → l ) LATIN CAPITAL LETTER IOTA → LATIN SMALL LETTER L # +FF4C ; 006C ; MA # ( l → l ) FULLWIDTH LATIN SMALL LETTER L → LATIN SMALL LETTER L # →Ⅰ→→Ӏ→ +217C ; 006C ; MA # ( ⅼ → l ) SMALL ROMAN NUMERAL FIFTY → LATIN SMALL LETTER L # +2113 ; 006C ; MA # ( ℓ → l ) SCRIPT SMALL L → LATIN SMALL LETTER L # +1D425 ; 006C ; MA # ( 𝐥 → l ) MATHEMATICAL BOLD SMALL L → LATIN SMALL LETTER L # +1D459 ; 006C ; MA # ( 𝑙 → l ) MATHEMATICAL ITALIC SMALL L → LATIN SMALL LETTER L # +1D48D ; 006C ; MA # ( 𝒍 → l ) MATHEMATICAL BOLD ITALIC SMALL L → LATIN SMALL LETTER L # +1D4C1 ; 006C ; MA # ( 𝓁 → l ) MATHEMATICAL SCRIPT SMALL L → LATIN SMALL LETTER L # +1D4F5 ; 006C ; MA # ( 𝓵 → l ) MATHEMATICAL BOLD SCRIPT SMALL L → LATIN SMALL LETTER L # +1D529 ; 006C ; MA # ( 𝔩 → l ) MATHEMATICAL FRAKTUR SMALL L → LATIN SMALL LETTER L # +1D55D ; 006C ; MA # ( 𝕝 → l ) MATHEMATICAL DOUBLE-STRUCK SMALL L → LATIN SMALL LETTER L # +1D591 ; 006C ; MA # ( 𝖑 → l ) MATHEMATICAL BOLD FRAKTUR SMALL L → LATIN SMALL LETTER L # +1D5C5 ; 006C ; MA # ( 𝗅 → l ) MATHEMATICAL SANS-SERIF SMALL L → LATIN SMALL LETTER L # +1D5F9 ; 006C ; MA # ( 𝗹 → l ) MATHEMATICAL SANS-SERIF BOLD SMALL L → LATIN SMALL LETTER L # +1D62D ; 006C ; MA # ( 𝘭 → l ) MATHEMATICAL SANS-SERIF ITALIC SMALL L → LATIN SMALL LETTER L # +1D661 ; 006C ; MA # ( 𝙡 → l ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L → LATIN SMALL LETTER L # +1D695 ; 006C ; MA # ( 𝚕 → l ) MATHEMATICAL MONOSPACE SMALL L → LATIN SMALL LETTER L # +01C0 ; 006C ; MA # ( ǀ → l ) LATIN LETTER DENTAL CLICK → LATIN SMALL LETTER L # +0399 ; 006C ; MA # ( Ι → l ) GREEK CAPITAL LETTER IOTA → LATIN SMALL LETTER L # +1D6B0 ; 006C ; MA # ( 𝚰 → l ) MATHEMATICAL BOLD CAPITAL IOTA → LATIN SMALL LETTER L # →Ι→ +1D6EA ; 006C ; MA # ( 𝛪 → l ) MATHEMATICAL ITALIC CAPITAL IOTA → LATIN SMALL LETTER L # →Ι→ +1D724 ; 006C ; MA # ( 𝜤 → l ) MATHEMATICAL BOLD ITALIC CAPITAL IOTA → LATIN SMALL LETTER L # →Ι→ +1D75E ; 006C ; MA # ( 𝝞 → l ) MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA → LATIN SMALL LETTER L # →Ι→ +1D798 ; 006C ; MA # ( 𝞘 → l ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA → LATIN SMALL LETTER L # →Ι→ +2C92 ; 006C ; MA # ( Ⲓ → l ) COPTIC CAPITAL LETTER IAUDA → LATIN SMALL LETTER L # →Ӏ→ +0406 ; 006C ; MA # ( І → l ) CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I → LATIN SMALL LETTER L # +04C0 ; 006C ; MA # ( Ӏ → l ) CYRILLIC LETTER PALOCHKA → LATIN SMALL LETTER L # +05D5 ; 006C ; MA # ( ‎ו‎ → l ) HEBREW LETTER VAV → LATIN SMALL LETTER L # +05DF ; 006C ; MA # ( ‎ן‎ → l ) HEBREW LETTER FINAL NUN → LATIN SMALL LETTER L # +0627 ; 006C ; MA # ( ‎ا‎ → l ) ARABIC LETTER ALEF → LATIN SMALL LETTER L # →1→ +1EE00 ; 006C ; MA # ( ‎𞸀‎ → l ) ARABIC MATHEMATICAL ALEF → LATIN SMALL LETTER L # →‎ا‎→→1→ +1EE80 ; 006C ; MA # ( ‎𞺀‎ → l ) ARABIC MATHEMATICAL LOOPED ALEF → LATIN SMALL LETTER L # →‎ا‎→→1→ +FE8E ; 006C ; MA # ( ‎ﺎ‎ → l ) ARABIC LETTER ALEF FINAL FORM → LATIN SMALL LETTER L # →‎ا‎→→1→ +FE8D ; 006C ; MA # ( ‎ﺍ‎ → l ) ARABIC LETTER ALEF ISOLATED FORM → LATIN SMALL LETTER L # →‎ا‎→→1→ +07CA ; 006C ; MA # ( ‎ߊ‎ → l ) NKO LETTER A → LATIN SMALL LETTER L # →∣→→ǀ→ +2D4F ; 006C ; MA # ( ⵏ → l ) TIFINAGH LETTER YAN → LATIN SMALL LETTER L # →Ӏ→ +16C1 ; 006C ; MA # ( ᛁ → l ) RUNIC LETTER ISAZ IS ISS I → LATIN SMALL LETTER L # →I→ +A4F2 ; 006C ; MA # ( ꓲ → l ) LISU LETTER I → LATIN SMALL LETTER L # →I→ +1028A ; 006C ; MA # ( 𐊊 → l ) LYCIAN LETTER J → LATIN SMALL LETTER L # →I→ +10309 ; 006C ; MA # ( 𐌉 → l ) OLD ITALIC LETTER I → LATIN SMALL LETTER L # →I→ + +216C ; 004C ; MA # ( Ⅼ → L ) ROMAN NUMERAL FIFTY → LATIN CAPITAL LETTER L # +2112 ; 004C ; MA # ( ℒ → L ) SCRIPT CAPITAL L → LATIN CAPITAL LETTER L # +1D40B ; 004C ; MA # ( 𝐋 → L ) MATHEMATICAL BOLD CAPITAL L → LATIN CAPITAL LETTER L # +1D43F ; 004C ; MA # ( 𝐿 → L ) MATHEMATICAL ITALIC CAPITAL L → LATIN CAPITAL LETTER L # +1D473 ; 004C ; MA # ( 𝑳 → L ) MATHEMATICAL BOLD ITALIC CAPITAL L → LATIN CAPITAL LETTER L # +1D4DB ; 004C ; MA # ( 𝓛 → L ) MATHEMATICAL BOLD SCRIPT CAPITAL L → LATIN CAPITAL LETTER L # +1D50F ; 004C ; MA # ( 𝔏 → L ) MATHEMATICAL FRAKTUR CAPITAL L → LATIN CAPITAL LETTER L # +1D543 ; 004C ; MA # ( 𝕃 → L ) MATHEMATICAL DOUBLE-STRUCK CAPITAL L → LATIN CAPITAL LETTER L # +1D577 ; 004C ; MA # ( 𝕷 → L ) MATHEMATICAL BOLD FRAKTUR CAPITAL L → LATIN CAPITAL LETTER L # +1D5AB ; 004C ; MA # ( 𝖫 → L ) MATHEMATICAL SANS-SERIF CAPITAL L → LATIN CAPITAL LETTER L # +1D5DF ; 004C ; MA # ( 𝗟 → L ) MATHEMATICAL SANS-SERIF BOLD CAPITAL L → LATIN CAPITAL LETTER L # +1D613 ; 004C ; MA # ( 𝘓 → L ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL L → LATIN CAPITAL LETTER L # +1D647 ; 004C ; MA # ( 𝙇 → L ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L → LATIN CAPITAL LETTER L # +1D67B ; 004C ; MA # ( 𝙻 → L ) MATHEMATICAL MONOSPACE CAPITAL L → LATIN CAPITAL LETTER L # +2CD0 ; 004C ; MA # ( Ⳑ → L ) COPTIC CAPITAL LETTER L-SHAPED HA → LATIN CAPITAL LETTER L # +13DE ; 004C ; MA # ( Ꮮ → L ) CHEROKEE LETTER TLE → LATIN CAPITAL LETTER L # +14AA ; 004C ; MA # ( ᒪ → L ) CANADIAN SYLLABICS MA → LATIN CAPITAL LETTER L # +A4E1 ; 004C ; MA # ( ꓡ → L ) LISU LETTER LA → LATIN CAPITAL LETTER L # +118A3 ; 004C ; MA # ( 𑢣 → L ) WARANG CITI CAPITAL LETTER YU → LATIN CAPITAL LETTER L # +118B2 ; 004C ; MA # ( 𑢲 → L ) WARANG CITI CAPITAL LETTER TTE → LATIN CAPITAL LETTER L # +1041B ; 004C ; MA # ( 𐐛 → L ) DESERET CAPITAL LETTER ETH → LATIN CAPITAL LETTER L # +10526 ; 004C ; MA # ( 𐔦 → L ) ELBASAN LETTER GHAMMA → LATIN CAPITAL LETTER L # + +FD3C ; 006C 030B ; MA # ( ‎ﴼ‎ → l̋ ) ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM → LATIN SMALL LETTER L, COMBINING DOUBLE ACUTE ACCENT # →‎اً‎→ +FD3D ; 006C 030B ; MA # ( ‎ﴽ‎ → l̋ ) ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM → LATIN SMALL LETTER L, COMBINING DOUBLE ACUTE ACCENT # →‎اً‎→ + +0142 ; 006C 0338 ; MA # ( ł → l̸ ) LATIN SMALL LETTER L WITH STROKE → LATIN SMALL LETTER L, COMBINING LONG SOLIDUS OVERLAY # →l̷→ + +0141 ; 004C 0338 ; MA # ( Ł → L̸ ) LATIN CAPITAL LETTER L WITH STROKE → LATIN CAPITAL LETTER L, COMBINING LONG SOLIDUS OVERLAY # →L̷→ + +026D ; 006C 0328 ; MA # ( ɭ → l̨ ) LATIN SMALL LETTER L WITH RETROFLEX HOOK → LATIN SMALL LETTER L, COMBINING OGONEK # →l̢→ + +0197 ; 006C 0335 ; MA # ( Ɨ → l̵ ) LATIN CAPITAL LETTER I WITH STROKE → LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY # →ƚ→ +019A ; 006C 0335 ; MA # ( ƚ → l̵ ) LATIN SMALL LETTER L WITH BAR → LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY # + +026B ; 006C 0334 ; MA # ( ɫ → l̴ ) LATIN SMALL LETTER L WITH MIDDLE TILDE → LATIN SMALL LETTER L, COMBINING TILDE OVERLAY # + +0625 ; 006C 0655 ; MA # ( ‎إ‎ → lٕ ) ARABIC LETTER ALEF WITH HAMZA BELOW → LATIN SMALL LETTER L, ARABIC HAMZA BELOW # →‎ٳ‎→→‎اٟ‎→ +FE88 ; 006C 0655 ; MA # ( ‎ﺈ‎ → lٕ ) ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM → LATIN SMALL LETTER L, ARABIC HAMZA BELOW # →‎إ‎→→‎ٳ‎→→‎اٟ‎→ +FE87 ; 006C 0655 ; MA # ( ‎ﺇ‎ → lٕ ) ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM → LATIN SMALL LETTER L, ARABIC HAMZA BELOW # →‎إ‎→→‎ٳ‎→→‎اٟ‎→ +0673 ; 006C 0655 ; MA # ( ‎ٳ‎ → lٕ ) ARABIC LETTER ALEF WITH WAVY HAMZA BELOW → LATIN SMALL LETTER L, ARABIC HAMZA BELOW # →‎اٟ‎→ + +0140 ; 006C 00B7 ; MA # ( ŀ → l· ) LATIN SMALL LETTER L WITH MIDDLE DOT → LATIN SMALL LETTER L, MIDDLE DOT # +013F ; 006C 00B7 ; MA # ( Ŀ → l· ) LATIN CAPITAL LETTER L WITH MIDDLE DOT → LATIN SMALL LETTER L, MIDDLE DOT # →L·→→ᒪ·→→ᒪᐧ→→ᒷ→→1ᐧ→ +14B7 ; 006C 00B7 ; MA # ( ᒷ → l· ) CANADIAN SYLLABICS WEST-CREE MWA → LATIN SMALL LETTER L, MIDDLE DOT # →1ᐧ→ + +1F102 ; 006C 002C ; MA #* ( 🄂 → l, ) DIGIT ONE COMMA → LATIN SMALL LETTER L, COMMA # →1,→ + +2488 ; 006C 002E ; MA #* ( ⒈ → l. ) DIGIT ONE FULL STOP → LATIN SMALL LETTER L, FULL STOP # →1.→ + +05F1 ; 006C 0027 ; MA # ( ‎ױ‎ → l' ) HEBREW LIGATURE YIDDISH VAV YOD → LATIN SMALL LETTER L, APOSTROPHE # →‎וי‎→ + +2493 ; 006C 0032 002E ; MA #* ( ⒓ → l2. ) NUMBER TWELVE FULL STOP → LATIN SMALL LETTER L, DIGIT TWO, FULL STOP # →12.→ + +33EB ; 006C 0032 65E5 ; MA #* ( ㏫ → l2日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE → LATIN SMALL LETTER L, DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5 # →12日→ + +32CB ; 006C 0032 6708 ; MA #* ( ㋋ → l2月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER → LATIN SMALL LETTER L, DIGIT TWO, CJK UNIFIED IDEOGRAPH-6708 # →12月→ + +3364 ; 006C 0032 70B9 ; MA #* ( ㍤ → l2点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE → LATIN SMALL LETTER L, DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9 # →12点→ + +2494 ; 006C 0033 002E ; MA #* ( ⒔ → l3. ) NUMBER THIRTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT THREE, FULL STOP # →13.→ + +33EC ; 006C 0033 65E5 ; MA #* ( ㏬ → l3日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN → LATIN SMALL LETTER L, DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5 # →13日→ + +3365 ; 006C 0033 70B9 ; MA #* ( ㍥ → l3点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN → LATIN SMALL LETTER L, DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9 # →13点→ + +2495 ; 006C 0034 002E ; MA #* ( ⒕ → l4. ) NUMBER FOURTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT FOUR, FULL STOP # →14.→ + +33ED ; 006C 0034 65E5 ; MA #* ( ㏭ → l4日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN → LATIN SMALL LETTER L, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5 # →14日→ + +3366 ; 006C 0034 70B9 ; MA #* ( ㍦ → l4点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN → LATIN SMALL LETTER L, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9 # →14点→ + +2496 ; 006C 0035 002E ; MA #* ( ⒖ → l5. ) NUMBER FIFTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT FIVE, FULL STOP # →15.→ + +33EE ; 006C 0035 65E5 ; MA #* ( ㏮ → l5日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN → LATIN SMALL LETTER L, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5 # →15日→ + +3367 ; 006C 0035 70B9 ; MA #* ( ㍧ → l5点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN → LATIN SMALL LETTER L, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-70B9 # →15点→ + +2497 ; 006C 0036 002E ; MA #* ( ⒗ → l6. ) NUMBER SIXTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT SIX, FULL STOP # →16.→ + +33EF ; 006C 0036 65E5 ; MA #* ( ㏯ → l6日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN → LATIN SMALL LETTER L, DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5 # →16日→ + +3368 ; 006C 0036 70B9 ; MA #* ( ㍨ → l6点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN → LATIN SMALL LETTER L, DIGIT SIX, CJK UNIFIED IDEOGRAPH-70B9 # →16点→ + +2498 ; 006C 0037 002E ; MA #* ( ⒘ → l7. ) NUMBER SEVENTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT SEVEN, FULL STOP # →17.→ + +33F0 ; 006C 0037 65E5 ; MA #* ( ㏰ → l7日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN → LATIN SMALL LETTER L, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5 # →17日→ + +3369 ; 006C 0037 70B9 ; MA #* ( ㍩ → l7点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN → LATIN SMALL LETTER L, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-70B9 # →17点→ + +2499 ; 006C 0038 002E ; MA #* ( ⒙ → l8. ) NUMBER EIGHTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT EIGHT, FULL STOP # →18.→ + +33F1 ; 006C 0038 65E5 ; MA #* ( ㏱ → l8日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN → LATIN SMALL LETTER L, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5 # →18日→ + +336A ; 006C 0038 70B9 ; MA #* ( ㍪ → l8点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN → LATIN SMALL LETTER L, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-70B9 # →18点→ + +249A ; 006C 0039 002E ; MA #* ( ⒚ → l9. ) NUMBER NINETEEN FULL STOP → LATIN SMALL LETTER L, DIGIT NINE, FULL STOP # →19.→ + +33F2 ; 006C 0039 65E5 ; MA #* ( ㏲ → l9日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN → LATIN SMALL LETTER L, DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5 # →19日→ + +336B ; 006C 0039 70B9 ; MA #* ( ㍫ → l9点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN → LATIN SMALL LETTER L, DIGIT NINE, CJK UNIFIED IDEOGRAPH-70B9 # →19点→ + +01C9 ; 006C 006A ; MA # ( lj → lj ) LATIN SMALL LETTER LJ → LATIN SMALL LETTER L, LATIN SMALL LETTER J # + +0132 ; 006C 004A ; MA # ( IJ → lJ ) LATIN CAPITAL LIGATURE IJ → LATIN SMALL LETTER L, LATIN CAPITAL LETTER J # →IJ→ + +01C8 ; 004C 006A ; MA # ( Lj → Lj ) LATIN CAPITAL LETTER L WITH SMALL LETTER J → LATIN CAPITAL LETTER L, LATIN SMALL LETTER J # + +01C7 ; 004C 004A ; MA # ( LJ → LJ ) LATIN CAPITAL LETTER LJ → LATIN CAPITAL LETTER L, LATIN CAPITAL LETTER J # + +2016 ; 006C 006C ; MA #* ( ‖ → ll ) DOUBLE VERTICAL LINE → LATIN SMALL LETTER L, LATIN SMALL LETTER L # →∥→→||→ +2225 ; 006C 006C ; MA #* ( ∥ → ll ) PARALLEL TO → LATIN SMALL LETTER L, LATIN SMALL LETTER L # →||→ +2161 ; 006C 006C ; MA # ( Ⅱ → ll ) ROMAN NUMERAL TWO → LATIN SMALL LETTER L, LATIN SMALL LETTER L # →II→ +01C1 ; 006C 006C ; MA # ( ǁ → ll ) LATIN LETTER LATERAL CLICK → LATIN SMALL LETTER L, LATIN SMALL LETTER L # →‖→→∥→→||→ +05F0 ; 006C 006C ; MA # ( ‎װ‎ → ll ) HEBREW LIGATURE YIDDISH DOUBLE VAV → LATIN SMALL LETTER L, LATIN SMALL LETTER L # →‎וו‎→ + +2492 ; 006C 006C 002E ; MA #* ( ⒒ → ll. ) NUMBER ELEVEN FULL STOP → LATIN SMALL LETTER L, LATIN SMALL LETTER L, FULL STOP # →11.→ + +2162 ; 006C 006C 006C ; MA # ( Ⅲ → lll ) ROMAN NUMERAL THREE → LATIN SMALL LETTER L, LATIN SMALL LETTER L, LATIN SMALL LETTER L # →III→ + +33EA ; 006C 006C 65E5 ; MA #* ( ㏪ → ll日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN → LATIN SMALL LETTER L, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5 # →11日→ + +32CA ; 006C 006C 6708 ; MA #* ( ㋊ → ll月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER → LATIN SMALL LETTER L, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-6708 # →11月→ + +3363 ; 006C 006C 70B9 ; MA #* ( ㍣ → ll点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN → LATIN SMALL LETTER L, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-70B9 # →11点→ + +042E ; 006C 004F ; MA # ( Ю → lO ) CYRILLIC CAPITAL LETTER YU → LATIN SMALL LETTER L, LATIN CAPITAL LETTER O # →IO→ + +2491 ; 006C 004F 002E ; MA #* ( ⒑ → lO. ) NUMBER TEN FULL STOP → LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, FULL STOP # →10.→ + +33E9 ; 006C 004F 65E5 ; MA #* ( ㏩ → lO日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN → LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-65E5 # →10日→ + +32C9 ; 006C 004F 6708 ; MA #* ( ㋉ → lO月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER → LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-6708 # →10月→ + +3362 ; 006C 004F 70B9 ; MA #* ( ㍢ → lO点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN → LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-70B9 # →10点→ + +02AA ; 006C 0073 ; MA # ( ʪ → ls ) LATIN SMALL LETTER LS DIGRAPH → LATIN SMALL LETTER L, LATIN SMALL LETTER S # + +20B6 ; 006C 0074 ; MA #* ( ₶ → lt ) LIVRE TOURNOIS SIGN → LATIN SMALL LETTER L, LATIN SMALL LETTER T # + +2163 ; 006C 0056 ; MA # ( Ⅳ → lV ) ROMAN NUMERAL FOUR → LATIN SMALL LETTER L, LATIN CAPITAL LETTER V # →IV→ + +2168 ; 006C 0058 ; MA # ( Ⅸ → lX ) ROMAN NUMERAL NINE → LATIN SMALL LETTER L, LATIN CAPITAL LETTER X # →IX→ + +026E ; 006C 021D ; MA # ( ɮ → lȝ ) LATIN SMALL LETTER LEZH → LATIN SMALL LETTER L, LATIN SMALL LETTER YOGH # →lʒ→ + +02AB ; 006C 007A ; MA # ( ʫ → lz ) LATIN SMALL LETTER LZ DIGRAPH → LATIN SMALL LETTER L, LATIN SMALL LETTER Z # + +0623 ; 006C 0674 ; MA # ( ‎أ‎ → ‎lٴ‎ ) ARABIC LETTER ALEF WITH HAMZA ABOVE → LATIN SMALL LETTER L, ARABIC LETTER HIGH HAMZA # →‎ٵ‎→→‎اٴ‎→ +FE84 ; 006C 0674 ; MA # ( ‎ﺄ‎ → ‎lٴ‎ ) ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM → LATIN SMALL LETTER L, ARABIC LETTER HIGH HAMZA # →‎أ‎→→‎ٵ‎→→‎اٴ‎→ +FE83 ; 006C 0674 ; MA # ( ‎ﺃ‎ → ‎lٴ‎ ) ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM → LATIN SMALL LETTER L, ARABIC LETTER HIGH HAMZA # →‎ٵ‎→→‎اٴ‎→ +0672 ; 006C 0674 ; MA # ( ‎ٲ‎ → ‎lٴ‎ ) ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE → LATIN SMALL LETTER L, ARABIC LETTER HIGH HAMZA # →‎أ‎→→‎ٵ‎→→‎اٴ‎→ +0675 ; 006C 0674 ; MA # ( ‎ٵ‎ → ‎lٴ‎ ) ARABIC LETTER HIGH HAMZA ALEF → LATIN SMALL LETTER L, ARABIC LETTER HIGH HAMZA # →‎اٴ‎→ + +FDF3 ; 006C 0643 0628 0631 ; MA # ( ‎ﷳ‎ → ‎lكبر‎ ) ARABIC LIGATURE AKBAR ISOLATED FORM → LATIN SMALL LETTER L, ARABIC LETTER KAF, ARABIC LETTER BEH, ARABIC LETTER REH # →‎اكبر‎→ + +FDF2 ; 006C 0644 0644 0651 0670 006F ; MA # ( ‎ﷲ‎ → ‎lللّٰo‎ ) ARABIC LIGATURE ALLAH ISOLATED FORM → LATIN SMALL LETTER L, ARABIC LETTER LAM, ARABIC LETTER LAM, ARABIC SHADDA, ARABIC LETTER SUPERSCRIPT ALEF, LATIN SMALL LETTER O # →‎اللّٰه‎→ + +33E0 ; 006C 65E5 ; MA #* ( ㏠ → l日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE → LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5 # →1日→ + +32C0 ; 006C 6708 ; MA #* ( ㋀ → l月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY → LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-6708 # →1月→ + +3359 ; 006C 70B9 ; MA #* ( ㍙ → l点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE → LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-70B9 # →1点→ + +2CD1 ; 029F ; MA # ( ⳑ → ʟ ) COPTIC SMALL LETTER L-SHAPED HA → LATIN LETTER SMALL CAPITAL L # +10443 ; 029F ; MA # ( 𐑃 → ʟ ) DESERET SMALL LETTER ETH → LATIN LETTER SMALL CAPITAL L # + +FF2D ; 004D ; MA # ( M → M ) FULLWIDTH LATIN CAPITAL LETTER M → LATIN CAPITAL LETTER M # →Μ→ +216F ; 004D ; MA # ( Ⅿ → M ) ROMAN NUMERAL ONE THOUSAND → LATIN CAPITAL LETTER M # +2133 ; 004D ; MA # ( ℳ → M ) SCRIPT CAPITAL M → LATIN CAPITAL LETTER M # +1D40C ; 004D ; MA # ( 𝐌 → M ) MATHEMATICAL BOLD CAPITAL M → LATIN CAPITAL LETTER M # +1D440 ; 004D ; MA # ( 𝑀 → M ) MATHEMATICAL ITALIC CAPITAL M → LATIN CAPITAL LETTER M # +1D474 ; 004D ; MA # ( 𝑴 → M ) MATHEMATICAL BOLD ITALIC CAPITAL M → LATIN CAPITAL LETTER M # +1D4DC ; 004D ; MA # ( 𝓜 → M ) MATHEMATICAL BOLD SCRIPT CAPITAL M → LATIN CAPITAL LETTER M # +1D510 ; 004D ; MA # ( 𝔐 → M ) MATHEMATICAL FRAKTUR CAPITAL M → LATIN CAPITAL LETTER M # +1D544 ; 004D ; MA # ( 𝕄 → M ) MATHEMATICAL DOUBLE-STRUCK CAPITAL M → LATIN CAPITAL LETTER M # +1D578 ; 004D ; MA # ( 𝕸 → M ) MATHEMATICAL BOLD FRAKTUR CAPITAL M → LATIN CAPITAL LETTER M # +1D5AC ; 004D ; MA # ( 𝖬 → M ) MATHEMATICAL SANS-SERIF CAPITAL M → LATIN CAPITAL LETTER M # +1D5E0 ; 004D ; MA # ( 𝗠 → M ) MATHEMATICAL SANS-SERIF BOLD CAPITAL M → LATIN CAPITAL LETTER M # +1D614 ; 004D ; MA # ( 𝘔 → M ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL M → LATIN CAPITAL LETTER M # +1D648 ; 004D ; MA # ( 𝙈 → M ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M → LATIN CAPITAL LETTER M # +1D67C ; 004D ; MA # ( 𝙼 → M ) MATHEMATICAL MONOSPACE CAPITAL M → LATIN CAPITAL LETTER M # +039C ; 004D ; MA # ( Μ → M ) GREEK CAPITAL LETTER MU → LATIN CAPITAL LETTER M # +1D6B3 ; 004D ; MA # ( 𝚳 → M ) MATHEMATICAL BOLD CAPITAL MU → LATIN CAPITAL LETTER M # →𝐌→ +1D6ED ; 004D ; MA # ( 𝛭 → M ) MATHEMATICAL ITALIC CAPITAL MU → LATIN CAPITAL LETTER M # →𝑀→ +1D727 ; 004D ; MA # ( 𝜧 → M ) MATHEMATICAL BOLD ITALIC CAPITAL MU → LATIN CAPITAL LETTER M # →𝑴→ +1D761 ; 004D ; MA # ( 𝝡 → M ) MATHEMATICAL SANS-SERIF BOLD CAPITAL MU → LATIN CAPITAL LETTER M # →Μ→ +1D79B ; 004D ; MA # ( 𝞛 → M ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU → LATIN CAPITAL LETTER M # →Μ→ +03FA ; 004D ; MA # ( Ϻ → M ) GREEK CAPITAL LETTER SAN → LATIN CAPITAL LETTER M # +2C98 ; 004D ; MA # ( Ⲙ → M ) COPTIC CAPITAL LETTER MI → LATIN CAPITAL LETTER M # +041C ; 004D ; MA # ( М → M ) CYRILLIC CAPITAL LETTER EM → LATIN CAPITAL LETTER M # +13B7 ; 004D ; MA # ( Ꮇ → M ) CHEROKEE LETTER LU → LATIN CAPITAL LETTER M # +15F0 ; 004D ; MA # ( ᗰ → M ) CANADIAN SYLLABICS CARRIER GO → LATIN CAPITAL LETTER M # +16D6 ; 004D ; MA # ( ᛖ → M ) RUNIC LETTER EHWAZ EH E → LATIN CAPITAL LETTER M # +A4DF ; 004D ; MA # ( ꓟ → M ) LISU LETTER MA → LATIN CAPITAL LETTER M # +102B0 ; 004D ; MA # ( 𐊰 → M ) CARIAN LETTER S → LATIN CAPITAL LETTER M # +10311 ; 004D ; MA # ( 𐌑 → M ) OLD ITALIC LETTER SHE → LATIN CAPITAL LETTER M # + +04CD ; 004D 0326 ; MA # ( Ӎ → M̦ ) CYRILLIC CAPITAL LETTER EM WITH TAIL → LATIN CAPITAL LETTER M, COMBINING COMMA BELOW # →М̡→ + +1F76B ; 004D 0042 ; MA #* ( 🝫 → MB ) ALCHEMICAL SYMBOL FOR BATH OF MARY → LATIN CAPITAL LETTER M, LATIN CAPITAL LETTER B # + +2DE8 ; 1DDF ; MA # ( ⷨ → ᷟ ) COMBINING CYRILLIC LETTER EM → COMBINING LATIN LETTER SMALL CAPITAL M # + +1D427 ; 006E ; MA # ( 𝐧 → n ) MATHEMATICAL BOLD SMALL N → LATIN SMALL LETTER N # +1D45B ; 006E ; MA # ( 𝑛 → n ) MATHEMATICAL ITALIC SMALL N → LATIN SMALL LETTER N # +1D48F ; 006E ; MA # ( 𝒏 → n ) MATHEMATICAL BOLD ITALIC SMALL N → LATIN SMALL LETTER N # +1D4C3 ; 006E ; MA # ( 𝓃 → n ) MATHEMATICAL SCRIPT SMALL N → LATIN SMALL LETTER N # +1D4F7 ; 006E ; MA # ( 𝓷 → n ) MATHEMATICAL BOLD SCRIPT SMALL N → LATIN SMALL LETTER N # +1D52B ; 006E ; MA # ( 𝔫 → n ) MATHEMATICAL FRAKTUR SMALL N → LATIN SMALL LETTER N # +1D55F ; 006E ; MA # ( 𝕟 → n ) MATHEMATICAL DOUBLE-STRUCK SMALL N → LATIN SMALL LETTER N # +1D593 ; 006E ; MA # ( 𝖓 → n ) MATHEMATICAL BOLD FRAKTUR SMALL N → LATIN SMALL LETTER N # +1D5C7 ; 006E ; MA # ( 𝗇 → n ) MATHEMATICAL SANS-SERIF SMALL N → LATIN SMALL LETTER N # +1D5FB ; 006E ; MA # ( 𝗻 → n ) MATHEMATICAL SANS-SERIF BOLD SMALL N → LATIN SMALL LETTER N # +1D62F ; 006E ; MA # ( 𝘯 → n ) MATHEMATICAL SANS-SERIF ITALIC SMALL N → LATIN SMALL LETTER N # +1D663 ; 006E ; MA # ( 𝙣 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N → LATIN SMALL LETTER N # +1D697 ; 006E ; MA # ( 𝚗 → n ) MATHEMATICAL MONOSPACE SMALL N → LATIN SMALL LETTER N # +03C0 ; 006E ; MA # ( π → n ) GREEK SMALL LETTER PI → LATIN SMALL LETTER N # +03D6 ; 006E ; MA # ( ϖ → n ) GREEK PI SYMBOL → LATIN SMALL LETTER N # →π→ +213C ; 006E ; MA # ( ℼ → n ) DOUBLE-STRUCK SMALL PI → LATIN SMALL LETTER N # →π→ +1D6D1 ; 006E ; MA # ( 𝛑 → n ) MATHEMATICAL BOLD SMALL PI → LATIN SMALL LETTER N # →π→ +1D6E1 ; 006E ; MA # ( 𝛡 → n ) MATHEMATICAL BOLD PI SYMBOL → LATIN SMALL LETTER N # →π→ +1D70B ; 006E ; MA # ( 𝜋 → n ) MATHEMATICAL ITALIC SMALL PI → LATIN SMALL LETTER N # →π→ +1D71B ; 006E ; MA # ( 𝜛 → n ) MATHEMATICAL ITALIC PI SYMBOL → LATIN SMALL LETTER N # →π→ +1D745 ; 006E ; MA # ( 𝝅 → n ) MATHEMATICAL BOLD ITALIC SMALL PI → LATIN SMALL LETTER N # →π→ +1D755 ; 006E ; MA # ( 𝝕 → n ) MATHEMATICAL BOLD ITALIC PI SYMBOL → LATIN SMALL LETTER N # →π→ +1D77F ; 006E ; MA # ( 𝝿 → n ) MATHEMATICAL SANS-SERIF BOLD SMALL PI → LATIN SMALL LETTER N # →π→ +1D78F ; 006E ; MA # ( 𝞏 → n ) MATHEMATICAL SANS-SERIF BOLD PI SYMBOL → LATIN SMALL LETTER N # →π→ +1D7B9 ; 006E ; MA # ( 𝞹 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI → LATIN SMALL LETTER N # →π→ +1D7C9 ; 006E ; MA # ( 𝟉 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL → LATIN SMALL LETTER N # →π→ +1D28 ; 006E ; MA # ( ᴨ → n ) GREEK LETTER SMALL CAPITAL PI → LATIN SMALL LETTER N # →п→ +043F ; 006E ; MA # ( п → n ) CYRILLIC SMALL LETTER PE → LATIN SMALL LETTER N # +0578 ; 006E ; MA # ( ո → n ) ARMENIAN SMALL LETTER VO → LATIN SMALL LETTER N # +057C ; 006E ; MA # ( ռ → n ) ARMENIAN SMALL LETTER RA → LATIN SMALL LETTER N # + +FF2E ; 004E ; MA # ( N → N ) FULLWIDTH LATIN CAPITAL LETTER N → LATIN CAPITAL LETTER N # →Ν→ +2115 ; 004E ; MA # ( ℕ → N ) DOUBLE-STRUCK CAPITAL N → LATIN CAPITAL LETTER N # +1D40D ; 004E ; MA # ( 𝐍 → N ) MATHEMATICAL BOLD CAPITAL N → LATIN CAPITAL LETTER N # +1D441 ; 004E ; MA # ( 𝑁 → N ) MATHEMATICAL ITALIC CAPITAL N → LATIN CAPITAL LETTER N # +1D475 ; 004E ; MA # ( 𝑵 → N ) MATHEMATICAL BOLD ITALIC CAPITAL N → LATIN CAPITAL LETTER N # +1D4A9 ; 004E ; MA # ( 𝒩 → N ) MATHEMATICAL SCRIPT CAPITAL N → LATIN CAPITAL LETTER N # +1D4DD ; 004E ; MA # ( 𝓝 → N ) MATHEMATICAL BOLD SCRIPT CAPITAL N → LATIN CAPITAL LETTER N # +1D511 ; 004E ; MA # ( 𝔑 → N ) MATHEMATICAL FRAKTUR CAPITAL N → LATIN CAPITAL LETTER N # +1D579 ; 004E ; MA # ( 𝕹 → N ) MATHEMATICAL BOLD FRAKTUR CAPITAL N → LATIN CAPITAL LETTER N # +1D5AD ; 004E ; MA # ( 𝖭 → N ) MATHEMATICAL SANS-SERIF CAPITAL N → LATIN CAPITAL LETTER N # +1D5E1 ; 004E ; MA # ( 𝗡 → N ) MATHEMATICAL SANS-SERIF BOLD CAPITAL N → LATIN CAPITAL LETTER N # +1D615 ; 004E ; MA # ( 𝘕 → N ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL N → LATIN CAPITAL LETTER N # +1D649 ; 004E ; MA # ( 𝙉 → N ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N → LATIN CAPITAL LETTER N # +1D67D ; 004E ; MA # ( 𝙽 → N ) MATHEMATICAL MONOSPACE CAPITAL N → LATIN CAPITAL LETTER N # +039D ; 004E ; MA # ( Ν → N ) GREEK CAPITAL LETTER NU → LATIN CAPITAL LETTER N # +1D6B4 ; 004E ; MA # ( 𝚴 → N ) MATHEMATICAL BOLD CAPITAL NU → LATIN CAPITAL LETTER N # →𝐍→ +1D6EE ; 004E ; MA # ( 𝛮 → N ) MATHEMATICAL ITALIC CAPITAL NU → LATIN CAPITAL LETTER N # →𝑁→ +1D728 ; 004E ; MA # ( 𝜨 → N ) MATHEMATICAL BOLD ITALIC CAPITAL NU → LATIN CAPITAL LETTER N # →𝑵→ +1D762 ; 004E ; MA # ( 𝝢 → N ) MATHEMATICAL SANS-SERIF BOLD CAPITAL NU → LATIN CAPITAL LETTER N # →Ν→ +1D79C ; 004E ; MA # ( 𝞜 → N ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU → LATIN CAPITAL LETTER N # →Ν→ +2C9A ; 004E ; MA # ( Ⲛ → N ) COPTIC CAPITAL LETTER NI → LATIN CAPITAL LETTER N # +A4E0 ; 004E ; MA # ( ꓠ → N ) LISU LETTER NA → LATIN CAPITAL LETTER N # +10513 ; 004E ; MA # ( 𐔓 → N ) ELBASAN LETTER NE → LATIN CAPITAL LETTER N # + +0273 ; 006E 0328 ; MA # ( ɳ → n̨ ) LATIN SMALL LETTER N WITH RETROFLEX HOOK → LATIN SMALL LETTER N, COMBINING OGONEK # →n̢→ + +019E ; 006E 0329 ; MA # ( ƞ → n̩ ) LATIN SMALL LETTER N WITH LONG RIGHT LEG → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW # +03B7 ; 006E 0329 ; MA # ( η → n̩ ) GREEK SMALL LETTER ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW # →ƞ→ +1D6C8 ; 006E 0329 ; MA # ( 𝛈 → n̩ ) MATHEMATICAL BOLD SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW # →η→→ƞ→ +1D702 ; 006E 0329 ; MA # ( 𝜂 → n̩ ) MATHEMATICAL ITALIC SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW # →η→→ƞ→ +1D73C ; 006E 0329 ; MA # ( 𝜼 → n̩ ) MATHEMATICAL BOLD ITALIC SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW # →η→→ƞ→ +1D776 ; 006E 0329 ; MA # ( 𝝶 → n̩ ) MATHEMATICAL SANS-SERIF BOLD SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW # →η→→ƞ→ +1D7B0 ; 006E 0329 ; MA # ( 𝞰 → n̩ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW # →η→→ƞ→ + +019D ; 004E 0326 ; MA # ( Ɲ → N̦ ) LATIN CAPITAL LETTER N WITH LEFT HOOK → LATIN CAPITAL LETTER N, COMBINING COMMA BELOW # →N̡→ + +1D70 ; 006E 0334 ; MA # ( ᵰ → n̴ ) LATIN SMALL LETTER N WITH MIDDLE TILDE → LATIN SMALL LETTER N, COMBINING TILDE OVERLAY # + +01CC ; 006E 006A ; MA # ( nj → nj ) LATIN SMALL LETTER NJ → LATIN SMALL LETTER N, LATIN SMALL LETTER J # + +01CB ; 004E 006A ; MA # ( Nj → Nj ) LATIN CAPITAL LETTER N WITH SMALL LETTER J → LATIN CAPITAL LETTER N, LATIN SMALL LETTER J # + +01CA ; 004E 004A ; MA # ( NJ → NJ ) LATIN CAPITAL LETTER NJ → LATIN CAPITAL LETTER N, LATIN CAPITAL LETTER J # + +2116 ; 004E 006F ; MA #* ( № → No ) NUMERO SIGN → LATIN CAPITAL LETTER N, LATIN SMALL LETTER O # + +0377 ; 1D0E ; MA # ( ͷ → ᴎ ) GREEK SMALL LETTER PAMPHYLIAN DIGAMMA → LATIN LETTER SMALL CAPITAL REVERSED N # →и→ +0438 ; 1D0E ; MA # ( и → ᴎ ) CYRILLIC SMALL LETTER I → LATIN LETTER SMALL CAPITAL REVERSED N # +1044D ; 1D0E ; MA # ( 𐑍 → ᴎ ) DESERET SMALL LETTER ENG → LATIN LETTER SMALL CAPITAL REVERSED N # →и→ + +0146 ; 0272 ; MA # ( ņ → ɲ ) LATIN SMALL LETTER N WITH CEDILLA → LATIN SMALL LETTER N WITH LEFT HOOK # + +0C02 ; 006F ; MA # ( ం → o ) TELUGU SIGN ANUSVARA → LATIN SMALL LETTER O # +0C82 ; 006F ; MA # ( ಂ → o ) KANNADA SIGN ANUSVARA → LATIN SMALL LETTER O # +0D02 ; 006F ; MA # ( ം → o ) MALAYALAM SIGN ANUSVARA → LATIN SMALL LETTER O # +0D82 ; 006F ; MA # ( ං → o ) SINHALA SIGN ANUSVARAYA → LATIN SMALL LETTER O # +0966 ; 006F ; MA # ( ० → o ) DEVANAGARI DIGIT ZERO → LATIN SMALL LETTER O # +0A66 ; 006F ; MA # ( ੦ → o ) GURMUKHI DIGIT ZERO → LATIN SMALL LETTER O # +0AE6 ; 006F ; MA # ( ૦ → o ) GUJARATI DIGIT ZERO → LATIN SMALL LETTER O # +0BE6 ; 006F ; MA # ( ௦ → o ) TAMIL DIGIT ZERO → LATIN SMALL LETTER O # +0C66 ; 006F ; MA # ( ౦ → o ) TELUGU DIGIT ZERO → LATIN SMALL LETTER O # +0CE6 ; 006F ; MA # ( ೦ → o ) KANNADA DIGIT ZERO → LATIN SMALL LETTER O # →౦→ +0D66 ; 006F ; MA # ( ൦ → o ) MALAYALAM DIGIT ZERO → LATIN SMALL LETTER O # +0E50 ; 006F ; MA # ( ๐ → o ) THAI DIGIT ZERO → LATIN SMALL LETTER O # +0ED0 ; 006F ; MA # ( ໐ → o ) LAO DIGIT ZERO → LATIN SMALL LETTER O # +1040 ; 006F ; MA # ( ၀ → o ) MYANMAR DIGIT ZERO → LATIN SMALL LETTER O # +0665 ; 006F ; MA # ( ‎٥‎ → o ) ARABIC-INDIC DIGIT FIVE → LATIN SMALL LETTER O # +06F5 ; 006F ; MA # ( ۵ → o ) EXTENDED ARABIC-INDIC DIGIT FIVE → LATIN SMALL LETTER O # →‎٥‎→ +FF4F ; 006F ; MA # ( o → o ) FULLWIDTH LATIN SMALL LETTER O → LATIN SMALL LETTER O # →о→ +2134 ; 006F ; MA # ( ℴ → o ) SCRIPT SMALL O → LATIN SMALL LETTER O # +1D428 ; 006F ; MA # ( 𝐨 → o ) MATHEMATICAL BOLD SMALL O → LATIN SMALL LETTER O # +1D45C ; 006F ; MA # ( 𝑜 → o ) MATHEMATICAL ITALIC SMALL O → LATIN SMALL LETTER O # +1D490 ; 006F ; MA # ( 𝒐 → o ) MATHEMATICAL BOLD ITALIC SMALL O → LATIN SMALL LETTER O # +1D4F8 ; 006F ; MA # ( 𝓸 → o ) MATHEMATICAL BOLD SCRIPT SMALL O → LATIN SMALL LETTER O # +1D52C ; 006F ; MA # ( 𝔬 → o ) MATHEMATICAL FRAKTUR SMALL O → LATIN SMALL LETTER O # +1D560 ; 006F ; MA # ( 𝕠 → o ) MATHEMATICAL DOUBLE-STRUCK SMALL O → LATIN SMALL LETTER O # +1D594 ; 006F ; MA # ( 𝖔 → o ) MATHEMATICAL BOLD FRAKTUR SMALL O → LATIN SMALL LETTER O # +1D5C8 ; 006F ; MA # ( 𝗈 → o ) MATHEMATICAL SANS-SERIF SMALL O → LATIN SMALL LETTER O # +1D5FC ; 006F ; MA # ( 𝗼 → o ) MATHEMATICAL SANS-SERIF BOLD SMALL O → LATIN SMALL LETTER O # +1D630 ; 006F ; MA # ( 𝘰 → o ) MATHEMATICAL SANS-SERIF ITALIC SMALL O → LATIN SMALL LETTER O # +1D664 ; 006F ; MA # ( 𝙤 → o ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O → LATIN SMALL LETTER O # +1D698 ; 006F ; MA # ( 𝚘 → o ) MATHEMATICAL MONOSPACE SMALL O → LATIN SMALL LETTER O # +1D0F ; 006F ; MA # ( ᴏ → o ) LATIN LETTER SMALL CAPITAL O → LATIN SMALL LETTER O # +1D11 ; 006F ; MA # ( ᴑ → o ) LATIN SMALL LETTER SIDEWAYS O → LATIN SMALL LETTER O # +AB3D ; 006F ; MA # ( ꬽ → o ) LATIN SMALL LETTER BLACKLETTER O → LATIN SMALL LETTER O # +03BF ; 006F ; MA # ( ο → o ) GREEK SMALL LETTER OMICRON → LATIN SMALL LETTER O # +1D6D0 ; 006F ; MA # ( 𝛐 → o ) MATHEMATICAL BOLD SMALL OMICRON → LATIN SMALL LETTER O # →𝐨→ +1D70A ; 006F ; MA # ( 𝜊 → o ) MATHEMATICAL ITALIC SMALL OMICRON → LATIN SMALL LETTER O # →𝑜→ +1D744 ; 006F ; MA # ( 𝝄 → o ) MATHEMATICAL BOLD ITALIC SMALL OMICRON → LATIN SMALL LETTER O # →𝒐→ +1D77E ; 006F ; MA # ( 𝝾 → o ) MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON → LATIN SMALL LETTER O # →ο→ +1D7B8 ; 006F ; MA # ( 𝞸 → o ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON → LATIN SMALL LETTER O # →ο→ +03C3 ; 006F ; MA # ( σ → o ) GREEK SMALL LETTER SIGMA → LATIN SMALL LETTER O # +1D6D4 ; 006F ; MA # ( 𝛔 → o ) MATHEMATICAL BOLD SMALL SIGMA → LATIN SMALL LETTER O # →σ→ +1D70E ; 006F ; MA # ( 𝜎 → o ) MATHEMATICAL ITALIC SMALL SIGMA → LATIN SMALL LETTER O # →σ→ +1D748 ; 006F ; MA # ( 𝝈 → o ) MATHEMATICAL BOLD ITALIC SMALL SIGMA → LATIN SMALL LETTER O # →σ→ +1D782 ; 006F ; MA # ( 𝞂 → o ) MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA → LATIN SMALL LETTER O # →σ→ +1D7BC ; 006F ; MA # ( 𝞼 → o ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA → LATIN SMALL LETTER O # →σ→ +2C9F ; 006F ; MA # ( ⲟ → o ) COPTIC SMALL LETTER O → LATIN SMALL LETTER O # +043E ; 006F ; MA # ( о → o ) CYRILLIC SMALL LETTER O → LATIN SMALL LETTER O # +10FF ; 006F ; MA # ( ჿ → o ) GEORGIAN LETTER LABIAL SIGN → LATIN SMALL LETTER O # +0585 ; 006F ; MA # ( օ → o ) ARMENIAN SMALL LETTER OH → LATIN SMALL LETTER O # +05E1 ; 006F ; MA # ( ‎ס‎ → o ) HEBREW LETTER SAMEKH → LATIN SMALL LETTER O # +0647 ; 006F ; MA # ( ‎ه‎ → o ) ARABIC LETTER HEH → LATIN SMALL LETTER O # +1EE24 ; 006F ; MA # ( ‎𞸤‎ → o ) ARABIC MATHEMATICAL INITIAL HEH → LATIN SMALL LETTER O # →‎ه‎→ +1EE64 ; 006F ; MA # ( ‎𞹤‎ → o ) ARABIC MATHEMATICAL STRETCHED HEH → LATIN SMALL LETTER O # →‎ه‎→ +1EE84 ; 006F ; MA # ( ‎𞺄‎ → o ) ARABIC MATHEMATICAL LOOPED HEH → LATIN SMALL LETTER O # →‎ه‎→ +FEEB ; 006F ; MA # ( ‎ﻫ‎ → o ) ARABIC LETTER HEH INITIAL FORM → LATIN SMALL LETTER O # →‎ه‎→ +FEEC ; 006F ; MA # ( ‎ﻬ‎ → o ) ARABIC LETTER HEH MEDIAL FORM → LATIN SMALL LETTER O # →‎ه‎→ +FEEA ; 006F ; MA # ( ‎ﻪ‎ → o ) ARABIC LETTER HEH FINAL FORM → LATIN SMALL LETTER O # →‎ه‎→ +FEE9 ; 006F ; MA # ( ‎ﻩ‎ → o ) ARABIC LETTER HEH ISOLATED FORM → LATIN SMALL LETTER O # →‎ه‎→ +06BE ; 006F ; MA # ( ‎ھ‎ → o ) ARABIC LETTER HEH DOACHASHMEE → LATIN SMALL LETTER O # →‎ه‎→ +FBAC ; 006F ; MA # ( ‎ﮬ‎ → o ) ARABIC LETTER HEH DOACHASHMEE INITIAL FORM → LATIN SMALL LETTER O # →‎ﻫ‎→→‎ه‎→ +FBAD ; 006F ; MA # ( ‎ﮭ‎ → o ) ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM → LATIN SMALL LETTER O # →‎ﻬ‎→→‎ه‎→ +FBAB ; 006F ; MA # ( ‎ﮫ‎ → o ) ARABIC LETTER HEH DOACHASHMEE FINAL FORM → LATIN SMALL LETTER O # →‎ﻪ‎→→‎ه‎→ +FBAA ; 006F ; MA # ( ‎ﮪ‎ → o ) ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM → LATIN SMALL LETTER O # →‎ه‎→ +06C1 ; 006F ; MA # ( ‎ہ‎ → o ) ARABIC LETTER HEH GOAL → LATIN SMALL LETTER O # →‎ه‎→ +FBA8 ; 006F ; MA # ( ‎ﮨ‎ → o ) ARABIC LETTER HEH GOAL INITIAL FORM → LATIN SMALL LETTER O # →‎ہ‎→→‎ه‎→ +FBA9 ; 006F ; MA # ( ‎ﮩ‎ → o ) ARABIC LETTER HEH GOAL MEDIAL FORM → LATIN SMALL LETTER O # →‎ہ‎→→‎ه‎→ +FBA7 ; 006F ; MA # ( ‎ﮧ‎ → o ) ARABIC LETTER HEH GOAL FINAL FORM → LATIN SMALL LETTER O # →‎ہ‎→→‎ه‎→ +FBA6 ; 006F ; MA # ( ‎ﮦ‎ → o ) ARABIC LETTER HEH GOAL ISOLATED FORM → LATIN SMALL LETTER O # →‎ه‎→ +06D5 ; 006F ; MA # ( ‎ە‎ → o ) ARABIC LETTER AE → LATIN SMALL LETTER O # →‎ه‎→ +101D ; 006F ; MA # ( ဝ → o ) MYANMAR LETTER WA → LATIN SMALL LETTER O # +118C8 ; 006F ; MA # ( 𑣈 → o ) WARANG CITI SMALL LETTER E → LATIN SMALL LETTER O # +118D7 ; 006F ; MA # ( 𑣗 → o ) WARANG CITI SMALL LETTER BU → LATIN SMALL LETTER O # +1042C ; 006F ; MA # ( 𐐬 → o ) DESERET SMALL LETTER LONG O → LATIN SMALL LETTER O # + +0030 ; 004F ; MA # ( 0 → O ) DIGIT ZERO → LATIN CAPITAL LETTER O # +07C0 ; 004F ; MA # ( ‎߀‎ → O ) NKO DIGIT ZERO → LATIN CAPITAL LETTER O # →0→ +09E6 ; 004F ; MA # ( ০ → O ) BENGALI DIGIT ZERO → LATIN CAPITAL LETTER O # →0→ +0B66 ; 004F ; MA # ( ୦ → O ) ORIYA DIGIT ZERO → LATIN CAPITAL LETTER O # →0→ +3007 ; 004F ; MA # ( 〇 → O ) IDEOGRAPHIC NUMBER ZERO → LATIN CAPITAL LETTER O # +114D0 ; 004F ; MA # ( 𑓐 → O ) TIRHUTA DIGIT ZERO → LATIN CAPITAL LETTER O # →০→→0→ +118E0 ; 004F ; MA # ( 𑣠 → O ) WARANG CITI DIGIT ZERO → LATIN CAPITAL LETTER O # →0→ +1D7CE ; 004F ; MA # ( 𝟎 → O ) MATHEMATICAL BOLD DIGIT ZERO → LATIN CAPITAL LETTER O # →0→ +1D7D8 ; 004F ; MA # ( 𝟘 → O ) MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO → LATIN CAPITAL LETTER O # →0→ +1D7E2 ; 004F ; MA # ( 𝟢 → O ) MATHEMATICAL SANS-SERIF DIGIT ZERO → LATIN CAPITAL LETTER O # →0→ +1D7EC ; 004F ; MA # ( 𝟬 → O ) MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO → LATIN CAPITAL LETTER O # →0→ +1D7F6 ; 004F ; MA # ( 𝟶 → O ) MATHEMATICAL MONOSPACE DIGIT ZERO → LATIN CAPITAL LETTER O # →0→ +FF2F ; 004F ; MA # ( O → O ) FULLWIDTH LATIN CAPITAL LETTER O → LATIN CAPITAL LETTER O # →О→ +1D40E ; 004F ; MA # ( 𝐎 → O ) MATHEMATICAL BOLD CAPITAL O → LATIN CAPITAL LETTER O # +1D442 ; 004F ; MA # ( 𝑂 → O ) MATHEMATICAL ITALIC CAPITAL O → LATIN CAPITAL LETTER O # +1D476 ; 004F ; MA # ( 𝑶 → O ) MATHEMATICAL BOLD ITALIC CAPITAL O → LATIN CAPITAL LETTER O # +1D4AA ; 004F ; MA # ( 𝒪 → O ) MATHEMATICAL SCRIPT CAPITAL O → LATIN CAPITAL LETTER O # +1D4DE ; 004F ; MA # ( 𝓞 → O ) MATHEMATICAL BOLD SCRIPT CAPITAL O → LATIN CAPITAL LETTER O # +1D512 ; 004F ; MA # ( 𝔒 → O ) MATHEMATICAL FRAKTUR CAPITAL O → LATIN CAPITAL LETTER O # +1D546 ; 004F ; MA # ( 𝕆 → O ) MATHEMATICAL DOUBLE-STRUCK CAPITAL O → LATIN CAPITAL LETTER O # +1D57A ; 004F ; MA # ( 𝕺 → O ) MATHEMATICAL BOLD FRAKTUR CAPITAL O → LATIN CAPITAL LETTER O # +1D5AE ; 004F ; MA # ( 𝖮 → O ) MATHEMATICAL SANS-SERIF CAPITAL O → LATIN CAPITAL LETTER O # +1D5E2 ; 004F ; MA # ( 𝗢 → O ) MATHEMATICAL SANS-SERIF BOLD CAPITAL O → LATIN CAPITAL LETTER O # +1D616 ; 004F ; MA # ( 𝘖 → O ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL O → LATIN CAPITAL LETTER O # +1D64A ; 004F ; MA # ( 𝙊 → O ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O → LATIN CAPITAL LETTER O # +1D67E ; 004F ; MA # ( 𝙾 → O ) MATHEMATICAL MONOSPACE CAPITAL O → LATIN CAPITAL LETTER O # +039F ; 004F ; MA # ( Ο → O ) GREEK CAPITAL LETTER OMICRON → LATIN CAPITAL LETTER O # +1D6B6 ; 004F ; MA # ( 𝚶 → O ) MATHEMATICAL BOLD CAPITAL OMICRON → LATIN CAPITAL LETTER O # →𝐎→ +1D6F0 ; 004F ; MA # ( 𝛰 → O ) MATHEMATICAL ITALIC CAPITAL OMICRON → LATIN CAPITAL LETTER O # →𝑂→ +1D72A ; 004F ; MA # ( 𝜪 → O ) MATHEMATICAL BOLD ITALIC CAPITAL OMICRON → LATIN CAPITAL LETTER O # →𝑶→ +1D764 ; 004F ; MA # ( 𝝤 → O ) MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON → LATIN CAPITAL LETTER O # →Ο→ +1D79E ; 004F ; MA # ( 𝞞 → O ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON → LATIN CAPITAL LETTER O # →Ο→ +2C9E ; 004F ; MA # ( Ⲟ → O ) COPTIC CAPITAL LETTER O → LATIN CAPITAL LETTER O # +041E ; 004F ; MA # ( О → O ) CYRILLIC CAPITAL LETTER O → LATIN CAPITAL LETTER O # +0555 ; 004F ; MA # ( Օ → O ) ARMENIAN CAPITAL LETTER OH → LATIN CAPITAL LETTER O # +2D54 ; 004F ; MA # ( ⵔ → O ) TIFINAGH LETTER YAR → LATIN CAPITAL LETTER O # +0B20 ; 004F ; MA # ( ଠ → O ) ORIYA LETTER TTHA → LATIN CAPITAL LETTER O # →୦→→0→ +0D20 ; 004F ; MA # ( ഠ → O ) MALAYALAM LETTER TTHA → LATIN CAPITAL LETTER O # +A4F3 ; 004F ; MA # ( ꓳ → O ) LISU LETTER O → LATIN CAPITAL LETTER O # +118B5 ; 004F ; MA # ( 𑢵 → O ) WARANG CITI CAPITAL LETTER AT → LATIN CAPITAL LETTER O # +10292 ; 004F ; MA # ( 𐊒 → O ) LYCIAN LETTER U → LATIN CAPITAL LETTER O # +102AB ; 004F ; MA # ( 𐊫 → O ) CARIAN LETTER O → LATIN CAPITAL LETTER O # +10404 ; 004F ; MA # ( 𐐄 → O ) DESERET CAPITAL LETTER LONG O → LATIN CAPITAL LETTER O # +10516 ; 004F ; MA # ( 𐔖 → O ) ELBASAN LETTER O → LATIN CAPITAL LETTER O # + +2070 ; 00BA ; MA #* ( ⁰ → º ) SUPERSCRIPT ZERO → MASCULINE ORDINAL INDICATOR # +1D52 ; 00BA ; MA # ( ᵒ → º ) MODIFIER LETTER SMALL O → MASCULINE ORDINAL INDICATOR # →⁰→ + +01D2 ; 014F ; MA # ( ǒ → ŏ ) LATIN SMALL LETTER O WITH CARON → LATIN SMALL LETTER O WITH BREVE # + +01D1 ; 014E ; MA # ( Ǒ → Ŏ ) LATIN CAPITAL LETTER O WITH CARON → LATIN CAPITAL LETTER O WITH BREVE # + +06FF ; 006F 0302 ; MA # ( ‎ۿ‎ → ô ) ARABIC LETTER HEH WITH INVERTED V → LATIN SMALL LETTER O, COMBINING CIRCUMFLEX ACCENT # →‎ھٛ‎→ + +00F8 ; 006F 0338 ; MA # ( ø → o̸ ) LATIN SMALL LETTER O WITH STROKE → LATIN SMALL LETTER O, COMBINING LONG SOLIDUS OVERLAY # →o̷→ +AB3E ; 006F 0338 ; MA # ( ꬾ → o̸ ) LATIN SMALL LETTER BLACKLETTER O WITH STROKE → LATIN SMALL LETTER O, COMBINING LONG SOLIDUS OVERLAY # →ø→→o̷→ + +00D8 ; 004F 0338 ; MA # ( Ø → O̸ ) LATIN CAPITAL LETTER O WITH STROKE → LATIN CAPITAL LETTER O, COMBINING LONG SOLIDUS OVERLAY # +2D41 ; 004F 0338 ; MA # ( ⵁ → O̸ ) TIFINAGH LETTER BERBER ACADEMY YAH → LATIN CAPITAL LETTER O, COMBINING LONG SOLIDUS OVERLAY # →Ø→ + +01FE ; 004F 0338 0301 ; MA # ( Ǿ → Ó̸ ) LATIN CAPITAL LETTER O WITH STROKE AND ACUTE → LATIN CAPITAL LETTER O, COMBINING LONG SOLIDUS OVERLAY, COMBINING ACUTE ACCENT # + +0275 ; 006F 0335 ; MA # ( ɵ → o̵ ) LATIN SMALL LETTER BARRED O → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY # +A74B ; 006F 0335 ; MA # ( ꝋ → o̵ ) LATIN SMALL LETTER O WITH LONG STROKE OVERLAY → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY # →o̶→ +04E9 ; 006F 0335 ; MA # ( ө → o̵ ) CYRILLIC SMALL LETTER BARRED O → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY # →ѳ→ +0473 ; 006F 0335 ; MA # ( ѳ → o̵ ) CYRILLIC SMALL LETTER FITA → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY # + +2296 ; 004F 0335 ; MA #* ( ⊖ → O̵ ) CIRCLED MINUS → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→Ꮎ→ +229D ; 004F 0335 ; MA #* ( ⊝ → O̵ ) CIRCLED DASH → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →⊖→→θ→→Ꮎ→ +236C ; 004F 0335 ; MA #* ( ⍬ → O̵ ) APL FUNCTIONAL SYMBOL ZILDE → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→Ꮎ→ +1F714 ; 004F 0335 ; MA #* ( 🜔 → O̵ ) ALCHEMICAL SYMBOL FOR SALT → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Ɵ→→O̶→ +019F ; 004F 0335 ; MA # ( Ɵ → O̵ ) LATIN CAPITAL LETTER O WITH MIDDLE TILDE → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →O̶→ +A74A ; 004F 0335 ; MA # ( Ꝋ → O̵ ) LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →O̶→ +03B8 ; 004F 0335 ; MA # ( θ → O̵ ) GREEK SMALL LETTER THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Ꮎ→ +03D1 ; 004F 0335 ; MA # ( ϑ → O̵ ) GREEK THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→Ꮎ→ +1D6C9 ; 004F 0335 ; MA # ( 𝛉 → O̵ ) MATHEMATICAL BOLD SMALL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→Ꮎ→ +1D6DD ; 004F 0335 ; MA # ( 𝛝 → O̵ ) MATHEMATICAL BOLD THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→Ꮎ→ +1D703 ; 004F 0335 ; MA # ( 𝜃 → O̵ ) MATHEMATICAL ITALIC SMALL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→Ꮎ→ +1D717 ; 004F 0335 ; MA # ( 𝜗 → O̵ ) MATHEMATICAL ITALIC THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→Ꮎ→ +1D73D ; 004F 0335 ; MA # ( 𝜽 → O̵ ) MATHEMATICAL BOLD ITALIC SMALL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→Ꮎ→ +1D751 ; 004F 0335 ; MA # ( 𝝑 → O̵ ) MATHEMATICAL BOLD ITALIC THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→Ꮎ→ +1D777 ; 004F 0335 ; MA # ( 𝝷 → O̵ ) MATHEMATICAL SANS-SERIF BOLD SMALL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→Ꮎ→ +1D78B ; 004F 0335 ; MA # ( 𝞋 → O̵ ) MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→Ꮎ→ +1D7B1 ; 004F 0335 ; MA # ( 𝞱 → O̵ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→Ꮎ→ +1D7C5 ; 004F 0335 ; MA # ( 𝟅 → O̵ ) MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→Ꮎ→ +0398 ; 004F 0335 ; MA # ( Θ → O̵ ) GREEK CAPITAL LETTER THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Ꮎ→ +03F4 ; 004F 0335 ; MA # ( ϴ → O̵ ) GREEK CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Ѳ→→О̵→ +1D6AF ; 004F 0335 ; MA # ( 𝚯 → O̵ ) MATHEMATICAL BOLD CAPITAL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ꮎ→ +1D6B9 ; 004F 0335 ; MA # ( 𝚹 → O̵ ) MATHEMATICAL BOLD CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ꮎ→ +1D6E9 ; 004F 0335 ; MA # ( 𝛩 → O̵ ) MATHEMATICAL ITALIC CAPITAL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ꮎ→ +1D6F3 ; 004F 0335 ; MA # ( 𝛳 → O̵ ) MATHEMATICAL ITALIC CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ꮎ→ +1D723 ; 004F 0335 ; MA # ( 𝜣 → O̵ ) MATHEMATICAL BOLD ITALIC CAPITAL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ꮎ→ +1D72D ; 004F 0335 ; MA # ( 𝜭 → O̵ ) MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ꮎ→ +1D75D ; 004F 0335 ; MA # ( 𝝝 → O̵ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ꮎ→ +1D767 ; 004F 0335 ; MA # ( 𝝧 → O̵ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ꮎ→ +1D797 ; 004F 0335 ; MA # ( 𝞗 → O̵ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ꮎ→ +1D7A1 ; 004F 0335 ; MA # ( 𝞡 → O̵ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ꮎ→ +04E8 ; 004F 0335 ; MA # ( Ө → O̵ ) CYRILLIC CAPITAL LETTER BARRED O → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Ѳ→→О̵→ +0472 ; 004F 0335 ; MA # ( Ѳ → O̵ ) CYRILLIC CAPITAL LETTER FITA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →О̵→ +2D31 ; 004F 0335 ; MA # ( ⴱ → O̵ ) TIFINAGH LETTER YAB → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Ɵ→→O̶→ +13BE ; 004F 0335 ; MA # ( Ꮎ → O̵ ) CHEROKEE LETTER NA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # +13EB ; 004F 0335 ; MA # ( Ꮻ → O̵ ) CHEROKEE LETTER WI → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Ѳ→→О̵→ + +FCD9 ; 006F 0670 ; MA # ( ‎ﳙ‎ → oٰ ) ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM → LATIN SMALL LETTER O, ARABIC LETTER SUPERSCRIPT ALEF # →‎هٰ‎→ + +1F101 ; 004F 002C ; MA #* ( 🄁 → O, ) DIGIT ZERO COMMA → LATIN CAPITAL LETTER O, COMMA # →0,→ + +1F100 ; 004F 002E ; MA #* ( 🄀 → O. ) DIGIT ZERO FULL STOP → LATIN CAPITAL LETTER O, FULL STOP # →0.→ + +01A1 ; 006F 0027 ; MA # ( ơ → o' ) LATIN SMALL LETTER O WITH HORN → LATIN SMALL LETTER O, APOSTROPHE # →oʼ→ + +01A0 ; 004F 0027 ; MA # ( Ơ → O' ) LATIN CAPITAL LETTER O WITH HORN → LATIN CAPITAL LETTER O, APOSTROPHE # →Oʼ→ +13A4 ; 004F 0027 ; MA # ( Ꭴ → O' ) CHEROKEE LETTER U → LATIN CAPITAL LETTER O, APOSTROPHE # →Ơ→→Oʼ→ + +0025 ; 00BA 002F 2080 ; MA #* ( % → º/₀ ) PERCENT SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO # →⁰/₀→ +066A ; 00BA 002F 2080 ; MA #* ( ٪ → º/₀ ) ARABIC PERCENT SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO # →%→→⁰/₀→ +2052 ; 00BA 002F 2080 ; MA #* ( ⁒ → º/₀ ) COMMERCIAL MINUS SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO # →%→→⁰/₀→ + +2030 ; 00BA 002F 2080 2080 ; MA #* ( ‰ → º/₀₀ ) PER MILLE SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO # →⁰/₀₀→ +0609 ; 00BA 002F 2080 2080 ; MA #* ( ؉ → º/₀₀ ) ARABIC-INDIC PER MILLE SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO # →‰→→⁰/₀₀→ + +2031 ; 00BA 002F 2080 2080 2080 ; MA #* ( ‱ → º/₀₀₀ ) PER TEN THOUSAND SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO, SUBSCRIPT ZERO # →⁰/₀₀₀→ +060A ; 00BA 002F 2080 2080 2080 ; MA #* ( ؊ → º/₀₀₀ ) ARABIC-INDIC PER TEN THOUSAND SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO, SUBSCRIPT ZERO # →‱→→⁰/₀₀₀→ + +0153 ; 006F 0065 ; MA # ( œ → oe ) LATIN SMALL LIGATURE OE → LATIN SMALL LETTER O, LATIN SMALL LETTER E # + +0152 ; 004F 0045 ; MA # ( Œ → OE ) LATIN CAPITAL LIGATURE OE → LATIN CAPITAL LETTER O, LATIN CAPITAL LETTER E # + +0276 ; 006F 1D07 ; MA # ( ɶ → oᴇ ) LATIN LETTER SMALL CAPITAL OE → LATIN SMALL LETTER O, LATIN LETTER SMALL CAPITAL E # + +221E ; 006F 006F ; MA #* ( ∞ → oo ) INFINITY → LATIN SMALL LETTER O, LATIN SMALL LETTER O # →ꝏ→ +A74F ; 006F 006F ; MA # ( ꝏ → oo ) LATIN SMALL LETTER OO → LATIN SMALL LETTER O, LATIN SMALL LETTER O # +A699 ; 006F 006F ; MA # ( ꚙ → oo ) CYRILLIC SMALL LETTER DOUBLE O → LATIN SMALL LETTER O, LATIN SMALL LETTER O # + +A74E ; 004F 004F ; MA # ( Ꝏ → OO ) LATIN CAPITAL LETTER OO → LATIN CAPITAL LETTER O, LATIN CAPITAL LETTER O # +A698 ; 004F 004F ; MA # ( Ꚙ → OO ) CYRILLIC CAPITAL LETTER DOUBLE O → LATIN CAPITAL LETTER O, LATIN CAPITAL LETTER O # + +FCD7 ; 006F 062C ; MA # ( ‎ﳗ‎ → ‎oج‎ ) ARABIC LIGATURE HEH WITH JEEM INITIAL FORM → LATIN SMALL LETTER O, ARABIC LETTER JEEM # →‎هج‎→ +FC51 ; 006F 062C ; MA # ( ‎ﱑ‎ → ‎oج‎ ) ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM → LATIN SMALL LETTER O, ARABIC LETTER JEEM # →‎هج‎→ + +FCD8 ; 006F 0645 ; MA # ( ‎ﳘ‎ → ‎oم‎ ) ARABIC LIGATURE HEH WITH MEEM INITIAL FORM → LATIN SMALL LETTER O, ARABIC LETTER MEEM # →‎هم‎→ +FC52 ; 006F 0645 ; MA # ( ‎ﱒ‎ → ‎oم‎ ) ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM → LATIN SMALL LETTER O, ARABIC LETTER MEEM # →‎هم‎→ + +FD93 ; 006F 0645 062C ; MA # ( ‎ﶓ‎ → ‎oمج‎ ) ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM → LATIN SMALL LETTER O, ARABIC LETTER MEEM, ARABIC LETTER JEEM # →‎همج‎→ + +FD94 ; 006F 0645 0645 ; MA # ( ‎ﶔ‎ → ‎oمم‎ ) ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM → LATIN SMALL LETTER O, ARABIC LETTER MEEM, ARABIC LETTER MEEM # →‎همم‎→ + +FC53 ; 006F 0649 ; MA # ( ‎ﱓ‎ → ‎oى‎ ) ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM → LATIN SMALL LETTER O, ARABIC LETTER ALEF MAKSURA # →‎هى‎→ +FC54 ; 006F 0649 ; MA # ( ‎ﱔ‎ → ‎oى‎ ) ARABIC LIGATURE HEH WITH YEH ISOLATED FORM → LATIN SMALL LETTER O, ARABIC LETTER ALEF MAKSURA # →‎هي‎→ + +0D5F ; 006F 0D30 006F ; MA # ( ൟ → oരo ) MALAYALAM LETTER ARCHAIC II → LATIN SMALL LETTER O, MALAYALAM LETTER RA, LATIN SMALL LETTER O # →൦ര൦→ + +1010 ; 006F 102C ; MA # ( တ → oာ ) MYANMAR LETTER TA → LATIN SMALL LETTER O, MYANMAR VOWEL SIGN AA # →ဝာ→ + +3358 ; 004F 70B9 ; MA #* ( ㍘ → O点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO → LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-70B9 # →0点→ + +2184 ; 0254 ; MA # ( ↄ → ɔ ) LATIN SMALL LETTER REVERSED C → LATIN SMALL LETTER OPEN O # +1D10 ; 0254 ; MA # ( ᴐ → ɔ ) LATIN LETTER SMALL CAPITAL OPEN O → LATIN SMALL LETTER OPEN O # +037B ; 0254 ; MA # ( ͻ → ɔ ) GREEK SMALL REVERSED LUNATE SIGMA SYMBOL → LATIN SMALL LETTER OPEN O # +1044B ; 0254 ; MA # ( 𐑋 → ɔ ) DESERET SMALL LETTER EM → LATIN SMALL LETTER OPEN O # + +2183 ; 0186 ; MA # ( Ↄ → Ɔ ) ROMAN NUMERAL REVERSED ONE HUNDRED → LATIN CAPITAL LETTER OPEN O # +03FD ; 0186 ; MA # ( Ͻ → Ɔ ) GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL → LATIN CAPITAL LETTER OPEN O # +A4DB ; 0186 ; MA # ( ꓛ → Ɔ ) LISU LETTER CHA → LATIN CAPITAL LETTER OPEN O # +10423 ; 0186 ; MA # ( 𐐣 → Ɔ ) DESERET CAPITAL LETTER EM → LATIN CAPITAL LETTER OPEN O # + +1043F ; 0277 ; MA # ( 𐐿 → ɷ ) DESERET SMALL LETTER KAY → LATIN SMALL LETTER CLOSED OMEGA # + +2374 ; 0070 ; MA #* ( ⍴ → p ) APL FUNCTIONAL SYMBOL RHO → LATIN SMALL LETTER P # →ρ→ +FF50 ; 0070 ; MA # ( p → p ) FULLWIDTH LATIN SMALL LETTER P → LATIN SMALL LETTER P # →р→ +1D429 ; 0070 ; MA # ( 𝐩 → p ) MATHEMATICAL BOLD SMALL P → LATIN SMALL LETTER P # +1D45D ; 0070 ; MA # ( 𝑝 → p ) MATHEMATICAL ITALIC SMALL P → LATIN SMALL LETTER P # +1D491 ; 0070 ; MA # ( 𝒑 → p ) MATHEMATICAL BOLD ITALIC SMALL P → LATIN SMALL LETTER P # +1D4C5 ; 0070 ; MA # ( 𝓅 → p ) MATHEMATICAL SCRIPT SMALL P → LATIN SMALL LETTER P # +1D4F9 ; 0070 ; MA # ( 𝓹 → p ) MATHEMATICAL BOLD SCRIPT SMALL P → LATIN SMALL LETTER P # +1D52D ; 0070 ; MA # ( 𝔭 → p ) MATHEMATICAL FRAKTUR SMALL P → LATIN SMALL LETTER P # +1D561 ; 0070 ; MA # ( 𝕡 → p ) MATHEMATICAL DOUBLE-STRUCK SMALL P → LATIN SMALL LETTER P # +1D595 ; 0070 ; MA # ( 𝖕 → p ) MATHEMATICAL BOLD FRAKTUR SMALL P → LATIN SMALL LETTER P # +1D5C9 ; 0070 ; MA # ( 𝗉 → p ) MATHEMATICAL SANS-SERIF SMALL P → LATIN SMALL LETTER P # +1D5FD ; 0070 ; MA # ( 𝗽 → p ) MATHEMATICAL SANS-SERIF BOLD SMALL P → LATIN SMALL LETTER P # +1D631 ; 0070 ; MA # ( 𝘱 → p ) MATHEMATICAL SANS-SERIF ITALIC SMALL P → LATIN SMALL LETTER P # +1D665 ; 0070 ; MA # ( 𝙥 → p ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P → LATIN SMALL LETTER P # +1D699 ; 0070 ; MA # ( 𝚙 → p ) MATHEMATICAL MONOSPACE SMALL P → LATIN SMALL LETTER P # +03C1 ; 0070 ; MA # ( ρ → p ) GREEK SMALL LETTER RHO → LATIN SMALL LETTER P # +03F1 ; 0070 ; MA # ( ϱ → p ) GREEK RHO SYMBOL → LATIN SMALL LETTER P # →ρ→ +1D6D2 ; 0070 ; MA # ( 𝛒 → p ) MATHEMATICAL BOLD SMALL RHO → LATIN SMALL LETTER P # →ρ→ +1D6E0 ; 0070 ; MA # ( 𝛠 → p ) MATHEMATICAL BOLD RHO SYMBOL → LATIN SMALL LETTER P # →ρ→ +1D70C ; 0070 ; MA # ( 𝜌 → p ) MATHEMATICAL ITALIC SMALL RHO → LATIN SMALL LETTER P # →ρ→ +1D71A ; 0070 ; MA # ( 𝜚 → p ) MATHEMATICAL ITALIC RHO SYMBOL → LATIN SMALL LETTER P # →ρ→ +1D746 ; 0070 ; MA # ( 𝝆 → p ) MATHEMATICAL BOLD ITALIC SMALL RHO → LATIN SMALL LETTER P # →ρ→ +1D754 ; 0070 ; MA # ( 𝝔 → p ) MATHEMATICAL BOLD ITALIC RHO SYMBOL → LATIN SMALL LETTER P # →ρ→ +1D780 ; 0070 ; MA # ( 𝞀 → p ) MATHEMATICAL SANS-SERIF BOLD SMALL RHO → LATIN SMALL LETTER P # →ρ→ +1D78E ; 0070 ; MA # ( 𝞎 → p ) MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL → LATIN SMALL LETTER P # →ρ→ +1D7BA ; 0070 ; MA # ( 𝞺 → p ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO → LATIN SMALL LETTER P # →ρ→ +1D7C8 ; 0070 ; MA # ( 𝟈 → p ) MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL → LATIN SMALL LETTER P # →ρ→ +2CA3 ; 0070 ; MA # ( ⲣ → p ) COPTIC SMALL LETTER RO → LATIN SMALL LETTER P # →ρ→ +0440 ; 0070 ; MA # ( р → p ) CYRILLIC SMALL LETTER ER → LATIN SMALL LETTER P # + +FF30 ; 0050 ; MA # ( P → P ) FULLWIDTH LATIN CAPITAL LETTER P → LATIN CAPITAL LETTER P # →Р→ +2119 ; 0050 ; MA # ( ℙ → P ) DOUBLE-STRUCK CAPITAL P → LATIN CAPITAL LETTER P # +1D40F ; 0050 ; MA # ( 𝐏 → P ) MATHEMATICAL BOLD CAPITAL P → LATIN CAPITAL LETTER P # +1D443 ; 0050 ; MA # ( 𝑃 → P ) MATHEMATICAL ITALIC CAPITAL P → LATIN CAPITAL LETTER P # +1D477 ; 0050 ; MA # ( 𝑷 → P ) MATHEMATICAL BOLD ITALIC CAPITAL P → LATIN CAPITAL LETTER P # +1D4AB ; 0050 ; MA # ( 𝒫 → P ) MATHEMATICAL SCRIPT CAPITAL P → LATIN CAPITAL LETTER P # +1D4DF ; 0050 ; MA # ( 𝓟 → P ) MATHEMATICAL BOLD SCRIPT CAPITAL P → LATIN CAPITAL LETTER P # +1D513 ; 0050 ; MA # ( 𝔓 → P ) MATHEMATICAL FRAKTUR CAPITAL P → LATIN CAPITAL LETTER P # +1D57B ; 0050 ; MA # ( 𝕻 → P ) MATHEMATICAL BOLD FRAKTUR CAPITAL P → LATIN CAPITAL LETTER P # +1D5AF ; 0050 ; MA # ( 𝖯 → P ) MATHEMATICAL SANS-SERIF CAPITAL P → LATIN CAPITAL LETTER P # +1D5E3 ; 0050 ; MA # ( 𝗣 → P ) MATHEMATICAL SANS-SERIF BOLD CAPITAL P → LATIN CAPITAL LETTER P # +1D617 ; 0050 ; MA # ( 𝘗 → P ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL P → LATIN CAPITAL LETTER P # +1D64B ; 0050 ; MA # ( 𝙋 → P ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P → LATIN CAPITAL LETTER P # +1D67F ; 0050 ; MA # ( 𝙿 → P ) MATHEMATICAL MONOSPACE CAPITAL P → LATIN CAPITAL LETTER P # +03A1 ; 0050 ; MA # ( Ρ → P ) GREEK CAPITAL LETTER RHO → LATIN CAPITAL LETTER P # +1D6B8 ; 0050 ; MA # ( 𝚸 → P ) MATHEMATICAL BOLD CAPITAL RHO → LATIN CAPITAL LETTER P # →𝐏→ +1D6F2 ; 0050 ; MA # ( 𝛲 → P ) MATHEMATICAL ITALIC CAPITAL RHO → LATIN CAPITAL LETTER P # →Ρ→ +1D72C ; 0050 ; MA # ( 𝜬 → P ) MATHEMATICAL BOLD ITALIC CAPITAL RHO → LATIN CAPITAL LETTER P # →Ρ→ +1D766 ; 0050 ; MA # ( 𝝦 → P ) MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO → LATIN CAPITAL LETTER P # →Ρ→ +1D7A0 ; 0050 ; MA # ( 𝞠 → P ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO → LATIN CAPITAL LETTER P # →Ρ→ +2CA2 ; 0050 ; MA # ( Ⲣ → P ) COPTIC CAPITAL LETTER RO → LATIN CAPITAL LETTER P # +0420 ; 0050 ; MA # ( Р → P ) CYRILLIC CAPITAL LETTER ER → LATIN CAPITAL LETTER P # +13E2 ; 0050 ; MA # ( Ꮲ → P ) CHEROKEE LETTER TLV → LATIN CAPITAL LETTER P # +146D ; 0050 ; MA # ( ᑭ → P ) CANADIAN SYLLABICS KI → LATIN CAPITAL LETTER P # +A4D1 ; 0050 ; MA # ( ꓑ → P ) LISU LETTER PA → LATIN CAPITAL LETTER P # +10295 ; 0050 ; MA # ( 𐊕 → P ) LYCIAN LETTER R → LATIN CAPITAL LETTER P # + +01A5 ; 0070 0314 ; MA # ( ƥ → p̔ ) LATIN SMALL LETTER P WITH HOOK → LATIN SMALL LETTER P, COMBINING REVERSED COMMA ABOVE # + +1D7D ; 0070 0335 ; MA # ( ᵽ → p̵ ) LATIN SMALL LETTER P WITH STROKE → LATIN SMALL LETTER P, COMBINING SHORT STROKE OVERLAY # + +1477 ; 0070 00B7 ; MA # ( ᑷ → p· ) CANADIAN SYLLABICS WEST-CREE KWI → LATIN SMALL LETTER P, MIDDLE DOT # →pᐧ→ + +1486 ; 0050 0027 ; MA # ( ᒆ → P' ) CANADIAN SYLLABICS SOUTH-SLAVEY KIH → LATIN CAPITAL LETTER P, APOSTROPHE # →ᑭᑊ→ + +1D29 ; 1D18 ; MA # ( ᴩ → ᴘ ) GREEK LETTER SMALL CAPITAL RHO → LATIN LETTER SMALL CAPITAL P # + +03C6 ; 0278 ; MA # ( φ → ɸ ) GREEK SMALL LETTER PHI → LATIN SMALL LETTER PHI # +03D5 ; 0278 ; MA # ( ϕ → ɸ ) GREEK PHI SYMBOL → LATIN SMALL LETTER PHI # +1D6D7 ; 0278 ; MA # ( 𝛗 → ɸ ) MATHEMATICAL BOLD SMALL PHI → LATIN SMALL LETTER PHI # →φ→ +1D6DF ; 0278 ; MA # ( 𝛟 → ɸ ) MATHEMATICAL BOLD PHI SYMBOL → LATIN SMALL LETTER PHI # →φ→ +1D711 ; 0278 ; MA # ( 𝜑 → ɸ ) MATHEMATICAL ITALIC SMALL PHI → LATIN SMALL LETTER PHI # →φ→ +1D719 ; 0278 ; MA # ( 𝜙 → ɸ ) MATHEMATICAL ITALIC PHI SYMBOL → LATIN SMALL LETTER PHI # →φ→ +1D74B ; 0278 ; MA # ( 𝝋 → ɸ ) MATHEMATICAL BOLD ITALIC SMALL PHI → LATIN SMALL LETTER PHI # →φ→ +1D753 ; 0278 ; MA # ( 𝝓 → ɸ ) MATHEMATICAL BOLD ITALIC PHI SYMBOL → LATIN SMALL LETTER PHI # →φ→ +1D785 ; 0278 ; MA # ( 𝞅 → ɸ ) MATHEMATICAL SANS-SERIF BOLD SMALL PHI → LATIN SMALL LETTER PHI # →φ→ +1D78D ; 0278 ; MA # ( 𝞍 → ɸ ) MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL → LATIN SMALL LETTER PHI # →φ→ +1D7BF ; 0278 ; MA # ( 𝞿 → ɸ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI → LATIN SMALL LETTER PHI # →φ→ +1D7C7 ; 0278 ; MA # ( 𝟇 → ɸ ) MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL → LATIN SMALL LETTER PHI # →φ→ +2CAB ; 0278 ; MA # ( ⲫ → ɸ ) COPTIC SMALL LETTER FI → LATIN SMALL LETTER PHI # →ϕ→ +0444 ; 0278 ; MA # ( ф → ɸ ) CYRILLIC SMALL LETTER EF → LATIN SMALL LETTER PHI # + +1D42A ; 0071 ; MA # ( 𝐪 → q ) MATHEMATICAL BOLD SMALL Q → LATIN SMALL LETTER Q # +1D45E ; 0071 ; MA # ( 𝑞 → q ) MATHEMATICAL ITALIC SMALL Q → LATIN SMALL LETTER Q # +1D492 ; 0071 ; MA # ( 𝒒 → q ) MATHEMATICAL BOLD ITALIC SMALL Q → LATIN SMALL LETTER Q # +1D4C6 ; 0071 ; MA # ( 𝓆 → q ) MATHEMATICAL SCRIPT SMALL Q → LATIN SMALL LETTER Q # +1D4FA ; 0071 ; MA # ( 𝓺 → q ) MATHEMATICAL BOLD SCRIPT SMALL Q → LATIN SMALL LETTER Q # +1D52E ; 0071 ; MA # ( 𝔮 → q ) MATHEMATICAL FRAKTUR SMALL Q → LATIN SMALL LETTER Q # +1D562 ; 0071 ; MA # ( 𝕢 → q ) MATHEMATICAL DOUBLE-STRUCK SMALL Q → LATIN SMALL LETTER Q # +1D596 ; 0071 ; MA # ( 𝖖 → q ) MATHEMATICAL BOLD FRAKTUR SMALL Q → LATIN SMALL LETTER Q # +1D5CA ; 0071 ; MA # ( 𝗊 → q ) MATHEMATICAL SANS-SERIF SMALL Q → LATIN SMALL LETTER Q # +1D5FE ; 0071 ; MA # ( 𝗾 → q ) MATHEMATICAL SANS-SERIF BOLD SMALL Q → LATIN SMALL LETTER Q # +1D632 ; 0071 ; MA # ( 𝘲 → q ) MATHEMATICAL SANS-SERIF ITALIC SMALL Q → LATIN SMALL LETTER Q # +1D666 ; 0071 ; MA # ( 𝙦 → q ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q → LATIN SMALL LETTER Q # +1D69A ; 0071 ; MA # ( 𝚚 → q ) MATHEMATICAL MONOSPACE SMALL Q → LATIN SMALL LETTER Q # +051B ; 0071 ; MA # ( ԛ → q ) CYRILLIC SMALL LETTER QA → LATIN SMALL LETTER Q # +0563 ; 0071 ; MA # ( գ → q ) ARMENIAN SMALL LETTER GIM → LATIN SMALL LETTER Q # +0566 ; 0071 ; MA # ( զ → q ) ARMENIAN SMALL LETTER ZA → LATIN SMALL LETTER Q # + +211A ; 0051 ; MA # ( ℚ → Q ) DOUBLE-STRUCK CAPITAL Q → LATIN CAPITAL LETTER Q # +1D410 ; 0051 ; MA # ( 𝐐 → Q ) MATHEMATICAL BOLD CAPITAL Q → LATIN CAPITAL LETTER Q # +1D444 ; 0051 ; MA # ( 𝑄 → Q ) MATHEMATICAL ITALIC CAPITAL Q → LATIN CAPITAL LETTER Q # +1D478 ; 0051 ; MA # ( 𝑸 → Q ) MATHEMATICAL BOLD ITALIC CAPITAL Q → LATIN CAPITAL LETTER Q # +1D4AC ; 0051 ; MA # ( 𝒬 → Q ) MATHEMATICAL SCRIPT CAPITAL Q → LATIN CAPITAL LETTER Q # +1D4E0 ; 0051 ; MA # ( 𝓠 → Q ) MATHEMATICAL BOLD SCRIPT CAPITAL Q → LATIN CAPITAL LETTER Q # +1D514 ; 0051 ; MA # ( 𝔔 → Q ) MATHEMATICAL FRAKTUR CAPITAL Q → LATIN CAPITAL LETTER Q # +1D57C ; 0051 ; MA # ( 𝕼 → Q ) MATHEMATICAL BOLD FRAKTUR CAPITAL Q → LATIN CAPITAL LETTER Q # +1D5B0 ; 0051 ; MA # ( 𝖰 → Q ) MATHEMATICAL SANS-SERIF CAPITAL Q → LATIN CAPITAL LETTER Q # +1D5E4 ; 0051 ; MA # ( 𝗤 → Q ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Q → LATIN CAPITAL LETTER Q # +1D618 ; 0051 ; MA # ( 𝘘 → Q ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q → LATIN CAPITAL LETTER Q # +1D64C ; 0051 ; MA # ( 𝙌 → Q ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q → LATIN CAPITAL LETTER Q # +1D680 ; 0051 ; MA # ( 𝚀 → Q ) MATHEMATICAL MONOSPACE CAPITAL Q → LATIN CAPITAL LETTER Q # +2D55 ; 0051 ; MA # ( ⵕ → Q ) TIFINAGH LETTER YARR → LATIN CAPITAL LETTER Q # + +02A0 ; 0071 0314 ; MA # ( ʠ → q̔ ) LATIN SMALL LETTER Q WITH HOOK → LATIN SMALL LETTER Q, COMBINING REVERSED COMMA ABOVE # + +1F700 ; 0051 0045 ; MA #* ( 🜀 → QE ) ALCHEMICAL SYMBOL FOR QUINTESSENCE → LATIN CAPITAL LETTER Q, LATIN CAPITAL LETTER E # + +1D90 ; 024B ; MA # ( ᶐ → ɋ ) LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK → LATIN SMALL LETTER Q WITH HOOK TAIL # + +1D42B ; 0072 ; MA # ( 𝐫 → r ) MATHEMATICAL BOLD SMALL R → LATIN SMALL LETTER R # +1D45F ; 0072 ; MA # ( 𝑟 → r ) MATHEMATICAL ITALIC SMALL R → LATIN SMALL LETTER R # +1D493 ; 0072 ; MA # ( 𝒓 → r ) MATHEMATICAL BOLD ITALIC SMALL R → LATIN SMALL LETTER R # +1D4C7 ; 0072 ; MA # ( 𝓇 → r ) MATHEMATICAL SCRIPT SMALL R → LATIN SMALL LETTER R # +1D4FB ; 0072 ; MA # ( 𝓻 → r ) MATHEMATICAL BOLD SCRIPT SMALL R → LATIN SMALL LETTER R # +1D52F ; 0072 ; MA # ( 𝔯 → r ) MATHEMATICAL FRAKTUR SMALL R → LATIN SMALL LETTER R # +1D563 ; 0072 ; MA # ( 𝕣 → r ) MATHEMATICAL DOUBLE-STRUCK SMALL R → LATIN SMALL LETTER R # +1D597 ; 0072 ; MA # ( 𝖗 → r ) MATHEMATICAL BOLD FRAKTUR SMALL R → LATIN SMALL LETTER R # +1D5CB ; 0072 ; MA # ( 𝗋 → r ) MATHEMATICAL SANS-SERIF SMALL R → LATIN SMALL LETTER R # +1D5FF ; 0072 ; MA # ( 𝗿 → r ) MATHEMATICAL SANS-SERIF BOLD SMALL R → LATIN SMALL LETTER R # +1D633 ; 0072 ; MA # ( 𝘳 → r ) MATHEMATICAL SANS-SERIF ITALIC SMALL R → LATIN SMALL LETTER R # +1D667 ; 0072 ; MA # ( 𝙧 → r ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R → LATIN SMALL LETTER R # +1D69B ; 0072 ; MA # ( 𝚛 → r ) MATHEMATICAL MONOSPACE SMALL R → LATIN SMALL LETTER R # +AB47 ; 0072 ; MA # ( ꭇ → r ) LATIN SMALL LETTER R WITHOUT HANDLE → LATIN SMALL LETTER R # +AB48 ; 0072 ; MA # ( ꭈ → r ) LATIN SMALL LETTER DOUBLE R → LATIN SMALL LETTER R # +1D26 ; 0072 ; MA # ( ᴦ → r ) GREEK LETTER SMALL CAPITAL GAMMA → LATIN SMALL LETTER R # →г→ +2C85 ; 0072 ; MA # ( ⲅ → r ) COPTIC SMALL LETTER GAMMA → LATIN SMALL LETTER R # →г→ +0433 ; 0072 ; MA # ( г → r ) CYRILLIC SMALL LETTER GHE → LATIN SMALL LETTER R # + +211B ; 0052 ; MA # ( ℛ → R ) SCRIPT CAPITAL R → LATIN CAPITAL LETTER R # +211C ; 0052 ; MA # ( ℜ → R ) BLACK-LETTER CAPITAL R → LATIN CAPITAL LETTER R # +211D ; 0052 ; MA # ( ℝ → R ) DOUBLE-STRUCK CAPITAL R → LATIN CAPITAL LETTER R # +1D411 ; 0052 ; MA # ( 𝐑 → R ) MATHEMATICAL BOLD CAPITAL R → LATIN CAPITAL LETTER R # +1D445 ; 0052 ; MA # ( 𝑅 → R ) MATHEMATICAL ITALIC CAPITAL R → LATIN CAPITAL LETTER R # +1D479 ; 0052 ; MA # ( 𝑹 → R ) MATHEMATICAL BOLD ITALIC CAPITAL R → LATIN CAPITAL LETTER R # +1D4E1 ; 0052 ; MA # ( 𝓡 → R ) MATHEMATICAL BOLD SCRIPT CAPITAL R → LATIN CAPITAL LETTER R # +1D57D ; 0052 ; MA # ( 𝕽 → R ) MATHEMATICAL BOLD FRAKTUR CAPITAL R → LATIN CAPITAL LETTER R # +1D5B1 ; 0052 ; MA # ( 𝖱 → R ) MATHEMATICAL SANS-SERIF CAPITAL R → LATIN CAPITAL LETTER R # +1D5E5 ; 0052 ; MA # ( 𝗥 → R ) MATHEMATICAL SANS-SERIF BOLD CAPITAL R → LATIN CAPITAL LETTER R # +1D619 ; 0052 ; MA # ( 𝘙 → R ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL R → LATIN CAPITAL LETTER R # +1D64D ; 0052 ; MA # ( 𝙍 → R ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R → LATIN CAPITAL LETTER R # +1D681 ; 0052 ; MA # ( 𝚁 → R ) MATHEMATICAL MONOSPACE CAPITAL R → LATIN CAPITAL LETTER R # +01A6 ; 0052 ; MA # ( Ʀ → R ) LATIN LETTER YR → LATIN CAPITAL LETTER R # +13A1 ; 0052 ; MA # ( Ꭱ → R ) CHEROKEE LETTER E → LATIN CAPITAL LETTER R # +13D2 ; 0052 ; MA # ( Ꮢ → R ) CHEROKEE LETTER SV → LATIN CAPITAL LETTER R # +1587 ; 0052 ; MA # ( ᖇ → R ) CANADIAN SYLLABICS TLHI → LATIN CAPITAL LETTER R # +A4E3 ; 0052 ; MA # ( ꓣ → R ) LISU LETTER ZHA → LATIN CAPITAL LETTER R # + +027D ; 0072 0328 ; MA # ( ɽ → r̨ ) LATIN SMALL LETTER R WITH TAIL → LATIN SMALL LETTER R, COMBINING OGONEK # + +027C ; 0072 0329 ; MA # ( ɼ → r̩ ) LATIN SMALL LETTER R WITH LONG LEG → LATIN SMALL LETTER R, COMBINING VERTICAL LINE BELOW # + +024D ; 0072 0335 ; MA # ( ɍ → r̵ ) LATIN SMALL LETTER R WITH STROKE → LATIN SMALL LETTER R, COMBINING SHORT STROKE OVERLAY # +0493 ; 0072 0335 ; MA # ( ғ → r̵ ) CYRILLIC SMALL LETTER GHE WITH STROKE → LATIN SMALL LETTER R, COMBINING SHORT STROKE OVERLAY # →г̵→ + +1D72 ; 0072 0334 ; MA # ( ᵲ → r̴ ) LATIN SMALL LETTER R WITH MIDDLE TILDE → LATIN SMALL LETTER R, COMBINING TILDE OVERLAY # + +0491 ; 0072 0027 ; MA # ( ґ → r' ) CYRILLIC SMALL LETTER GHE WITH UPTURN → LATIN SMALL LETTER R, APOSTROPHE # →гˈ→ + +118E3 ; 0072 006E ; MA # ( 𑣣 → rn ) WARANG CITI DIGIT THREE → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +006D ; 0072 006E ; MA # ( m → rn ) LATIN SMALL LETTER M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # +217F ; 0072 006E ; MA # ( ⅿ → rn ) SMALL ROMAN NUMERAL ONE THOUSAND → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +1D426 ; 0072 006E ; MA # ( 𝐦 → rn ) MATHEMATICAL BOLD SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +1D45A ; 0072 006E ; MA # ( 𝑚 → rn ) MATHEMATICAL ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +1D48E ; 0072 006E ; MA # ( 𝒎 → rn ) MATHEMATICAL BOLD ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +1D4C2 ; 0072 006E ; MA # ( 𝓂 → rn ) MATHEMATICAL SCRIPT SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +1D4F6 ; 0072 006E ; MA # ( 𝓶 → rn ) MATHEMATICAL BOLD SCRIPT SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +1D52A ; 0072 006E ; MA # ( 𝔪 → rn ) MATHEMATICAL FRAKTUR SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +1D55E ; 0072 006E ; MA # ( 𝕞 → rn ) MATHEMATICAL DOUBLE-STRUCK SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +1D592 ; 0072 006E ; MA # ( 𝖒 → rn ) MATHEMATICAL BOLD FRAKTUR SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +1D5C6 ; 0072 006E ; MA # ( 𝗆 → rn ) MATHEMATICAL SANS-SERIF SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +1D5FA ; 0072 006E ; MA # ( 𝗺 → rn ) MATHEMATICAL SANS-SERIF BOLD SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +1D62E ; 0072 006E ; MA # ( 𝘮 → rn ) MATHEMATICAL SANS-SERIF ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +1D662 ; 0072 006E ; MA # ( 𝙢 → rn ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +1D696 ; 0072 006E ; MA # ( 𝚖 → rn ) MATHEMATICAL MONOSPACE SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +1D0D ; 0072 006E ; MA # ( ᴍ → rn ) LATIN LETTER SMALL CAPITAL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →м→→m→ +AB51 ; 0072 006E ; MA # ( ꭑ → rn ) LATIN SMALL LETTER TURNED UI → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +028D ; 0072 006E ; MA # ( ʍ → rn ) LATIN SMALL LETTER TURNED W → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +043C ; 0072 006E ; MA # ( м → rn ) CYRILLIC SMALL LETTER EM → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ +11700 ; 0072 006E ; MA # ( 𑜀 → rn ) AHOM LETTER KA → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ + +20A5 ; 0072 006E 0338 ; MA #* ( ₥ → rn̸ ) MILL SIGN → LATIN SMALL LETTER R, LATIN SMALL LETTER N, COMBINING LONG SOLIDUS OVERLAY # →m̷→ + +0271 ; 0072 006E 0326 ; MA # ( ɱ → rn̦ ) LATIN SMALL LETTER M WITH HOOK → LATIN SMALL LETTER R, LATIN SMALL LETTER N, COMBINING COMMA BELOW # →m̡→ +04CE ; 0072 006E 0326 ; MA # ( ӎ → rn̦ ) CYRILLIC SMALL LETTER EM WITH TAIL → LATIN SMALL LETTER R, LATIN SMALL LETTER N, COMBINING COMMA BELOW # →м̡→ + +1D6F ; 0072 006E 0334 ; MA # ( ᵯ → rn̴ ) LATIN SMALL LETTER M WITH MIDDLE TILDE → LATIN SMALL LETTER R, LATIN SMALL LETTER N, COMBINING TILDE OVERLAY # →m̴→ + +20A8 ; 0052 0073 ; MA #* ( ₨ → Rs ) RUPEE SIGN → LATIN CAPITAL LETTER R, LATIN SMALL LETTER S # + +044F ; 1D19 ; MA # ( я → ᴙ ) CYRILLIC SMALL LETTER YA → LATIN LETTER SMALL CAPITAL REVERSED R # + +1D73 ; 027E 0334 ; MA # ( ᵳ → ɾ̴ ) LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE → LATIN SMALL LETTER R WITH FISHHOOK, COMBINING TILDE OVERLAY # + +2129 ; 027F ; MA #* ( ℩ → ɿ ) TURNED GREEK SMALL LETTER IOTA → LATIN SMALL LETTER REVERSED R WITH FISHHOOK # + +FF53 ; 0073 ; MA # ( s → s ) FULLWIDTH LATIN SMALL LETTER S → LATIN SMALL LETTER S # →ѕ→ +1D42C ; 0073 ; MA # ( 𝐬 → s ) MATHEMATICAL BOLD SMALL S → LATIN SMALL LETTER S # +1D460 ; 0073 ; MA # ( 𝑠 → s ) MATHEMATICAL ITALIC SMALL S → LATIN SMALL LETTER S # +1D494 ; 0073 ; MA # ( 𝒔 → s ) MATHEMATICAL BOLD ITALIC SMALL S → LATIN SMALL LETTER S # +1D4C8 ; 0073 ; MA # ( 𝓈 → s ) MATHEMATICAL SCRIPT SMALL S → LATIN SMALL LETTER S # +1D4FC ; 0073 ; MA # ( 𝓼 → s ) MATHEMATICAL BOLD SCRIPT SMALL S → LATIN SMALL LETTER S # +1D530 ; 0073 ; MA # ( 𝔰 → s ) MATHEMATICAL FRAKTUR SMALL S → LATIN SMALL LETTER S # +1D564 ; 0073 ; MA # ( 𝕤 → s ) MATHEMATICAL DOUBLE-STRUCK SMALL S → LATIN SMALL LETTER S # +1D598 ; 0073 ; MA # ( 𝖘 → s ) MATHEMATICAL BOLD FRAKTUR SMALL S → LATIN SMALL LETTER S # +1D5CC ; 0073 ; MA # ( 𝗌 → s ) MATHEMATICAL SANS-SERIF SMALL S → LATIN SMALL LETTER S # +1D600 ; 0073 ; MA # ( 𝘀 → s ) MATHEMATICAL SANS-SERIF BOLD SMALL S → LATIN SMALL LETTER S # +1D634 ; 0073 ; MA # ( 𝘴 → s ) MATHEMATICAL SANS-SERIF ITALIC SMALL S → LATIN SMALL LETTER S # +1D668 ; 0073 ; MA # ( 𝙨 → s ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S → LATIN SMALL LETTER S # +1D69C ; 0073 ; MA # ( 𝚜 → s ) MATHEMATICAL MONOSPACE SMALL S → LATIN SMALL LETTER S # +A731 ; 0073 ; MA # ( ꜱ → s ) LATIN LETTER SMALL CAPITAL S → LATIN SMALL LETTER S # +01BD ; 0073 ; MA # ( ƽ → s ) LATIN SMALL LETTER TONE FIVE → LATIN SMALL LETTER S # +0455 ; 0073 ; MA # ( ѕ → s ) CYRILLIC SMALL LETTER DZE → LATIN SMALL LETTER S # +118C1 ; 0073 ; MA # ( 𑣁 → s ) WARANG CITI SMALL LETTER A → LATIN SMALL LETTER S # +10448 ; 0073 ; MA # ( 𐑈 → s ) DESERET SMALL LETTER ZHEE → LATIN SMALL LETTER S # + +FF33 ; 0053 ; MA # ( S → S ) FULLWIDTH LATIN CAPITAL LETTER S → LATIN CAPITAL LETTER S # →Ѕ→ +1D412 ; 0053 ; MA # ( 𝐒 → S ) MATHEMATICAL BOLD CAPITAL S → LATIN CAPITAL LETTER S # +1D446 ; 0053 ; MA # ( 𝑆 → S ) MATHEMATICAL ITALIC CAPITAL S → LATIN CAPITAL LETTER S # +1D47A ; 0053 ; MA # ( 𝑺 → S ) MATHEMATICAL BOLD ITALIC CAPITAL S → LATIN CAPITAL LETTER S # +1D4AE ; 0053 ; MA # ( 𝒮 → S ) MATHEMATICAL SCRIPT CAPITAL S → LATIN CAPITAL LETTER S # +1D4E2 ; 0053 ; MA # ( 𝓢 → S ) MATHEMATICAL BOLD SCRIPT CAPITAL S → LATIN CAPITAL LETTER S # +1D516 ; 0053 ; MA # ( 𝔖 → S ) MATHEMATICAL FRAKTUR CAPITAL S → LATIN CAPITAL LETTER S # +1D54A ; 0053 ; MA # ( 𝕊 → S ) MATHEMATICAL DOUBLE-STRUCK CAPITAL S → LATIN CAPITAL LETTER S # +1D57E ; 0053 ; MA # ( 𝕾 → S ) MATHEMATICAL BOLD FRAKTUR CAPITAL S → LATIN CAPITAL LETTER S # +1D5B2 ; 0053 ; MA # ( 𝖲 → S ) MATHEMATICAL SANS-SERIF CAPITAL S → LATIN CAPITAL LETTER S # +1D5E6 ; 0053 ; MA # ( 𝗦 → S ) MATHEMATICAL SANS-SERIF BOLD CAPITAL S → LATIN CAPITAL LETTER S # +1D61A ; 0053 ; MA # ( 𝘚 → S ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL S → LATIN CAPITAL LETTER S # +1D64E ; 0053 ; MA # ( 𝙎 → S ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S → LATIN CAPITAL LETTER S # +1D682 ; 0053 ; MA # ( 𝚂 → S ) MATHEMATICAL MONOSPACE CAPITAL S → LATIN CAPITAL LETTER S # +0405 ; 0053 ; MA # ( Ѕ → S ) CYRILLIC CAPITAL LETTER DZE → LATIN CAPITAL LETTER S # +054F ; 0053 ; MA # ( Տ → S ) ARMENIAN CAPITAL LETTER TIWN → LATIN CAPITAL LETTER S # +13D5 ; 0053 ; MA # ( Ꮥ → S ) CHEROKEE LETTER DE → LATIN CAPITAL LETTER S # +13DA ; 0053 ; MA # ( Ꮪ → S ) CHEROKEE LETTER DU → LATIN CAPITAL LETTER S # +A4E2 ; 0053 ; MA # ( ꓢ → S ) LISU LETTER SA → LATIN CAPITAL LETTER S # +10296 ; 0053 ; MA # ( 𐊖 → S ) LYCIAN LETTER S → LATIN CAPITAL LETTER S # +10420 ; 0053 ; MA # ( 𐐠 → S ) DESERET CAPITAL LETTER ZHEE → LATIN CAPITAL LETTER S # + +0282 ; 0073 0328 ; MA # ( ʂ → s̨ ) LATIN SMALL LETTER S WITH HOOK → LATIN SMALL LETTER S, COMBINING OGONEK # + +1D74 ; 0073 0334 ; MA # ( ᵴ → s̴ ) LATIN SMALL LETTER S WITH MIDDLE TILDE → LATIN SMALL LETTER S, COMBINING TILDE OVERLAY # + +03B2 ; 00DF ; MA # ( β → ß ) GREEK SMALL LETTER BETA → LATIN SMALL LETTER SHARP S # +03D0 ; 00DF ; MA # ( ϐ → ß ) GREEK BETA SYMBOL → LATIN SMALL LETTER SHARP S # →β→ +1D6C3 ; 00DF ; MA # ( 𝛃 → ß ) MATHEMATICAL BOLD SMALL BETA → LATIN SMALL LETTER SHARP S # →β→ +1D6FD ; 00DF ; MA # ( 𝛽 → ß ) MATHEMATICAL ITALIC SMALL BETA → LATIN SMALL LETTER SHARP S # →β→ +1D737 ; 00DF ; MA # ( 𝜷 → ß ) MATHEMATICAL BOLD ITALIC SMALL BETA → LATIN SMALL LETTER SHARP S # →β→ +1D771 ; 00DF ; MA # ( 𝝱 → ß ) MATHEMATICAL SANS-SERIF BOLD SMALL BETA → LATIN SMALL LETTER SHARP S # →β→ +1D7AB ; 00DF ; MA # ( 𝞫 → ß ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA → LATIN SMALL LETTER SHARP S # →β→ +13F0 ; 00DF ; MA # ( Ᏸ → ß ) CHEROKEE LETTER YE → LATIN SMALL LETTER SHARP S # →β→ +A7B5 ; 00DF ; MA # ( ꞵ → ß ) LATIN SMALL LETTER BETA → LATIN SMALL LETTER SHARP S # →β→ + +1F75C ; 0073 0073 0073 ; MA #* ( 🝜 → sss ) ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM → LATIN SMALL LETTER S, LATIN SMALL LETTER S, LATIN SMALL LETTER S # + +FB06 ; 0073 0074 ; MA # ( st → st ) LATIN SMALL LIGATURE ST → LATIN SMALL LETTER S, LATIN SMALL LETTER T # + +222B ; 0283 ; MA #* ( ∫ → ʃ ) INTEGRAL → LATIN SMALL LETTER ESH # +AB4D ; 0283 ; MA # ( ꭍ → ʃ ) LATIN SMALL LETTER BASELINE ESH → LATIN SMALL LETTER ESH # + +2211 ; 01A9 ; MA #* ( ∑ → Ʃ ) N-ARY SUMMATION → LATIN CAPITAL LETTER ESH # +2140 ; 01A9 ; MA #* ( ⅀ → Ʃ ) DOUBLE-STRUCK N-ARY SUMMATION → LATIN CAPITAL LETTER ESH # →∑→ +03A3 ; 01A9 ; MA # ( Σ → Ʃ ) GREEK CAPITAL LETTER SIGMA → LATIN CAPITAL LETTER ESH # +1D6BA ; 01A9 ; MA # ( 𝚺 → Ʃ ) MATHEMATICAL BOLD CAPITAL SIGMA → LATIN CAPITAL LETTER ESH # →Σ→ +1D6F4 ; 01A9 ; MA # ( 𝛴 → Ʃ ) MATHEMATICAL ITALIC CAPITAL SIGMA → LATIN CAPITAL LETTER ESH # →Σ→ +1D72E ; 01A9 ; MA # ( 𝜮 → Ʃ ) MATHEMATICAL BOLD ITALIC CAPITAL SIGMA → LATIN CAPITAL LETTER ESH # →Σ→ +1D768 ; 01A9 ; MA # ( 𝝨 → Ʃ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA → LATIN CAPITAL LETTER ESH # →Σ→ +1D7A2 ; 01A9 ; MA # ( 𝞢 → Ʃ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA → LATIN CAPITAL LETTER ESH # →Σ→ +2D49 ; 01A9 ; MA # ( ⵉ → Ʃ ) TIFINAGH LETTER YI → LATIN CAPITAL LETTER ESH # + +222C ; 0283 0283 ; MA #* ( ∬ → ʃʃ ) DOUBLE INTEGRAL → LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH # →∫∫→ + +222D ; 0283 0283 0283 ; MA #* ( ∭ → ʃʃʃ ) TRIPLE INTEGRAL → LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH # →∫∫∫→ + +2A0C ; 0283 0283 0283 0283 ; MA #* ( ⨌ → ʃʃʃʃ ) QUADRUPLE INTEGRAL OPERATOR → LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH # →∫∫∫∫→ + +1D42D ; 0074 ; MA # ( 𝐭 → t ) MATHEMATICAL BOLD SMALL T → LATIN SMALL LETTER T # +1D461 ; 0074 ; MA # ( 𝑡 → t ) MATHEMATICAL ITALIC SMALL T → LATIN SMALL LETTER T # +1D495 ; 0074 ; MA # ( 𝒕 → t ) MATHEMATICAL BOLD ITALIC SMALL T → LATIN SMALL LETTER T # +1D4C9 ; 0074 ; MA # ( 𝓉 → t ) MATHEMATICAL SCRIPT SMALL T → LATIN SMALL LETTER T # +1D4FD ; 0074 ; MA # ( 𝓽 → t ) MATHEMATICAL BOLD SCRIPT SMALL T → LATIN SMALL LETTER T # +1D531 ; 0074 ; MA # ( 𝔱 → t ) MATHEMATICAL FRAKTUR SMALL T → LATIN SMALL LETTER T # +1D565 ; 0074 ; MA # ( 𝕥 → t ) MATHEMATICAL DOUBLE-STRUCK SMALL T → LATIN SMALL LETTER T # +1D599 ; 0074 ; MA # ( 𝖙 → t ) MATHEMATICAL BOLD FRAKTUR SMALL T → LATIN SMALL LETTER T # +1D5CD ; 0074 ; MA # ( 𝗍 → t ) MATHEMATICAL SANS-SERIF SMALL T → LATIN SMALL LETTER T # +1D601 ; 0074 ; MA # ( 𝘁 → t ) MATHEMATICAL SANS-SERIF BOLD SMALL T → LATIN SMALL LETTER T # +1D635 ; 0074 ; MA # ( 𝘵 → t ) MATHEMATICAL SANS-SERIF ITALIC SMALL T → LATIN SMALL LETTER T # +1D669 ; 0074 ; MA # ( 𝙩 → t ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T → LATIN SMALL LETTER T # +1D69D ; 0074 ; MA # ( 𝚝 → t ) MATHEMATICAL MONOSPACE SMALL T → LATIN SMALL LETTER T # +1D1B ; 0074 ; MA # ( ᴛ → t ) LATIN LETTER SMALL CAPITAL T → LATIN SMALL LETTER T # →т→→τ→ +03C4 ; 0074 ; MA # ( τ → t ) GREEK SMALL LETTER TAU → LATIN SMALL LETTER T # +1D6D5 ; 0074 ; MA # ( 𝛕 → t ) MATHEMATICAL BOLD SMALL TAU → LATIN SMALL LETTER T # →τ→ +1D70F ; 0074 ; MA # ( 𝜏 → t ) MATHEMATICAL ITALIC SMALL TAU → LATIN SMALL LETTER T # →τ→ +1D749 ; 0074 ; MA # ( 𝝉 → t ) MATHEMATICAL BOLD ITALIC SMALL TAU → LATIN SMALL LETTER T # →τ→ +1D783 ; 0074 ; MA # ( 𝞃 → t ) MATHEMATICAL SANS-SERIF BOLD SMALL TAU → LATIN SMALL LETTER T # →τ→ +1D7BD ; 0074 ; MA # ( 𝞽 → t ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU → LATIN SMALL LETTER T # →τ→ +0442 ; 0074 ; MA # ( т → t ) CYRILLIC SMALL LETTER TE → LATIN SMALL LETTER T # →τ→ + +22A4 ; 0054 ; MA #* ( ⊤ → T ) DOWN TACK → LATIN CAPITAL LETTER T # +27D9 ; 0054 ; MA #* ( ⟙ → T ) LARGE DOWN TACK → LATIN CAPITAL LETTER T # +1F768 ; 0054 ; MA #* ( 🝨 → T ) ALCHEMICAL SYMBOL FOR CRUCIBLE-4 → LATIN CAPITAL LETTER T # +FF34 ; 0054 ; MA # ( T → T ) FULLWIDTH LATIN CAPITAL LETTER T → LATIN CAPITAL LETTER T # →Т→ +1D413 ; 0054 ; MA # ( 𝐓 → T ) MATHEMATICAL BOLD CAPITAL T → LATIN CAPITAL LETTER T # +1D447 ; 0054 ; MA # ( 𝑇 → T ) MATHEMATICAL ITALIC CAPITAL T → LATIN CAPITAL LETTER T # +1D47B ; 0054 ; MA # ( 𝑻 → T ) MATHEMATICAL BOLD ITALIC CAPITAL T → LATIN CAPITAL LETTER T # +1D4AF ; 0054 ; MA # ( 𝒯 → T ) MATHEMATICAL SCRIPT CAPITAL T → LATIN CAPITAL LETTER T # +1D4E3 ; 0054 ; MA # ( 𝓣 → T ) MATHEMATICAL BOLD SCRIPT CAPITAL T → LATIN CAPITAL LETTER T # +1D517 ; 0054 ; MA # ( 𝔗 → T ) MATHEMATICAL FRAKTUR CAPITAL T → LATIN CAPITAL LETTER T # +1D54B ; 0054 ; MA # ( 𝕋 → T ) MATHEMATICAL DOUBLE-STRUCK CAPITAL T → LATIN CAPITAL LETTER T # +1D57F ; 0054 ; MA # ( 𝕿 → T ) MATHEMATICAL BOLD FRAKTUR CAPITAL T → LATIN CAPITAL LETTER T # +1D5B3 ; 0054 ; MA # ( 𝖳 → T ) MATHEMATICAL SANS-SERIF CAPITAL T → LATIN CAPITAL LETTER T # +1D5E7 ; 0054 ; MA # ( 𝗧 → T ) MATHEMATICAL SANS-SERIF BOLD CAPITAL T → LATIN CAPITAL LETTER T # +1D61B ; 0054 ; MA # ( 𝘛 → T ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL T → LATIN CAPITAL LETTER T # +1D64F ; 0054 ; MA # ( 𝙏 → T ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T → LATIN CAPITAL LETTER T # +1D683 ; 0054 ; MA # ( 𝚃 → T ) MATHEMATICAL MONOSPACE CAPITAL T → LATIN CAPITAL LETTER T # +03A4 ; 0054 ; MA # ( Τ → T ) GREEK CAPITAL LETTER TAU → LATIN CAPITAL LETTER T # +1D6BB ; 0054 ; MA # ( 𝚻 → T ) MATHEMATICAL BOLD CAPITAL TAU → LATIN CAPITAL LETTER T # →Τ→ +1D6F5 ; 0054 ; MA # ( 𝛵 → T ) MATHEMATICAL ITALIC CAPITAL TAU → LATIN CAPITAL LETTER T # →Τ→ +1D72F ; 0054 ; MA # ( 𝜯 → T ) MATHEMATICAL BOLD ITALIC CAPITAL TAU → LATIN CAPITAL LETTER T # →Τ→ +1D769 ; 0054 ; MA # ( 𝝩 → T ) MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU → LATIN CAPITAL LETTER T # →Τ→ +1D7A3 ; 0054 ; MA # ( 𝞣 → T ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU → LATIN CAPITAL LETTER T # →Τ→ +2CA6 ; 0054 ; MA # ( Ⲧ → T ) COPTIC CAPITAL LETTER TAU → LATIN CAPITAL LETTER T # +0422 ; 0054 ; MA # ( Т → T ) CYRILLIC CAPITAL LETTER TE → LATIN CAPITAL LETTER T # +13A2 ; 0054 ; MA # ( Ꭲ → T ) CHEROKEE LETTER I → LATIN CAPITAL LETTER T # +A4D4 ; 0054 ; MA # ( ꓔ → T ) LISU LETTER TA → LATIN CAPITAL LETTER T # +118BC ; 0054 ; MA # ( 𑢼 → T ) WARANG CITI CAPITAL LETTER HAR → LATIN CAPITAL LETTER T # +10297 ; 0054 ; MA # ( 𐊗 → T ) LYCIAN LETTER T → LATIN CAPITAL LETTER T # +102B1 ; 0054 ; MA # ( 𐊱 → T ) CARIAN LETTER C-18 → LATIN CAPITAL LETTER T # +10315 ; 0054 ; MA # ( 𐌕 → T ) OLD ITALIC LETTER TE → LATIN CAPITAL LETTER T # + +01AD ; 0074 0314 ; MA # ( ƭ → t̔ ) LATIN SMALL LETTER T WITH HOOK → LATIN SMALL LETTER T, COMBINING REVERSED COMMA ABOVE # + +2361 ; 0054 0308 ; MA #* ( ⍡ → T̈ ) APL FUNCTIONAL SYMBOL UP TACK DIAERESIS → LATIN CAPITAL LETTER T, COMBINING DIAERESIS # →⊤̈→ + +023E ; 0054 0338 ; MA # ( Ⱦ → T̸ ) LATIN CAPITAL LETTER T WITH DIAGONAL STROKE → LATIN CAPITAL LETTER T, COMBINING LONG SOLIDUS OVERLAY # + +021A ; 0162 ; MA # ( Ț → Ţ ) LATIN CAPITAL LETTER T WITH COMMA BELOW → LATIN CAPITAL LETTER T WITH CEDILLA # + +01AE ; 0054 0328 ; MA # ( Ʈ → T̨ ) LATIN CAPITAL LETTER T WITH RETROFLEX HOOK → LATIN CAPITAL LETTER T, COMBINING OGONEK # + +04AD ; 0074 0329 ; MA # ( ҭ → t̩ ) CYRILLIC SMALL LETTER TE WITH DESCENDER → LATIN SMALL LETTER T, COMBINING VERTICAL LINE BELOW # →т̩→ + +04AC ; 0054 0329 ; MA # ( Ҭ → T̩ ) CYRILLIC CAPITAL LETTER TE WITH DESCENDER → LATIN CAPITAL LETTER T, COMBINING VERTICAL LINE BELOW # →Т̩→ + +20AE ; 0054 20EB ; MA #* ( ₮ → T⃫ ) TUGRIK SIGN → LATIN CAPITAL LETTER T, COMBINING LONG DOUBLE SOLIDUS OVERLAY # →Т⃫→ + +0167 ; 0074 0335 ; MA # ( ŧ → t̵ ) LATIN SMALL LETTER T WITH STROKE → LATIN SMALL LETTER T, COMBINING SHORT STROKE OVERLAY # + +0166 ; 0054 0335 ; MA # ( Ŧ → T̵ ) LATIN CAPITAL LETTER T WITH STROKE → LATIN CAPITAL LETTER T, COMBINING SHORT STROKE OVERLAY # + +1D75 ; 0074 0334 ; MA # ( ᵵ → t̴ ) LATIN SMALL LETTER T WITH MIDDLE TILDE → LATIN SMALL LETTER T, COMBINING TILDE OVERLAY # + +10A0 ; A786 ; MA # ( Ⴀ → Ꞇ ) GEORGIAN CAPITAL LETTER AN → LATIN CAPITAL LETTER INSULAR T # + +A728 ; 0054 0033 ; MA # ( Ꜩ → T3 ) LATIN CAPITAL LETTER TZ → LATIN CAPITAL LETTER T, DIGIT THREE # →TƷ→ + +02A8 ; 0074 0255 ; MA # ( ʨ → tɕ ) LATIN SMALL LETTER TC DIGRAPH WITH CURL → LATIN SMALL LETTER T, LATIN SMALL LETTER C WITH CURL # + +2121 ; 0054 0045 004C ; MA #* ( ℡ → TEL ) TELEPHONE SIGN → LATIN CAPITAL LETTER T, LATIN CAPITAL LETTER E, LATIN CAPITAL LETTER L # + +A777 ; 0074 0066 ; MA # ( ꝷ → tf ) LATIN SMALL LETTER TUM → LATIN SMALL LETTER T, LATIN SMALL LETTER F # + +02A6 ; 0074 0073 ; MA # ( ʦ → ts ) LATIN SMALL LETTER TS DIGRAPH → LATIN SMALL LETTER T, LATIN SMALL LETTER S # + +02A7 ; 0074 0283 ; MA # ( ʧ → tʃ ) LATIN SMALL LETTER TESH DIGRAPH → LATIN SMALL LETTER T, LATIN SMALL LETTER ESH # + +A729 ; 0074 021D ; MA # ( ꜩ → tȝ ) LATIN SMALL LETTER TZ → LATIN SMALL LETTER T, LATIN SMALL LETTER YOGH # + +0163 ; 01AB ; MA # ( ţ → ƫ ) LATIN SMALL LETTER T WITH CEDILLA → LATIN SMALL LETTER T WITH PALATAL HOOK # +021B ; 01AB ; MA # ( ț → ƫ ) LATIN SMALL LETTER T WITH COMMA BELOW → LATIN SMALL LETTER T WITH PALATAL HOOK # →ţ→ +13BF ; 01AB ; MA # ( Ꮏ → ƫ ) CHEROKEE LETTER HNA → LATIN SMALL LETTER T WITH PALATAL HOOK # + +1D42E ; 0075 ; MA # ( 𝐮 → u ) MATHEMATICAL BOLD SMALL U → LATIN SMALL LETTER U # +1D462 ; 0075 ; MA # ( 𝑢 → u ) MATHEMATICAL ITALIC SMALL U → LATIN SMALL LETTER U # +1D496 ; 0075 ; MA # ( 𝒖 → u ) MATHEMATICAL BOLD ITALIC SMALL U → LATIN SMALL LETTER U # +1D4CA ; 0075 ; MA # ( 𝓊 → u ) MATHEMATICAL SCRIPT SMALL U → LATIN SMALL LETTER U # +1D4FE ; 0075 ; MA # ( 𝓾 → u ) MATHEMATICAL BOLD SCRIPT SMALL U → LATIN SMALL LETTER U # +1D532 ; 0075 ; MA # ( 𝔲 → u ) MATHEMATICAL FRAKTUR SMALL U → LATIN SMALL LETTER U # +1D566 ; 0075 ; MA # ( 𝕦 → u ) MATHEMATICAL DOUBLE-STRUCK SMALL U → LATIN SMALL LETTER U # +1D59A ; 0075 ; MA # ( 𝖚 → u ) MATHEMATICAL BOLD FRAKTUR SMALL U → LATIN SMALL LETTER U # +1D5CE ; 0075 ; MA # ( 𝗎 → u ) MATHEMATICAL SANS-SERIF SMALL U → LATIN SMALL LETTER U # +1D602 ; 0075 ; MA # ( 𝘂 → u ) MATHEMATICAL SANS-SERIF BOLD SMALL U → LATIN SMALL LETTER U # +1D636 ; 0075 ; MA # ( 𝘶 → u ) MATHEMATICAL SANS-SERIF ITALIC SMALL U → LATIN SMALL LETTER U # +1D66A ; 0075 ; MA # ( 𝙪 → u ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U → LATIN SMALL LETTER U # +1D69E ; 0075 ; MA # ( 𝚞 → u ) MATHEMATICAL MONOSPACE SMALL U → LATIN SMALL LETTER U # +A79F ; 0075 ; MA # ( ꞟ → u ) LATIN SMALL LETTER VOLAPUK UE → LATIN SMALL LETTER U # +1D1C ; 0075 ; MA # ( ᴜ → u ) LATIN LETTER SMALL CAPITAL U → LATIN SMALL LETTER U # +AB4E ; 0075 ; MA # ( ꭎ → u ) LATIN SMALL LETTER U WITH SHORT RIGHT LEG → LATIN SMALL LETTER U # +AB52 ; 0075 ; MA # ( ꭒ → u ) LATIN SMALL LETTER U WITH LEFT HOOK → LATIN SMALL LETTER U # +028B ; 0075 ; MA # ( ʋ → u ) LATIN SMALL LETTER V WITH HOOK → LATIN SMALL LETTER U # +03C5 ; 0075 ; MA # ( υ → u ) GREEK SMALL LETTER UPSILON → LATIN SMALL LETTER U # →ʋ→ +1D6D6 ; 0075 ; MA # ( 𝛖 → u ) MATHEMATICAL BOLD SMALL UPSILON → LATIN SMALL LETTER U # →υ→→ʋ→ +1D710 ; 0075 ; MA # ( 𝜐 → u ) MATHEMATICAL ITALIC SMALL UPSILON → LATIN SMALL LETTER U # →υ→→ʋ→ +1D74A ; 0075 ; MA # ( 𝝊 → u ) MATHEMATICAL BOLD ITALIC SMALL UPSILON → LATIN SMALL LETTER U # →υ→→ʋ→ +1D784 ; 0075 ; MA # ( 𝞄 → u ) MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON → LATIN SMALL LETTER U # →υ→→ʋ→ +1D7BE ; 0075 ; MA # ( 𝞾 → u ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON → LATIN SMALL LETTER U # →υ→→ʋ→ +0446 ; 0075 ; MA # ( ц → u ) CYRILLIC SMALL LETTER TSE → LATIN SMALL LETTER U # +057D ; 0075 ; MA # ( ս → u ) ARMENIAN SMALL LETTER SEH → LATIN SMALL LETTER U # +118D8 ; 0075 ; MA # ( 𑣘 → u ) WARANG CITI SMALL LETTER PU → LATIN SMALL LETTER U # →υ→→ʋ→ + +222A ; 0055 ; MA #* ( ∪ → U ) UNION → LATIN CAPITAL LETTER U # →ᑌ→ +22C3 ; 0055 ; MA #* ( ⋃ → U ) N-ARY UNION → LATIN CAPITAL LETTER U # →∪→→ᑌ→ +1D414 ; 0055 ; MA # ( 𝐔 → U ) MATHEMATICAL BOLD CAPITAL U → LATIN CAPITAL LETTER U # +1D448 ; 0055 ; MA # ( 𝑈 → U ) MATHEMATICAL ITALIC CAPITAL U → LATIN CAPITAL LETTER U # +1D47C ; 0055 ; MA # ( 𝑼 → U ) MATHEMATICAL BOLD ITALIC CAPITAL U → LATIN CAPITAL LETTER U # +1D4B0 ; 0055 ; MA # ( 𝒰 → U ) MATHEMATICAL SCRIPT CAPITAL U → LATIN CAPITAL LETTER U # +1D4E4 ; 0055 ; MA # ( 𝓤 → U ) MATHEMATICAL BOLD SCRIPT CAPITAL U → LATIN CAPITAL LETTER U # +1D518 ; 0055 ; MA # ( 𝔘 → U ) MATHEMATICAL FRAKTUR CAPITAL U → LATIN CAPITAL LETTER U # +1D54C ; 0055 ; MA # ( 𝕌 → U ) MATHEMATICAL DOUBLE-STRUCK CAPITAL U → LATIN CAPITAL LETTER U # +1D580 ; 0055 ; MA # ( 𝖀 → U ) MATHEMATICAL BOLD FRAKTUR CAPITAL U → LATIN CAPITAL LETTER U # +1D5B4 ; 0055 ; MA # ( 𝖴 → U ) MATHEMATICAL SANS-SERIF CAPITAL U → LATIN CAPITAL LETTER U # +1D5E8 ; 0055 ; MA # ( 𝗨 → U ) MATHEMATICAL SANS-SERIF BOLD CAPITAL U → LATIN CAPITAL LETTER U # +1D61C ; 0055 ; MA # ( 𝘜 → U ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL U → LATIN CAPITAL LETTER U # +1D650 ; 0055 ; MA # ( 𝙐 → U ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U → LATIN CAPITAL LETTER U # +1D684 ; 0055 ; MA # ( 𝚄 → U ) MATHEMATICAL MONOSPACE CAPITAL U → LATIN CAPITAL LETTER U # +054D ; 0055 ; MA # ( Ս → U ) ARMENIAN CAPITAL LETTER SEH → LATIN CAPITAL LETTER U # +144C ; 0055 ; MA # ( ᑌ → U ) CANADIAN SYLLABICS TE → LATIN CAPITAL LETTER U # +A4F4 ; 0055 ; MA # ( ꓴ → U ) LISU LETTER U → LATIN CAPITAL LETTER U # +118B8 ; 0055 ; MA # ( 𑢸 → U ) WARANG CITI CAPITAL LETTER PU → LATIN CAPITAL LETTER U # + +01D4 ; 016D ; MA # ( ǔ → ŭ ) LATIN SMALL LETTER U WITH CARON → LATIN SMALL LETTER U WITH BREVE # + +01D3 ; 016C ; MA # ( Ǔ → Ŭ ) LATIN CAPITAL LETTER U WITH CARON → LATIN CAPITAL LETTER U WITH BREVE # + +1D7E ; 0075 0335 ; MA # ( ᵾ → u̵ ) LATIN SMALL CAPITAL LETTER U WITH STROKE → LATIN SMALL LETTER U, COMBINING SHORT STROKE OVERLAY # →ᴜ̵→ + +0244 ; 0055 0335 ; MA # ( Ʉ → U̵ ) LATIN CAPITAL LETTER U BAR → LATIN CAPITAL LETTER U, COMBINING SHORT STROKE OVERLAY # →U̶→ +13CC ; 0055 0335 ; MA # ( Ꮜ → U̵ ) CHEROKEE LETTER SA → LATIN CAPITAL LETTER U, COMBINING SHORT STROKE OVERLAY # →Ʉ→→U̶→ + +1458 ; 0055 00B7 ; MA # ( ᑘ → U· ) CANADIAN SYLLABICS WEST-CREE TWE → LATIN CAPITAL LETTER U, MIDDLE DOT # →ᑌᐧ→→ᑌ·→ + +1467 ; 0055 0027 ; MA # ( ᑧ → U' ) CANADIAN SYLLABICS TTE → LATIN CAPITAL LETTER U, APOSTROPHE # →ᑌᑊ→→ᑌ'→ + +1D6B ; 0075 0065 ; MA # ( ᵫ → ue ) LATIN SMALL LETTER UE → LATIN SMALL LETTER U, LATIN SMALL LETTER E # + +057A ; 0270 ; MA # ( պ → ɰ ) ARMENIAN SMALL LETTER PEH → LATIN SMALL LETTER TURNED M WITH LONG LEG # + +2127 ; 01B1 ; MA #* ( ℧ → Ʊ ) INVERTED OHM SIGN → LATIN CAPITAL LETTER UPSILON # +162E ; 01B1 ; MA # ( ᘮ → Ʊ ) CANADIAN SYLLABICS CARRIER LHU → LATIN CAPITAL LETTER UPSILON # →℧→ +1634 ; 01B1 ; MA # ( ᘴ → Ʊ ) CANADIAN SYLLABICS CARRIER TLHU → LATIN CAPITAL LETTER UPSILON # →ᘮ→→℧→ + +1D7F ; 028A 0335 ; MA # ( ᵿ → ʊ̵ ) LATIN SMALL LETTER UPSILON WITH STROKE → LATIN SMALL LETTER UPSILON, COMBINING SHORT STROKE OVERLAY # + +2228 ; 0076 ; MA #* ( ∨ → v ) LOGICAL OR → LATIN SMALL LETTER V # +22C1 ; 0076 ; MA #* ( ⋁ → v ) N-ARY LOGICAL OR → LATIN SMALL LETTER V # →∨→ +FF56 ; 0076 ; MA # ( v → v ) FULLWIDTH LATIN SMALL LETTER V → LATIN SMALL LETTER V # →ν→ +2174 ; 0076 ; MA # ( ⅴ → v ) SMALL ROMAN NUMERAL FIVE → LATIN SMALL LETTER V # +1D42F ; 0076 ; MA # ( 𝐯 → v ) MATHEMATICAL BOLD SMALL V → LATIN SMALL LETTER V # +1D463 ; 0076 ; MA # ( 𝑣 → v ) MATHEMATICAL ITALIC SMALL V → LATIN SMALL LETTER V # +1D497 ; 0076 ; MA # ( 𝒗 → v ) MATHEMATICAL BOLD ITALIC SMALL V → LATIN SMALL LETTER V # +1D4CB ; 0076 ; MA # ( 𝓋 → v ) MATHEMATICAL SCRIPT SMALL V → LATIN SMALL LETTER V # +1D4FF ; 0076 ; MA # ( 𝓿 → v ) MATHEMATICAL BOLD SCRIPT SMALL V → LATIN SMALL LETTER V # +1D533 ; 0076 ; MA # ( 𝔳 → v ) MATHEMATICAL FRAKTUR SMALL V → LATIN SMALL LETTER V # +1D567 ; 0076 ; MA # ( 𝕧 → v ) MATHEMATICAL DOUBLE-STRUCK SMALL V → LATIN SMALL LETTER V # +1D59B ; 0076 ; MA # ( 𝖛 → v ) MATHEMATICAL BOLD FRAKTUR SMALL V → LATIN SMALL LETTER V # +1D5CF ; 0076 ; MA # ( 𝗏 → v ) MATHEMATICAL SANS-SERIF SMALL V → LATIN SMALL LETTER V # +1D603 ; 0076 ; MA # ( 𝘃 → v ) MATHEMATICAL SANS-SERIF BOLD SMALL V → LATIN SMALL LETTER V # +1D637 ; 0076 ; MA # ( 𝘷 → v ) MATHEMATICAL SANS-SERIF ITALIC SMALL V → LATIN SMALL LETTER V # +1D66B ; 0076 ; MA # ( 𝙫 → v ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V → LATIN SMALL LETTER V # +1D69F ; 0076 ; MA # ( 𝚟 → v ) MATHEMATICAL MONOSPACE SMALL V → LATIN SMALL LETTER V # +1D20 ; 0076 ; MA # ( ᴠ → v ) LATIN LETTER SMALL CAPITAL V → LATIN SMALL LETTER V # +03BD ; 0076 ; MA # ( ν → v ) GREEK SMALL LETTER NU → LATIN SMALL LETTER V # +1D6CE ; 0076 ; MA # ( 𝛎 → v ) MATHEMATICAL BOLD SMALL NU → LATIN SMALL LETTER V # →ν→ +1D708 ; 0076 ; MA # ( 𝜈 → v ) MATHEMATICAL ITALIC SMALL NU → LATIN SMALL LETTER V # →ν→ +1D742 ; 0076 ; MA # ( 𝝂 → v ) MATHEMATICAL BOLD ITALIC SMALL NU → LATIN SMALL LETTER V # →ν→ +1D77C ; 0076 ; MA # ( 𝝼 → v ) MATHEMATICAL SANS-SERIF BOLD SMALL NU → LATIN SMALL LETTER V # →ν→ +1D7B6 ; 0076 ; MA # ( 𝞶 → v ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU → LATIN SMALL LETTER V # →ν→ +0475 ; 0076 ; MA # ( ѵ → v ) CYRILLIC SMALL LETTER IZHITSA → LATIN SMALL LETTER V # +05D8 ; 0076 ; MA # ( ‎ט‎ → v ) HEBREW LETTER TET → LATIN SMALL LETTER V # +118C0 ; 0076 ; MA # ( 𑣀 → v ) WARANG CITI SMALL LETTER NGAA → LATIN SMALL LETTER V # + +0667 ; 0056 ; MA # ( ‎٧‎ → V ) ARABIC-INDIC DIGIT SEVEN → LATIN CAPITAL LETTER V # +06F7 ; 0056 ; MA # ( ۷ → V ) EXTENDED ARABIC-INDIC DIGIT SEVEN → LATIN CAPITAL LETTER V # →‎٧‎→ +2164 ; 0056 ; MA # ( Ⅴ → V ) ROMAN NUMERAL FIVE → LATIN CAPITAL LETTER V # +1D415 ; 0056 ; MA # ( 𝐕 → V ) MATHEMATICAL BOLD CAPITAL V → LATIN CAPITAL LETTER V # +1D449 ; 0056 ; MA # ( 𝑉 → V ) MATHEMATICAL ITALIC CAPITAL V → LATIN CAPITAL LETTER V # +1D47D ; 0056 ; MA # ( 𝑽 → V ) MATHEMATICAL BOLD ITALIC CAPITAL V → LATIN CAPITAL LETTER V # +1D4B1 ; 0056 ; MA # ( 𝒱 → V ) MATHEMATICAL SCRIPT CAPITAL V → LATIN CAPITAL LETTER V # +1D4E5 ; 0056 ; MA # ( 𝓥 → V ) MATHEMATICAL BOLD SCRIPT CAPITAL V → LATIN CAPITAL LETTER V # +1D519 ; 0056 ; MA # ( 𝔙 → V ) MATHEMATICAL FRAKTUR CAPITAL V → LATIN CAPITAL LETTER V # +1D54D ; 0056 ; MA # ( 𝕍 → V ) MATHEMATICAL DOUBLE-STRUCK CAPITAL V → LATIN CAPITAL LETTER V # +1D581 ; 0056 ; MA # ( 𝖁 → V ) MATHEMATICAL BOLD FRAKTUR CAPITAL V → LATIN CAPITAL LETTER V # +1D5B5 ; 0056 ; MA # ( 𝖵 → V ) MATHEMATICAL SANS-SERIF CAPITAL V → LATIN CAPITAL LETTER V # +1D5E9 ; 0056 ; MA # ( 𝗩 → V ) MATHEMATICAL SANS-SERIF BOLD CAPITAL V → LATIN CAPITAL LETTER V # +1D61D ; 0056 ; MA # ( 𝘝 → V ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL V → LATIN CAPITAL LETTER V # +1D651 ; 0056 ; MA # ( 𝙑 → V ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V → LATIN CAPITAL LETTER V # +1D685 ; 0056 ; MA # ( 𝚅 → V ) MATHEMATICAL MONOSPACE CAPITAL V → LATIN CAPITAL LETTER V # +0474 ; 0056 ; MA # ( Ѵ → V ) CYRILLIC CAPITAL LETTER IZHITSA → LATIN CAPITAL LETTER V # +2D38 ; 0056 ; MA # ( ⴸ → V ) TIFINAGH LETTER YADH → LATIN CAPITAL LETTER V # +13D9 ; 0056 ; MA # ( Ꮩ → V ) CHEROKEE LETTER DO → LATIN CAPITAL LETTER V # +142F ; 0056 ; MA # ( ᐯ → V ) CANADIAN SYLLABICS PE → LATIN CAPITAL LETTER V # +A4E6 ; 0056 ; MA # ( ꓦ → V ) LISU LETTER HA → LATIN CAPITAL LETTER V # +118A0 ; 0056 ; MA # ( 𑢠 → V ) WARANG CITI CAPITAL LETTER NGAA → LATIN CAPITAL LETTER V # +1051D ; 0056 ; MA # ( 𐔝 → V ) ELBASAN LETTER TE → LATIN CAPITAL LETTER V # + +143B ; 0056 00B7 ; MA # ( ᐻ → V· ) CANADIAN SYLLABICS WEST-CREE PWE → LATIN CAPITAL LETTER V, MIDDLE DOT # →ᐯᐧ→ + +1F76C ; 0056 0042 ; MA #* ( 🝬 → VB ) ALCHEMICAL SYMBOL FOR BATH OF VAPOURS → LATIN CAPITAL LETTER V, LATIN CAPITAL LETTER B # + +2175 ; 0076 0069 ; MA # ( ⅵ → vi ) SMALL ROMAN NUMERAL SIX → LATIN SMALL LETTER V, LATIN SMALL LETTER I # + +2176 ; 0076 0069 0069 ; MA # ( ⅶ → vii ) SMALL ROMAN NUMERAL SEVEN → LATIN SMALL LETTER V, LATIN SMALL LETTER I, LATIN SMALL LETTER I # + +2177 ; 0076 0069 0069 0069 ; MA # ( ⅷ → viii ) SMALL ROMAN NUMERAL EIGHT → LATIN SMALL LETTER V, LATIN SMALL LETTER I, LATIN SMALL LETTER I, LATIN SMALL LETTER I # + +2165 ; 0056 006C ; MA # ( Ⅵ → Vl ) ROMAN NUMERAL SIX → LATIN CAPITAL LETTER V, LATIN SMALL LETTER L # →VI→ + +2166 ; 0056 006C 006C ; MA # ( Ⅶ → Vll ) ROMAN NUMERAL SEVEN → LATIN CAPITAL LETTER V, LATIN SMALL LETTER L, LATIN SMALL LETTER L # →VII→ + +2167 ; 0056 006C 006C 006C ; MA # ( Ⅷ → Vlll ) ROMAN NUMERAL EIGHT → LATIN CAPITAL LETTER V, LATIN SMALL LETTER L, LATIN SMALL LETTER L, LATIN SMALL LETTER L # →VIII→ + +1F708 ; 0056 1DE4 ; MA #* ( 🜈 → Vᷤ ) ALCHEMICAL SYMBOL FOR AQUA VITAE → LATIN CAPITAL LETTER V, COMBINING LATIN SMALL LETTER S # + +026F ; 0076 0076 ; MA # ( ɯ → vv ) LATIN SMALL LETTER TURNED M → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +0077 ; 0076 0076 ; MA # ( w → vv ) LATIN SMALL LETTER W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # +1D430 ; 0076 0076 ; MA # ( 𝐰 → vv ) MATHEMATICAL BOLD SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +1D464 ; 0076 0076 ; MA # ( 𝑤 → vv ) MATHEMATICAL ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +1D498 ; 0076 0076 ; MA # ( 𝒘 → vv ) MATHEMATICAL BOLD ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +1D4CC ; 0076 0076 ; MA # ( 𝓌 → vv ) MATHEMATICAL SCRIPT SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +1D500 ; 0076 0076 ; MA # ( 𝔀 → vv ) MATHEMATICAL BOLD SCRIPT SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +1D534 ; 0076 0076 ; MA # ( 𝔴 → vv ) MATHEMATICAL FRAKTUR SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +1D568 ; 0076 0076 ; MA # ( 𝕨 → vv ) MATHEMATICAL DOUBLE-STRUCK SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +1D59C ; 0076 0076 ; MA # ( 𝖜 → vv ) MATHEMATICAL BOLD FRAKTUR SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +1D5D0 ; 0076 0076 ; MA # ( 𝗐 → vv ) MATHEMATICAL SANS-SERIF SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +1D604 ; 0076 0076 ; MA # ( 𝘄 → vv ) MATHEMATICAL SANS-SERIF BOLD SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +1D638 ; 0076 0076 ; MA # ( 𝘸 → vv ) MATHEMATICAL SANS-SERIF ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +1D66C ; 0076 0076 ; MA # ( 𝙬 → vv ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +1D6A0 ; 0076 0076 ; MA # ( 𝚠 → vv ) MATHEMATICAL MONOSPACE SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +1D21 ; 0076 0076 ; MA # ( ᴡ → vv ) LATIN LETTER SMALL CAPITAL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +0461 ; 0076 0076 ; MA # ( ѡ → vv ) CYRILLIC SMALL LETTER OMEGA → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +051D ; 0076 0076 ; MA # ( ԝ → vv ) CYRILLIC SMALL LETTER WE → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +0561 ; 0076 0076 ; MA # ( ա → vv ) ARMENIAN SMALL LETTER AYB → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →ɯ→→w→ +1170E ; 0076 0076 ; MA # ( 𑜎 → vv ) AHOM LETTER LA → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ +1170F ; 0076 0076 ; MA # ( 𑜏 → vv ) AHOM LETTER SA → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ + +114C5 ; 0076 0076 0307 ; MA # ( 𑓅 → vv̇ ) TIRHUTA GVANG → LATIN SMALL LETTER V, LATIN SMALL LETTER V, COMBINING DOT ABOVE # →ẇ→ + +047D ; 0076 0076 0483 ; MA # ( ѽ → vv҃ ) CYRILLIC SMALL LETTER OMEGA WITH TITLO → LATIN SMALL LETTER V, LATIN SMALL LETTER V, COMBINING CYRILLIC TITLO # →ѡ҃→ + +A761 ; 0076 0079 ; MA # ( ꝡ → vy ) LATIN SMALL LETTER VY → LATIN SMALL LETTER V, LATIN SMALL LETTER Y # + +1D27 ; 028C ; MA # ( ᴧ → ʌ ) GREEK LETTER SMALL CAPITAL LAMDA → LATIN SMALL LETTER TURNED V # + +0668 ; 0245 ; MA # ( ‎٨‎ → Ʌ ) ARABIC-INDIC DIGIT EIGHT → LATIN CAPITAL LETTER TURNED V # →Λ→ +06F8 ; 0245 ; MA # ( ۸ → Ʌ ) EXTENDED ARABIC-INDIC DIGIT EIGHT → LATIN CAPITAL LETTER TURNED V # →‎٨‎→→Λ→ +039B ; 0245 ; MA # ( Λ → Ʌ ) GREEK CAPITAL LETTER LAMDA → LATIN CAPITAL LETTER TURNED V # +1D6B2 ; 0245 ; MA # ( 𝚲 → Ʌ ) MATHEMATICAL BOLD CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V # →Λ→ +1D6EC ; 0245 ; MA # ( 𝛬 → Ʌ ) MATHEMATICAL ITALIC CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V # →Λ→ +1D726 ; 0245 ; MA # ( 𝜦 → Ʌ ) MATHEMATICAL BOLD ITALIC CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V # →Λ→ +1D760 ; 0245 ; MA # ( 𝝠 → Ʌ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V # →Λ→ +1D79A ; 0245 ; MA # ( 𝞚 → Ʌ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V # →Λ→ +041B ; 0245 ; MA # ( Л → Ʌ ) CYRILLIC CAPITAL LETTER EL → LATIN CAPITAL LETTER TURNED V # →Λ→ +2D37 ; 0245 ; MA # ( ⴷ → Ʌ ) TIFINAGH LETTER YAD → LATIN CAPITAL LETTER TURNED V # +1431 ; 0245 ; MA # ( ᐱ → Ʌ ) CANADIAN SYLLABICS PI → LATIN CAPITAL LETTER TURNED V # +A4E5 ; 0245 ; MA # ( ꓥ → Ʌ ) LISU LETTER NGA → LATIN CAPITAL LETTER TURNED V # +1028D ; 0245 ; MA # ( 𐊍 → Ʌ ) LYCIAN LETTER L → LATIN CAPITAL LETTER TURNED V # →Λ→ + +04C5 ; 0245 0326 ; MA # ( Ӆ → Ʌ̦ ) CYRILLIC CAPITAL LETTER EL WITH TAIL → LATIN CAPITAL LETTER TURNED V, COMBINING COMMA BELOW # →Л̡→ + +143D ; 0245 00B7 ; MA # ( ᐽ → Ʌ· ) CANADIAN SYLLABICS WEST-CREE PWI → LATIN CAPITAL LETTER TURNED V, MIDDLE DOT # →ᐱᐧ→→ᐱ·→ + +118EF ; 0057 ; MA #* ( 𑣯 → W ) WARANG CITI NUMBER SIXTY → LATIN CAPITAL LETTER W # +118E6 ; 0057 ; MA # ( 𑣦 → W ) WARANG CITI DIGIT SIX → LATIN CAPITAL LETTER W # +1D416 ; 0057 ; MA # ( 𝐖 → W ) MATHEMATICAL BOLD CAPITAL W → LATIN CAPITAL LETTER W # +1D44A ; 0057 ; MA # ( 𝑊 → W ) MATHEMATICAL ITALIC CAPITAL W → LATIN CAPITAL LETTER W # +1D47E ; 0057 ; MA # ( 𝑾 → W ) MATHEMATICAL BOLD ITALIC CAPITAL W → LATIN CAPITAL LETTER W # +1D4B2 ; 0057 ; MA # ( 𝒲 → W ) MATHEMATICAL SCRIPT CAPITAL W → LATIN CAPITAL LETTER W # +1D4E6 ; 0057 ; MA # ( 𝓦 → W ) MATHEMATICAL BOLD SCRIPT CAPITAL W → LATIN CAPITAL LETTER W # +1D51A ; 0057 ; MA # ( 𝔚 → W ) MATHEMATICAL FRAKTUR CAPITAL W → LATIN CAPITAL LETTER W # +1D54E ; 0057 ; MA # ( 𝕎 → W ) MATHEMATICAL DOUBLE-STRUCK CAPITAL W → LATIN CAPITAL LETTER W # +1D582 ; 0057 ; MA # ( 𝖂 → W ) MATHEMATICAL BOLD FRAKTUR CAPITAL W → LATIN CAPITAL LETTER W # +1D5B6 ; 0057 ; MA # ( 𝖶 → W ) MATHEMATICAL SANS-SERIF CAPITAL W → LATIN CAPITAL LETTER W # +1D5EA ; 0057 ; MA # ( 𝗪 → W ) MATHEMATICAL SANS-SERIF BOLD CAPITAL W → LATIN CAPITAL LETTER W # +1D61E ; 0057 ; MA # ( 𝘞 → W ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL W → LATIN CAPITAL LETTER W # +1D652 ; 0057 ; MA # ( 𝙒 → W ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W → LATIN CAPITAL LETTER W # +1D686 ; 0057 ; MA # ( 𝚆 → W ) MATHEMATICAL MONOSPACE CAPITAL W → LATIN CAPITAL LETTER W # +051C ; 0057 ; MA # ( Ԝ → W ) CYRILLIC CAPITAL LETTER WE → LATIN CAPITAL LETTER W # +13B3 ; 0057 ; MA # ( Ꮃ → W ) CHEROKEE LETTER LA → LATIN CAPITAL LETTER W # +13D4 ; 0057 ; MA # ( Ꮤ → W ) CHEROKEE LETTER TA → LATIN CAPITAL LETTER W # +A4EA ; 0057 ; MA # ( ꓪ → W ) LISU LETTER WA → LATIN CAPITAL LETTER W # + +20A9 ; 0057 0335 ; MA #* ( ₩ → W̵ ) WON SIGN → LATIN CAPITAL LETTER W, COMBINING SHORT STROKE OVERLAY # + +166E ; 0078 ; MA #* ( ᙮ → x ) CANADIAN SYLLABICS FULL STOP → LATIN SMALL LETTER X # +00D7 ; 0078 ; MA #* ( × → x ) MULTIPLICATION SIGN → LATIN SMALL LETTER X # +292B ; 0078 ; MA #* ( ⤫ → x ) RISING DIAGONAL CROSSING FALLING DIAGONAL → LATIN SMALL LETTER X # +292C ; 0078 ; MA #* ( ⤬ → x ) FALLING DIAGONAL CROSSING RISING DIAGONAL → LATIN SMALL LETTER X # +2A2F ; 0078 ; MA #* ( ⨯ → x ) VECTOR OR CROSS PRODUCT → LATIN SMALL LETTER X # →×→ +FF58 ; 0078 ; MA # ( x → x ) FULLWIDTH LATIN SMALL LETTER X → LATIN SMALL LETTER X # →х→ +2179 ; 0078 ; MA # ( ⅹ → x ) SMALL ROMAN NUMERAL TEN → LATIN SMALL LETTER X # +1D431 ; 0078 ; MA # ( 𝐱 → x ) MATHEMATICAL BOLD SMALL X → LATIN SMALL LETTER X # +1D465 ; 0078 ; MA # ( 𝑥 → x ) MATHEMATICAL ITALIC SMALL X → LATIN SMALL LETTER X # +1D499 ; 0078 ; MA # ( 𝒙 → x ) MATHEMATICAL BOLD ITALIC SMALL X → LATIN SMALL LETTER X # +1D4CD ; 0078 ; MA # ( 𝓍 → x ) MATHEMATICAL SCRIPT SMALL X → LATIN SMALL LETTER X # +1D501 ; 0078 ; MA # ( 𝔁 → x ) MATHEMATICAL BOLD SCRIPT SMALL X → LATIN SMALL LETTER X # +1D535 ; 0078 ; MA # ( 𝔵 → x ) MATHEMATICAL FRAKTUR SMALL X → LATIN SMALL LETTER X # +1D569 ; 0078 ; MA # ( 𝕩 → x ) MATHEMATICAL DOUBLE-STRUCK SMALL X → LATIN SMALL LETTER X # +1D59D ; 0078 ; MA # ( 𝖝 → x ) MATHEMATICAL BOLD FRAKTUR SMALL X → LATIN SMALL LETTER X # +1D5D1 ; 0078 ; MA # ( 𝗑 → x ) MATHEMATICAL SANS-SERIF SMALL X → LATIN SMALL LETTER X # +1D605 ; 0078 ; MA # ( 𝘅 → x ) MATHEMATICAL SANS-SERIF BOLD SMALL X → LATIN SMALL LETTER X # +1D639 ; 0078 ; MA # ( 𝘹 → x ) MATHEMATICAL SANS-SERIF ITALIC SMALL X → LATIN SMALL LETTER X # +1D66D ; 0078 ; MA # ( 𝙭 → x ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X → LATIN SMALL LETTER X # +1D6A1 ; 0078 ; MA # ( 𝚡 → x ) MATHEMATICAL MONOSPACE SMALL X → LATIN SMALL LETTER X # +0445 ; 0078 ; MA # ( х → x ) CYRILLIC SMALL LETTER HA → LATIN SMALL LETTER X # +1541 ; 0078 ; MA # ( ᕁ → x ) CANADIAN SYLLABICS SAYISI YI → LATIN SMALL LETTER X # →᙮→ +157D ; 0078 ; MA # ( ᕽ → x ) CANADIAN SYLLABICS HK → LATIN SMALL LETTER X # →ᕁ→→᙮→ + +166D ; 0058 ; MA #* ( ᙭ → X ) CANADIAN SYLLABICS CHI SIGN → LATIN CAPITAL LETTER X # +2573 ; 0058 ; MA #* ( ╳ → X ) BOX DRAWINGS LIGHT DIAGONAL CROSS → LATIN CAPITAL LETTER X # +10322 ; 0058 ; MA #* ( 𐌢 → X ) OLD ITALIC NUMERAL TEN → LATIN CAPITAL LETTER X # →𐌗→ +118EC ; 0058 ; MA #* ( 𑣬 → X ) WARANG CITI NUMBER THIRTY → LATIN CAPITAL LETTER X # +FF38 ; 0058 ; MA # ( X → X ) FULLWIDTH LATIN CAPITAL LETTER X → LATIN CAPITAL LETTER X # →Х→ +2169 ; 0058 ; MA # ( Ⅹ → X ) ROMAN NUMERAL TEN → LATIN CAPITAL LETTER X # +1D417 ; 0058 ; MA # ( 𝐗 → X ) MATHEMATICAL BOLD CAPITAL X → LATIN CAPITAL LETTER X # +1D44B ; 0058 ; MA # ( 𝑋 → X ) MATHEMATICAL ITALIC CAPITAL X → LATIN CAPITAL LETTER X # +1D47F ; 0058 ; MA # ( 𝑿 → X ) MATHEMATICAL BOLD ITALIC CAPITAL X → LATIN CAPITAL LETTER X # +1D4B3 ; 0058 ; MA # ( 𝒳 → X ) MATHEMATICAL SCRIPT CAPITAL X → LATIN CAPITAL LETTER X # +1D4E7 ; 0058 ; MA # ( 𝓧 → X ) MATHEMATICAL BOLD SCRIPT CAPITAL X → LATIN CAPITAL LETTER X # +1D51B ; 0058 ; MA # ( 𝔛 → X ) MATHEMATICAL FRAKTUR CAPITAL X → LATIN CAPITAL LETTER X # +1D54F ; 0058 ; MA # ( 𝕏 → X ) MATHEMATICAL DOUBLE-STRUCK CAPITAL X → LATIN CAPITAL LETTER X # +1D583 ; 0058 ; MA # ( 𝖃 → X ) MATHEMATICAL BOLD FRAKTUR CAPITAL X → LATIN CAPITAL LETTER X # +1D5B7 ; 0058 ; MA # ( 𝖷 → X ) MATHEMATICAL SANS-SERIF CAPITAL X → LATIN CAPITAL LETTER X # +1D5EB ; 0058 ; MA # ( 𝗫 → X ) MATHEMATICAL SANS-SERIF BOLD CAPITAL X → LATIN CAPITAL LETTER X # +1D61F ; 0058 ; MA # ( 𝘟 → X ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL X → LATIN CAPITAL LETTER X # +1D653 ; 0058 ; MA # ( 𝙓 → X ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X → LATIN CAPITAL LETTER X # +1D687 ; 0058 ; MA # ( 𝚇 → X ) MATHEMATICAL MONOSPACE CAPITAL X → LATIN CAPITAL LETTER X # +03A7 ; 0058 ; MA # ( Χ → X ) GREEK CAPITAL LETTER CHI → LATIN CAPITAL LETTER X # +1D6BE ; 0058 ; MA # ( 𝚾 → X ) MATHEMATICAL BOLD CAPITAL CHI → LATIN CAPITAL LETTER X # →Χ→ +1D6F8 ; 0058 ; MA # ( 𝛸 → X ) MATHEMATICAL ITALIC CAPITAL CHI → LATIN CAPITAL LETTER X # →Χ→ +1D732 ; 0058 ; MA # ( 𝜲 → X ) MATHEMATICAL BOLD ITALIC CAPITAL CHI → LATIN CAPITAL LETTER X # →𝑿→ +1D76C ; 0058 ; MA # ( 𝝬 → X ) MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI → LATIN CAPITAL LETTER X # →Χ→ +1D7A6 ; 0058 ; MA # ( 𝞦 → X ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI → LATIN CAPITAL LETTER X # →Χ→ +2CAC ; 0058 ; MA # ( Ⲭ → X ) COPTIC CAPITAL LETTER KHI → LATIN CAPITAL LETTER X # →Х→ +0425 ; 0058 ; MA # ( Х → X ) CYRILLIC CAPITAL LETTER HA → LATIN CAPITAL LETTER X # +2D5D ; 0058 ; MA # ( ⵝ → X ) TIFINAGH LETTER YATH → LATIN CAPITAL LETTER X # +16B7 ; 0058 ; MA # ( ᚷ → X ) RUNIC LETTER GEBO GYFU G → LATIN CAPITAL LETTER X # +A4EB ; 0058 ; MA # ( ꓫ → X ) LISU LETTER SHA → LATIN CAPITAL LETTER X # +10290 ; 0058 ; MA # ( 𐊐 → X ) LYCIAN LETTER MM → LATIN CAPITAL LETTER X # +102B4 ; 0058 ; MA # ( 𐊴 → X ) CARIAN LETTER X → LATIN CAPITAL LETTER X # +10317 ; 0058 ; MA # ( 𐌗 → X ) OLD ITALIC LETTER EKS → LATIN CAPITAL LETTER X # +10527 ; 0058 ; MA # ( 𐔧 → X ) ELBASAN LETTER KHE → LATIN CAPITAL LETTER X # +A7B3 ; 0058 ; MA # ( Ꭓ → X ) LATIN CAPITAL LETTER CHI → LATIN CAPITAL LETTER X # + +2A30 ; 0078 0307 ; MA #* ( ⨰ → ẋ ) MULTIPLICATION SIGN WITH DOT ABOVE → LATIN SMALL LETTER X, COMBINING DOT ABOVE # →×̇→ + +04B2 ; 0058 0329 ; MA # ( Ҳ → X̩ ) CYRILLIC CAPITAL LETTER HA WITH DESCENDER → LATIN CAPITAL LETTER X, COMBINING VERTICAL LINE BELOW # →Х̩→ + +217A ; 0078 0069 ; MA # ( ⅺ → xi ) SMALL ROMAN NUMERAL ELEVEN → LATIN SMALL LETTER X, LATIN SMALL LETTER I # + +217B ; 0078 0069 0069 ; MA # ( ⅻ → xii ) SMALL ROMAN NUMERAL TWELVE → LATIN SMALL LETTER X, LATIN SMALL LETTER I, LATIN SMALL LETTER I # + +216A ; 0058 006C ; MA # ( Ⅺ → Xl ) ROMAN NUMERAL ELEVEN → LATIN CAPITAL LETTER X, LATIN SMALL LETTER L # →XI→ + +216B ; 0058 006C 006C ; MA # ( Ⅻ → Xll ) ROMAN NUMERAL TWELVE → LATIN CAPITAL LETTER X, LATIN SMALL LETTER L, LATIN SMALL LETTER L # →XII→ + +0263 ; 0079 ; MA # ( ɣ → y ) LATIN SMALL LETTER GAMMA → LATIN SMALL LETTER Y # →γ→ +1D8C ; 0079 ; MA # ( ᶌ → y ) LATIN SMALL LETTER V WITH PALATAL HOOK → LATIN SMALL LETTER Y # +FF59 ; 0079 ; MA # ( y → y ) FULLWIDTH LATIN SMALL LETTER Y → LATIN SMALL LETTER Y # →у→ +1D432 ; 0079 ; MA # ( 𝐲 → y ) MATHEMATICAL BOLD SMALL Y → LATIN SMALL LETTER Y # +1D466 ; 0079 ; MA # ( 𝑦 → y ) MATHEMATICAL ITALIC SMALL Y → LATIN SMALL LETTER Y # +1D49A ; 0079 ; MA # ( 𝒚 → y ) MATHEMATICAL BOLD ITALIC SMALL Y → LATIN SMALL LETTER Y # +1D4CE ; 0079 ; MA # ( 𝓎 → y ) MATHEMATICAL SCRIPT SMALL Y → LATIN SMALL LETTER Y # +1D502 ; 0079 ; MA # ( 𝔂 → y ) MATHEMATICAL BOLD SCRIPT SMALL Y → LATIN SMALL LETTER Y # +1D536 ; 0079 ; MA # ( 𝔶 → y ) MATHEMATICAL FRAKTUR SMALL Y → LATIN SMALL LETTER Y # +1D56A ; 0079 ; MA # ( 𝕪 → y ) MATHEMATICAL DOUBLE-STRUCK SMALL Y → LATIN SMALL LETTER Y # +1D59E ; 0079 ; MA # ( 𝖞 → y ) MATHEMATICAL BOLD FRAKTUR SMALL Y → LATIN SMALL LETTER Y # +1D5D2 ; 0079 ; MA # ( 𝗒 → y ) MATHEMATICAL SANS-SERIF SMALL Y → LATIN SMALL LETTER Y # +1D606 ; 0079 ; MA # ( 𝘆 → y ) MATHEMATICAL SANS-SERIF BOLD SMALL Y → LATIN SMALL LETTER Y # +1D63A ; 0079 ; MA # ( 𝘺 → y ) MATHEMATICAL SANS-SERIF ITALIC SMALL Y → LATIN SMALL LETTER Y # +1D66E ; 0079 ; MA # ( 𝙮 → y ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y → LATIN SMALL LETTER Y # +1D6A2 ; 0079 ; MA # ( 𝚢 → y ) MATHEMATICAL MONOSPACE SMALL Y → LATIN SMALL LETTER Y # +028F ; 0079 ; MA # ( ʏ → y ) LATIN LETTER SMALL CAPITAL Y → LATIN SMALL LETTER Y # →ү→→γ→ +1EFF ; 0079 ; MA # ( ỿ → y ) LATIN SMALL LETTER Y WITH LOOP → LATIN SMALL LETTER Y # +AB5A ; 0079 ; MA # ( ꭚ → y ) LATIN SMALL LETTER Y WITH SHORT RIGHT LEG → LATIN SMALL LETTER Y # +03B3 ; 0079 ; MA # ( γ → y ) GREEK SMALL LETTER GAMMA → LATIN SMALL LETTER Y # +213D ; 0079 ; MA # ( ℽ → y ) DOUBLE-STRUCK SMALL GAMMA → LATIN SMALL LETTER Y # →γ→ +1D6C4 ; 0079 ; MA # ( 𝛄 → y ) MATHEMATICAL BOLD SMALL GAMMA → LATIN SMALL LETTER Y # →γ→ +1D6FE ; 0079 ; MA # ( 𝛾 → y ) MATHEMATICAL ITALIC SMALL GAMMA → LATIN SMALL LETTER Y # →γ→ +1D738 ; 0079 ; MA # ( 𝜸 → y ) MATHEMATICAL BOLD ITALIC SMALL GAMMA → LATIN SMALL LETTER Y # →γ→ +1D772 ; 0079 ; MA # ( 𝝲 → y ) MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA → LATIN SMALL LETTER Y # →γ→ +1D7AC ; 0079 ; MA # ( 𝞬 → y ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA → LATIN SMALL LETTER Y # →γ→ +0443 ; 0079 ; MA # ( у → y ) CYRILLIC SMALL LETTER U → LATIN SMALL LETTER Y # +04AF ; 0079 ; MA # ( ү → y ) CYRILLIC SMALL LETTER STRAIGHT U → LATIN SMALL LETTER Y # →γ→ +10E7 ; 0079 ; MA # ( ყ → y ) GEORGIAN LETTER QAR → LATIN SMALL LETTER Y # +118DC ; 0079 ; MA # ( 𑣜 → y ) WARANG CITI SMALL LETTER HAR → LATIN SMALL LETTER Y # →ɣ→→γ→ + +FF39 ; 0059 ; MA # ( Y → Y ) FULLWIDTH LATIN CAPITAL LETTER Y → LATIN CAPITAL LETTER Y # →Υ→ +1D418 ; 0059 ; MA # ( 𝐘 → Y ) MATHEMATICAL BOLD CAPITAL Y → LATIN CAPITAL LETTER Y # +1D44C ; 0059 ; MA # ( 𝑌 → Y ) MATHEMATICAL ITALIC CAPITAL Y → LATIN CAPITAL LETTER Y # +1D480 ; 0059 ; MA # ( 𝒀 → Y ) MATHEMATICAL BOLD ITALIC CAPITAL Y → LATIN CAPITAL LETTER Y # +1D4B4 ; 0059 ; MA # ( 𝒴 → Y ) MATHEMATICAL SCRIPT CAPITAL Y → LATIN CAPITAL LETTER Y # +1D4E8 ; 0059 ; MA # ( 𝓨 → Y ) MATHEMATICAL BOLD SCRIPT CAPITAL Y → LATIN CAPITAL LETTER Y # +1D51C ; 0059 ; MA # ( 𝔜 → Y ) MATHEMATICAL FRAKTUR CAPITAL Y → LATIN CAPITAL LETTER Y # +1D550 ; 0059 ; MA # ( 𝕐 → Y ) MATHEMATICAL DOUBLE-STRUCK CAPITAL Y → LATIN CAPITAL LETTER Y # +1D584 ; 0059 ; MA # ( 𝖄 → Y ) MATHEMATICAL BOLD FRAKTUR CAPITAL Y → LATIN CAPITAL LETTER Y # +1D5B8 ; 0059 ; MA # ( 𝖸 → Y ) MATHEMATICAL SANS-SERIF CAPITAL Y → LATIN CAPITAL LETTER Y # +1D5EC ; 0059 ; MA # ( 𝗬 → Y ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Y → LATIN CAPITAL LETTER Y # +1D620 ; 0059 ; MA # ( 𝘠 → Y ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y → LATIN CAPITAL LETTER Y # +1D654 ; 0059 ; MA # ( 𝙔 → Y ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y → LATIN CAPITAL LETTER Y # +1D688 ; 0059 ; MA # ( 𝚈 → Y ) MATHEMATICAL MONOSPACE CAPITAL Y → LATIN CAPITAL LETTER Y # +03A5 ; 0059 ; MA # ( Υ → Y ) GREEK CAPITAL LETTER UPSILON → LATIN CAPITAL LETTER Y # +03D2 ; 0059 ; MA # ( ϒ → Y ) GREEK UPSILON WITH HOOK SYMBOL → LATIN CAPITAL LETTER Y # +1D6BC ; 0059 ; MA # ( 𝚼 → Y ) MATHEMATICAL BOLD CAPITAL UPSILON → LATIN CAPITAL LETTER Y # →Υ→ +1D6F6 ; 0059 ; MA # ( 𝛶 → Y ) MATHEMATICAL ITALIC CAPITAL UPSILON → LATIN CAPITAL LETTER Y # →Υ→ +1D730 ; 0059 ; MA # ( 𝜰 → Y ) MATHEMATICAL BOLD ITALIC CAPITAL UPSILON → LATIN CAPITAL LETTER Y # →Υ→ +1D76A ; 0059 ; MA # ( 𝝪 → Y ) MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON → LATIN CAPITAL LETTER Y # →Υ→ +1D7A4 ; 0059 ; MA # ( 𝞤 → Y ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON → LATIN CAPITAL LETTER Y # →Υ→ +2CA8 ; 0059 ; MA # ( Ⲩ → Y ) COPTIC CAPITAL LETTER UA → LATIN CAPITAL LETTER Y # +04AE ; 0059 ; MA # ( Ү → Y ) CYRILLIC CAPITAL LETTER STRAIGHT U → LATIN CAPITAL LETTER Y # +13A9 ; 0059 ; MA # ( Ꭹ → Y ) CHEROKEE LETTER GI → LATIN CAPITAL LETTER Y # +13BD ; 0059 ; MA # ( Ꮍ → Y ) CHEROKEE LETTER MU → LATIN CAPITAL LETTER Y # →Ꭹ→ +A4EC ; 0059 ; MA # ( ꓬ → Y ) LISU LETTER YA → LATIN CAPITAL LETTER Y # +118A4 ; 0059 ; MA # ( 𑢤 → Y ) WARANG CITI CAPITAL LETTER YA → LATIN CAPITAL LETTER Y # +102B2 ; 0059 ; MA # ( 𐊲 → Y ) CARIAN LETTER U → LATIN CAPITAL LETTER Y # + +01B4 ; 0079 0314 ; MA # ( ƴ → y̔ ) LATIN SMALL LETTER Y WITH HOOK → LATIN SMALL LETTER Y, COMBINING REVERSED COMMA ABOVE # + +024F ; 0079 0335 ; MA # ( ɏ → y̵ ) LATIN SMALL LETTER Y WITH STROKE → LATIN SMALL LETTER Y, COMBINING SHORT STROKE OVERLAY # +04B1 ; 0079 0335 ; MA # ( ұ → y̵ ) CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE → LATIN SMALL LETTER Y, COMBINING SHORT STROKE OVERLAY # →ү̵→ + +00A5 ; 0059 0335 ; MA #* ( ¥ → Y̵ ) YEN SIGN → LATIN CAPITAL LETTER Y, COMBINING SHORT STROKE OVERLAY # +024E ; 0059 0335 ; MA # ( Ɏ → Y̵ ) LATIN CAPITAL LETTER Y WITH STROKE → LATIN CAPITAL LETTER Y, COMBINING SHORT STROKE OVERLAY # +04B0 ; 0059 0335 ; MA # ( Ұ → Y̵ ) CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE → LATIN CAPITAL LETTER Y, COMBINING SHORT STROKE OVERLAY # →Ү̵→ + +0292 ; 021D ; MA # ( ʒ → ȝ ) LATIN SMALL LETTER EZH → LATIN SMALL LETTER YOGH # +A76B ; 021D ; MA # ( ꝫ → ȝ ) LATIN SMALL LETTER ET → LATIN SMALL LETTER YOGH # +2CCD ; 021D ; MA # ( ⳍ → ȝ ) COPTIC SMALL LETTER OLD COPTIC HORI → LATIN SMALL LETTER YOGH # +04E1 ; 021D ; MA # ( ӡ → ȝ ) CYRILLIC SMALL LETTER ABKHASIAN DZE → LATIN SMALL LETTER YOGH # →ʒ→ +10F3 ; 021D ; MA # ( ჳ → ȝ ) GEORGIAN LETTER WE → LATIN SMALL LETTER YOGH # →ʒ→ + +1D433 ; 007A ; MA # ( 𝐳 → z ) MATHEMATICAL BOLD SMALL Z → LATIN SMALL LETTER Z # +1D467 ; 007A ; MA # ( 𝑧 → z ) MATHEMATICAL ITALIC SMALL Z → LATIN SMALL LETTER Z # +1D49B ; 007A ; MA # ( 𝒛 → z ) MATHEMATICAL BOLD ITALIC SMALL Z → LATIN SMALL LETTER Z # +1D4CF ; 007A ; MA # ( 𝓏 → z ) MATHEMATICAL SCRIPT SMALL Z → LATIN SMALL LETTER Z # +1D503 ; 007A ; MA # ( 𝔃 → z ) MATHEMATICAL BOLD SCRIPT SMALL Z → LATIN SMALL LETTER Z # +1D537 ; 007A ; MA # ( 𝔷 → z ) MATHEMATICAL FRAKTUR SMALL Z → LATIN SMALL LETTER Z # +1D56B ; 007A ; MA # ( 𝕫 → z ) MATHEMATICAL DOUBLE-STRUCK SMALL Z → LATIN SMALL LETTER Z # +1D59F ; 007A ; MA # ( 𝖟 → z ) MATHEMATICAL BOLD FRAKTUR SMALL Z → LATIN SMALL LETTER Z # +1D5D3 ; 007A ; MA # ( 𝗓 → z ) MATHEMATICAL SANS-SERIF SMALL Z → LATIN SMALL LETTER Z # +1D607 ; 007A ; MA # ( 𝘇 → z ) MATHEMATICAL SANS-SERIF BOLD SMALL Z → LATIN SMALL LETTER Z # +1D63B ; 007A ; MA # ( 𝘻 → z ) MATHEMATICAL SANS-SERIF ITALIC SMALL Z → LATIN SMALL LETTER Z # +1D66F ; 007A ; MA # ( 𝙯 → z ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z → LATIN SMALL LETTER Z # +1D6A3 ; 007A ; MA # ( 𝚣 → z ) MATHEMATICAL MONOSPACE SMALL Z → LATIN SMALL LETTER Z # +1D22 ; 007A ; MA # ( ᴢ → z ) LATIN LETTER SMALL CAPITAL Z → LATIN SMALL LETTER Z # +118C4 ; 007A ; MA # ( 𑣄 → z ) WARANG CITI SMALL LETTER YA → LATIN SMALL LETTER Z # + +102F5 ; 005A ; MA #* ( 𐋵 → Z ) COPTIC EPACT NUMBER THREE HUNDRED → LATIN CAPITAL LETTER Z # +118E5 ; 005A ; MA # ( 𑣥 → Z ) WARANG CITI DIGIT FIVE → LATIN CAPITAL LETTER Z # +FF3A ; 005A ; MA # ( Z → Z ) FULLWIDTH LATIN CAPITAL LETTER Z → LATIN CAPITAL LETTER Z # →Ζ→ +2124 ; 005A ; MA # ( ℤ → Z ) DOUBLE-STRUCK CAPITAL Z → LATIN CAPITAL LETTER Z # +2128 ; 005A ; MA # ( ℨ → Z ) BLACK-LETTER CAPITAL Z → LATIN CAPITAL LETTER Z # +1D419 ; 005A ; MA # ( 𝐙 → Z ) MATHEMATICAL BOLD CAPITAL Z → LATIN CAPITAL LETTER Z # +1D44D ; 005A ; MA # ( 𝑍 → Z ) MATHEMATICAL ITALIC CAPITAL Z → LATIN CAPITAL LETTER Z # +1D481 ; 005A ; MA # ( 𝒁 → Z ) MATHEMATICAL BOLD ITALIC CAPITAL Z → LATIN CAPITAL LETTER Z # +1D4B5 ; 005A ; MA # ( 𝒵 → Z ) MATHEMATICAL SCRIPT CAPITAL Z → LATIN CAPITAL LETTER Z # +1D4E9 ; 005A ; MA # ( 𝓩 → Z ) MATHEMATICAL BOLD SCRIPT CAPITAL Z → LATIN CAPITAL LETTER Z # +1D585 ; 005A ; MA # ( 𝖅 → Z ) MATHEMATICAL BOLD FRAKTUR CAPITAL Z → LATIN CAPITAL LETTER Z # +1D5B9 ; 005A ; MA # ( 𝖹 → Z ) MATHEMATICAL SANS-SERIF CAPITAL Z → LATIN CAPITAL LETTER Z # +1D5ED ; 005A ; MA # ( 𝗭 → Z ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Z → LATIN CAPITAL LETTER Z # +1D621 ; 005A ; MA # ( 𝘡 → Z ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z → LATIN CAPITAL LETTER Z # +1D655 ; 005A ; MA # ( 𝙕 → Z ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z → LATIN CAPITAL LETTER Z # +1D689 ; 005A ; MA # ( 𝚉 → Z ) MATHEMATICAL MONOSPACE CAPITAL Z → LATIN CAPITAL LETTER Z # +0396 ; 005A ; MA # ( Ζ → Z ) GREEK CAPITAL LETTER ZETA → LATIN CAPITAL LETTER Z # +1D6AD ; 005A ; MA # ( 𝚭 → Z ) MATHEMATICAL BOLD CAPITAL ZETA → LATIN CAPITAL LETTER Z # →Ζ→ +1D6E7 ; 005A ; MA # ( 𝛧 → Z ) MATHEMATICAL ITALIC CAPITAL ZETA → LATIN CAPITAL LETTER Z # →𝑍→ +1D721 ; 005A ; MA # ( 𝜡 → Z ) MATHEMATICAL BOLD ITALIC CAPITAL ZETA → LATIN CAPITAL LETTER Z # →Ζ→ +1D75B ; 005A ; MA # ( 𝝛 → Z ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA → LATIN CAPITAL LETTER Z # →Ζ→ +1D795 ; 005A ; MA # ( 𝞕 → Z ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA → LATIN CAPITAL LETTER Z # →Ζ→ +13C3 ; 005A ; MA # ( Ꮓ → Z ) CHEROKEE LETTER NO → LATIN CAPITAL LETTER Z # +A4DC ; 005A ; MA # ( ꓜ → Z ) LISU LETTER DZA → LATIN CAPITAL LETTER Z # +118A9 ; 005A ; MA # ( 𑢩 → Z ) WARANG CITI CAPITAL LETTER O → LATIN CAPITAL LETTER Z # + +0290 ; 007A 0328 ; MA # ( ʐ → z̨ ) LATIN SMALL LETTER Z WITH RETROFLEX HOOK → LATIN SMALL LETTER Z, COMBINING OGONEK # →z̢→ + +01B6 ; 007A 0335 ; MA # ( ƶ → z̵ ) LATIN SMALL LETTER Z WITH STROKE → LATIN SMALL LETTER Z, COMBINING SHORT STROKE OVERLAY # + +01B5 ; 005A 0335 ; MA # ( Ƶ → Z̵ ) LATIN CAPITAL LETTER Z WITH STROKE → LATIN CAPITAL LETTER Z, COMBINING SHORT STROKE OVERLAY # + +0225 ; 007A 0326 ; MA # ( ȥ → z̦ ) LATIN SMALL LETTER Z WITH HOOK → LATIN SMALL LETTER Z, COMBINING COMMA BELOW # →z̡→ + +0224 ; 005A 0326 ; MA # ( Ȥ → Z̦ ) LATIN CAPITAL LETTER Z WITH HOOK → LATIN CAPITAL LETTER Z, COMBINING COMMA BELOW # →Z̧→ + +1D76 ; 007A 0334 ; MA # ( ᵶ → z̴ ) LATIN SMALL LETTER Z WITH MIDDLE TILDE → LATIN SMALL LETTER Z, COMBINING TILDE OVERLAY # + +01BF ; 00FE ; MA # ( ƿ → þ ) LATIN LETTER WYNN → LATIN SMALL LETTER THORN # +03F8 ; 00FE ; MA # ( ϸ → þ ) GREEK SMALL LETTER SHO → LATIN SMALL LETTER THORN # + +03F7 ; 00DE ; MA # ( Ϸ → Þ ) GREEK CAPITAL LETTER SHO → LATIN CAPITAL LETTER THORN # + +1D24 ; 01A8 ; MA # ( ᴤ → ƨ ) LATIN LETTER VOICED LARYNGEAL SPIRANT → LATIN SMALL LETTER TONE TWO # +03E9 ; 01A8 ; MA # ( ϩ → ƨ ) COPTIC SMALL LETTER HORI → LATIN SMALL LETTER TONE TWO # +A645 ; 01A8 ; MA # ( ꙅ → ƨ ) CYRILLIC SMALL LETTER REVERSED DZE → LATIN SMALL LETTER TONE TWO # + +044C ; 0185 ; MA # ( ь → ƅ ) CYRILLIC SMALL LETTER SOFT SIGN → LATIN SMALL LETTER TONE SIX # + +044B ; 0185 0069 ; MA # ( ы → ƅi ) CYRILLIC SMALL LETTER YERU → LATIN SMALL LETTER TONE SIX, LATIN SMALL LETTER I # →ьı→ + +02E4 ; 02C1 ; MA # ( ˤ → ˁ ) MODIFIER LETTER SMALL REVERSED GLOTTAL STOP → MODIFIER LETTER REVERSED GLOTTAL STOP # + +2299 ; 0298 ; MA #* ( ⊙ → ʘ ) CIRCLED DOT OPERATOR → LATIN LETTER BILABIAL CLICK # +2609 ; 0298 ; MA #* ( ☉ → ʘ ) SUN → LATIN LETTER BILABIAL CLICK # →⊙→ +2A00 ; 0298 ; MA #* ( ⨀ → ʘ ) N-ARY CIRCLED DOT OPERATOR → LATIN LETTER BILABIAL CLICK # →⊙→ +A668 ; 0298 ; MA # ( Ꙩ → ʘ ) CYRILLIC CAPITAL LETTER MONOCULAR O → LATIN LETTER BILABIAL CLICK # +2D59 ; 0298 ; MA # ( ⵙ → ʘ ) TIFINAGH LETTER YAS → LATIN LETTER BILABIAL CLICK # →⊙→ + +213E ; 0393 ; MA # ( ℾ → Γ ) DOUBLE-STRUCK CAPITAL GAMMA → GREEK CAPITAL LETTER GAMMA # +1D6AA ; 0393 ; MA # ( 𝚪 → Γ ) MATHEMATICAL BOLD CAPITAL GAMMA → GREEK CAPITAL LETTER GAMMA # +1D6E4 ; 0393 ; MA # ( 𝛤 → Γ ) MATHEMATICAL ITALIC CAPITAL GAMMA → GREEK CAPITAL LETTER GAMMA # +1D71E ; 0393 ; MA # ( 𝜞 → Γ ) MATHEMATICAL BOLD ITALIC CAPITAL GAMMA → GREEK CAPITAL LETTER GAMMA # +1D758 ; 0393 ; MA # ( 𝝘 → Γ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA → GREEK CAPITAL LETTER GAMMA # +1D792 ; 0393 ; MA # ( 𝞒 → Γ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA → GREEK CAPITAL LETTER GAMMA # +2C84 ; 0393 ; MA # ( Ⲅ → Γ ) COPTIC CAPITAL LETTER GAMMA → GREEK CAPITAL LETTER GAMMA # +0413 ; 0393 ; MA # ( Г → Γ ) CYRILLIC CAPITAL LETTER GHE → GREEK CAPITAL LETTER GAMMA # +13B1 ; 0393 ; MA # ( Ꮁ → Γ ) CHEROKEE LETTER HU → GREEK CAPITAL LETTER GAMMA # +14A5 ; 0393 ; MA # ( ᒥ → Γ ) CANADIAN SYLLABICS MI → GREEK CAPITAL LETTER GAMMA # + +0492 ; 0393 0335 ; MA # ( Ғ → Γ̵ ) CYRILLIC CAPITAL LETTER GHE WITH STROKE → GREEK CAPITAL LETTER GAMMA, COMBINING SHORT STROKE OVERLAY # →Г̵→ + +14AF ; 0393 00B7 ; MA # ( ᒯ → Γ· ) CANADIAN SYLLABICS WEST-CREE MWI → GREEK CAPITAL LETTER GAMMA, MIDDLE DOT # →ᒥᐧ→→ᒥ·→ + +0490 ; 0393 0027 ; MA # ( Ґ → Γ' ) CYRILLIC CAPITAL LETTER GHE WITH UPTURN → GREEK CAPITAL LETTER GAMMA, APOSTROPHE # →Гˈ→ + +2206 ; 0394 ; MA #* ( ∆ → Δ ) INCREMENT → GREEK CAPITAL LETTER DELTA # +25B3 ; 0394 ; MA #* ( △ → Δ ) WHITE UP-POINTING TRIANGLE → GREEK CAPITAL LETTER DELTA # +1F702 ; 0394 ; MA #* ( 🜂 → Δ ) ALCHEMICAL SYMBOL FOR FIRE → GREEK CAPITAL LETTER DELTA # →△→ +1D6AB ; 0394 ; MA # ( 𝚫 → Δ ) MATHEMATICAL BOLD CAPITAL DELTA → GREEK CAPITAL LETTER DELTA # +1D6E5 ; 0394 ; MA # ( 𝛥 → Δ ) MATHEMATICAL ITALIC CAPITAL DELTA → GREEK CAPITAL LETTER DELTA # +1D71F ; 0394 ; MA # ( 𝜟 → Δ ) MATHEMATICAL BOLD ITALIC CAPITAL DELTA → GREEK CAPITAL LETTER DELTA # +1D759 ; 0394 ; MA # ( 𝝙 → Δ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA → GREEK CAPITAL LETTER DELTA # +1D793 ; 0394 ; MA # ( 𝞓 → Δ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA → GREEK CAPITAL LETTER DELTA # +2C86 ; 0394 ; MA # ( Ⲇ → Δ ) COPTIC CAPITAL LETTER DALDA → GREEK CAPITAL LETTER DELTA # +2D60 ; 0394 ; MA # ( ⵠ → Δ ) TIFINAGH LETTER YAV → GREEK CAPITAL LETTER DELTA # +1403 ; 0394 ; MA # ( ᐃ → Δ ) CANADIAN SYLLABICS I → GREEK CAPITAL LETTER DELTA # +10285 ; 0394 ; MA # ( 𐊅 → Δ ) LYCIAN LETTER D → GREEK CAPITAL LETTER DELTA # +102A3 ; 0394 ; MA # ( 𐊣 → Δ ) CARIAN LETTER L → GREEK CAPITAL LETTER DELTA # + +2359 ; 0394 0332 ; MA #* ( ⍙ → Δ̲ ) APL FUNCTIONAL SYMBOL DELTA UNDERBAR → GREEK CAPITAL LETTER DELTA, COMBINING LOW LINE # + +140F ; 0394 00B7 ; MA # ( ᐏ → Δ· ) CANADIAN SYLLABICS WEST-CREE WI → GREEK CAPITAL LETTER DELTA, MIDDLE DOT # →ᐃᐧ→ + +142C ; 0394 1420 ; MA # ( ᐬ → Δᐠ ) CANADIAN SYLLABICS IN → GREEK CAPITAL LETTER DELTA, CANADIAN SYLLABICS FINAL GRAVE # →ᐃᐠ→ + +1D7CB ; 03DD ; MA # ( 𝟋 → ϝ ) MATHEMATICAL BOLD SMALL DIGAMMA → GREEK SMALL LETTER DIGAMMA # + +1D6C7 ; 03B6 ; MA # ( 𝛇 → ζ ) MATHEMATICAL BOLD SMALL ZETA → GREEK SMALL LETTER ZETA # +1D701 ; 03B6 ; MA # ( 𝜁 → ζ ) MATHEMATICAL ITALIC SMALL ZETA → GREEK SMALL LETTER ZETA # +1D73B ; 03B6 ; MA # ( 𝜻 → ζ ) MATHEMATICAL BOLD ITALIC SMALL ZETA → GREEK SMALL LETTER ZETA # +1D775 ; 03B6 ; MA # ( 𝝵 → ζ ) MATHEMATICAL SANS-SERIF BOLD SMALL ZETA → GREEK SMALL LETTER ZETA # +1D7AF ; 03B6 ; MA # ( 𝞯 → ζ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA → GREEK SMALL LETTER ZETA # + +2CE4 ; 03D7 ; MA # ( ⳤ → ϗ ) COPTIC SYMBOL KAI → GREEK KAI SYMBOL # + +1D6CC ; 03BB ; MA # ( 𝛌 → λ ) MATHEMATICAL BOLD SMALL LAMDA → GREEK SMALL LETTER LAMDA # +1D706 ; 03BB ; MA # ( 𝜆 → λ ) MATHEMATICAL ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA # +1D740 ; 03BB ; MA # ( 𝝀 → λ ) MATHEMATICAL BOLD ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA # +1D77A ; 03BB ; MA # ( 𝝺 → λ ) MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA → GREEK SMALL LETTER LAMDA # +1D7B4 ; 03BB ; MA # ( 𝞴 → λ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA # +2C96 ; 03BB ; MA # ( Ⲗ → λ ) COPTIC CAPITAL LETTER LAULA → GREEK SMALL LETTER LAMDA # + +00B5 ; 03BC ; MA # ( µ → μ ) MICRO SIGN → GREEK SMALL LETTER MU # +1D6CD ; 03BC ; MA # ( 𝛍 → μ ) MATHEMATICAL BOLD SMALL MU → GREEK SMALL LETTER MU # +1D707 ; 03BC ; MA # ( 𝜇 → μ ) MATHEMATICAL ITALIC SMALL MU → GREEK SMALL LETTER MU # +1D741 ; 03BC ; MA # ( 𝝁 → μ ) MATHEMATICAL BOLD ITALIC SMALL MU → GREEK SMALL LETTER MU # +1D77B ; 03BC ; MA # ( 𝝻 → μ ) MATHEMATICAL SANS-SERIF BOLD SMALL MU → GREEK SMALL LETTER MU # +1D7B5 ; 03BC ; MA # ( 𝞵 → μ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU → GREEK SMALL LETTER MU # + +1D6CF ; 03BE ; MA # ( 𝛏 → ξ ) MATHEMATICAL BOLD SMALL XI → GREEK SMALL LETTER XI # +1D709 ; 03BE ; MA # ( 𝜉 → ξ ) MATHEMATICAL ITALIC SMALL XI → GREEK SMALL LETTER XI # +1D743 ; 03BE ; MA # ( 𝝃 → ξ ) MATHEMATICAL BOLD ITALIC SMALL XI → GREEK SMALL LETTER XI # +1D77D ; 03BE ; MA # ( 𝝽 → ξ ) MATHEMATICAL SANS-SERIF BOLD SMALL XI → GREEK SMALL LETTER XI # +1D7B7 ; 03BE ; MA # ( 𝞷 → ξ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI → GREEK SMALL LETTER XI # + +1D6B5 ; 039E ; MA # ( 𝚵 → Ξ ) MATHEMATICAL BOLD CAPITAL XI → GREEK CAPITAL LETTER XI # +1D6EF ; 039E ; MA # ( 𝛯 → Ξ ) MATHEMATICAL ITALIC CAPITAL XI → GREEK CAPITAL LETTER XI # +1D729 ; 039E ; MA # ( 𝜩 → Ξ ) MATHEMATICAL BOLD ITALIC CAPITAL XI → GREEK CAPITAL LETTER XI # +1D763 ; 039E ; MA # ( 𝝣 → Ξ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL XI → GREEK CAPITAL LETTER XI # +1D79D ; 039E ; MA # ( 𝞝 → Ξ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI → GREEK CAPITAL LETTER XI # + +220F ; 03A0 ; MA #* ( ∏ → Π ) N-ARY PRODUCT → GREEK CAPITAL LETTER PI # +213F ; 03A0 ; MA # ( ℿ → Π ) DOUBLE-STRUCK CAPITAL PI → GREEK CAPITAL LETTER PI # +1D6B7 ; 03A0 ; MA # ( 𝚷 → Π ) MATHEMATICAL BOLD CAPITAL PI → GREEK CAPITAL LETTER PI # +1D6F1 ; 03A0 ; MA # ( 𝛱 → Π ) MATHEMATICAL ITALIC CAPITAL PI → GREEK CAPITAL LETTER PI # +1D72B ; 03A0 ; MA # ( 𝜫 → Π ) MATHEMATICAL BOLD ITALIC CAPITAL PI → GREEK CAPITAL LETTER PI # +1D765 ; 03A0 ; MA # ( 𝝥 → Π ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PI → GREEK CAPITAL LETTER PI # +1D79F ; 03A0 ; MA # ( 𝞟 → Π ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI → GREEK CAPITAL LETTER PI # +2CA0 ; 03A0 ; MA # ( Ⲡ → Π ) COPTIC CAPITAL LETTER PI → GREEK CAPITAL LETTER PI # +041F ; 03A0 ; MA # ( П → Π ) CYRILLIC CAPITAL LETTER PE → GREEK CAPITAL LETTER PI # + +102AD ; 03D8 ; MA # ( 𐊭 → Ϙ ) CARIAN LETTER T → GREEK LETTER ARCHAIC KOPPA # +10312 ; 03D8 ; MA # ( 𐌒 → Ϙ ) OLD ITALIC LETTER KU → GREEK LETTER ARCHAIC KOPPA # + +03DB ; 03C2 ; MA # ( ϛ → ς ) GREEK SMALL LETTER STIGMA → GREEK SMALL LETTER FINAL SIGMA # +1D6D3 ; 03C2 ; MA # ( 𝛓 → ς ) MATHEMATICAL BOLD SMALL FINAL SIGMA → GREEK SMALL LETTER FINAL SIGMA # +1D70D ; 03C2 ; MA # ( 𝜍 → ς ) MATHEMATICAL ITALIC SMALL FINAL SIGMA → GREEK SMALL LETTER FINAL SIGMA # +1D747 ; 03C2 ; MA # ( 𝝇 → ς ) MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA → GREEK SMALL LETTER FINAL SIGMA # +1D781 ; 03C2 ; MA # ( 𝞁 → ς ) MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA → GREEK SMALL LETTER FINAL SIGMA # +1D7BB ; 03C2 ; MA # ( 𝞻 → ς ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA → GREEK SMALL LETTER FINAL SIGMA # + +1D6BD ; 03A6 ; MA # ( 𝚽 → Φ ) MATHEMATICAL BOLD CAPITAL PHI → GREEK CAPITAL LETTER PHI # +1D6F7 ; 03A6 ; MA # ( 𝛷 → Φ ) MATHEMATICAL ITALIC CAPITAL PHI → GREEK CAPITAL LETTER PHI # +1D731 ; 03A6 ; MA # ( 𝜱 → Φ ) MATHEMATICAL BOLD ITALIC CAPITAL PHI → GREEK CAPITAL LETTER PHI # +1D76B ; 03A6 ; MA # ( 𝝫 → Φ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI → GREEK CAPITAL LETTER PHI # +1D7A5 ; 03A6 ; MA # ( 𝞥 → Φ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI → GREEK CAPITAL LETTER PHI # +2CAA ; 03A6 ; MA # ( Ⲫ → Φ ) COPTIC CAPITAL LETTER FI → GREEK CAPITAL LETTER PHI # +0424 ; 03A6 ; MA # ( Ф → Φ ) CYRILLIC CAPITAL LETTER EF → GREEK CAPITAL LETTER PHI # +0553 ; 03A6 ; MA # ( Փ → Φ ) ARMENIAN CAPITAL LETTER PIWR → GREEK CAPITAL LETTER PHI # +16F0 ; 03A6 ; MA # ( ᛰ → Φ ) RUNIC BELGTHOR SYMBOL → GREEK CAPITAL LETTER PHI # +102B3 ; 03A6 ; MA # ( 𐊳 → Φ ) CARIAN LETTER NN → GREEK CAPITAL LETTER PHI # + +AB53 ; 03C7 ; MA # ( ꭓ → χ ) LATIN SMALL LETTER CHI → GREEK SMALL LETTER CHI # +AB55 ; 03C7 ; MA # ( ꭕ → χ ) LATIN SMALL LETTER CHI WITH LOW LEFT SERIF → GREEK SMALL LETTER CHI # +1D6D8 ; 03C7 ; MA # ( 𝛘 → χ ) MATHEMATICAL BOLD SMALL CHI → GREEK SMALL LETTER CHI # +1D712 ; 03C7 ; MA # ( 𝜒 → χ ) MATHEMATICAL ITALIC SMALL CHI → GREEK SMALL LETTER CHI # +1D74C ; 03C7 ; MA # ( 𝝌 → χ ) MATHEMATICAL BOLD ITALIC SMALL CHI → GREEK SMALL LETTER CHI # +1D786 ; 03C7 ; MA # ( 𝞆 → χ ) MATHEMATICAL SANS-SERIF BOLD SMALL CHI → GREEK SMALL LETTER CHI # +1D7C0 ; 03C7 ; MA # ( 𝟀 → χ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI → GREEK SMALL LETTER CHI # +2CAD ; 03C7 ; MA # ( ⲭ → χ ) COPTIC SMALL LETTER KHI → GREEK SMALL LETTER CHI # + +1D6D9 ; 03C8 ; MA # ( 𝛙 → ψ ) MATHEMATICAL BOLD SMALL PSI → GREEK SMALL LETTER PSI # +1D713 ; 03C8 ; MA # ( 𝜓 → ψ ) MATHEMATICAL ITALIC SMALL PSI → GREEK SMALL LETTER PSI # +1D74D ; 03C8 ; MA # ( 𝝍 → ψ ) MATHEMATICAL BOLD ITALIC SMALL PSI → GREEK SMALL LETTER PSI # +1D787 ; 03C8 ; MA # ( 𝞇 → ψ ) MATHEMATICAL SANS-SERIF BOLD SMALL PSI → GREEK SMALL LETTER PSI # +1D7C1 ; 03C8 ; MA # ( 𝟁 → ψ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI → GREEK SMALL LETTER PSI # +0471 ; 03C8 ; MA # ( ѱ → ψ ) CYRILLIC SMALL LETTER PSI → GREEK SMALL LETTER PSI # + +1D6BF ; 03A8 ; MA # ( 𝚿 → Ψ ) MATHEMATICAL BOLD CAPITAL PSI → GREEK CAPITAL LETTER PSI # +1D6F9 ; 03A8 ; MA # ( 𝛹 → Ψ ) MATHEMATICAL ITALIC CAPITAL PSI → GREEK CAPITAL LETTER PSI # +1D733 ; 03A8 ; MA # ( 𝜳 → Ψ ) MATHEMATICAL BOLD ITALIC CAPITAL PSI → GREEK CAPITAL LETTER PSI # +1D76D ; 03A8 ; MA # ( 𝝭 → Ψ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI → GREEK CAPITAL LETTER PSI # +1D7A7 ; 03A8 ; MA # ( 𝞧 → Ψ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI → GREEK CAPITAL LETTER PSI # +2CAE ; 03A8 ; MA # ( Ⲯ → Ψ ) COPTIC CAPITAL LETTER PSI → GREEK CAPITAL LETTER PSI # +0470 ; 03A8 ; MA # ( Ѱ → Ψ ) CYRILLIC CAPITAL LETTER PSI → GREEK CAPITAL LETTER PSI # +16D8 ; 03A8 ; MA # ( ᛘ → Ψ ) RUNIC LETTER LONG-BRANCH-MADR M → GREEK CAPITAL LETTER PSI # +102B5 ; 03A8 ; MA # ( 𐊵 → Ψ ) CARIAN LETTER N → GREEK CAPITAL LETTER PSI # + +2375 ; 03C9 ; MA #* ( ⍵ → ω ) APL FUNCTIONAL SYMBOL OMEGA → GREEK SMALL LETTER OMEGA # +1D6DA ; 03C9 ; MA # ( 𝛚 → ω ) MATHEMATICAL BOLD SMALL OMEGA → GREEK SMALL LETTER OMEGA # +1D714 ; 03C9 ; MA # ( 𝜔 → ω ) MATHEMATICAL ITALIC SMALL OMEGA → GREEK SMALL LETTER OMEGA # +1D74E ; 03C9 ; MA # ( 𝝎 → ω ) MATHEMATICAL BOLD ITALIC SMALL OMEGA → GREEK SMALL LETTER OMEGA # +1D788 ; 03C9 ; MA # ( 𝞈 → ω ) MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA → GREEK SMALL LETTER OMEGA # +1D7C2 ; 03C9 ; MA # ( 𝟂 → ω ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA → GREEK SMALL LETTER OMEGA # +2CB1 ; 03C9 ; MA # ( ⲱ → ω ) COPTIC SMALL LETTER OOU → GREEK SMALL LETTER OMEGA # +A64D ; 03C9 ; MA # ( ꙍ → ω ) CYRILLIC SMALL LETTER BROAD OMEGA → GREEK SMALL LETTER OMEGA # →ꞷ→ +A7B7 ; 03C9 ; MA # ( ꞷ → ω ) LATIN SMALL LETTER OMEGA → GREEK SMALL LETTER OMEGA # + +2126 ; 03A9 ; MA # ( Ω → Ω ) OHM SIGN → GREEK CAPITAL LETTER OMEGA # +1D6C0 ; 03A9 ; MA # ( 𝛀 → Ω ) MATHEMATICAL BOLD CAPITAL OMEGA → GREEK CAPITAL LETTER OMEGA # +1D6FA ; 03A9 ; MA # ( 𝛺 → Ω ) MATHEMATICAL ITALIC CAPITAL OMEGA → GREEK CAPITAL LETTER OMEGA # +1D734 ; 03A9 ; MA # ( 𝜴 → Ω ) MATHEMATICAL BOLD ITALIC CAPITAL OMEGA → GREEK CAPITAL LETTER OMEGA # +1D76E ; 03A9 ; MA # ( 𝝮 → Ω ) MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA → GREEK CAPITAL LETTER OMEGA # +1D7A8 ; 03A9 ; MA # ( 𝞨 → Ω ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA → GREEK CAPITAL LETTER OMEGA # +162F ; 03A9 ; MA # ( ᘯ → Ω ) CANADIAN SYLLABICS CARRIER LHO → GREEK CAPITAL LETTER OMEGA # +1635 ; 03A9 ; MA # ( ᘵ → Ω ) CANADIAN SYLLABICS CARRIER TLHO → GREEK CAPITAL LETTER OMEGA # →ᘯ→ +102B6 ; 03A9 ; MA # ( 𐊶 → Ω ) CARIAN LETTER TT2 → GREEK CAPITAL LETTER OMEGA # + +2379 ; 03C9 0332 ; MA #* ( ⍹ → ω̲ ) APL FUNCTIONAL SYMBOL OMEGA UNDERBAR → GREEK SMALL LETTER OMEGA, COMBINING LOW LINE # + +1F7D ; 1FF4 ; MA # ( ώ → ῴ ) GREEK SMALL LETTER OMEGA WITH OXIA → GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI # + +2630 ; 2CB6 ; MA #* ( ☰ → Ⲷ ) TRIGRAM FOR HEAVEN → COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE # + +2CDC ; 03EC ; MA # ( Ⳝ → Ϭ ) COPTIC CAPITAL LETTER OLD NUBIAN SHIMA → COPTIC CAPITAL LETTER SHIMA # + +0497 ; 0436 0329 ; MA # ( җ → ж̩ ) CYRILLIC SMALL LETTER ZHE WITH DESCENDER → CYRILLIC SMALL LETTER ZHE, COMBINING VERTICAL LINE BELOW # + +0496 ; 0416 0329 ; MA # ( Җ → Ж̩ ) CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER → CYRILLIC CAPITAL LETTER ZHE, COMBINING VERTICAL LINE BELOW # + +0376 ; 0418 ; MA # ( Ͷ → И ) GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA → CYRILLIC CAPITAL LETTER I # +10425 ; 0418 ; MA # ( 𐐥 → И ) DESERET CAPITAL LETTER ENG → CYRILLIC CAPITAL LETTER I # + +0419 ; 040D ; MA # ( Й → Ѝ ) CYRILLIC CAPITAL LETTER SHORT I → CYRILLIC CAPITAL LETTER I WITH GRAVE # + +048A ; 040D 0326 ; MA # ( Ҋ → Ѝ̦ ) CYRILLIC CAPITAL LETTER SHORT I WITH TAIL → CYRILLIC CAPITAL LETTER I WITH GRAVE, COMBINING COMMA BELOW # →Й̡→ + +045D ; 0439 ; MA # ( ѝ → й ) CYRILLIC SMALL LETTER I WITH GRAVE → CYRILLIC SMALL LETTER SHORT I # + +048B ; 0439 0326 ; MA # ( ҋ → й̦ ) CYRILLIC SMALL LETTER SHORT I WITH TAIL → CYRILLIC SMALL LETTER SHORT I, COMBINING COMMA BELOW # →й̡→ + +1D2B ; 043B ; MA # ( ᴫ → л ) CYRILLIC LETTER SMALL CAPITAL EL → CYRILLIC SMALL LETTER EL # + +04C6 ; 043B 0326 ; MA # ( ӆ → л̦ ) CYRILLIC SMALL LETTER EL WITH TAIL → CYRILLIC SMALL LETTER EL, COMBINING COMMA BELOW # →л̡→ + +AB60 ; 0459 ; MA # ( ꭠ → љ ) LATIN SMALL LETTER SAKHA YAT → CYRILLIC SMALL LETTER LJE # + +13C7 ; 0460 ; MA # ( Ꮗ → Ѡ ) CHEROKEE LETTER QUE → CYRILLIC CAPITAL LETTER OMEGA # +15EF ; 0460 ; MA # ( ᗯ → Ѡ ) CANADIAN SYLLABICS CARRIER GU → CYRILLIC CAPITAL LETTER OMEGA # + +047C ; 0460 0483 ; MA # ( Ѽ → Ѡ҃ ) CYRILLIC CAPITAL LETTER OMEGA WITH TITLO → CYRILLIC CAPITAL LETTER OMEGA, COMBINING CYRILLIC TITLO # + +18ED ; 0460 00B7 ; MA # ( ᣭ → Ѡ· ) CANADIAN SYLLABICS CARRIER GWU → CYRILLIC CAPITAL LETTER OMEGA, MIDDLE DOT # →ᗯᐧ→ + +A7B6 ; A64C ; MA # ( Ꞷ → Ꙍ ) LATIN CAPITAL LETTER OMEGA → CYRILLIC CAPITAL LETTER BROAD OMEGA # + +04CC ; 04B7 ; MA # ( ӌ → ҷ ) CYRILLIC SMALL LETTER KHAKASSIAN CHE → CYRILLIC SMALL LETTER CHE WITH DESCENDER # + +04CB ; 04B6 ; MA # ( Ӌ → Ҷ ) CYRILLIC CAPITAL LETTER KHAKASSIAN CHE → CYRILLIC CAPITAL LETTER CHE WITH DESCENDER # + +04BE ; 04BC 0328 ; MA # ( Ҿ → Ҽ̨ ) CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER → CYRILLIC CAPITAL LETTER ABKHASIAN CHE, COMBINING OGONEK # + +2CBD ; 0448 ; MA # ( ⲽ → ш ) COPTIC SMALL LETTER CRYPTOGRAMMIC NI → CYRILLIC SMALL LETTER SHA # + +2CBC ; 0428 ; MA # ( Ⲽ → Ш ) COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI → CYRILLIC CAPITAL LETTER SHA # + +2108 ; 042D ; MA #* ( ℈ → Э ) SCRUPLE → CYRILLIC CAPITAL LETTER E # + +0587 ; 0565 0582 ; MA # ( և → եւ ) ARMENIAN SMALL LIGATURE ECH YIWN → ARMENIAN SMALL LETTER ECH, ARMENIAN SMALL LETTER YIWN # + +FB14 ; 0574 0565 ; MA # ( ﬔ → մե ) ARMENIAN SMALL LIGATURE MEN ECH → ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER ECH # + +FB15 ; 0574 056B ; MA # ( ﬕ → մի ) ARMENIAN SMALL LIGATURE MEN INI → ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER INI # + +FB17 ; 0574 056D ; MA # ( ﬗ → մխ ) ARMENIAN SMALL LIGATURE MEN XEH → ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER XEH # + +FB13 ; 0574 0576 ; MA # ( ﬓ → մն ) ARMENIAN SMALL LIGATURE MEN NOW → ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER NOW # + +2229 ; 0548 ; MA #* ( ∩ → Ո ) INTERSECTION → ARMENIAN CAPITAL LETTER VO # →ᑎ→ +22C2 ; 0548 ; MA #* ( ⋂ → Ո ) N-ARY INTERSECTION → ARMENIAN CAPITAL LETTER VO # →∩→→ᑎ→ +144E ; 0548 ; MA # ( ᑎ → Ո ) CANADIAN SYLLABICS TI → ARMENIAN CAPITAL LETTER VO # +A4F5 ; 0548 ; MA # ( ꓵ → Ո ) LISU LETTER UE → ARMENIAN CAPITAL LETTER VO # →∩→→ᑎ→ + +145A ; 0548 00B7 ; MA # ( ᑚ → Ո· ) CANADIAN SYLLABICS WEST-CREE TWI → ARMENIAN CAPITAL LETTER VO, MIDDLE DOT # →ᑎᐧ→→ᑎ·→ + +1468 ; 0548 0027 ; MA # ( ᑨ → Ո' ) CANADIAN SYLLABICS TTI → ARMENIAN CAPITAL LETTER VO, APOSTROPHE # →ᑎᑊ→→ᑎ'→ + +FB16 ; 057E 0576 ; MA # ( ﬖ → վն ) ARMENIAN SMALL LIGATURE VEW NOW → ARMENIAN SMALL LETTER VEW, ARMENIAN SMALL LETTER NOW # + +20BD ; 0554 ; MA #* ( ₽ → Ք ) RUBLE SIGN → ARMENIAN CAPITAL LETTER KEH # + +02D3 ; 0559 ; MA #* ( ˓ → ՙ ) MODIFIER LETTER CENTRED LEFT HALF RING → ARMENIAN MODIFIER LETTER LEFT HALF RING # +02BF ; 0559 ; MA # ( ʿ → ՙ ) MODIFIER LETTER LEFT HALF RING → ARMENIAN MODIFIER LETTER LEFT HALF RING # + +2135 ; 05D0 ; MA # ( ℵ → ‎א‎ ) ALEF SYMBOL → HEBREW LETTER ALEF # +FB21 ; 05D0 ; MA # ( ‎ﬡ‎ → ‎א‎ ) HEBREW LETTER WIDE ALEF → HEBREW LETTER ALEF # + +FB2F ; FB2E ; MA # ( ‎אָ‎ → ‎אַ‎ ) HEBREW LETTER ALEF WITH QAMATS → HEBREW LETTER ALEF WITH PATAH # +FB30 ; FB2E ; MA # ( ‎אּ‎ → ‎אַ‎ ) HEBREW LETTER ALEF WITH MAPIQ → HEBREW LETTER ALEF WITH PATAH # + +FB4F ; 05D0 05DC ; MA # ( ‎ﭏ‎ → ‎אל‎ ) HEBREW LIGATURE ALEF LAMED → HEBREW LETTER ALEF, HEBREW LETTER LAMED # + +2136 ; 05D1 ; MA # ( ℶ → ‎ב‎ ) BET SYMBOL → HEBREW LETTER BET # + +2137 ; 05D2 ; MA # ( ℷ → ‎ג‎ ) GIMEL SYMBOL → HEBREW LETTER GIMEL # + +2138 ; 05D3 ; MA # ( ℸ → ‎ד‎ ) DALET SYMBOL → HEBREW LETTER DALET # +FB22 ; 05D3 ; MA # ( ‎ﬢ‎ → ‎ד‎ ) HEBREW LETTER WIDE DALET → HEBREW LETTER DALET # + +FB23 ; 05D4 ; MA # ( ‎ﬣ‎ → ‎ה‎ ) HEBREW LETTER WIDE HE → HEBREW LETTER HE # + +FB39 ; FB1D ; MA # ( ‎יּ‎ → ‎יִ‎ ) HEBREW LETTER YOD WITH DAGESH → HEBREW LETTER YOD WITH HIRIQ # + +FB24 ; 05DB ; MA # ( ‎ﬤ‎ → ‎כ‎ ) HEBREW LETTER WIDE KAF → HEBREW LETTER KAF # + +FB25 ; 05DC ; MA # ( ‎ﬥ‎ → ‎ל‎ ) HEBREW LETTER WIDE LAMED → HEBREW LETTER LAMED # + +FB26 ; 05DD ; MA # ( ‎ﬦ‎ → ‎ם‎ ) HEBREW LETTER WIDE FINAL MEM → HEBREW LETTER FINAL MEM # + +FB20 ; 05E2 ; MA # ( ‎ﬠ‎ → ‎ע‎ ) HEBREW LETTER ALTERNATIVE AYIN → HEBREW LETTER AYIN # + +FB27 ; 05E8 ; MA # ( ‎ﬧ‎ → ‎ר‎ ) HEBREW LETTER WIDE RESH → HEBREW LETTER RESH # + +FB2B ; FB2A ; MA # ( ‎שׂ‎ → ‎שׁ‎ ) HEBREW LETTER SHIN WITH SIN DOT → HEBREW LETTER SHIN WITH SHIN DOT # +FB49 ; FB2A ; MA # ( ‎שּ‎ → ‎שׁ‎ ) HEBREW LETTER SHIN WITH DAGESH → HEBREW LETTER SHIN WITH SHIN DOT # + +FB2D ; FB2C ; MA # ( ‎שּׂ‎ → ‎שּׁ‎ ) HEBREW LETTER SHIN WITH DAGESH AND SIN DOT → HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT # + +FB28 ; 05EA ; MA # ( ‎ﬨ‎ → ‎ת‎ ) HEBREW LETTER WIDE TAV → HEBREW LETTER TAV # + +FE80 ; 0621 ; MA # ( ‎ﺀ‎ → ‎ء‎ ) ARABIC LETTER HAMZA ISOLATED FORM → ARABIC LETTER HAMZA # + +06FD ; 0621 0348 ; MA #* ( ‎۽‎ → ‎ء͈‎ ) ARABIC SIGN SINDHI AMPERSAND → ARABIC LETTER HAMZA, COMBINING DOUBLE VERTICAL LINE BELOW # + +FE82 ; 0622 ; MA # ( ‎ﺂ‎ → ‎آ‎ ) ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM → ARABIC LETTER ALEF WITH MADDA ABOVE # +FE81 ; 0622 ; MA # ( ‎ﺁ‎ → ‎آ‎ ) ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM → ARABIC LETTER ALEF WITH MADDA ABOVE # + +FB51 ; 0671 ; MA # ( ‎ﭑ‎ → ‎ٱ‎ ) ARABIC LETTER ALEF WASLA FINAL FORM → ARABIC LETTER ALEF WASLA # +FB50 ; 0671 ; MA # ( ‎ﭐ‎ → ‎ٱ‎ ) ARABIC LETTER ALEF WASLA ISOLATED FORM → ARABIC LETTER ALEF WASLA # + +1EE01 ; 0628 ; MA # ( ‎𞸁‎ → ‎ب‎ ) ARABIC MATHEMATICAL BEH → ARABIC LETTER BEH # +1EE21 ; 0628 ; MA # ( ‎𞸡‎ → ‎ب‎ ) ARABIC MATHEMATICAL INITIAL BEH → ARABIC LETTER BEH # +1EE61 ; 0628 ; MA # ( ‎𞹡‎ → ‎ب‎ ) ARABIC MATHEMATICAL STRETCHED BEH → ARABIC LETTER BEH # +1EE81 ; 0628 ; MA # ( ‎𞺁‎ → ‎ب‎ ) ARABIC MATHEMATICAL LOOPED BEH → ARABIC LETTER BEH # +1EEA1 ; 0628 ; MA # ( ‎𞺡‎ → ‎ب‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK BEH → ARABIC LETTER BEH # +FE91 ; 0628 ; MA # ( ‎ﺑ‎ → ‎ب‎ ) ARABIC LETTER BEH INITIAL FORM → ARABIC LETTER BEH # +FE92 ; 0628 ; MA # ( ‎ﺒ‎ → ‎ب‎ ) ARABIC LETTER BEH MEDIAL FORM → ARABIC LETTER BEH # +FE90 ; 0628 ; MA # ( ‎ﺐ‎ → ‎ب‎ ) ARABIC LETTER BEH FINAL FORM → ARABIC LETTER BEH # +FE8F ; 0628 ; MA # ( ‎ﺏ‎ → ‎ب‎ ) ARABIC LETTER BEH ISOLATED FORM → ARABIC LETTER BEH # + +0751 ; 0628 06DB ; MA # ( ‎ݑ‎ → ‎بۛ‎ ) ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE → ARABIC LETTER BEH, ARABIC SMALL HIGH THREE DOTS # + +08A1 ; 0628 0654 ; MA # ( ‎ࢡ‎ → ‎بٔ‎ ) ARABIC LETTER BEH WITH HAMZA ABOVE → ARABIC LETTER BEH, ARABIC HAMZA ABOVE # + +FCA0 ; 0628 006F ; MA # ( ‎ﲠ‎ → ‎بo‎ ) ARABIC LIGATURE BEH WITH HEH INITIAL FORM → ARABIC LETTER BEH, LATIN SMALL LETTER O # →‎به‎→ +FCE2 ; 0628 006F ; MA # ( ‎ﳢ‎ → ‎بo‎ ) ARABIC LIGATURE BEH WITH HEH MEDIAL FORM → ARABIC LETTER BEH, LATIN SMALL LETTER O # →‎به‎→ + +FC9C ; 0628 062C ; MA # ( ‎ﲜ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH JEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM # +FC05 ; 0628 062C ; MA # ( ‎ﰅ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM # + +FC9D ; 0628 062D ; MA # ( ‎ﲝ‎ → ‎بح‎ ) ARABIC LIGATURE BEH WITH HAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH # +FC06 ; 0628 062D ; MA # ( ‎ﰆ‎ → ‎بح‎ ) ARABIC LIGATURE BEH WITH HAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER HAH # + +FDC2 ; 0628 062D 0649 ; MA # ( ‎ﷂ‎ → ‎بحى‎ ) ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎بحي‎→ + +FC9E ; 0628 062E ; MA # ( ‎ﲞ‎ → ‎بخ‎ ) ARABIC LIGATURE BEH WITH KHAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER KHAH # +FC07 ; 0628 062E ; MA # ( ‎ﰇ‎ → ‎بخ‎ ) ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER KHAH # +FCD2 ; 0628 062E ; MA # ( ‎ﳒ‎ → ‎بخ‎ ) ARABIC LIGATURE NOON WITH JEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER KHAH # →‎ﲞ‎→ +FC4B ; 0628 062E ; MA # ( ‎ﱋ‎ → ‎بخ‎ ) ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER KHAH # →‎نج‎→→‎ﳒ‎→→‎ﲞ‎→ + +FD9E ; 0628 062E 0649 ; MA # ( ‎ﶞ‎ → ‎بخى‎ ) ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA # →‎بخي‎→ + +FC6A ; 0628 0631 ; MA # ( ‎ﱪ‎ → ‎بر‎ ) ARABIC LIGATURE BEH WITH REH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER REH # + +FC6B ; 0628 0632 ; MA # ( ‎ﱫ‎ → ‎بز‎ ) ARABIC LIGATURE BEH WITH ZAIN FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ZAIN # + +FC9F ; 0628 0645 ; MA # ( ‎ﲟ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM # +FCE1 ; 0628 0645 ; MA # ( ‎ﳡ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM # +FC6C ; 0628 0645 ; MA # ( ‎ﱬ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM # +FC08 ; 0628 0645 ; MA # ( ‎ﰈ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM # + +FC6D ; 0628 0646 ; MA # ( ‎ﱭ‎ → ‎بن‎ ) ARABIC LIGATURE BEH WITH NOON FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER NOON # + +FC6E ; 0628 0649 ; MA # ( ‎ﱮ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA # +FC09 ; 0628 0649 ; MA # ( ‎ﰉ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA # +FC6F ; 0628 0649 ; MA # ( ‎ﱯ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA # →‎بي‎→ +FC0A ; 0628 0649 ; MA # ( ‎ﰊ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH YEH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA # →‎بي‎→ + +FB54 ; 067B ; MA # ( ‎ﭔ‎ → ‎ٻ‎ ) ARABIC LETTER BEEH INITIAL FORM → ARABIC LETTER BEEH # +FB55 ; 067B ; MA # ( ‎ﭕ‎ → ‎ٻ‎ ) ARABIC LETTER BEEH MEDIAL FORM → ARABIC LETTER BEEH # +FB53 ; 067B ; MA # ( ‎ﭓ‎ → ‎ٻ‎ ) ARABIC LETTER BEEH FINAL FORM → ARABIC LETTER BEEH # +FB52 ; 067B ; MA # ( ‎ﭒ‎ → ‎ٻ‎ ) ARABIC LETTER BEEH ISOLATED FORM → ARABIC LETTER BEEH # +06D0 ; 067B ; MA # ( ‎ې‎ → ‎ٻ‎ ) ARABIC LETTER E → ARABIC LETTER BEEH # +FBE6 ; 067B ; MA # ( ‎ﯦ‎ → ‎ٻ‎ ) ARABIC LETTER E INITIAL FORM → ARABIC LETTER BEEH # →‎ې‎→ +FBE7 ; 067B ; MA # ( ‎ﯧ‎ → ‎ٻ‎ ) ARABIC LETTER E MEDIAL FORM → ARABIC LETTER BEEH # →‎ې‎→ +FBE5 ; 067B ; MA # ( ‎ﯥ‎ → ‎ٻ‎ ) ARABIC LETTER E FINAL FORM → ARABIC LETTER BEEH # →‎ې‎→ +FBE4 ; 067B ; MA # ( ‎ﯤ‎ → ‎ٻ‎ ) ARABIC LETTER E ISOLATED FORM → ARABIC LETTER BEEH # →‎ې‎→ + +FB5C ; 0680 ; MA # ( ‎ﭜ‎ → ‎ڀ‎ ) ARABIC LETTER BEHEH INITIAL FORM → ARABIC LETTER BEHEH # +FB5D ; 0680 ; MA # ( ‎ﭝ‎ → ‎ڀ‎ ) ARABIC LETTER BEHEH MEDIAL FORM → ARABIC LETTER BEHEH # +FB5B ; 0680 ; MA # ( ‎ﭛ‎ → ‎ڀ‎ ) ARABIC LETTER BEHEH FINAL FORM → ARABIC LETTER BEHEH # +FB5A ; 0680 ; MA # ( ‎ﭚ‎ → ‎ڀ‎ ) ARABIC LETTER BEHEH ISOLATED FORM → ARABIC LETTER BEHEH # + +08A9 ; 0754 ; MA # ( ‎ࢩ‎ → ‎ݔ‎ ) ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE → ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE # +0767 ; 0754 ; MA # ( ‎ݧ‎ → ‎ݔ‎ ) ARABIC LETTER NOON WITH TWO DOTS BELOW → ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE # + +00F6 ; 0629 ; MA # ( ö → ‎ة‎ ) LATIN SMALL LETTER O WITH DIAERESIS → ARABIC LETTER TEH MARBUTA # +FE94 ; 0629 ; MA # ( ‎ﺔ‎ → ‎ة‎ ) ARABIC LETTER TEH MARBUTA FINAL FORM → ARABIC LETTER TEH MARBUTA # +FE93 ; 0629 ; MA # ( ‎ﺓ‎ → ‎ة‎ ) ARABIC LETTER TEH MARBUTA ISOLATED FORM → ARABIC LETTER TEH MARBUTA # +06C3 ; 0629 ; MA # ( ‎ۃ‎ → ‎ة‎ ) ARABIC LETTER TEH MARBUTA GOAL → ARABIC LETTER TEH MARBUTA # + +1EE15 ; 062A ; MA # ( ‎𞸕‎ → ‎ت‎ ) ARABIC MATHEMATICAL TEH → ARABIC LETTER TEH # +1EE35 ; 062A ; MA # ( ‎𞸵‎ → ‎ت‎ ) ARABIC MATHEMATICAL INITIAL TEH → ARABIC LETTER TEH # +1EE75 ; 062A ; MA # ( ‎𞹵‎ → ‎ت‎ ) ARABIC MATHEMATICAL STRETCHED TEH → ARABIC LETTER TEH # +1EE95 ; 062A ; MA # ( ‎𞺕‎ → ‎ت‎ ) ARABIC MATHEMATICAL LOOPED TEH → ARABIC LETTER TEH # +1EEB5 ; 062A ; MA # ( ‎𞺵‎ → ‎ت‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK TEH → ARABIC LETTER TEH # +FE97 ; 062A ; MA # ( ‎ﺗ‎ → ‎ت‎ ) ARABIC LETTER TEH INITIAL FORM → ARABIC LETTER TEH # +FE98 ; 062A ; MA # ( ‎ﺘ‎ → ‎ت‎ ) ARABIC LETTER TEH MEDIAL FORM → ARABIC LETTER TEH # +FE96 ; 062A ; MA # ( ‎ﺖ‎ → ‎ت‎ ) ARABIC LETTER TEH FINAL FORM → ARABIC LETTER TEH # +FE95 ; 062A ; MA # ( ‎ﺕ‎ → ‎ت‎ ) ARABIC LETTER TEH ISOLATED FORM → ARABIC LETTER TEH # + +FCA5 ; 062A 006F ; MA # ( ‎ﲥ‎ → ‎تo‎ ) ARABIC LIGATURE TEH WITH HEH INITIAL FORM → ARABIC LETTER TEH, LATIN SMALL LETTER O # →‎ته‎→ +FCE4 ; 062A 006F ; MA # ( ‎ﳤ‎ → ‎تo‎ ) ARABIC LIGATURE TEH WITH HEH MEDIAL FORM → ARABIC LETTER TEH, LATIN SMALL LETTER O # →‎ته‎→ + +FCA1 ; 062A 062C ; MA # ( ‎ﲡ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM # +FC0B ; 062A 062C ; MA # ( ‎ﰋ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM # + +FD50 ; 062A 062C 0645 ; MA # ( ‎ﵐ‎ → ‎تجم‎ ) ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM # + +FDA0 ; 062A 062C 0649 ; MA # ( ‎ﶠ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA # +FD9F ; 062A 062C 0649 ; MA # ( ‎ﶟ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA # →‎تجي‎→ + +FCA2 ; 062A 062D ; MA # ( ‎ﲢ‎ → ‎تح‎ ) ARABIC LIGATURE TEH WITH HAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH # +FC0C ; 062A 062D ; MA # ( ‎ﰌ‎ → ‎تح‎ ) ARABIC LIGATURE TEH WITH HAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER HAH # + +FD52 ; 062A 062D 062C ; MA # ( ‎ﵒ‎ → ‎تحج‎ ) ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER JEEM # +FD51 ; 062A 062D 062C ; MA # ( ‎ﵑ‎ → ‎تحج‎ ) ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER JEEM # + +FD53 ; 062A 062D 0645 ; MA # ( ‎ﵓ‎ → ‎تحم‎ ) ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER MEEM # + +FCA3 ; 062A 062E ; MA # ( ‎ﲣ‎ → ‎تخ‎ ) ARABIC LIGATURE TEH WITH KHAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER KHAH # +FC0D ; 062A 062E ; MA # ( ‎ﰍ‎ → ‎تخ‎ ) ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER KHAH # + +FD54 ; 062A 062E 0645 ; MA # ( ‎ﵔ‎ → ‎تخم‎ ) ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER KHAH, ARABIC LETTER MEEM # + +FDA2 ; 062A 062E 0649 ; MA # ( ‎ﶢ‎ → ‎تخى‎ ) ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA # +FDA1 ; 062A 062E 0649 ; MA # ( ‎ﶡ‎ → ‎تخى‎ ) ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA # →‎تخي‎→ + +FC70 ; 062A 0631 ; MA # ( ‎ﱰ‎ → ‎تر‎ ) ARABIC LIGATURE TEH WITH REH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER REH # + +FC71 ; 062A 0632 ; MA # ( ‎ﱱ‎ → ‎تز‎ ) ARABIC LIGATURE TEH WITH ZAIN FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER ZAIN # + +FCA4 ; 062A 0645 ; MA # ( ‎ﲤ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM # +FCE3 ; 062A 0645 ; MA # ( ‎ﳣ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM # +FC72 ; 062A 0645 ; MA # ( ‎ﱲ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM # +FC0E ; 062A 0645 ; MA # ( ‎ﰎ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM # + +FD55 ; 062A 0645 062C ; MA # ( ‎ﵕ‎ → ‎تمج‎ ) ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER JEEM # + +FD56 ; 062A 0645 062D ; MA # ( ‎ﵖ‎ → ‎تمح‎ ) ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER HAH # + +FD57 ; 062A 0645 062E ; MA # ( ‎ﵗ‎ → ‎تمخ‎ ) ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER KHAH # + +FDA4 ; 062A 0645 0649 ; MA # ( ‎ﶤ‎ → ‎تمى‎ ) ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # +FDA3 ; 062A 0645 0649 ; MA # ( ‎ﶣ‎ → ‎تمى‎ ) ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # →‎تمي‎→ + +FC73 ; 062A 0646 ; MA # ( ‎ﱳ‎ → ‎تن‎ ) ARABIC LIGATURE TEH WITH NOON FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER NOON # + +FC74 ; 062A 0649 ; MA # ( ‎ﱴ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA # +FC0F ; 062A 0649 ; MA # ( ‎ﰏ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA # +FC75 ; 062A 0649 ; MA # ( ‎ﱵ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA # →‎تي‎→ +FC10 ; 062A 0649 ; MA # ( ‎ﰐ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH YEH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA # →‎تي‎→ + +FB60 ; 067A ; MA # ( ‎ﭠ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH INITIAL FORM → ARABIC LETTER TTEHEH # +FB61 ; 067A ; MA # ( ‎ﭡ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH MEDIAL FORM → ARABIC LETTER TTEHEH # +FB5F ; 067A ; MA # ( ‎ﭟ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH FINAL FORM → ARABIC LETTER TTEHEH # +FB5E ; 067A ; MA # ( ‎ﭞ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH ISOLATED FORM → ARABIC LETTER TTEHEH # + +FB64 ; 067F ; MA # ( ‎ﭤ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH INITIAL FORM → ARABIC LETTER TEHEH # +FB65 ; 067F ; MA # ( ‎ﭥ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH MEDIAL FORM → ARABIC LETTER TEHEH # +FB63 ; 067F ; MA # ( ‎ﭣ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH FINAL FORM → ARABIC LETTER TEHEH # +FB62 ; 067F ; MA # ( ‎ﭢ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH ISOLATED FORM → ARABIC LETTER TEHEH # + +1EE02 ; 062C ; MA # ( ‎𞸂‎ → ‎ج‎ ) ARABIC MATHEMATICAL JEEM → ARABIC LETTER JEEM # +1EE22 ; 062C ; MA # ( ‎𞸢‎ → ‎ج‎ ) ARABIC MATHEMATICAL INITIAL JEEM → ARABIC LETTER JEEM # +1EE42 ; 062C ; MA # ( ‎𞹂‎ → ‎ج‎ ) ARABIC MATHEMATICAL TAILED JEEM → ARABIC LETTER JEEM # +1EE62 ; 062C ; MA # ( ‎𞹢‎ → ‎ج‎ ) ARABIC MATHEMATICAL STRETCHED JEEM → ARABIC LETTER JEEM # +1EE82 ; 062C ; MA # ( ‎𞺂‎ → ‎ج‎ ) ARABIC MATHEMATICAL LOOPED JEEM → ARABIC LETTER JEEM # +1EEA2 ; 062C ; MA # ( ‎𞺢‎ → ‎ج‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM → ARABIC LETTER JEEM # +FE9F ; 062C ; MA # ( ‎ﺟ‎ → ‎ج‎ ) ARABIC LETTER JEEM INITIAL FORM → ARABIC LETTER JEEM # +FEA0 ; 062C ; MA # ( ‎ﺠ‎ → ‎ج‎ ) ARABIC LETTER JEEM MEDIAL FORM → ARABIC LETTER JEEM # +FE9E ; 062C ; MA # ( ‎ﺞ‎ → ‎ج‎ ) ARABIC LETTER JEEM FINAL FORM → ARABIC LETTER JEEM # +FE9D ; 062C ; MA # ( ‎ﺝ‎ → ‎ج‎ ) ARABIC LETTER JEEM ISOLATED FORM → ARABIC LETTER JEEM # + +FCA7 ; 062C 062D ; MA # ( ‎ﲧ‎ → ‎جح‎ ) ARABIC LIGATURE JEEM WITH HAH INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH # +FC15 ; 062C 062D ; MA # ( ‎ﰕ‎ → ‎جح‎ ) ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH # + +FDA6 ; 062C 062D 0649 ; MA # ( ‎ﶦ‎ → ‎جحى‎ ) ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # +FDBE ; 062C 062D 0649 ; MA # ( ‎ﶾ‎ → ‎جحى‎ ) ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎جحي‎→ + +FDFB ; 062C 0644 0020 062C 0644 006C 0644 006F ; MA #* ( ‎ﷻ‎ → ‎جل جلlلo‎ ) ARABIC LIGATURE JALLAJALALOUHOU → ARABIC LETTER JEEM, ARABIC LETTER LAM, SPACE, ARABIC LETTER JEEM, ARABIC LETTER LAM, LATIN SMALL LETTER L, ARABIC LETTER LAM, LATIN SMALL LETTER O # →‎جل جلاله‎→ + +FCA8 ; 062C 0645 ; MA # ( ‎ﲨ‎ → ‎جم‎ ) ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM # +FC16 ; 062C 0645 ; MA # ( ‎ﰖ‎ → ‎جم‎ ) ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM # + +FD59 ; 062C 0645 062D ; MA # ( ‎ﵙ‎ → ‎جمح‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER HAH # +FD58 ; 062C 0645 062D ; MA # ( ‎ﵘ‎ → ‎جمح‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER HAH # + +FDA7 ; 062C 0645 0649 ; MA # ( ‎ﶧ‎ → ‎جمى‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # +FDA5 ; 062C 0645 0649 ; MA # ( ‎ﶥ‎ → ‎جمى‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # →‎جمي‎→ + +FD1D ; 062C 0649 ; MA # ( ‎ﴝ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA # +FD01 ; 062C 0649 ; MA # ( ‎ﴁ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA # +FD1E ; 062C 0649 ; MA # ( ‎ﴞ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA # →‎جي‎→ +FD02 ; 062C 0649 ; MA # ( ‎ﴂ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA # →‎جي‎→ + +FB78 ; 0683 ; MA # ( ‎ﭸ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH INITIAL FORM → ARABIC LETTER NYEH # +FB79 ; 0683 ; MA # ( ‎ﭹ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH MEDIAL FORM → ARABIC LETTER NYEH # +FB77 ; 0683 ; MA # ( ‎ﭷ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH FINAL FORM → ARABIC LETTER NYEH # +FB76 ; 0683 ; MA # ( ‎ﭶ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH ISOLATED FORM → ARABIC LETTER NYEH # + +FB74 ; 0684 ; MA # ( ‎ﭴ‎ → ‎ڄ‎ ) ARABIC LETTER DYEH INITIAL FORM → ARABIC LETTER DYEH # +FB75 ; 0684 ; MA # ( ‎ﭵ‎ → ‎ڄ‎ ) ARABIC LETTER DYEH MEDIAL FORM → ARABIC LETTER DYEH # +FB73 ; 0684 ; MA # ( ‎ﭳ‎ → ‎ڄ‎ ) ARABIC LETTER DYEH FINAL FORM → ARABIC LETTER DYEH # +FB72 ; 0684 ; MA # ( ‎ﭲ‎ → ‎ڄ‎ ) ARABIC LETTER DYEH ISOLATED FORM → ARABIC LETTER DYEH # + +FB7C ; 0686 ; MA # ( ‎ﭼ‎ → ‎چ‎ ) ARABIC LETTER TCHEH INITIAL FORM → ARABIC LETTER TCHEH # +FB7D ; 0686 ; MA # ( ‎ﭽ‎ → ‎چ‎ ) ARABIC LETTER TCHEH MEDIAL FORM → ARABIC LETTER TCHEH # +FB7B ; 0686 ; MA # ( ‎ﭻ‎ → ‎چ‎ ) ARABIC LETTER TCHEH FINAL FORM → ARABIC LETTER TCHEH # +FB7A ; 0686 ; MA # ( ‎ﭺ‎ → ‎چ‎ ) ARABIC LETTER TCHEH ISOLATED FORM → ARABIC LETTER TCHEH # + +FB80 ; 0687 ; MA # ( ‎ﮀ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH INITIAL FORM → ARABIC LETTER TCHEHEH # +FB81 ; 0687 ; MA # ( ‎ﮁ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH MEDIAL FORM → ARABIC LETTER TCHEHEH # +FB7F ; 0687 ; MA # ( ‎ﭿ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH FINAL FORM → ARABIC LETTER TCHEHEH # +FB7E ; 0687 ; MA # ( ‎ﭾ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH ISOLATED FORM → ARABIC LETTER TCHEHEH # + +1EE07 ; 062D ; MA # ( ‎𞸇‎ → ‎ح‎ ) ARABIC MATHEMATICAL HAH → ARABIC LETTER HAH # +1EE27 ; 062D ; MA # ( ‎𞸧‎ → ‎ح‎ ) ARABIC MATHEMATICAL INITIAL HAH → ARABIC LETTER HAH # +1EE47 ; 062D ; MA # ( ‎𞹇‎ → ‎ح‎ ) ARABIC MATHEMATICAL TAILED HAH → ARABIC LETTER HAH # +1EE67 ; 062D ; MA # ( ‎𞹧‎ → ‎ح‎ ) ARABIC MATHEMATICAL STRETCHED HAH → ARABIC LETTER HAH # +1EE87 ; 062D ; MA # ( ‎𞺇‎ → ‎ح‎ ) ARABIC MATHEMATICAL LOOPED HAH → ARABIC LETTER HAH # +1EEA7 ; 062D ; MA # ( ‎𞺧‎ → ‎ح‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK HAH → ARABIC LETTER HAH # +FEA3 ; 062D ; MA # ( ‎ﺣ‎ → ‎ح‎ ) ARABIC LETTER HAH INITIAL FORM → ARABIC LETTER HAH # +FEA4 ; 062D ; MA # ( ‎ﺤ‎ → ‎ح‎ ) ARABIC LETTER HAH MEDIAL FORM → ARABIC LETTER HAH # +FEA2 ; 062D ; MA # ( ‎ﺢ‎ → ‎ح‎ ) ARABIC LETTER HAH FINAL FORM → ARABIC LETTER HAH # +FEA1 ; 062D ; MA # ( ‎ﺡ‎ → ‎ح‎ ) ARABIC LETTER HAH ISOLATED FORM → ARABIC LETTER HAH # + +0685 ; 062D 06DB ; MA # ( ‎څ‎ → ‎حۛ‎ ) ARABIC LETTER HAH WITH THREE DOTS ABOVE → ARABIC LETTER HAH, ARABIC SMALL HIGH THREE DOTS # + +0681 ; 062D 0654 ; MA # ( ‎ځ‎ → ‎حٔ‎ ) ARABIC LETTER HAH WITH HAMZA ABOVE → ARABIC LETTER HAH, ARABIC HAMZA ABOVE # +0772 ; 062D 0654 ; MA # ( ‎ݲ‎ → ‎حٔ‎ ) ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE → ARABIC LETTER HAH, ARABIC HAMZA ABOVE # + +FCA9 ; 062D 062C ; MA # ( ‎ﲩ‎ → ‎حج‎ ) ARABIC LIGATURE HAH WITH JEEM INITIAL FORM → ARABIC LETTER HAH, ARABIC LETTER JEEM # +FC17 ; 062D 062C ; MA # ( ‎ﰗ‎ → ‎حج‎ ) ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER JEEM # + +FDBF ; 062D 062C 0649 ; MA # ( ‎ﶿ‎ → ‎حجى‎ ) ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA # →‎حجي‎→ + +FCAA ; 062D 0645 ; MA # ( ‎ﲪ‎ → ‎حم‎ ) ARABIC LIGATURE HAH WITH MEEM INITIAL FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM # +FC18 ; 062D 0645 ; MA # ( ‎ﰘ‎ → ‎حم‎ ) ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM # + +FD5B ; 062D 0645 0649 ; MA # ( ‎ﵛ‎ → ‎حمى‎ ) ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # +FD5A ; 062D 0645 0649 ; MA # ( ‎ﵚ‎ → ‎حمى‎ ) ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # →‎حمي‎→ + +FD1B ; 062D 0649 ; MA # ( ‎ﴛ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # +FCFF ; 062D 0649 ; MA # ( ‎ﳿ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # +FD1C ; 062D 0649 ; MA # ( ‎ﴜ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH YEH FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎حي‎→ +FD00 ; 062D 0649 ; MA # ( ‎ﴀ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH YEH ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎حي‎→ + +1EE17 ; 062E ; MA # ( ‎𞸗‎ → ‎خ‎ ) ARABIC MATHEMATICAL KHAH → ARABIC LETTER KHAH # +1EE37 ; 062E ; MA # ( ‎𞸷‎ → ‎خ‎ ) ARABIC MATHEMATICAL INITIAL KHAH → ARABIC LETTER KHAH # +1EE57 ; 062E ; MA # ( ‎𞹗‎ → ‎خ‎ ) ARABIC MATHEMATICAL TAILED KHAH → ARABIC LETTER KHAH # +1EE77 ; 062E ; MA # ( ‎𞹷‎ → ‎خ‎ ) ARABIC MATHEMATICAL STRETCHED KHAH → ARABIC LETTER KHAH # +1EE97 ; 062E ; MA # ( ‎𞺗‎ → ‎خ‎ ) ARABIC MATHEMATICAL LOOPED KHAH → ARABIC LETTER KHAH # +1EEB7 ; 062E ; MA # ( ‎𞺷‎ → ‎خ‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH → ARABIC LETTER KHAH # +FEA7 ; 062E ; MA # ( ‎ﺧ‎ → ‎خ‎ ) ARABIC LETTER KHAH INITIAL FORM → ARABIC LETTER KHAH # +FEA8 ; 062E ; MA # ( ‎ﺨ‎ → ‎خ‎ ) ARABIC LETTER KHAH MEDIAL FORM → ARABIC LETTER KHAH # +FEA6 ; 062E ; MA # ( ‎ﺦ‎ → ‎خ‎ ) ARABIC LETTER KHAH FINAL FORM → ARABIC LETTER KHAH # +FEA5 ; 062E ; MA # ( ‎ﺥ‎ → ‎خ‎ ) ARABIC LETTER KHAH ISOLATED FORM → ARABIC LETTER KHAH # + +FCAB ; 062E 062C ; MA # ( ‎ﲫ‎ → ‎خج‎ ) ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM → ARABIC LETTER KHAH, ARABIC LETTER JEEM # +FC19 ; 062E 062C ; MA # ( ‎ﰙ‎ → ‎خج‎ ) ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM → ARABIC LETTER KHAH, ARABIC LETTER JEEM # + +FC1A ; 062E 062D ; MA # ( ‎ﰚ‎ → ‎خح‎ ) ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM → ARABIC LETTER KHAH, ARABIC LETTER HAH # + +FCAC ; 062E 0645 ; MA # ( ‎ﲬ‎ → ‎خم‎ ) ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM → ARABIC LETTER KHAH, ARABIC LETTER MEEM # +FC1B ; 062E 0645 ; MA # ( ‎ﰛ‎ → ‎خم‎ ) ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM → ARABIC LETTER KHAH, ARABIC LETTER MEEM # + +FD1F ; 062E 0649 ; MA # ( ‎ﴟ‎ → ‎خى‎ ) ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA # +FD03 ; 062E 0649 ; MA # ( ‎ﴃ‎ → ‎خى‎ ) ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA # +FD20 ; 062E 0649 ; MA # ( ‎ﴠ‎ → ‎خى‎ ) ARABIC LIGATURE KHAH WITH YEH FINAL FORM → ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA # →‎خي‎→ +FD04 ; 062E 0649 ; MA # ( ‎ﴄ‎ → ‎خى‎ ) ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM → ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA # →‎خي‎→ + +102E1 ; 062F ; MA #* ( 𐋡 → ‎د‎ ) COPTIC EPACT DIGIT ONE → ARABIC LETTER DAL # +1EE03 ; 062F ; MA # ( ‎𞸃‎ → ‎د‎ ) ARABIC MATHEMATICAL DAL → ARABIC LETTER DAL # +1EE83 ; 062F ; MA # ( ‎𞺃‎ → ‎د‎ ) ARABIC MATHEMATICAL LOOPED DAL → ARABIC LETTER DAL # +1EEA3 ; 062F ; MA # ( ‎𞺣‎ → ‎د‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK DAL → ARABIC LETTER DAL # +FEAA ; 062F ; MA # ( ‎ﺪ‎ → ‎د‎ ) ARABIC LETTER DAL FINAL FORM → ARABIC LETTER DAL # +FEA9 ; 062F ; MA # ( ‎ﺩ‎ → ‎د‎ ) ARABIC LETTER DAL ISOLATED FORM → ARABIC LETTER DAL # + +0688 ; 062F 0615 ; MA # ( ‎ڈ‎ → ‎دؕ‎ ) ARABIC LETTER DDAL → ARABIC LETTER DAL, ARABIC SMALL HIGH TAH # +FB89 ; 062F 0615 ; MA # ( ‎ﮉ‎ → ‎دؕ‎ ) ARABIC LETTER DDAL FINAL FORM → ARABIC LETTER DAL, ARABIC SMALL HIGH TAH # →‎ڈ‎→ +FB88 ; 062F 0615 ; MA # ( ‎ﮈ‎ → ‎دؕ‎ ) ARABIC LETTER DDAL ISOLATED FORM → ARABIC LETTER DAL, ARABIC SMALL HIGH TAH # →‎ڈ‎→ + +068E ; 062F 06DB ; MA # ( ‎ڎ‎ → ‎دۛ‎ ) ARABIC LETTER DUL → ARABIC LETTER DAL, ARABIC SMALL HIGH THREE DOTS # +FB87 ; 062F 06DB ; MA # ( ‎ﮇ‎ → ‎دۛ‎ ) ARABIC LETTER DUL FINAL FORM → ARABIC LETTER DAL, ARABIC SMALL HIGH THREE DOTS # →‎ڎ‎→ +FB86 ; 062F 06DB ; MA # ( ‎ﮆ‎ → ‎دۛ‎ ) ARABIC LETTER DUL ISOLATED FORM → ARABIC LETTER DAL, ARABIC SMALL HIGH THREE DOTS # →‎ڎ‎→ + +06EE ; 062F 0302 ; MA # ( ‎ۮ‎ → ‎د̂‎ ) ARABIC LETTER DAL WITH INVERTED V → ARABIC LETTER DAL, COMBINING CIRCUMFLEX ACCENT # →‎دٛ‎→ + +08AE ; 062F 0324 0323 ; MA # ( ‎ࢮ‎ → ‎د̤̣‎ ) ARABIC LETTER DAL WITH THREE DOTS BELOW → ARABIC LETTER DAL, COMBINING DIAERESIS BELOW, COMBINING DOT BELOW # →‎د࣮࣭‎→ + +1EE18 ; 0630 ; MA # ( ‎𞸘‎ → ‎ذ‎ ) ARABIC MATHEMATICAL THAL → ARABIC LETTER THAL # +1EE98 ; 0630 ; MA # ( ‎𞺘‎ → ‎ذ‎ ) ARABIC MATHEMATICAL LOOPED THAL → ARABIC LETTER THAL # +1EEB8 ; 0630 ; MA # ( ‎𞺸‎ → ‎ذ‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK THAL → ARABIC LETTER THAL # +FEAC ; 0630 ; MA # ( ‎ﺬ‎ → ‎ذ‎ ) ARABIC LETTER THAL FINAL FORM → ARABIC LETTER THAL # +FEAB ; 0630 ; MA # ( ‎ﺫ‎ → ‎ذ‎ ) ARABIC LETTER THAL ISOLATED FORM → ARABIC LETTER THAL # + +FC5B ; 0630 0670 ; MA # ( ‎ﱛ‎ → ‎ذٰ‎ ) ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC LETTER THAL, ARABIC LETTER SUPERSCRIPT ALEF # + +068B ; 068A 0615 ; MA # ( ‎ڋ‎ → ‎ڊؕ‎ ) ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH → ARABIC LETTER DAL WITH DOT BELOW, ARABIC SMALL HIGH TAH # + +FB85 ; 068C ; MA # ( ‎ﮅ‎ → ‎ڌ‎ ) ARABIC LETTER DAHAL FINAL FORM → ARABIC LETTER DAHAL # +FB84 ; 068C ; MA # ( ‎ﮄ‎ → ‎ڌ‎ ) ARABIC LETTER DAHAL ISOLATED FORM → ARABIC LETTER DAHAL # + +FB83 ; 068D ; MA # ( ‎ﮃ‎ → ‎ڍ‎ ) ARABIC LETTER DDAHAL FINAL FORM → ARABIC LETTER DDAHAL # +FB82 ; 068D ; MA # ( ‎ﮂ‎ → ‎ڍ‎ ) ARABIC LETTER DDAHAL ISOLATED FORM → ARABIC LETTER DDAHAL # + +1EE13 ; 0631 ; MA # ( ‎𞸓‎ → ‎ر‎ ) ARABIC MATHEMATICAL REH → ARABIC LETTER REH # +1EE93 ; 0631 ; MA # ( ‎𞺓‎ → ‎ر‎ ) ARABIC MATHEMATICAL LOOPED REH → ARABIC LETTER REH # +1EEB3 ; 0631 ; MA # ( ‎𞺳‎ → ‎ر‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK REH → ARABIC LETTER REH # +FEAE ; 0631 ; MA # ( ‎ﺮ‎ → ‎ر‎ ) ARABIC LETTER REH FINAL FORM → ARABIC LETTER REH # +FEAD ; 0631 ; MA # ( ‎ﺭ‎ → ‎ر‎ ) ARABIC LETTER REH ISOLATED FORM → ARABIC LETTER REH # + +0691 ; 0631 0615 ; MA # ( ‎ڑ‎ → ‎رؕ‎ ) ARABIC LETTER RREH → ARABIC LETTER REH, ARABIC SMALL HIGH TAH # +FB8D ; 0631 0615 ; MA # ( ‎ﮍ‎ → ‎رؕ‎ ) ARABIC LETTER RREH FINAL FORM → ARABIC LETTER REH, ARABIC SMALL HIGH TAH # →‎ڑ‎→ +FB8C ; 0631 0615 ; MA # ( ‎ﮌ‎ → ‎رؕ‎ ) ARABIC LETTER RREH ISOLATED FORM → ARABIC LETTER REH, ARABIC SMALL HIGH TAH # →‎ڑ‎→ + +0698 ; 0631 06DB ; MA # ( ‎ژ‎ → ‎رۛ‎ ) ARABIC LETTER JEH → ARABIC LETTER REH, ARABIC SMALL HIGH THREE DOTS # +FB8B ; 0631 06DB ; MA # ( ‎ﮋ‎ → ‎رۛ‎ ) ARABIC LETTER JEH FINAL FORM → ARABIC LETTER REH, ARABIC SMALL HIGH THREE DOTS # →‎ژ‎→ +FB8A ; 0631 06DB ; MA # ( ‎ﮊ‎ → ‎رۛ‎ ) ARABIC LETTER JEH ISOLATED FORM → ARABIC LETTER REH, ARABIC SMALL HIGH THREE DOTS # →‎ژ‎→ + +0692 ; 0631 0306 ; MA # ( ‎ڒ‎ → ‎ر̆‎ ) ARABIC LETTER REH WITH SMALL V → ARABIC LETTER REH, COMBINING BREVE # →‎رٚ‎→ + +06EF ; 0631 0302 ; MA # ( ‎ۯ‎ → ‎ر̂‎ ) ARABIC LETTER REH WITH INVERTED V → ARABIC LETTER REH, COMBINING CIRCUMFLEX ACCENT # →‎رٛ‎→ + +076C ; 0631 0654 ; MA # ( ‎ݬ‎ → ‎رٔ‎ ) ARABIC LETTER REH WITH HAMZA ABOVE → ARABIC LETTER REH, ARABIC HAMZA ABOVE # + +FC5C ; 0631 0670 ; MA # ( ‎ﱜ‎ → ‎رٰ‎ ) ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC LETTER REH, ARABIC LETTER SUPERSCRIPT ALEF # + +FDF6 ; 0631 0633 0648 0644 ; MA # ( ‎ﷶ‎ → ‎رسول‎ ) ARABIC LIGATURE RASOUL ISOLATED FORM → ARABIC LETTER REH, ARABIC LETTER SEEN, ARABIC LETTER WAW, ARABIC LETTER LAM # + +FDFC ; 0631 0649 006C 0644 ; MA #* ( ‎﷼‎ → ‎رىlل‎ ) RIAL SIGN → ARABIC LETTER REH, ARABIC LETTER ALEF MAKSURA, LATIN SMALL LETTER L, ARABIC LETTER LAM # →‎ریال‎→ + +1EE06 ; 0632 ; MA # ( ‎𞸆‎ → ‎ز‎ ) ARABIC MATHEMATICAL ZAIN → ARABIC LETTER ZAIN # +1EE86 ; 0632 ; MA # ( ‎𞺆‎ → ‎ز‎ ) ARABIC MATHEMATICAL LOOPED ZAIN → ARABIC LETTER ZAIN # +1EEA6 ; 0632 ; MA # ( ‎𞺦‎ → ‎ز‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN → ARABIC LETTER ZAIN # +FEB0 ; 0632 ; MA # ( ‎ﺰ‎ → ‎ز‎ ) ARABIC LETTER ZAIN FINAL FORM → ARABIC LETTER ZAIN # +FEAF ; 0632 ; MA # ( ‎ﺯ‎ → ‎ز‎ ) ARABIC LETTER ZAIN ISOLATED FORM → ARABIC LETTER ZAIN # + +08B2 ; 0632 0302 ; MA # ( ‎ࢲ‎ → ‎ز̂‎ ) ARABIC LETTER ZAIN WITH INVERTED V ABOVE → ARABIC LETTER ZAIN, COMBINING CIRCUMFLEX ACCENT # →‎زٛ‎→ + +0771 ; 0697 0615 ; MA # ( ‎ݱ‎ → ‎ڗؕ‎ ) ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS → ARABIC LETTER REH WITH TWO DOTS ABOVE, ARABIC SMALL HIGH TAH # + +1EE0E ; 0633 ; MA # ( ‎𞸎‎ → ‎س‎ ) ARABIC MATHEMATICAL SEEN → ARABIC LETTER SEEN # +1EE2E ; 0633 ; MA # ( ‎𞸮‎ → ‎س‎ ) ARABIC MATHEMATICAL INITIAL SEEN → ARABIC LETTER SEEN # +1EE4E ; 0633 ; MA # ( ‎𞹎‎ → ‎س‎ ) ARABIC MATHEMATICAL TAILED SEEN → ARABIC LETTER SEEN # +1EE6E ; 0633 ; MA # ( ‎𞹮‎ → ‎س‎ ) ARABIC MATHEMATICAL STRETCHED SEEN → ARABIC LETTER SEEN # +1EE8E ; 0633 ; MA # ( ‎𞺎‎ → ‎س‎ ) ARABIC MATHEMATICAL LOOPED SEEN → ARABIC LETTER SEEN # +1EEAE ; 0633 ; MA # ( ‎𞺮‎ → ‎س‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN → ARABIC LETTER SEEN # +FEB3 ; 0633 ; MA # ( ‎ﺳ‎ → ‎س‎ ) ARABIC LETTER SEEN INITIAL FORM → ARABIC LETTER SEEN # +FEB4 ; 0633 ; MA # ( ‎ﺴ‎ → ‎س‎ ) ARABIC LETTER SEEN MEDIAL FORM → ARABIC LETTER SEEN # +FEB2 ; 0633 ; MA # ( ‎ﺲ‎ → ‎س‎ ) ARABIC LETTER SEEN FINAL FORM → ARABIC LETTER SEEN # +FEB1 ; 0633 ; MA # ( ‎ﺱ‎ → ‎س‎ ) ARABIC LETTER SEEN ISOLATED FORM → ARABIC LETTER SEEN # + +0634 ; 0633 06DB ; MA # ( ‎ش‎ → ‎سۛ‎ ) ARABIC LETTER SHEEN → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS # +1EE14 ; 0633 06DB ; MA # ( ‎𞸔‎ → ‎سۛ‎ ) ARABIC MATHEMATICAL SHEEN → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS # →‎ش‎→ +1EE34 ; 0633 06DB ; MA # ( ‎𞸴‎ → ‎سۛ‎ ) ARABIC MATHEMATICAL INITIAL SHEEN → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS # →‎ش‎→ +1EE54 ; 0633 06DB ; MA # ( ‎𞹔‎ → ‎سۛ‎ ) ARABIC MATHEMATICAL TAILED SHEEN → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS # →‎ش‎→ +1EE74 ; 0633 06DB ; MA # ( ‎𞹴‎ → ‎سۛ‎ ) ARABIC MATHEMATICAL STRETCHED SHEEN → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS # →‎ش‎→ +1EE94 ; 0633 06DB ; MA # ( ‎𞺔‎ → ‎سۛ‎ ) ARABIC MATHEMATICAL LOOPED SHEEN → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS # →‎ش‎→ +1EEB4 ; 0633 06DB ; MA # ( ‎𞺴‎ → ‎سۛ‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS # →‎ش‎→ +FEB7 ; 0633 06DB ; MA # ( ‎ﺷ‎ → ‎سۛ‎ ) ARABIC LETTER SHEEN INITIAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS # →‎ش‎→ +FEB8 ; 0633 06DB ; MA # ( ‎ﺸ‎ → ‎سۛ‎ ) ARABIC LETTER SHEEN MEDIAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS # →‎ش‎→ +FEB6 ; 0633 06DB ; MA # ( ‎ﺶ‎ → ‎سۛ‎ ) ARABIC LETTER SHEEN FINAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS # →‎ش‎→ +FEB5 ; 0633 06DB ; MA # ( ‎ﺵ‎ → ‎سۛ‎ ) ARABIC LETTER SHEEN ISOLATED FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS # →‎ش‎→ + +077E ; 0633 0302 ; MA # ( ‎ݾ‎ → ‎س̂‎ ) ARABIC LETTER SEEN WITH INVERTED V → ARABIC LETTER SEEN, COMBINING CIRCUMFLEX ACCENT # →‎سٛ‎→ + +FD31 ; 0633 006F ; MA # ( ‎ﴱ‎ → ‎سo‎ ) ARABIC LIGATURE SEEN WITH HEH INITIAL FORM → ARABIC LETTER SEEN, LATIN SMALL LETTER O # →‎سه‎→ +FCE8 ; 0633 006F ; MA # ( ‎ﳨ‎ → ‎سo‎ ) ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM → ARABIC LETTER SEEN, LATIN SMALL LETTER O # →‎سه‎→ + +FD32 ; 0633 06DB 006F ; MA # ( ‎ﴲ‎ → ‎سۛo‎ ) ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, LATIN SMALL LETTER O # →‎شه‎→ +FCEA ; 0633 06DB 006F ; MA # ( ‎ﳪ‎ → ‎سۛo‎ ) ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, LATIN SMALL LETTER O # →‎شه‎→ + +FCAD ; 0633 062C ; MA # ( ‎ﲭ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM # +FD34 ; 0633 062C ; MA # ( ‎ﴴ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM # +FC1C ; 0633 062C ; MA # ( ‎ﰜ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM # + +FD2D ; 0633 06DB 062C ; MA # ( ‎ﴭ‎ → ‎سۛج‎ ) ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER JEEM # →‎شج‎→ +FD37 ; 0633 06DB 062C ; MA # ( ‎ﴷ‎ → ‎سۛج‎ ) ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER JEEM # →‎شج‎→ +FD25 ; 0633 06DB 062C ; MA # ( ‎ﴥ‎ → ‎سۛج‎ ) ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER JEEM # →‎شج‎→ +FD09 ; 0633 06DB 062C ; MA # ( ‎ﴉ‎ → ‎سۛج‎ ) ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER JEEM # →‎شج‎→ + +FD5D ; 0633 062C 062D ; MA # ( ‎ﵝ‎ → ‎سجح‎ ) ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER HAH # + +FD5E ; 0633 062C 0649 ; MA # ( ‎ﵞ‎ → ‎سجى‎ ) ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA # + +FD69 ; 0633 06DB 062C 0649 ; MA # ( ‎ﵩ‎ → ‎سۛجى‎ ) ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA # →‎شجي‎→ + +FCAE ; 0633 062D ; MA # ( ‎ﲮ‎ → ‎سح‎ ) ARABIC LIGATURE SEEN WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH # +FD35 ; 0633 062D ; MA # ( ‎ﴵ‎ → ‎سح‎ ) ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH # +FC1D ; 0633 062D ; MA # ( ‎ﰝ‎ → ‎سح‎ ) ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH # + +FD2E ; 0633 06DB 062D ; MA # ( ‎ﴮ‎ → ‎سۛح‎ ) ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER HAH # →‎شح‎→ +FD38 ; 0633 06DB 062D ; MA # ( ‎ﴸ‎ → ‎سۛح‎ ) ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER HAH # →‎شح‎→ +FD26 ; 0633 06DB 062D ; MA # ( ‎ﴦ‎ → ‎سۛح‎ ) ARABIC LIGATURE SHEEN WITH HAH FINAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER HAH # →‎شح‎→ +FD0A ; 0633 06DB 062D ; MA # ( ‎ﴊ‎ → ‎سۛح‎ ) ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER HAH # →‎شح‎→ + +FD5C ; 0633 062D 062C ; MA # ( ‎ﵜ‎ → ‎سحج‎ ) ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH, ARABIC LETTER JEEM # + +FD68 ; 0633 06DB 062D 0645 ; MA # ( ‎ﵨ‎ → ‎سۛحم‎ ) ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER HAH, ARABIC LETTER MEEM # →‎شحم‎→ +FD67 ; 0633 06DB 062D 0645 ; MA # ( ‎ﵧ‎ → ‎سۛحم‎ ) ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER HAH, ARABIC LETTER MEEM # →‎شحم‎→ + +FDAA ; 0633 06DB 062D 0649 ; MA # ( ‎ﶪ‎ → ‎سۛحى‎ ) ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎شحي‎→ + +FCAF ; 0633 062E ; MA # ( ‎ﲯ‎ → ‎سخ‎ ) ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER KHAH # +FD36 ; 0633 062E ; MA # ( ‎ﴶ‎ → ‎سخ‎ ) ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER KHAH # +FC1E ; 0633 062E ; MA # ( ‎ﰞ‎ → ‎سخ‎ ) ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER KHAH # + +FD2F ; 0633 06DB 062E ; MA # ( ‎ﴯ‎ → ‎سۛخ‎ ) ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER KHAH # →‎شخ‎→ +FD39 ; 0633 06DB 062E ; MA # ( ‎ﴹ‎ → ‎سۛخ‎ ) ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER KHAH # →‎شخ‎→ +FD27 ; 0633 06DB 062E ; MA # ( ‎ﴧ‎ → ‎سۛخ‎ ) ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER KHAH # →‎شخ‎→ +FD0B ; 0633 06DB 062E ; MA # ( ‎ﴋ‎ → ‎سۛخ‎ ) ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER KHAH # →‎شخ‎→ + +FDA8 ; 0633 062E 0649 ; MA # ( ‎ﶨ‎ → ‎سخى‎ ) ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA # +FDC6 ; 0633 062E 0649 ; MA # ( ‎ﷆ‎ → ‎سخى‎ ) ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA # →‎سخي‎→ + +FD2A ; 0633 0631 ; MA # ( ‎ﴪ‎ → ‎سر‎ ) ARABIC LIGATURE SEEN WITH REH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER REH # +FD0E ; 0633 0631 ; MA # ( ‎ﴎ‎ → ‎سر‎ ) ARABIC LIGATURE SEEN WITH REH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER REH # + +FD29 ; 0633 06DB 0631 ; MA # ( ‎ﴩ‎ → ‎سۛر‎ ) ARABIC LIGATURE SHEEN WITH REH FINAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER REH # →‎شر‎→ +FD0D ; 0633 06DB 0631 ; MA # ( ‎ﴍ‎ → ‎سۛر‎ ) ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER REH # →‎شر‎→ + +FCB0 ; 0633 0645 ; MA # ( ‎ﲰ‎ → ‎سم‎ ) ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM # +FCE7 ; 0633 0645 ; MA # ( ‎ﳧ‎ → ‎سم‎ ) ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM # +FC1F ; 0633 0645 ; MA # ( ‎ﰟ‎ → ‎سم‎ ) ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM # + +FD30 ; 0633 06DB 0645 ; MA # ( ‎ﴰ‎ → ‎سۛم‎ ) ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM # →‎شم‎→ +FCE9 ; 0633 06DB 0645 ; MA # ( ‎ﳩ‎ → ‎سۛم‎ ) ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM # →‎شم‎→ +FD28 ; 0633 06DB 0645 ; MA # ( ‎ﴨ‎ → ‎سۛم‎ ) ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM # →‎شم‎→ +FD0C ; 0633 06DB 0645 ; MA # ( ‎ﴌ‎ → ‎سۛم‎ ) ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM # →‎شم‎→ + +FD61 ; 0633 0645 062C ; MA # ( ‎ﵡ‎ → ‎سمج‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER JEEM # + +FD60 ; 0633 0645 062D ; MA # ( ‎ﵠ‎ → ‎سمح‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER HAH # +FD5F ; 0633 0645 062D ; MA # ( ‎ﵟ‎ → ‎سمح‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER HAH # + +FD6B ; 0633 06DB 0645 062E ; MA # ( ‎ﵫ‎ → ‎سۛمخ‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM, ARABIC LETTER KHAH # →‎شمخ‎→ +FD6A ; 0633 06DB 0645 062E ; MA # ( ‎ﵪ‎ → ‎سۛمخ‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM, ARABIC LETTER KHAH # →‎شمخ‎→ + +FD63 ; 0633 0645 0645 ; MA # ( ‎ﵣ‎ → ‎سمم‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM # +FD62 ; 0633 0645 0645 ; MA # ( ‎ﵢ‎ → ‎سمم‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM # + +FD6D ; 0633 06DB 0645 0645 ; MA # ( ‎ﵭ‎ → ‎سۛمم‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM, ARABIC LETTER MEEM # →‎شمم‎→ +FD6C ; 0633 06DB 0645 0645 ; MA # ( ‎ﵬ‎ → ‎سۛمم‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM, ARABIC LETTER MEEM # →‎شمم‎→ + +FD17 ; 0633 0649 ; MA # ( ‎ﴗ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA # +FCFB ; 0633 0649 ; MA # ( ‎ﳻ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA # +FD18 ; 0633 0649 ; MA # ( ‎ﴘ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH YEH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA # →‎سي‎→ +FCFC ; 0633 0649 ; MA # ( ‎ﳼ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA # →‎سي‎→ + +FD19 ; 0633 06DB 0649 ; MA # ( ‎ﴙ‎ → ‎سۛى‎ ) ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA # →‎شى‎→ +FCFD ; 0633 06DB 0649 ; MA # ( ‎ﳽ‎ → ‎سۛى‎ ) ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA # →‎شى‎→ +FD1A ; 0633 06DB 0649 ; MA # ( ‎ﴚ‎ → ‎سۛى‎ ) ARABIC LIGATURE SHEEN WITH YEH FINAL FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA # →‎شي‎→ +FCFE ; 0633 06DB 0649 ; MA # ( ‎ﳾ‎ → ‎سۛى‎ ) ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA # →‎شي‎→ + +102F2 ; 0635 ; MA #* ( 𐋲 → ‎ص‎ ) COPTIC EPACT NUMBER NINETY → ARABIC LETTER SAD # +1EE11 ; 0635 ; MA # ( ‎𞸑‎ → ‎ص‎ ) ARABIC MATHEMATICAL SAD → ARABIC LETTER SAD # +1EE31 ; 0635 ; MA # ( ‎𞸱‎ → ‎ص‎ ) ARABIC MATHEMATICAL INITIAL SAD → ARABIC LETTER SAD # +1EE51 ; 0635 ; MA # ( ‎𞹑‎ → ‎ص‎ ) ARABIC MATHEMATICAL TAILED SAD → ARABIC LETTER SAD # +1EE71 ; 0635 ; MA # ( ‎𞹱‎ → ‎ص‎ ) ARABIC MATHEMATICAL STRETCHED SAD → ARABIC LETTER SAD # +1EE91 ; 0635 ; MA # ( ‎𞺑‎ → ‎ص‎ ) ARABIC MATHEMATICAL LOOPED SAD → ARABIC LETTER SAD # +1EEB1 ; 0635 ; MA # ( ‎𞺱‎ → ‎ص‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK SAD → ARABIC LETTER SAD # +FEBB ; 0635 ; MA # ( ‎ﺻ‎ → ‎ص‎ ) ARABIC LETTER SAD INITIAL FORM → ARABIC LETTER SAD # +FEBC ; 0635 ; MA # ( ‎ﺼ‎ → ‎ص‎ ) ARABIC LETTER SAD MEDIAL FORM → ARABIC LETTER SAD # +FEBA ; 0635 ; MA # ( ‎ﺺ‎ → ‎ص‎ ) ARABIC LETTER SAD FINAL FORM → ARABIC LETTER SAD # +FEB9 ; 0635 ; MA # ( ‎ﺹ‎ → ‎ص‎ ) ARABIC LETTER SAD ISOLATED FORM → ARABIC LETTER SAD # + +069E ; 0635 06DB ; MA # ( ‎ڞ‎ → ‎صۛ‎ ) ARABIC LETTER SAD WITH THREE DOTS ABOVE → ARABIC LETTER SAD, ARABIC SMALL HIGH THREE DOTS # + +08AF ; 0635 0324 0323 ; MA # ( ‎ࢯ‎ → ‎ص̤̣‎ ) ARABIC LETTER SAD WITH THREE DOTS BELOW → ARABIC LETTER SAD, COMBINING DIAERESIS BELOW, COMBINING DOT BELOW # →‎ص࣮࣭‎→ + +FCB1 ; 0635 062D ; MA # ( ‎ﲱ‎ → ‎صح‎ ) ARABIC LIGATURE SAD WITH HAH INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH # +FC20 ; 0635 062D ; MA # ( ‎ﰠ‎ → ‎صح‎ ) ARABIC LIGATURE SAD WITH HAH ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER HAH # + +FD65 ; 0635 062D 062D ; MA # ( ‎ﵥ‎ → ‎صحح‎ ) ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER HAH # +FD64 ; 0635 062D 062D ; MA # ( ‎ﵤ‎ → ‎صحح‎ ) ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER HAH # + +FDA9 ; 0635 062D 0649 ; MA # ( ‎ﶩ‎ → ‎صحى‎ ) ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎صحي‎→ + +FCB2 ; 0635 062E ; MA # ( ‎ﲲ‎ → ‎صخ‎ ) ARABIC LIGATURE SAD WITH KHAH INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER KHAH # + +FD2B ; 0635 0631 ; MA # ( ‎ﴫ‎ → ‎صر‎ ) ARABIC LIGATURE SAD WITH REH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER REH # +FD0F ; 0635 0631 ; MA # ( ‎ﴏ‎ → ‎صر‎ ) ARABIC LIGATURE SAD WITH REH ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER REH # + +FDF5 ; 0635 0644 0639 0645 ; MA # ( ‎ﷵ‎ → ‎صلعم‎ ) ARABIC LIGATURE SALAM ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER AIN, ARABIC LETTER MEEM # + +FDF9 ; 0635 0644 0649 ; MA # ( ‎ﷹ‎ → ‎صلى‎ ) ARABIC LIGATURE SALLA ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA # +FDF0 ; 0635 0644 0649 ; MA # ( ‎ﷰ‎ → ‎صلى‎ ) ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA # →‎صلے‎→ + +FDFA ; 0635 0644 0649 0020 006C 0644 0644 006F 0020 0639 0644 0649 006F 0020 0648 0633 0644 0645 ; MA #* ( ‎ﷺ‎ → ‎صلى lللo علىo وسلم‎ ) ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, SPACE, LATIN SMALL LETTER L, ARABIC LETTER LAM, ARABIC LETTER LAM, LATIN SMALL LETTER O, SPACE, ARABIC LETTER AIN, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, LATIN SMALL LETTER O, SPACE, ARABIC LETTER WAW, ARABIC LETTER SEEN, ARABIC LETTER LAM, ARABIC LETTER MEEM # →‎صلى الله عليه وسلم‎→ + +FCB3 ; 0635 0645 ; MA # ( ‎ﲳ‎ → ‎صم‎ ) ARABIC LIGATURE SAD WITH MEEM INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM # +FC21 ; 0635 0645 ; MA # ( ‎ﰡ‎ → ‎صم‎ ) ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM # + +FDC5 ; 0635 0645 0645 ; MA # ( ‎ﷅ‎ → ‎صمم‎ ) ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM, ARABIC LETTER MEEM # +FD66 ; 0635 0645 0645 ; MA # ( ‎ﵦ‎ → ‎صمم‎ ) ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM, ARABIC LETTER MEEM # + +FD21 ; 0635 0649 ; MA # ( ‎ﴡ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA # +FD05 ; 0635 0649 ; MA # ( ‎ﴅ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA # +FD22 ; 0635 0649 ; MA # ( ‎ﴢ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH YEH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA # →‎صي‎→ +FD06 ; 0635 0649 ; MA # ( ‎ﴆ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH YEH ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA # →‎صي‎→ + +1EE19 ; 0636 ; MA # ( ‎𞸙‎ → ‎ض‎ ) ARABIC MATHEMATICAL DAD → ARABIC LETTER DAD # +1EE39 ; 0636 ; MA # ( ‎𞸹‎ → ‎ض‎ ) ARABIC MATHEMATICAL INITIAL DAD → ARABIC LETTER DAD # +1EE59 ; 0636 ; MA # ( ‎𞹙‎ → ‎ض‎ ) ARABIC MATHEMATICAL TAILED DAD → ARABIC LETTER DAD # +1EE79 ; 0636 ; MA # ( ‎𞹹‎ → ‎ض‎ ) ARABIC MATHEMATICAL STRETCHED DAD → ARABIC LETTER DAD # +1EE99 ; 0636 ; MA # ( ‎𞺙‎ → ‎ض‎ ) ARABIC MATHEMATICAL LOOPED DAD → ARABIC LETTER DAD # +1EEB9 ; 0636 ; MA # ( ‎𞺹‎ → ‎ض‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK DAD → ARABIC LETTER DAD # +FEBF ; 0636 ; MA # ( ‎ﺿ‎ → ‎ض‎ ) ARABIC LETTER DAD INITIAL FORM → ARABIC LETTER DAD # +FEC0 ; 0636 ; MA # ( ‎ﻀ‎ → ‎ض‎ ) ARABIC LETTER DAD MEDIAL FORM → ARABIC LETTER DAD # +FEBE ; 0636 ; MA # ( ‎ﺾ‎ → ‎ض‎ ) ARABIC LETTER DAD FINAL FORM → ARABIC LETTER DAD # +FEBD ; 0636 ; MA # ( ‎ﺽ‎ → ‎ض‎ ) ARABIC LETTER DAD ISOLATED FORM → ARABIC LETTER DAD # + +FCB4 ; 0636 062C ; MA # ( ‎ﲴ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH JEEM INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM # +FC22 ; 0636 062C ; MA # ( ‎ﰢ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM # + +FCB5 ; 0636 062D ; MA # ( ‎ﲵ‎ → ‎ضح‎ ) ARABIC LIGATURE DAD WITH HAH INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER HAH # +FC23 ; 0636 062D ; MA # ( ‎ﰣ‎ → ‎ضح‎ ) ARABIC LIGATURE DAD WITH HAH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER HAH # + +FD6E ; 0636 062D 0649 ; MA # ( ‎ﵮ‎ → ‎ضحى‎ ) ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # +FDAB ; 0636 062D 0649 ; MA # ( ‎ﶫ‎ → ‎ضحى‎ ) ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎ضحي‎→ + +FCB6 ; 0636 062E ; MA # ( ‎ﲶ‎ → ‎ضخ‎ ) ARABIC LIGATURE DAD WITH KHAH INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER KHAH # +FC24 ; 0636 062E ; MA # ( ‎ﰤ‎ → ‎ضخ‎ ) ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER KHAH # + +FD70 ; 0636 062E 0645 ; MA # ( ‎ﵰ‎ → ‎ضخم‎ ) ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER KHAH, ARABIC LETTER MEEM # +FD6F ; 0636 062E 0645 ; MA # ( ‎ﵯ‎ → ‎ضخم‎ ) ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER KHAH, ARABIC LETTER MEEM # + +FD2C ; 0636 0631 ; MA # ( ‎ﴬ‎ → ‎ضر‎ ) ARABIC LIGATURE DAD WITH REH FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER REH # +FD10 ; 0636 0631 ; MA # ( ‎ﴐ‎ → ‎ضر‎ ) ARABIC LIGATURE DAD WITH REH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER REH # + +FCB7 ; 0636 0645 ; MA # ( ‎ﲷ‎ → ‎ضم‎ ) ARABIC LIGATURE DAD WITH MEEM INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER MEEM # +FC25 ; 0636 0645 ; MA # ( ‎ﰥ‎ → ‎ضم‎ ) ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER MEEM # + +FD23 ; 0636 0649 ; MA # ( ‎ﴣ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA # +FD07 ; 0636 0649 ; MA # ( ‎ﴇ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA # +FD24 ; 0636 0649 ; MA # ( ‎ﴤ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH YEH FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA # →‎ضي‎→ +FD08 ; 0636 0649 ; MA # ( ‎ﴈ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH YEH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA # →‎ضي‎→ + +102E8 ; 0637 ; MA #* ( 𐋨 → ‎ط‎ ) COPTIC EPACT DIGIT EIGHT → ARABIC LETTER TAH # +1EE08 ; 0637 ; MA # ( ‎𞸈‎ → ‎ط‎ ) ARABIC MATHEMATICAL TAH → ARABIC LETTER TAH # +1EE68 ; 0637 ; MA # ( ‎𞹨‎ → ‎ط‎ ) ARABIC MATHEMATICAL STRETCHED TAH → ARABIC LETTER TAH # +1EE88 ; 0637 ; MA # ( ‎𞺈‎ → ‎ط‎ ) ARABIC MATHEMATICAL LOOPED TAH → ARABIC LETTER TAH # +1EEA8 ; 0637 ; MA # ( ‎𞺨‎ → ‎ط‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK TAH → ARABIC LETTER TAH # +FEC3 ; 0637 ; MA # ( ‎ﻃ‎ → ‎ط‎ ) ARABIC LETTER TAH INITIAL FORM → ARABIC LETTER TAH # +FEC4 ; 0637 ; MA # ( ‎ﻄ‎ → ‎ط‎ ) ARABIC LETTER TAH MEDIAL FORM → ARABIC LETTER TAH # +FEC2 ; 0637 ; MA # ( ‎ﻂ‎ → ‎ط‎ ) ARABIC LETTER TAH FINAL FORM → ARABIC LETTER TAH # +FEC1 ; 0637 ; MA # ( ‎ﻁ‎ → ‎ط‎ ) ARABIC LETTER TAH ISOLATED FORM → ARABIC LETTER TAH # + +069F ; 0637 06DB ; MA # ( ‎ڟ‎ → ‎طۛ‎ ) ARABIC LETTER TAH WITH THREE DOTS ABOVE → ARABIC LETTER TAH, ARABIC SMALL HIGH THREE DOTS # + +FCB8 ; 0637 062D ; MA # ( ‎ﲸ‎ → ‎طح‎ ) ARABIC LIGATURE TAH WITH HAH INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER HAH # +FC26 ; 0637 062D ; MA # ( ‎ﰦ‎ → ‎طح‎ ) ARABIC LIGATURE TAH WITH HAH ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER HAH # + +FD33 ; 0637 0645 ; MA # ( ‎ﴳ‎ → ‎طم‎ ) ARABIC LIGATURE TAH WITH MEEM INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM # +FD3A ; 0637 0645 ; MA # ( ‎ﴺ‎ → ‎طم‎ ) ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM # +FC27 ; 0637 0645 ; MA # ( ‎ﰧ‎ → ‎طم‎ ) ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM # + +FD72 ; 0637 0645 062D ; MA # ( ‎ﵲ‎ → ‎طمح‎ ) ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER HAH # +FD71 ; 0637 0645 062D ; MA # ( ‎ﵱ‎ → ‎طمح‎ ) ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER HAH # + +FD73 ; 0637 0645 0645 ; MA # ( ‎ﵳ‎ → ‎طمم‎ ) ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER MEEM # + +FD74 ; 0637 0645 0649 ; MA # ( ‎ﵴ‎ → ‎طمى‎ ) ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # →‎طمي‎→ + +FD11 ; 0637 0649 ; MA # ( ‎ﴑ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA # +FCF5 ; 0637 0649 ; MA # ( ‎ﳵ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA # +FD12 ; 0637 0649 ; MA # ( ‎ﴒ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH YEH FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA # →‎طي‎→ +FCF6 ; 0637 0649 ; MA # ( ‎ﳶ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH YEH ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA # →‎طي‎→ + +1EE1A ; 0638 ; MA # ( ‎𞸚‎ → ‎ظ‎ ) ARABIC MATHEMATICAL ZAH → ARABIC LETTER ZAH # +1EE7A ; 0638 ; MA # ( ‎𞹺‎ → ‎ظ‎ ) ARABIC MATHEMATICAL STRETCHED ZAH → ARABIC LETTER ZAH # +1EE9A ; 0638 ; MA # ( ‎𞺚‎ → ‎ظ‎ ) ARABIC MATHEMATICAL LOOPED ZAH → ARABIC LETTER ZAH # +1EEBA ; 0638 ; MA # ( ‎𞺺‎ → ‎ظ‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH → ARABIC LETTER ZAH # +FEC7 ; 0638 ; MA # ( ‎ﻇ‎ → ‎ظ‎ ) ARABIC LETTER ZAH INITIAL FORM → ARABIC LETTER ZAH # +FEC8 ; 0638 ; MA # ( ‎ﻈ‎ → ‎ظ‎ ) ARABIC LETTER ZAH MEDIAL FORM → ARABIC LETTER ZAH # +FEC6 ; 0638 ; MA # ( ‎ﻆ‎ → ‎ظ‎ ) ARABIC LETTER ZAH FINAL FORM → ARABIC LETTER ZAH # +FEC5 ; 0638 ; MA # ( ‎ﻅ‎ → ‎ظ‎ ) ARABIC LETTER ZAH ISOLATED FORM → ARABIC LETTER ZAH # + +FCB9 ; 0638 0645 ; MA # ( ‎ﲹ‎ → ‎ظم‎ ) ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM → ARABIC LETTER ZAH, ARABIC LETTER MEEM # +FD3B ; 0638 0645 ; MA # ( ‎ﴻ‎ → ‎ظم‎ ) ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM → ARABIC LETTER ZAH, ARABIC LETTER MEEM # +FC28 ; 0638 0645 ; MA # ( ‎ﰨ‎ → ‎ظم‎ ) ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM → ARABIC LETTER ZAH, ARABIC LETTER MEEM # + +060F ; 0639 ; MA #* ( ؏ → ‎ع‎ ) ARABIC SIGN MISRA → ARABIC LETTER AIN # +1EE0F ; 0639 ; MA # ( ‎𞸏‎ → ‎ع‎ ) ARABIC MATHEMATICAL AIN → ARABIC LETTER AIN # +1EE2F ; 0639 ; MA # ( ‎𞸯‎ → ‎ع‎ ) ARABIC MATHEMATICAL INITIAL AIN → ARABIC LETTER AIN # +1EE4F ; 0639 ; MA # ( ‎𞹏‎ → ‎ع‎ ) ARABIC MATHEMATICAL TAILED AIN → ARABIC LETTER AIN # +1EE6F ; 0639 ; MA # ( ‎𞹯‎ → ‎ع‎ ) ARABIC MATHEMATICAL STRETCHED AIN → ARABIC LETTER AIN # +1EE8F ; 0639 ; MA # ( ‎𞺏‎ → ‎ع‎ ) ARABIC MATHEMATICAL LOOPED AIN → ARABIC LETTER AIN # +1EEAF ; 0639 ; MA # ( ‎𞺯‎ → ‎ع‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK AIN → ARABIC LETTER AIN # +FECB ; 0639 ; MA # ( ‎ﻋ‎ → ‎ع‎ ) ARABIC LETTER AIN INITIAL FORM → ARABIC LETTER AIN # +FECC ; 0639 ; MA # ( ‎ﻌ‎ → ‎ع‎ ) ARABIC LETTER AIN MEDIAL FORM → ARABIC LETTER AIN # +FECA ; 0639 ; MA # ( ‎ﻊ‎ → ‎ع‎ ) ARABIC LETTER AIN FINAL FORM → ARABIC LETTER AIN # +FEC9 ; 0639 ; MA # ( ‎ﻉ‎ → ‎ع‎ ) ARABIC LETTER AIN ISOLATED FORM → ARABIC LETTER AIN # + +FCBA ; 0639 062C ; MA # ( ‎ﲺ‎ → ‎عج‎ ) ARABIC LIGATURE AIN WITH JEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM # +FC29 ; 0639 062C ; MA # ( ‎ﰩ‎ → ‎عج‎ ) ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM # + +FDC4 ; 0639 062C 0645 ; MA # ( ‎ﷄ‎ → ‎عجم‎ ) ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM, ARABIC LETTER MEEM # +FD75 ; 0639 062C 0645 ; MA # ( ‎ﵵ‎ → ‎عجم‎ ) ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM, ARABIC LETTER MEEM # + +FDF7 ; 0639 0644 0649 006F ; MA # ( ‎ﷷ‎ → ‎علىo‎ ) ARABIC LIGATURE ALAYHE ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, LATIN SMALL LETTER O # →‎عليه‎→ + +FCBB ; 0639 0645 ; MA # ( ‎ﲻ‎ → ‎عم‎ ) ARABIC LIGATURE AIN WITH MEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM # +FC2A ; 0639 0645 ; MA # ( ‎ﰪ‎ → ‎عم‎ ) ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM # + +FD77 ; 0639 0645 0645 ; MA # ( ‎ﵷ‎ → ‎عمم‎ ) ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM # +FD76 ; 0639 0645 0645 ; MA # ( ‎ﵶ‎ → ‎عمم‎ ) ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM # + +FD78 ; 0639 0645 0649 ; MA # ( ‎ﵸ‎ → ‎عمى‎ ) ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # +FDB6 ; 0639 0645 0649 ; MA # ( ‎ﶶ‎ → ‎عمى‎ ) ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # →‎عمي‎→ + +FD13 ; 0639 0649 ; MA # ( ‎ﴓ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA # +FCF7 ; 0639 0649 ; MA # ( ‎ﳷ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA # +FD14 ; 0639 0649 ; MA # ( ‎ﴔ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH YEH FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA # →‎عي‎→ +FCF8 ; 0639 0649 ; MA # ( ‎ﳸ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH YEH ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA # →‎عي‎→ + +1EE1B ; 063A ; MA # ( ‎𞸛‎ → ‎غ‎ ) ARABIC MATHEMATICAL GHAIN → ARABIC LETTER GHAIN # +1EE3B ; 063A ; MA # ( ‎𞸻‎ → ‎غ‎ ) ARABIC MATHEMATICAL INITIAL GHAIN → ARABIC LETTER GHAIN # +1EE5B ; 063A ; MA # ( ‎𞹛‎ → ‎غ‎ ) ARABIC MATHEMATICAL TAILED GHAIN → ARABIC LETTER GHAIN # +1EE7B ; 063A ; MA # ( ‎𞹻‎ → ‎غ‎ ) ARABIC MATHEMATICAL STRETCHED GHAIN → ARABIC LETTER GHAIN # +1EE9B ; 063A ; MA # ( ‎𞺛‎ → ‎غ‎ ) ARABIC MATHEMATICAL LOOPED GHAIN → ARABIC LETTER GHAIN # +1EEBB ; 063A ; MA # ( ‎𞺻‎ → ‎غ‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN → ARABIC LETTER GHAIN # +FECF ; 063A ; MA # ( ‎ﻏ‎ → ‎غ‎ ) ARABIC LETTER GHAIN INITIAL FORM → ARABIC LETTER GHAIN # +FED0 ; 063A ; MA # ( ‎ﻐ‎ → ‎غ‎ ) ARABIC LETTER GHAIN MEDIAL FORM → ARABIC LETTER GHAIN # +FECE ; 063A ; MA # ( ‎ﻎ‎ → ‎غ‎ ) ARABIC LETTER GHAIN FINAL FORM → ARABIC LETTER GHAIN # +FECD ; 063A ; MA # ( ‎ﻍ‎ → ‎غ‎ ) ARABIC LETTER GHAIN ISOLATED FORM → ARABIC LETTER GHAIN # + +FCBC ; 063A 062C ; MA # ( ‎ﲼ‎ → ‎غج‎ ) ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER JEEM # +FC2B ; 063A 062C ; MA # ( ‎ﰫ‎ → ‎غج‎ ) ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER JEEM # + +FCBD ; 063A 0645 ; MA # ( ‎ﲽ‎ → ‎غم‎ ) ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM # +FC2C ; 063A 0645 ; MA # ( ‎ﰬ‎ → ‎غم‎ ) ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM # + +FD79 ; 063A 0645 0645 ; MA # ( ‎ﵹ‎ → ‎غمم‎ ) ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM # + +FD7B ; 063A 0645 0649 ; MA # ( ‎ﵻ‎ → ‎غمى‎ ) ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # +FD7A ; 063A 0645 0649 ; MA # ( ‎ﵺ‎ → ‎غمى‎ ) ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # →‎غمي‎→ + +FD15 ; 063A 0649 ; MA # ( ‎ﴕ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA # +FCF9 ; 063A 0649 ; MA # ( ‎ﳹ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA # +FD16 ; 063A 0649 ; MA # ( ‎ﴖ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH YEH FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA # →‎غي‎→ +FCFA ; 063A 0649 ; MA # ( ‎ﳺ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA # →‎غي‎→ + +1EE10 ; 0641 ; MA # ( ‎𞸐‎ → ‎ف‎ ) ARABIC MATHEMATICAL FEH → ARABIC LETTER FEH # +1EE30 ; 0641 ; MA # ( ‎𞸰‎ → ‎ف‎ ) ARABIC MATHEMATICAL INITIAL FEH → ARABIC LETTER FEH # +1EE70 ; 0641 ; MA # ( ‎𞹰‎ → ‎ف‎ ) ARABIC MATHEMATICAL STRETCHED FEH → ARABIC LETTER FEH # +1EE90 ; 0641 ; MA # ( ‎𞺐‎ → ‎ف‎ ) ARABIC MATHEMATICAL LOOPED FEH → ARABIC LETTER FEH # +1EEB0 ; 0641 ; MA # ( ‎𞺰‎ → ‎ف‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK FEH → ARABIC LETTER FEH # +FED3 ; 0641 ; MA # ( ‎ﻓ‎ → ‎ف‎ ) ARABIC LETTER FEH INITIAL FORM → ARABIC LETTER FEH # +FED4 ; 0641 ; MA # ( ‎ﻔ‎ → ‎ف‎ ) ARABIC LETTER FEH MEDIAL FORM → ARABIC LETTER FEH # +FED2 ; 0641 ; MA # ( ‎ﻒ‎ → ‎ف‎ ) ARABIC LETTER FEH FINAL FORM → ARABIC LETTER FEH # +FED1 ; 0641 ; MA # ( ‎ﻑ‎ → ‎ف‎ ) ARABIC LETTER FEH ISOLATED FORM → ARABIC LETTER FEH # +06A7 ; 0641 ; MA # ( ‎ڧ‎ → ‎ف‎ ) ARABIC LETTER QAF WITH DOT ABOVE → ARABIC LETTER FEH # + +FCBE ; 0641 062C ; MA # ( ‎ﲾ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH JEEM INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM # +FC2D ; 0641 062C ; MA # ( ‎ﰭ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM # + +FCBF ; 0641 062D ; MA # ( ‎ﲿ‎ → ‎فح‎ ) ARABIC LIGATURE FEH WITH HAH INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER HAH # +FC2E ; 0641 062D ; MA # ( ‎ﰮ‎ → ‎فح‎ ) ARABIC LIGATURE FEH WITH HAH ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER HAH # + +FCC0 ; 0641 062E ; MA # ( ‎ﳀ‎ → ‎فخ‎ ) ARABIC LIGATURE FEH WITH KHAH INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER KHAH # +FC2F ; 0641 062E ; MA # ( ‎ﰯ‎ → ‎فخ‎ ) ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER KHAH # + +FD7D ; 0641 062E 0645 ; MA # ( ‎ﵽ‎ → ‎فخم‎ ) ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER KHAH, ARABIC LETTER MEEM # +FD7C ; 0641 062E 0645 ; MA # ( ‎ﵼ‎ → ‎فخم‎ ) ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER KHAH, ARABIC LETTER MEEM # + +FCC1 ; 0641 0645 ; MA # ( ‎ﳁ‎ → ‎فم‎ ) ARABIC LIGATURE FEH WITH MEEM INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER MEEM # +FC30 ; 0641 0645 ; MA # ( ‎ﰰ‎ → ‎فم‎ ) ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER MEEM # + +FDC1 ; 0641 0645 0649 ; MA # ( ‎ﷁ‎ → ‎فمى‎ ) ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # →‎فمي‎→ + +FC7C ; 0641 0649 ; MA # ( ‎ﱼ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA # +FC31 ; 0641 0649 ; MA # ( ‎ﰱ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA # +FC7D ; 0641 0649 ; MA # ( ‎ﱽ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH YEH FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA # →‎في‎→ +FC32 ; 0641 0649 ; MA # ( ‎ﰲ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH YEH ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA # →‎في‎→ + +1EE1E ; 06A1 ; MA # ( ‎𞸞‎ → ‎ڡ‎ ) ARABIC MATHEMATICAL DOTLESS FEH → ARABIC LETTER DOTLESS FEH # +1EE7E ; 06A1 ; MA # ( ‎𞹾‎ → ‎ڡ‎ ) ARABIC MATHEMATICAL STRETCHED DOTLESS FEH → ARABIC LETTER DOTLESS FEH # +066F ; 06A1 ; MA # ( ‎ٯ‎ → ‎ڡ‎ ) ARABIC LETTER DOTLESS QAF → ARABIC LETTER DOTLESS FEH # +1EE1F ; 06A1 ; MA # ( ‎𞸟‎ → ‎ڡ‎ ) ARABIC MATHEMATICAL DOTLESS QAF → ARABIC LETTER DOTLESS FEH # →‎ٯ‎→ +1EE5F ; 06A1 ; MA # ( ‎𞹟‎ → ‎ڡ‎ ) ARABIC MATHEMATICAL TAILED DOTLESS QAF → ARABIC LETTER DOTLESS FEH # →‎ٯ‎→ + +06A4 ; 06A1 06DB ; MA # ( ‎ڤ‎ → ‎ڡۛ‎ ) ARABIC LETTER VEH → ARABIC LETTER DOTLESS FEH, ARABIC SMALL HIGH THREE DOTS # +FB6C ; 06A1 06DB ; MA # ( ‎ﭬ‎ → ‎ڡۛ‎ ) ARABIC LETTER VEH INITIAL FORM → ARABIC LETTER DOTLESS FEH, ARABIC SMALL HIGH THREE DOTS # →‎ڤ‎→ +FB6D ; 06A1 06DB ; MA # ( ‎ﭭ‎ → ‎ڡۛ‎ ) ARABIC LETTER VEH MEDIAL FORM → ARABIC LETTER DOTLESS FEH, ARABIC SMALL HIGH THREE DOTS # →‎ڤ‎→ +FB6B ; 06A1 06DB ; MA # ( ‎ﭫ‎ → ‎ڡۛ‎ ) ARABIC LETTER VEH FINAL FORM → ARABIC LETTER DOTLESS FEH, ARABIC SMALL HIGH THREE DOTS # →‎ڤ‎→ +FB6A ; 06A1 06DB ; MA # ( ‎ﭪ‎ → ‎ڡۛ‎ ) ARABIC LETTER VEH ISOLATED FORM → ARABIC LETTER DOTLESS FEH, ARABIC SMALL HIGH THREE DOTS # →‎ڤ‎→ +06A8 ; 06A1 06DB ; MA # ( ‎ڨ‎ → ‎ڡۛ‎ ) ARABIC LETTER QAF WITH THREE DOTS ABOVE → ARABIC LETTER DOTLESS FEH, ARABIC SMALL HIGH THREE DOTS # →‎ڤ‎→ + +08A4 ; 06A2 06DB ; MA # ( ‎ࢤ‎ → ‎ڢۛ‎ ) ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE → ARABIC LETTER FEH WITH DOT MOVED BELOW, ARABIC SMALL HIGH THREE DOTS # + +FB70 ; 06A6 ; MA # ( ‎ﭰ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH INITIAL FORM → ARABIC LETTER PEHEH # +FB71 ; 06A6 ; MA # ( ‎ﭱ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH MEDIAL FORM → ARABIC LETTER PEHEH # +FB6F ; 06A6 ; MA # ( ‎ﭯ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH FINAL FORM → ARABIC LETTER PEHEH # +FB6E ; 06A6 ; MA # ( ‎ﭮ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH ISOLATED FORM → ARABIC LETTER PEHEH # + +1EE12 ; 0642 ; MA # ( ‎𞸒‎ → ‎ق‎ ) ARABIC MATHEMATICAL QAF → ARABIC LETTER QAF # +1EE32 ; 0642 ; MA # ( ‎𞸲‎ → ‎ق‎ ) ARABIC MATHEMATICAL INITIAL QAF → ARABIC LETTER QAF # +1EE52 ; 0642 ; MA # ( ‎𞹒‎ → ‎ق‎ ) ARABIC MATHEMATICAL TAILED QAF → ARABIC LETTER QAF # +1EE72 ; 0642 ; MA # ( ‎𞹲‎ → ‎ق‎ ) ARABIC MATHEMATICAL STRETCHED QAF → ARABIC LETTER QAF # +1EE92 ; 0642 ; MA # ( ‎𞺒‎ → ‎ق‎ ) ARABIC MATHEMATICAL LOOPED QAF → ARABIC LETTER QAF # +1EEB2 ; 0642 ; MA # ( ‎𞺲‎ → ‎ق‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK QAF → ARABIC LETTER QAF # +FED7 ; 0642 ; MA # ( ‎ﻗ‎ → ‎ق‎ ) ARABIC LETTER QAF INITIAL FORM → ARABIC LETTER QAF # +FED8 ; 0642 ; MA # ( ‎ﻘ‎ → ‎ق‎ ) ARABIC LETTER QAF MEDIAL FORM → ARABIC LETTER QAF # +FED6 ; 0642 ; MA # ( ‎ﻖ‎ → ‎ق‎ ) ARABIC LETTER QAF FINAL FORM → ARABIC LETTER QAF # +FED5 ; 0642 ; MA # ( ‎ﻕ‎ → ‎ق‎ ) ARABIC LETTER QAF ISOLATED FORM → ARABIC LETTER QAF # + +FCC2 ; 0642 062D ; MA # ( ‎ﳂ‎ → ‎قح‎ ) ARABIC LIGATURE QAF WITH HAH INITIAL FORM → ARABIC LETTER QAF, ARABIC LETTER HAH # +FC33 ; 0642 062D ; MA # ( ‎ﰳ‎ → ‎قح‎ ) ARABIC LIGATURE QAF WITH HAH ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER HAH # + +FDF1 ; 0642 0644 0649 ; MA # ( ‎ﷱ‎ → ‎قلى‎ ) ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA # →‎قلے‎→ + +FCC3 ; 0642 0645 ; MA # ( ‎ﳃ‎ → ‎قم‎ ) ARABIC LIGATURE QAF WITH MEEM INITIAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM # +FC34 ; 0642 0645 ; MA # ( ‎ﰴ‎ → ‎قم‎ ) ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM # + +FDB4 ; 0642 0645 062D ; MA # ( ‎ﶴ‎ → ‎قمح‎ ) ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER HAH # +FD7E ; 0642 0645 062D ; MA # ( ‎ﵾ‎ → ‎قمح‎ ) ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER HAH # + +FD7F ; 0642 0645 0645 ; MA # ( ‎ﵿ‎ → ‎قمم‎ ) ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM # + +FDB2 ; 0642 0645 0649 ; MA # ( ‎ﶲ‎ → ‎قمى‎ ) ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # →‎قمي‎→ + +FC7E ; 0642 0649 ; MA # ( ‎ﱾ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA # +FC35 ; 0642 0649 ; MA # ( ‎ﰵ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA # +FC7F ; 0642 0649 ; MA # ( ‎ﱿ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH YEH FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA # →‎قي‎→ +FC36 ; 0642 0649 ; MA # ( ‎ﰶ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH YEH ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA # →‎قي‎→ + +1EE0A ; 0643 ; MA # ( ‎𞸊‎ → ‎ك‎ ) ARABIC MATHEMATICAL KAF → ARABIC LETTER KAF # +1EE2A ; 0643 ; MA # ( ‎𞸪‎ → ‎ك‎ ) ARABIC MATHEMATICAL INITIAL KAF → ARABIC LETTER KAF # +1EE6A ; 0643 ; MA # ( ‎𞹪‎ → ‎ك‎ ) ARABIC MATHEMATICAL STRETCHED KAF → ARABIC LETTER KAF # +FEDB ; 0643 ; MA # ( ‎ﻛ‎ → ‎ك‎ ) ARABIC LETTER KAF INITIAL FORM → ARABIC LETTER KAF # +FEDC ; 0643 ; MA # ( ‎ﻜ‎ → ‎ك‎ ) ARABIC LETTER KAF MEDIAL FORM → ARABIC LETTER KAF # +FEDA ; 0643 ; MA # ( ‎ﻚ‎ → ‎ك‎ ) ARABIC LETTER KAF FINAL FORM → ARABIC LETTER KAF # +FED9 ; 0643 ; MA # ( ‎ﻙ‎ → ‎ك‎ ) ARABIC LETTER KAF ISOLATED FORM → ARABIC LETTER KAF # +06A9 ; 0643 ; MA # ( ‎ک‎ → ‎ك‎ ) ARABIC LETTER KEHEH → ARABIC LETTER KAF # +FB90 ; 0643 ; MA # ( ‎ﮐ‎ → ‎ك‎ ) ARABIC LETTER KEHEH INITIAL FORM → ARABIC LETTER KAF # →‎ک‎→ +FB91 ; 0643 ; MA # ( ‎ﮑ‎ → ‎ك‎ ) ARABIC LETTER KEHEH MEDIAL FORM → ARABIC LETTER KAF # →‎ک‎→ +FB8F ; 0643 ; MA # ( ‎ﮏ‎ → ‎ك‎ ) ARABIC LETTER KEHEH FINAL FORM → ARABIC LETTER KAF # →‎ک‎→ +FB8E ; 0643 ; MA # ( ‎ﮎ‎ → ‎ك‎ ) ARABIC LETTER KEHEH ISOLATED FORM → ARABIC LETTER KAF # →‎ک‎→ +06AA ; 0643 ; MA # ( ‎ڪ‎ → ‎ك‎ ) ARABIC LETTER SWASH KAF → ARABIC LETTER KAF # + +06AD ; 0643 06DB ; MA # ( ‎ڭ‎ → ‎كۛ‎ ) ARABIC LETTER NG → ARABIC LETTER KAF, ARABIC SMALL HIGH THREE DOTS # +FBD5 ; 0643 06DB ; MA # ( ‎ﯕ‎ → ‎كۛ‎ ) ARABIC LETTER NG INITIAL FORM → ARABIC LETTER KAF, ARABIC SMALL HIGH THREE DOTS # →‎ڭ‎→ +FBD6 ; 0643 06DB ; MA # ( ‎ﯖ‎ → ‎كۛ‎ ) ARABIC LETTER NG MEDIAL FORM → ARABIC LETTER KAF, ARABIC SMALL HIGH THREE DOTS # →‎ڭ‎→ +FBD4 ; 0643 06DB ; MA # ( ‎ﯔ‎ → ‎كۛ‎ ) ARABIC LETTER NG FINAL FORM → ARABIC LETTER KAF, ARABIC SMALL HIGH THREE DOTS # →‎ڭ‎→ +FBD3 ; 0643 06DB ; MA # ( ‎ﯓ‎ → ‎كۛ‎ ) ARABIC LETTER NG ISOLATED FORM → ARABIC LETTER KAF, ARABIC SMALL HIGH THREE DOTS # →‎ڭ‎→ +0763 ; 0643 06DB ; MA # ( ‎ݣ‎ → ‎كۛ‎ ) ARABIC LETTER KEHEH WITH THREE DOTS ABOVE → ARABIC LETTER KAF, ARABIC SMALL HIGH THREE DOTS # →‎ڭ‎→ + +FC80 ; 0643 006C ; MA # ( ‎ﲀ‎ → ‎كl‎ ) ARABIC LIGATURE KAF WITH ALEF FINAL FORM → ARABIC LETTER KAF, LATIN SMALL LETTER L # →‎كا‎→ +FC37 ; 0643 006C ; MA # ( ‎ﰷ‎ → ‎كl‎ ) ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM → ARABIC LETTER KAF, LATIN SMALL LETTER L # →‎كا‎→ + +FCC4 ; 0643 062C ; MA # ( ‎ﳄ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH JEEM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM # +FC38 ; 0643 062C ; MA # ( ‎ﰸ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM # + +FCC5 ; 0643 062D ; MA # ( ‎ﳅ‎ → ‎كح‎ ) ARABIC LIGATURE KAF WITH HAH INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER HAH # +FC39 ; 0643 062D ; MA # ( ‎ﰹ‎ → ‎كح‎ ) ARABIC LIGATURE KAF WITH HAH ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER HAH # + +FCC6 ; 0643 062E ; MA # ( ‎ﳆ‎ → ‎كخ‎ ) ARABIC LIGATURE KAF WITH KHAH INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER KHAH # +FC3A ; 0643 062E ; MA # ( ‎ﰺ‎ → ‎كخ‎ ) ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER KHAH # + +FCC7 ; 0643 0644 ; MA # ( ‎ﳇ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER LAM # +FCEB ; 0643 0644 ; MA # ( ‎ﳫ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM MEDIAL FORM → ARABIC LETTER KAF, ARABIC LETTER LAM # +FC81 ; 0643 0644 ; MA # ( ‎ﲁ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER LAM # +FC3B ; 0643 0644 ; MA # ( ‎ﰻ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER LAM # + +FCC8 ; 0643 0645 ; MA # ( ‎ﳈ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM # +FCEC ; 0643 0645 ; MA # ( ‎ﳬ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM # +FC82 ; 0643 0645 ; MA # ( ‎ﲂ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM # +FC3C ; 0643 0645 ; MA # ( ‎ﰼ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM # + +FDC3 ; 0643 0645 0645 ; MA # ( ‎ﷃ‎ → ‎كمم‎ ) ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM # +FDBB ; 0643 0645 0645 ; MA # ( ‎ﶻ‎ → ‎كمم‎ ) ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM # + +FDB7 ; 0643 0645 0649 ; MA # ( ‎ﶷ‎ → ‎كمى‎ ) ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # →‎كمي‎→ + +FC83 ; 0643 0649 ; MA # ( ‎ﲃ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA # +FC3D ; 0643 0649 ; MA # ( ‎ﰽ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA # +FC84 ; 0643 0649 ; MA # ( ‎ﲄ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH YEH FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA # →‎كي‎→ +FC3E ; 0643 0649 ; MA # ( ‎ﰾ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH YEH ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA # →‎كي‎→ + +0762 ; 06AC ; MA # ( ‎ݢ‎ → ‎ڬ‎ ) ARABIC LETTER KEHEH WITH DOT ABOVE → ARABIC LETTER KAF WITH DOT ABOVE # + +FB94 ; 06AF ; MA # ( ‎ﮔ‎ → ‎گ‎ ) ARABIC LETTER GAF INITIAL FORM → ARABIC LETTER GAF # +FB95 ; 06AF ; MA # ( ‎ﮕ‎ → ‎گ‎ ) ARABIC LETTER GAF MEDIAL FORM → ARABIC LETTER GAF # +FB93 ; 06AF ; MA # ( ‎ﮓ‎ → ‎گ‎ ) ARABIC LETTER GAF FINAL FORM → ARABIC LETTER GAF # +FB92 ; 06AF ; MA # ( ‎ﮒ‎ → ‎گ‎ ) ARABIC LETTER GAF ISOLATED FORM → ARABIC LETTER GAF # +08B0 ; 06AF ; MA # ( ‎ࢰ‎ → ‎گ‎ ) ARABIC LETTER GAF WITH INVERTED STROKE → ARABIC LETTER GAF # + +06B4 ; 06AF 06DB ; MA # ( ‎ڴ‎ → ‎گۛ‎ ) ARABIC LETTER GAF WITH THREE DOTS ABOVE → ARABIC LETTER GAF, ARABIC SMALL HIGH THREE DOTS # + +FB9C ; 06B1 ; MA # ( ‎ﮜ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH INITIAL FORM → ARABIC LETTER NGOEH # +FB9D ; 06B1 ; MA # ( ‎ﮝ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH MEDIAL FORM → ARABIC LETTER NGOEH # +FB9B ; 06B1 ; MA # ( ‎ﮛ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH FINAL FORM → ARABIC LETTER NGOEH # +FB9A ; 06B1 ; MA # ( ‎ﮚ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH ISOLATED FORM → ARABIC LETTER NGOEH # + +FB98 ; 06B3 ; MA # ( ‎ﮘ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH INITIAL FORM → ARABIC LETTER GUEH # +FB99 ; 06B3 ; MA # ( ‎ﮙ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH MEDIAL FORM → ARABIC LETTER GUEH # +FB97 ; 06B3 ; MA # ( ‎ﮗ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH FINAL FORM → ARABIC LETTER GUEH # +FB96 ; 06B3 ; MA # ( ‎ﮖ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH ISOLATED FORM → ARABIC LETTER GUEH # + +1EE0B ; 0644 ; MA # ( ‎𞸋‎ → ‎ل‎ ) ARABIC MATHEMATICAL LAM → ARABIC LETTER LAM # +1EE2B ; 0644 ; MA # ( ‎𞸫‎ → ‎ل‎ ) ARABIC MATHEMATICAL INITIAL LAM → ARABIC LETTER LAM # +1EE4B ; 0644 ; MA # ( ‎𞹋‎ → ‎ل‎ ) ARABIC MATHEMATICAL TAILED LAM → ARABIC LETTER LAM # +1EE8B ; 0644 ; MA # ( ‎𞺋‎ → ‎ل‎ ) ARABIC MATHEMATICAL LOOPED LAM → ARABIC LETTER LAM # +1EEAB ; 0644 ; MA # ( ‎𞺫‎ → ‎ل‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK LAM → ARABIC LETTER LAM # +FEDF ; 0644 ; MA # ( ‎ﻟ‎ → ‎ل‎ ) ARABIC LETTER LAM INITIAL FORM → ARABIC LETTER LAM # +FEE0 ; 0644 ; MA # ( ‎ﻠ‎ → ‎ل‎ ) ARABIC LETTER LAM MEDIAL FORM → ARABIC LETTER LAM # +FEDE ; 0644 ; MA # ( ‎ﻞ‎ → ‎ل‎ ) ARABIC LETTER LAM FINAL FORM → ARABIC LETTER LAM # +FEDD ; 0644 ; MA # ( ‎ﻝ‎ → ‎ل‎ ) ARABIC LETTER LAM ISOLATED FORM → ARABIC LETTER LAM # + +06B7 ; 0644 06DB ; MA # ( ‎ڷ‎ → ‎لۛ‎ ) ARABIC LETTER LAM WITH THREE DOTS ABOVE → ARABIC LETTER LAM, ARABIC SMALL HIGH THREE DOTS # + +06B5 ; 0644 0306 ; MA # ( ‎ڵ‎ → ‎ل̆‎ ) ARABIC LETTER LAM WITH SMALL V → ARABIC LETTER LAM, COMBINING BREVE # →‎لٚ‎→ + +FEFC ; 0644 006C ; MA # ( ‎ﻼ‎ → ‎لl‎ ) ARABIC LIGATURE LAM WITH ALEF FINAL FORM → ARABIC LETTER LAM, LATIN SMALL LETTER L # →‎لا‎→ +FEFB ; 0644 006C ; MA # ( ‎ﻻ‎ → ‎لl‎ ) ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM → ARABIC LETTER LAM, LATIN SMALL LETTER L # →‎لا‎→ + +FEFA ; 0644 006C 0655 ; MA # ( ‎ﻺ‎ → ‎لlٕ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM → ARABIC LETTER LAM, LATIN SMALL LETTER L, ARABIC HAMZA BELOW # →‎لإ‎→ +FEF9 ; 0644 006C 0655 ; MA # ( ‎ﻹ‎ → ‎لlٕ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM → ARABIC LETTER LAM, LATIN SMALL LETTER L, ARABIC HAMZA BELOW # →‎لإ‎→ + +FEF8 ; 0644 006C 0674 ; MA # ( ‎ﻸ‎ → ‎لlٴ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER LAM, LATIN SMALL LETTER L, ARABIC LETTER HIGH HAMZA # →‎لأ‎→ +FEF7 ; 0644 006C 0674 ; MA # ( ‎ﻷ‎ → ‎لlٴ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER LAM, LATIN SMALL LETTER L, ARABIC LETTER HIGH HAMZA # →‎لأ‎→ + +FCCD ; 0644 006F ; MA # ( ‎ﳍ‎ → ‎لo‎ ) ARABIC LIGATURE LAM WITH HEH INITIAL FORM → ARABIC LETTER LAM, LATIN SMALL LETTER O # →‎له‎→ + +FEF6 ; 0644 0622 ; MA # ( ‎ﻶ‎ → ‎لآ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH MADDA ABOVE # +FEF5 ; 0644 0622 ; MA # ( ‎ﻵ‎ → ‎لآ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH MADDA ABOVE # + +FCC9 ; 0644 062C ; MA # ( ‎ﳉ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH JEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM # +FC3F ; 0644 062C ; MA # ( ‎ﰿ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM # + +FD83 ; 0644 062C 062C ; MA # ( ‎ﶃ‎ → ‎لجج‎ ) ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER JEEM # +FD84 ; 0644 062C 062C ; MA # ( ‎ﶄ‎ → ‎لجج‎ ) ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER JEEM # + +FDBA ; 0644 062C 0645 ; MA # ( ‎ﶺ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM # +FDBC ; 0644 062C 0645 ; MA # ( ‎ﶼ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM # + +FDAC ; 0644 062C 0649 ; MA # ( ‎ﶬ‎ → ‎لجى‎ ) ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA # →‎لجي‎→ + +FCCA ; 0644 062D ; MA # ( ‎ﳊ‎ → ‎لح‎ ) ARABIC LIGATURE LAM WITH HAH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH # +FC40 ; 0644 062D ; MA # ( ‎ﱀ‎ → ‎لح‎ ) ARABIC LIGATURE LAM WITH HAH ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER HAH # + +FDB5 ; 0644 062D 0645 ; MA # ( ‎ﶵ‎ → ‎لحم‎ ) ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER MEEM # +FD80 ; 0644 062D 0645 ; MA # ( ‎ﶀ‎ → ‎لحم‎ ) ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER MEEM # + +FD82 ; 0644 062D 0649 ; MA # ( ‎ﶂ‎ → ‎لحى‎ ) ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # +FD81 ; 0644 062D 0649 ; MA # ( ‎ﶁ‎ → ‎لحى‎ ) ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎لحي‎→ + +FCCB ; 0644 062E ; MA # ( ‎ﳋ‎ → ‎لخ‎ ) ARABIC LIGATURE LAM WITH KHAH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER KHAH # +FC41 ; 0644 062E ; MA # ( ‎ﱁ‎ → ‎لخ‎ ) ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER KHAH # + +FD86 ; 0644 062E 0645 ; MA # ( ‎ﶆ‎ → ‎لخم‎ ) ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER KHAH, ARABIC LETTER MEEM # +FD85 ; 0644 062E 0645 ; MA # ( ‎ﶅ‎ → ‎لخم‎ ) ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER KHAH, ARABIC LETTER MEEM # + +FCCC ; 0644 0645 ; MA # ( ‎ﳌ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM # +FCED ; 0644 0645 ; MA # ( ‎ﳭ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM # +FC85 ; 0644 0645 ; MA # ( ‎ﲅ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM # +FC42 ; 0644 0645 ; MA # ( ‎ﱂ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM # + +FD88 ; 0644 0645 062D ; MA # ( ‎ﶈ‎ → ‎لمح‎ ) ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER HAH # +FD87 ; 0644 0645 062D ; MA # ( ‎ﶇ‎ → ‎لمح‎ ) ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER HAH # + +FDAD ; 0644 0645 0649 ; MA # ( ‎ﶭ‎ → ‎لمى‎ ) ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # →‎لمي‎→ + +FC86 ; 0644 0649 ; MA # ( ‎ﲆ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA # +FC43 ; 0644 0649 ; MA # ( ‎ﱃ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA # +FC87 ; 0644 0649 ; MA # ( ‎ﲇ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA # →‎لي‎→ +FC44 ; 0644 0649 ; MA # ( ‎ﱄ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH YEH ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA # →‎لي‎→ + +1EE0C ; 0645 ; MA # ( ‎𞸌‎ → ‎م‎ ) ARABIC MATHEMATICAL MEEM → ARABIC LETTER MEEM # +1EE2C ; 0645 ; MA # ( ‎𞸬‎ → ‎م‎ ) ARABIC MATHEMATICAL INITIAL MEEM → ARABIC LETTER MEEM # +1EE6C ; 0645 ; MA # ( ‎𞹬‎ → ‎م‎ ) ARABIC MATHEMATICAL STRETCHED MEEM → ARABIC LETTER MEEM # +1EE8C ; 0645 ; MA # ( ‎𞺌‎ → ‎م‎ ) ARABIC MATHEMATICAL LOOPED MEEM → ARABIC LETTER MEEM # +1EEAC ; 0645 ; MA # ( ‎𞺬‎ → ‎م‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM → ARABIC LETTER MEEM # +FEE3 ; 0645 ; MA # ( ‎ﻣ‎ → ‎م‎ ) ARABIC LETTER MEEM INITIAL FORM → ARABIC LETTER MEEM # +FEE4 ; 0645 ; MA # ( ‎ﻤ‎ → ‎م‎ ) ARABIC LETTER MEEM MEDIAL FORM → ARABIC LETTER MEEM # +FEE2 ; 0645 ; MA # ( ‎ﻢ‎ → ‎م‎ ) ARABIC LETTER MEEM FINAL FORM → ARABIC LETTER MEEM # +FEE1 ; 0645 ; MA # ( ‎ﻡ‎ → ‎م‎ ) ARABIC LETTER MEEM ISOLATED FORM → ARABIC LETTER MEEM # + +08A7 ; 0645 06DB ; MA # ( ‎ࢧ‎ → ‎مۛ‎ ) ARABIC LETTER MEEM WITH THREE DOTS ABOVE → ARABIC LETTER MEEM, ARABIC SMALL HIGH THREE DOTS # + +06FE ; 0645 0348 ; MA #* ( ‎۾‎ → ‎م͈‎ ) ARABIC SIGN SINDHI POSTPOSITION MEN → ARABIC LETTER MEEM, COMBINING DOUBLE VERTICAL LINE BELOW # + +FC88 ; 0645 006C ; MA # ( ‎ﲈ‎ → ‎مl‎ ) ARABIC LIGATURE MEEM WITH ALEF FINAL FORM → ARABIC LETTER MEEM, LATIN SMALL LETTER L # →‎ما‎→ + +FCCE ; 0645 062C ; MA # ( ‎ﳎ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM # +FC45 ; 0645 062C ; MA # ( ‎ﱅ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM # + +FD8C ; 0645 062C 062D ; MA # ( ‎ﶌ‎ → ‎مجح‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER HAH # + +FD92 ; 0645 062C 062E ; MA # ( ‎ﶒ‎ → ‎مجخ‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER KHAH # + +FD8D ; 0645 062C 0645 ; MA # ( ‎ﶍ‎ → ‎مجم‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER MEEM # + +FDC0 ; 0645 062C 0649 ; MA # ( ‎ﷀ‎ → ‎مجى‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA # →‎مجي‎→ + +FCCF ; 0645 062D ; MA # ( ‎ﳏ‎ → ‎مح‎ ) ARABIC LIGATURE MEEM WITH HAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH # +FC46 ; 0645 062D ; MA # ( ‎ﱆ‎ → ‎مح‎ ) ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH # + +FD89 ; 0645 062D 062C ; MA # ( ‎ﶉ‎ → ‎محج‎ ) ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER JEEM # + +FD8A ; 0645 062D 0645 ; MA # ( ‎ﶊ‎ → ‎محم‎ ) ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER MEEM # + +FDF4 ; 0645 062D 0645 062F ; MA # ( ‎ﷴ‎ → ‎محمد‎ ) ARABIC LIGATURE MOHAMMAD ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER DAL # + +FD8B ; 0645 062D 0649 ; MA # ( ‎ﶋ‎ → ‎محى‎ ) ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎محي‎→ + +FCD0 ; 0645 062E ; MA # ( ‎ﳐ‎ → ‎مخ‎ ) ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER KHAH # +FC47 ; 0645 062E ; MA # ( ‎ﱇ‎ → ‎مخ‎ ) ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER KHAH # + +FD8E ; 0645 062E 062C ; MA # ( ‎ﶎ‎ → ‎مخج‎ ) ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER KHAH, ARABIC LETTER JEEM # + +FD8F ; 0645 062E 0645 ; MA # ( ‎ﶏ‎ → ‎مخم‎ ) ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER KHAH, ARABIC LETTER MEEM # + +FDB9 ; 0645 062E 0649 ; MA # ( ‎ﶹ‎ → ‎مخى‎ ) ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA # →‎مخي‎→ + +FCD1 ; 0645 0645 ; MA # ( ‎ﳑ‎ → ‎مم‎ ) ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM # +FC89 ; 0645 0645 ; MA # ( ‎ﲉ‎ → ‎مم‎ ) ARABIC LIGATURE MEEM WITH MEEM FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM # +FC48 ; 0645 0645 ; MA # ( ‎ﱈ‎ → ‎مم‎ ) ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM # + +FDB1 ; 0645 0645 0649 ; MA # ( ‎ﶱ‎ → ‎ممى‎ ) ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # →‎ممي‎→ + +FC49 ; 0645 0649 ; MA # ( ‎ﱉ‎ → ‎مى‎ ) ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # +FC4A ; 0645 0649 ; MA # ( ‎ﱊ‎ → ‎مى‎ ) ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # →‎مي‎→ + +1EE0D ; 0646 ; MA # ( ‎𞸍‎ → ‎ن‎ ) ARABIC MATHEMATICAL NOON → ARABIC LETTER NOON # +1EE2D ; 0646 ; MA # ( ‎𞸭‎ → ‎ن‎ ) ARABIC MATHEMATICAL INITIAL NOON → ARABIC LETTER NOON # +1EE4D ; 0646 ; MA # ( ‎𞹍‎ → ‎ن‎ ) ARABIC MATHEMATICAL TAILED NOON → ARABIC LETTER NOON # +1EE6D ; 0646 ; MA # ( ‎𞹭‎ → ‎ن‎ ) ARABIC MATHEMATICAL STRETCHED NOON → ARABIC LETTER NOON # +1EE8D ; 0646 ; MA # ( ‎𞺍‎ → ‎ن‎ ) ARABIC MATHEMATICAL LOOPED NOON → ARABIC LETTER NOON # +1EEAD ; 0646 ; MA # ( ‎𞺭‎ → ‎ن‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK NOON → ARABIC LETTER NOON # +FEE7 ; 0646 ; MA # ( ‎ﻧ‎ → ‎ن‎ ) ARABIC LETTER NOON INITIAL FORM → ARABIC LETTER NOON # +FEE8 ; 0646 ; MA # ( ‎ﻨ‎ → ‎ن‎ ) ARABIC LETTER NOON MEDIAL FORM → ARABIC LETTER NOON # +FEE6 ; 0646 ; MA # ( ‎ﻦ‎ → ‎ن‎ ) ARABIC LETTER NOON FINAL FORM → ARABIC LETTER NOON # +FEE5 ; 0646 ; MA # ( ‎ﻥ‎ → ‎ن‎ ) ARABIC LETTER NOON ISOLATED FORM → ARABIC LETTER NOON # + +0768 ; 0646 0615 ; MA # ( ‎ݨ‎ → ‎نؕ‎ ) ARABIC LETTER NOON WITH SMALL TAH → ARABIC LETTER NOON, ARABIC SMALL HIGH TAH # + +0769 ; 0646 0306 ; MA # ( ‎ݩ‎ → ‎ن̆‎ ) ARABIC LETTER NOON WITH SMALL V → ARABIC LETTER NOON, COMBINING BREVE # →‎نٚ‎→ + +FCD6 ; 0646 006F ; MA # ( ‎ﳖ‎ → ‎نo‎ ) ARABIC LIGATURE NOON WITH HEH INITIAL FORM → ARABIC LETTER NOON, LATIN SMALL LETTER O # →‎نه‎→ +FCEF ; 0646 006F ; MA # ( ‎ﳯ‎ → ‎نo‎ ) ARABIC LIGATURE NOON WITH HEH MEDIAL FORM → ARABIC LETTER NOON, LATIN SMALL LETTER O # →‎نه‎→ + +FDB8 ; 0646 062C 062D ; MA # ( ‎ﶸ‎ → ‎نجح‎ ) ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM → ARABIC LETTER NOON, ARABIC LETTER JEEM, ARABIC LETTER HAH # +FDBD ; 0646 062C 062D ; MA # ( ‎ﶽ‎ → ‎نجح‎ ) ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM → ARABIC LETTER NOON, ARABIC LETTER JEEM, ARABIC LETTER HAH # + +FD98 ; 0646 062C 0645 ; MA # ( ‎ﶘ‎ → ‎نجم‎ ) ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER NOON, ARABIC LETTER JEEM, ARABIC LETTER MEEM # +FD97 ; 0646 062C 0645 ; MA # ( ‎ﶗ‎ → ‎نجم‎ ) ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM → ARABIC LETTER NOON, ARABIC LETTER JEEM, ARABIC LETTER MEEM # + +FD99 ; 0646 062C 0649 ; MA # ( ‎ﶙ‎ → ‎نجى‎ ) ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER NOON, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA # +FDC7 ; 0646 062C 0649 ; MA # ( ‎ﷇ‎ → ‎نجى‎ ) ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER NOON, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA # →‎نجي‎→ + +FCD3 ; 0646 062D ; MA # ( ‎ﳓ‎ → ‎نح‎ ) ARABIC LIGATURE NOON WITH HAH INITIAL FORM → ARABIC LETTER NOON, ARABIC LETTER HAH # +FC4C ; 0646 062D ; MA # ( ‎ﱌ‎ → ‎نح‎ ) ARABIC LIGATURE NOON WITH HAH ISOLATED FORM → ARABIC LETTER NOON, ARABIC LETTER HAH # + +FD95 ; 0646 062D 0645 ; MA # ( ‎ﶕ‎ → ‎نحم‎ ) ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER NOON, ARABIC LETTER HAH, ARABIC LETTER MEEM # + +FD96 ; 0646 062D 0649 ; MA # ( ‎ﶖ‎ → ‎نحى‎ ) ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER NOON, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # +FDB3 ; 0646 062D 0649 ; MA # ( ‎ﶳ‎ → ‎نحى‎ ) ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM → ARABIC LETTER NOON, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎نحي‎→ + +FCD4 ; 0646 062E ; MA # ( ‎ﳔ‎ → ‎نخ‎ ) ARABIC LIGATURE NOON WITH KHAH INITIAL FORM → ARABIC LETTER NOON, ARABIC LETTER KHAH # +FC4D ; 0646 062E ; MA # ( ‎ﱍ‎ → ‎نخ‎ ) ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM → ARABIC LETTER NOON, ARABIC LETTER KHAH # + +FC8A ; 0646 0631 ; MA # ( ‎ﲊ‎ → ‎نر‎ ) ARABIC LIGATURE NOON WITH REH FINAL FORM → ARABIC LETTER NOON, ARABIC LETTER REH # + +FC8B ; 0646 0632 ; MA # ( ‎ﲋ‎ → ‎نز‎ ) ARABIC LIGATURE NOON WITH ZAIN FINAL FORM → ARABIC LETTER NOON, ARABIC LETTER ZAIN # + +FCD5 ; 0646 0645 ; MA # ( ‎ﳕ‎ → ‎نم‎ ) ARABIC LIGATURE NOON WITH MEEM INITIAL FORM → ARABIC LETTER NOON, ARABIC LETTER MEEM # +FCEE ; 0646 0645 ; MA # ( ‎ﳮ‎ → ‎نم‎ ) ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM → ARABIC LETTER NOON, ARABIC LETTER MEEM # +FC8C ; 0646 0645 ; MA # ( ‎ﲌ‎ → ‎نم‎ ) ARABIC LIGATURE NOON WITH MEEM FINAL FORM → ARABIC LETTER NOON, ARABIC LETTER MEEM # +FC4E ; 0646 0645 ; MA # ( ‎ﱎ‎ → ‎نم‎ ) ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM → ARABIC LETTER NOON, ARABIC LETTER MEEM # + +FD9B ; 0646 0645 0649 ; MA # ( ‎ﶛ‎ → ‎نمى‎ ) ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER NOON, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # +FD9A ; 0646 0645 0649 ; MA # ( ‎ﶚ‎ → ‎نمى‎ ) ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER NOON, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # →‎نمي‎→ + +FC8D ; 0646 0646 ; MA # ( ‎ﲍ‎ → ‎نن‎ ) ARABIC LIGATURE NOON WITH NOON FINAL FORM → ARABIC LETTER NOON, ARABIC LETTER NOON # + +FC8E ; 0646 0649 ; MA # ( ‎ﲎ‎ → ‎نى‎ ) ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER NOON, ARABIC LETTER ALEF MAKSURA # +FC4F ; 0646 0649 ; MA # ( ‎ﱏ‎ → ‎نى‎ ) ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER NOON, ARABIC LETTER ALEF MAKSURA # +FC8F ; 0646 0649 ; MA # ( ‎ﲏ‎ → ‎نى‎ ) ARABIC LIGATURE NOON WITH YEH FINAL FORM → ARABIC LETTER NOON, ARABIC LETTER ALEF MAKSURA # →‎ني‎→ +FC50 ; 0646 0649 ; MA # ( ‎ﱐ‎ → ‎نى‎ ) ARABIC LIGATURE NOON WITH YEH ISOLATED FORM → ARABIC LETTER NOON, ARABIC LETTER ALEF MAKSURA # →‎ني‎→ + +06C2 ; 06C0 ; MA # ( ‎ۂ‎ → ‎ۀ‎ ) ARABIC LETTER HEH GOAL WITH HAMZA ABOVE → ARABIC LETTER HEH WITH YEH ABOVE # →‎ﮤ‎→ +FBA5 ; 06C0 ; MA # ( ‎ﮥ‎ → ‎ۀ‎ ) ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM → ARABIC LETTER HEH WITH YEH ABOVE # +FBA4 ; 06C0 ; MA # ( ‎ﮤ‎ → ‎ۀ‎ ) ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM → ARABIC LETTER HEH WITH YEH ABOVE # + +102E4 ; 0648 ; MA #* ( 𐋤 → ‎و‎ ) COPTIC EPACT DIGIT FOUR → ARABIC LETTER WAW # +1EE05 ; 0648 ; MA # ( ‎𞸅‎ → ‎و‎ ) ARABIC MATHEMATICAL WAW → ARABIC LETTER WAW # +1EE85 ; 0648 ; MA # ( ‎𞺅‎ → ‎و‎ ) ARABIC MATHEMATICAL LOOPED WAW → ARABIC LETTER WAW # +1EEA5 ; 0648 ; MA # ( ‎𞺥‎ → ‎و‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK WAW → ARABIC LETTER WAW # +FEEE ; 0648 ; MA # ( ‎ﻮ‎ → ‎و‎ ) ARABIC LETTER WAW FINAL FORM → ARABIC LETTER WAW # +FEED ; 0648 ; MA # ( ‎ﻭ‎ → ‎و‎ ) ARABIC LETTER WAW ISOLATED FORM → ARABIC LETTER WAW # +08B1 ; 0648 ; MA # ( ‎ࢱ‎ → ‎و‎ ) ARABIC LETTER STRAIGHT WAW → ARABIC LETTER WAW # + +06CB ; 0648 06DB ; MA # ( ‎ۋ‎ → ‎وۛ‎ ) ARABIC LETTER VE → ARABIC LETTER WAW, ARABIC SMALL HIGH THREE DOTS # +FBDF ; 0648 06DB ; MA # ( ‎ﯟ‎ → ‎وۛ‎ ) ARABIC LETTER VE FINAL FORM → ARABIC LETTER WAW, ARABIC SMALL HIGH THREE DOTS # →‎ۋ‎→ +FBDE ; 0648 06DB ; MA # ( ‎ﯞ‎ → ‎وۛ‎ ) ARABIC LETTER VE ISOLATED FORM → ARABIC LETTER WAW, ARABIC SMALL HIGH THREE DOTS # →‎ۋ‎→ + +06C7 ; 0648 0313 ; MA # ( ‎ۇ‎ → ‎و̓‎ ) ARABIC LETTER U → ARABIC LETTER WAW, COMBINING COMMA ABOVE # →‎وُ‎→ +FBD8 ; 0648 0313 ; MA # ( ‎ﯘ‎ → ‎و̓‎ ) ARABIC LETTER U FINAL FORM → ARABIC LETTER WAW, COMBINING COMMA ABOVE # →‎ۇ‎→→‎وُ‎→ +FBD7 ; 0648 0313 ; MA # ( ‎ﯗ‎ → ‎و̓‎ ) ARABIC LETTER U ISOLATED FORM → ARABIC LETTER WAW, COMBINING COMMA ABOVE # →‎ۇ‎→→‎وُ‎→ + +06C6 ; 0648 0306 ; MA # ( ‎ۆ‎ → ‎و̆‎ ) ARABIC LETTER OE → ARABIC LETTER WAW, COMBINING BREVE # →‎وٚ‎→ +FBDA ; 0648 0306 ; MA # ( ‎ﯚ‎ → ‎و̆‎ ) ARABIC LETTER OE FINAL FORM → ARABIC LETTER WAW, COMBINING BREVE # →‎ۆ‎→→‎وٚ‎→ +FBD9 ; 0648 0306 ; MA # ( ‎ﯙ‎ → ‎و̆‎ ) ARABIC LETTER OE ISOLATED FORM → ARABIC LETTER WAW, COMBINING BREVE # →‎ۆ‎→→‎وٚ‎→ + +06C9 ; 0648 0302 ; MA # ( ‎ۉ‎ → ‎و̂‎ ) ARABIC LETTER KIRGHIZ YU → ARABIC LETTER WAW, COMBINING CIRCUMFLEX ACCENT # →‎وٛ‎→ +FBE3 ; 0648 0302 ; MA # ( ‎ﯣ‎ → ‎و̂‎ ) ARABIC LETTER KIRGHIZ YU FINAL FORM → ARABIC LETTER WAW, COMBINING CIRCUMFLEX ACCENT # →‎ۉ‎→→‎وٛ‎→ +FBE2 ; 0648 0302 ; MA # ( ‎ﯢ‎ → ‎و̂‎ ) ARABIC LETTER KIRGHIZ YU ISOLATED FORM → ARABIC LETTER WAW, COMBINING CIRCUMFLEX ACCENT # →‎ۉ‎→→‎وٛ‎→ + +06C8 ; 0648 0670 ; MA # ( ‎ۈ‎ → ‎وٰ‎ ) ARABIC LETTER YU → ARABIC LETTER WAW, ARABIC LETTER SUPERSCRIPT ALEF # +FBDC ; 0648 0670 ; MA # ( ‎ﯜ‎ → ‎وٰ‎ ) ARABIC LETTER YU FINAL FORM → ARABIC LETTER WAW, ARABIC LETTER SUPERSCRIPT ALEF # →‎ۈ‎→ +FBDB ; 0648 0670 ; MA # ( ‎ﯛ‎ → ‎وٰ‎ ) ARABIC LETTER YU ISOLATED FORM → ARABIC LETTER WAW, ARABIC LETTER SUPERSCRIPT ALEF # →‎ۈ‎→ + +0624 ; 0648 0674 ; MA # ( ‎ؤ‎ → ‎وٴ‎ ) ARABIC LETTER WAW WITH HAMZA ABOVE → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA # →‎ٶ‎→ +FE86 ; 0648 0674 ; MA # ( ‎ﺆ‎ → ‎وٴ‎ ) ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA # →‎ٶ‎→ +FE85 ; 0648 0674 ; MA # ( ‎ﺅ‎ → ‎وٴ‎ ) ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA # →‎ٶ‎→ +0676 ; 0648 0674 ; MA # ( ‎ٶ‎ → ‎وٴ‎ ) ARABIC LETTER HIGH HAMZA WAW → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA # + +0677 ; 0648 0313 0674 ; MA # ( ‎ٷ‎ → ‎و̓ٴ‎ ) ARABIC LETTER U WITH HAMZA ABOVE → ARABIC LETTER WAW, COMBINING COMMA ABOVE, ARABIC LETTER HIGH HAMZA # →‎ۇٴ‎→ +FBDD ; 0648 0313 0674 ; MA # ( ‎ﯝ‎ → ‎و̓ٴ‎ ) ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER WAW, COMBINING COMMA ABOVE, ARABIC LETTER HIGH HAMZA # →‎ۇٴ‎→ + +FDF8 ; 0648 0633 0644 0645 ; MA # ( ‎ﷸ‎ → ‎وسلم‎ ) ARABIC LIGATURE WASALLAM ISOLATED FORM → ARABIC LETTER WAW, ARABIC LETTER SEEN, ARABIC LETTER LAM, ARABIC LETTER MEEM # + +FBE1 ; 06C5 ; MA # ( ‎ﯡ‎ → ‎ۅ‎ ) ARABIC LETTER KIRGHIZ OE FINAL FORM → ARABIC LETTER KIRGHIZ OE # +FBE0 ; 06C5 ; MA # ( ‎ﯠ‎ → ‎ۅ‎ ) ARABIC LETTER KIRGHIZ OE ISOLATED FORM → ARABIC LETTER KIRGHIZ OE # + +066E ; 0649 ; MA # ( ‎ٮ‎ → ‎ى‎ ) ARABIC LETTER DOTLESS BEH → ARABIC LETTER ALEF MAKSURA # +1EE1C ; 0649 ; MA # ( ‎𞸜‎ → ‎ى‎ ) ARABIC MATHEMATICAL DOTLESS BEH → ARABIC LETTER ALEF MAKSURA # →‎ٮ‎→ +1EE7C ; 0649 ; MA # ( ‎𞹼‎ → ‎ى‎ ) ARABIC MATHEMATICAL STRETCHED DOTLESS BEH → ARABIC LETTER ALEF MAKSURA # →‎ٮ‎→ +06BA ; 0649 ; MA # ( ‎ں‎ → ‎ى‎ ) ARABIC LETTER NOON GHUNNA → ARABIC LETTER ALEF MAKSURA # +1EE1D ; 0649 ; MA # ( ‎𞸝‎ → ‎ى‎ ) ARABIC MATHEMATICAL DOTLESS NOON → ARABIC LETTER ALEF MAKSURA # →‎ں‎→ +1EE5D ; 0649 ; MA # ( ‎𞹝‎ → ‎ى‎ ) ARABIC MATHEMATICAL TAILED DOTLESS NOON → ARABIC LETTER ALEF MAKSURA # →‎ں‎→ +FB9F ; 0649 ; MA # ( ‎ﮟ‎ → ‎ى‎ ) ARABIC LETTER NOON GHUNNA FINAL FORM → ARABIC LETTER ALEF MAKSURA # →‎ں‎→ +FB9E ; 0649 ; MA # ( ‎ﮞ‎ → ‎ى‎ ) ARABIC LETTER NOON GHUNNA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA # →‎ں‎→ +FBE8 ; 0649 ; MA # ( ‎ﯨ‎ → ‎ى‎ ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM → ARABIC LETTER ALEF MAKSURA # +FBE9 ; 0649 ; MA # ( ‎ﯩ‎ → ‎ى‎ ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM → ARABIC LETTER ALEF MAKSURA # +FEF0 ; 0649 ; MA # ( ‎ﻰ‎ → ‎ى‎ ) ARABIC LETTER ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA # +FEEF ; 0649 ; MA # ( ‎ﻯ‎ → ‎ى‎ ) ARABIC LETTER ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA # +064A ; 0649 ; MA # ( ‎ي‎ → ‎ى‎ ) ARABIC LETTER YEH → ARABIC LETTER ALEF MAKSURA # +1EE09 ; 0649 ; MA # ( ‎𞸉‎ → ‎ى‎ ) ARABIC MATHEMATICAL YEH → ARABIC LETTER ALEF MAKSURA # →‎ي‎→ +1EE29 ; 0649 ; MA # ( ‎𞸩‎ → ‎ى‎ ) ARABIC MATHEMATICAL INITIAL YEH → ARABIC LETTER ALEF MAKSURA # →‎ي‎→ +1EE49 ; 0649 ; MA # ( ‎𞹉‎ → ‎ى‎ ) ARABIC MATHEMATICAL TAILED YEH → ARABIC LETTER ALEF MAKSURA # →‎ي‎→ +1EE69 ; 0649 ; MA # ( ‎𞹩‎ → ‎ى‎ ) ARABIC MATHEMATICAL STRETCHED YEH → ARABIC LETTER ALEF MAKSURA # →‎ي‎→ +1EE89 ; 0649 ; MA # ( ‎𞺉‎ → ‎ى‎ ) ARABIC MATHEMATICAL LOOPED YEH → ARABIC LETTER ALEF MAKSURA # →‎ي‎→ +1EEA9 ; 0649 ; MA # ( ‎𞺩‎ → ‎ى‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK YEH → ARABIC LETTER ALEF MAKSURA # →‎ي‎→ +FEF3 ; 0649 ; MA # ( ‎ﻳ‎ → ‎ى‎ ) ARABIC LETTER YEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA # →‎ي‎→ +FEF4 ; 0649 ; MA # ( ‎ﻴ‎ → ‎ى‎ ) ARABIC LETTER YEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA # →‎ي‎→ +FEF2 ; 0649 ; MA # ( ‎ﻲ‎ → ‎ى‎ ) ARABIC LETTER YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA # →‎ي‎→ +FEF1 ; 0649 ; MA # ( ‎ﻱ‎ → ‎ى‎ ) ARABIC LETTER YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA # →‎ي‎→ +06CC ; 0649 ; MA # ( ‎ی‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH → ARABIC LETTER ALEF MAKSURA # +FBFE ; 0649 ; MA # ( ‎ﯾ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA # →‎ی‎→ +FBFF ; 0649 ; MA # ( ‎ﯿ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA # →‎ی‎→ +FBFD ; 0649 ; MA # ( ‎ﯽ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA # →‎ﻰ‎→ +FBFC ; 0649 ; MA # ( ‎ﯼ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA # +06D2 ; 0649 ; MA # ( ‎ے‎ → ‎ى‎ ) ARABIC LETTER YEH BARREE → ARABIC LETTER ALEF MAKSURA # →‎ي‎→ +FBAF ; 0649 ; MA # ( ‎ﮯ‎ → ‎ى‎ ) ARABIC LETTER YEH BARREE FINAL FORM → ARABIC LETTER ALEF MAKSURA # →‎ے‎→→‎ي‎→ +FBAE ; 0649 ; MA # ( ‎ﮮ‎ → ‎ى‎ ) ARABIC LETTER YEH BARREE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA # →‎ے‎→→‎ي‎→ + +0679 ; 0649 0615 ; MA # ( ‎ٹ‎ → ‎ىؕ‎ ) ARABIC LETTER TTEH → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH # →‎ٮؕ‎→ +FB68 ; 0649 0615 ; MA # ( ‎ﭨ‎ → ‎ىؕ‎ ) ARABIC LETTER TTEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH # →‎ٹ‎→→‎ٮؕ‎→ +FB69 ; 0649 0615 ; MA # ( ‎ﭩ‎ → ‎ىؕ‎ ) ARABIC LETTER TTEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH # →‎ٹ‎→→‎ٮؕ‎→ +FB67 ; 0649 0615 ; MA # ( ‎ﭧ‎ → ‎ىؕ‎ ) ARABIC LETTER TTEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH # →‎ٹ‎→→‎ٮؕ‎→ +FB66 ; 0649 0615 ; MA # ( ‎ﭦ‎ → ‎ىؕ‎ ) ARABIC LETTER TTEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH # →‎ٹ‎→→‎ٮؕ‎→ +06BB ; 0649 0615 ; MA # ( ‎ڻ‎ → ‎ىؕ‎ ) ARABIC LETTER RNOON → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH # →‎ںؕ‎→ +FBA2 ; 0649 0615 ; MA # ( ‎ﮢ‎ → ‎ىؕ‎ ) ARABIC LETTER RNOON INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH # →‎ڻ‎→→‎ںؕ‎→ +FBA3 ; 0649 0615 ; MA # ( ‎ﮣ‎ → ‎ىؕ‎ ) ARABIC LETTER RNOON MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH # →‎ڻ‎→→‎ںؕ‎→ +FBA1 ; 0649 0615 ; MA # ( ‎ﮡ‎ → ‎ىؕ‎ ) ARABIC LETTER RNOON FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH # →‎ڻ‎→→‎ںؕ‎→ +FBA0 ; 0649 0615 ; MA # ( ‎ﮠ‎ → ‎ىؕ‎ ) ARABIC LETTER RNOON ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH # →‎ڻ‎→→‎ںؕ‎→ + +067E ; 0649 06DB ; MA # ( ‎پ‎ → ‎ىۛ‎ ) ARABIC LETTER PEH → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎ڽ‎→→‎ںۛ‎→ +FB58 ; 0649 06DB ; MA # ( ‎ﭘ‎ → ‎ىۛ‎ ) ARABIC LETTER PEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎پ‎→→‎ڽ‎→→‎ںۛ‎→ +FB59 ; 0649 06DB ; MA # ( ‎ﭙ‎ → ‎ىۛ‎ ) ARABIC LETTER PEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎پ‎→→‎ڽ‎→→‎ںۛ‎→ +FB57 ; 0649 06DB ; MA # ( ‎ﭗ‎ → ‎ىۛ‎ ) ARABIC LETTER PEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎پ‎→→‎ڽ‎→→‎ںۛ‎→ +FB56 ; 0649 06DB ; MA # ( ‎ﭖ‎ → ‎ىۛ‎ ) ARABIC LETTER PEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎پ‎→→‎ڽ‎→→‎ںۛ‎→ +062B ; 0649 06DB ; MA # ( ‎ث‎ → ‎ىۛ‎ ) ARABIC LETTER THEH → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎ٮۛ‎→ +1EE16 ; 0649 06DB ; MA # ( ‎𞸖‎ → ‎ىۛ‎ ) ARABIC MATHEMATICAL THEH → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎ث‎→→‎ٮۛ‎→ +1EE36 ; 0649 06DB ; MA # ( ‎𞸶‎ → ‎ىۛ‎ ) ARABIC MATHEMATICAL INITIAL THEH → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎ث‎→→‎ٮۛ‎→ +1EE76 ; 0649 06DB ; MA # ( ‎𞹶‎ → ‎ىۛ‎ ) ARABIC MATHEMATICAL STRETCHED THEH → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎ث‎→→‎ٮۛ‎→ +1EE96 ; 0649 06DB ; MA # ( ‎𞺖‎ → ‎ىۛ‎ ) ARABIC MATHEMATICAL LOOPED THEH → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎ث‎→→‎ٮۛ‎→ +1EEB6 ; 0649 06DB ; MA # ( ‎𞺶‎ → ‎ىۛ‎ ) ARABIC MATHEMATICAL DOUBLE-STRUCK THEH → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎ث‎→→‎ٮۛ‎→ +FE9B ; 0649 06DB ; MA # ( ‎ﺛ‎ → ‎ىۛ‎ ) ARABIC LETTER THEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎ث‎→→‎ٮۛ‎→ +FE9C ; 0649 06DB ; MA # ( ‎ﺜ‎ → ‎ىۛ‎ ) ARABIC LETTER THEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎ث‎→→‎ٮۛ‎→ +FE9A ; 0649 06DB ; MA # ( ‎ﺚ‎ → ‎ىۛ‎ ) ARABIC LETTER THEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎ث‎→→‎ٮۛ‎→ +FE99 ; 0649 06DB ; MA # ( ‎ﺙ‎ → ‎ىۛ‎ ) ARABIC LETTER THEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎ث‎→→‎ٮۛ‎→ +06BD ; 0649 06DB ; MA # ( ‎ڽ‎ → ‎ىۛ‎ ) ARABIC LETTER NOON WITH THREE DOTS ABOVE → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎ںۛ‎→ +06D1 ; 0649 06DB ; MA # ( ‎ۑ‎ → ‎ىۛ‎ ) ARABIC LETTER YEH WITH THREE DOTS BELOW → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎پ‎→→‎ڽ‎→→‎ںۛ‎→ +063F ; 0649 06DB ; MA # ( ‎ؿ‎ → ‎ىۛ‎ ) ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎یۛ‎→ + +0756 ; 0649 0306 ; MA # ( ‎ݖ‎ → ‎ى̆‎ ) ARABIC LETTER BEH WITH SMALL V → ARABIC LETTER ALEF MAKSURA, COMBINING BREVE # →‎ٮٚ‎→ +06CE ; 0649 0306 ; MA # ( ‎ێ‎ → ‎ى̆‎ ) ARABIC LETTER YEH WITH SMALL V → ARABIC LETTER ALEF MAKSURA, COMBINING BREVE # →‎یٚ‎→ + +063D ; 0649 0302 ; MA # ( ‎ؽ‎ → ‎ى̂‎ ) ARABIC LETTER FARSI YEH WITH INVERTED V → ARABIC LETTER ALEF MAKSURA, COMBINING CIRCUMFLEX ACCENT # →‎یٛ‎→ + +08A8 ; 0649 0654 ; MA # ( ‎ࢨ‎ → ‎ىٔ‎ ) ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE → ARABIC LETTER ALEF MAKSURA, ARABIC HAMZA ABOVE # →‎ئ‎→ + +FC90 ; 0649 0670 ; MA # ( ‎ﲐ‎ → ‎ىٰ‎ ) ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER SUPERSCRIPT ALEF # +FC5D ; 0649 0670 ; MA # ( ‎ﱝ‎ → ‎ىٰ‎ ) ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER SUPERSCRIPT ALEF # + +FCDE ; 0649 006F ; MA # ( ‎ﳞ‎ → ‎ىo‎ ) ARABIC LIGATURE YEH WITH HEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, LATIN SMALL LETTER O # →‎يه‎→ +FCF1 ; 0649 006F ; MA # ( ‎ﳱ‎ → ‎ىo‎ ) ARABIC LIGATURE YEH WITH HEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, LATIN SMALL LETTER O # →‎يه‎→ + +FCE6 ; 0649 06DB 006F ; MA # ( ‎ﳦ‎ → ‎ىۛo‎ ) ARABIC LIGATURE THEH WITH HEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, LATIN SMALL LETTER O # →‎ثه‎→ + +0626 ; 0649 0674 ; MA # ( ‎ئ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA # →‎ٸ‎→→‎يٴ‎→ +FE8B ; 0649 0674 ; MA # ( ‎ﺋ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA # →‎ئ‎→→‎ٸ‎→→‎يٴ‎→ +FE8C ; 0649 0674 ; MA # ( ‎ﺌ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA # →‎ئ‎→→‎ٸ‎→→‎يٴ‎→ +FE8A ; 0649 0674 ; MA # ( ‎ﺊ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA # →‎ئ‎→→‎ٸ‎→→‎يٴ‎→ +FE89 ; 0649 0674 ; MA # ( ‎ﺉ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA # →‎ٸ‎→→‎يٴ‎→ +0678 ; 0649 0674 ; MA # ( ‎ٸ‎ → ‎ىٴ‎ ) ARABIC LETTER HIGH HAMZA YEH → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA # →‎يٴ‎→ + +FBEB ; 0649 0674 006C ; MA # ( ‎ﯫ‎ → ‎ىٴl‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, LATIN SMALL LETTER L # →‎ئا‎→ +FBEA ; 0649 0674 006C ; MA # ( ‎ﯪ‎ → ‎ىٴl‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, LATIN SMALL LETTER L # →‎ئا‎→ + +FC9B ; 0649 0674 006F ; MA # ( ‎ﲛ‎ → ‎ىٴo‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, LATIN SMALL LETTER O # →‎ئه‎→ +FCE0 ; 0649 0674 006F ; MA # ( ‎ﳠ‎ → ‎ىٴo‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, LATIN SMALL LETTER O # →‎ئه‎→ +FBED ; 0649 0674 006F ; MA # ( ‎ﯭ‎ → ‎ىٴo‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, LATIN SMALL LETTER O # →‎ئە‎→→‎ٴىo‎→→‎ئه‎→ +FBEC ; 0649 0674 006F ; MA # ( ‎ﯬ‎ → ‎ىٴo‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, LATIN SMALL LETTER O # →‎ئە‎→→‎ٴىo‎→→‎ئه‎→ + +FBF8 ; 0649 0674 067B ; MA # ( ‎ﯸ‎ → ‎ىٴٻ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER BEEH # →‎ئې‎→ +FBF7 ; 0649 0674 067B ; MA # ( ‎ﯷ‎ → ‎ىٴٻ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER BEEH # →‎ئې‎→ +FBF6 ; 0649 0674 067B ; MA # ( ‎ﯶ‎ → ‎ىٴٻ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER BEEH # →‎ئې‎→ + +FC97 ; 0649 0674 062C ; MA # ( ‎ﲗ‎ → ‎ىٴج‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM # →‎ئج‎→ +FC00 ; 0649 0674 062C ; MA # ( ‎ﰀ‎ → ‎ىٴج‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM # →‎ئج‎→ + +FC98 ; 0649 0674 062D ; MA # ( ‎ﲘ‎ → ‎ىٴح‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HAH # →‎ئح‎→ +FC01 ; 0649 0674 062D ; MA # ( ‎ﰁ‎ → ‎ىٴح‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HAH # →‎ئح‎→ + +FC99 ; 0649 0674 062E ; MA # ( ‎ﲙ‎ → ‎ىٴخ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER KHAH # →‎ئخ‎→ + +FC64 ; 0649 0674 0631 ; MA # ( ‎ﱤ‎ → ‎ىٴر‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER REH # →‎ئر‎→ + +FC65 ; 0649 0674 0632 ; MA # ( ‎ﱥ‎ → ‎ىٴز‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ZAIN # →‎ئز‎→ + +FC9A ; 0649 0674 0645 ; MA # ( ‎ﲚ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM # →‎ئم‎→ +FCDF ; 0649 0674 0645 ; MA # ( ‎ﳟ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM # →‎ئم‎→ +FC66 ; 0649 0674 0645 ; MA # ( ‎ﱦ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM # →‎ئم‎→ +FC02 ; 0649 0674 0645 ; MA # ( ‎ﰂ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM # →‎ئم‎→ + +FC67 ; 0649 0674 0646 ; MA # ( ‎ﱧ‎ → ‎ىٴن‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER NOON # →‎ئن‎→ + +FBEF ; 0649 0674 0648 ; MA # ( ‎ﯯ‎ → ‎ىٴو‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW # →‎ئو‎→ +FBEE ; 0649 0674 0648 ; MA # ( ‎ﯮ‎ → ‎ىٴو‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW # →‎ئو‎→ + +FBF1 ; 0649 0674 0648 0313 ; MA # ( ‎ﯱ‎ → ‎ىٴو̓‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW, COMBINING COMMA ABOVE # →‎ئۇ‎→ +FBF0 ; 0649 0674 0648 0313 ; MA # ( ‎ﯰ‎ → ‎ىٴو̓‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW, COMBINING COMMA ABOVE # →‎ئۇ‎→ + +FBF3 ; 0649 0674 0648 0306 ; MA # ( ‎ﯳ‎ → ‎ىٴو̆‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW, COMBINING BREVE # →‎ئۆ‎→ +FBF2 ; 0649 0674 0648 0306 ; MA # ( ‎ﯲ‎ → ‎ىٴو̆‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW, COMBINING BREVE # →‎ئۆ‎→ + +FBF5 ; 0649 0674 0648 0670 ; MA # ( ‎ﯵ‎ → ‎ىٴوٰ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW, ARABIC LETTER SUPERSCRIPT ALEF # →‎ئۈ‎→ +FBF4 ; 0649 0674 0648 0670 ; MA # ( ‎ﯴ‎ → ‎ىٴوٰ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW, ARABIC LETTER SUPERSCRIPT ALEF # →‎ئۈ‎→ + +FBFB ; 0649 0674 0649 ; MA # ( ‎ﯻ‎ → ‎ىٴى‎ ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA # →‎ئى‎→ +FBFA ; 0649 0674 0649 ; MA # ( ‎ﯺ‎ → ‎ىٴى‎ ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA # →‎ئى‎→ +FC68 ; 0649 0674 0649 ; MA # ( ‎ﱨ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA # →‎ئى‎→ +FBF9 ; 0649 0674 0649 ; MA # ( ‎ﯹ‎ → ‎ىٴى‎ ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA # →‎ئى‎→ +FC03 ; 0649 0674 0649 ; MA # ( ‎ﰃ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA # →‎ئى‎→ +FC69 ; 0649 0674 0649 ; MA # ( ‎ﱩ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA # →‎ئي‎→→‎ٴىى‎→→‎ئى‎→ +FC04 ; 0649 0674 0649 ; MA # ( ‎ﰄ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA # →‎ئي‎→→‎ٴىى‎→→‎ئى‎→ + +FCDA ; 0649 062C ; MA # ( ‎ﳚ‎ → ‎ىج‎ ) ARABIC LIGATURE YEH WITH JEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER JEEM # →‎يج‎→ +FC55 ; 0649 062C ; MA # ( ‎ﱕ‎ → ‎ىج‎ ) ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER JEEM # →‎يج‎→ + +FC11 ; 0649 06DB 062C ; MA # ( ‎ﰑ‎ → ‎ىۛج‎ ) ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER JEEM # →‎ثج‎→ + +FDAF ; 0649 062C 0649 ; MA # ( ‎ﶯ‎ → ‎ىجى‎ ) ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA # →‎يجي‎→ + +FCDB ; 0649 062D ; MA # ( ‎ﳛ‎ → ‎ىح‎ ) ARABIC LIGATURE YEH WITH HAH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HAH # →‎يح‎→ +FC56 ; 0649 062D ; MA # ( ‎ﱖ‎ → ‎ىح‎ ) ARABIC LIGATURE YEH WITH HAH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HAH # →‎يح‎→ + +FDAE ; 0649 062D 0649 ; MA # ( ‎ﶮ‎ → ‎ىحى‎ ) ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎يحي‎→ + +FCDC ; 0649 062E ; MA # ( ‎ﳜ‎ → ‎ىخ‎ ) ARABIC LIGATURE YEH WITH KHAH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER KHAH # →‎يخ‎→ +FC57 ; 0649 062E ; MA # ( ‎ﱗ‎ → ‎ىخ‎ ) ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER KHAH # →‎يخ‎→ + +FC91 ; 0649 0631 ; MA # ( ‎ﲑ‎ → ‎ىر‎ ) ARABIC LIGATURE YEH WITH REH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER REH # →‎ير‎→ + +FC76 ; 0649 06DB 0631 ; MA # ( ‎ﱶ‎ → ‎ىۛر‎ ) ARABIC LIGATURE THEH WITH REH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER REH # →‎ثر‎→ + +FC92 ; 0649 0632 ; MA # ( ‎ﲒ‎ → ‎ىز‎ ) ARABIC LIGATURE YEH WITH ZAIN FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ZAIN # →‎يز‎→ + +FC77 ; 0649 06DB 0632 ; MA # ( ‎ﱷ‎ → ‎ىۛز‎ ) ARABIC LIGATURE THEH WITH ZAIN FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ZAIN # →‎ثز‎→ + +FCDD ; 0649 0645 ; MA # ( ‎ﳝ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM # →‎يم‎→ +FCF0 ; 0649 0645 ; MA # ( ‎ﳰ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM # →‎يم‎→ +FC93 ; 0649 0645 ; MA # ( ‎ﲓ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM # →‎يم‎→ +FC58 ; 0649 0645 ; MA # ( ‎ﱘ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM # →‎يم‎→ + +FCA6 ; 0649 06DB 0645 ; MA # ( ‎ﲦ‎ → ‎ىۛم‎ ) ARABIC LIGATURE THEH WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM # →‎ثم‎→ +FCE5 ; 0649 06DB 0645 ; MA # ( ‎ﳥ‎ → ‎ىۛم‎ ) ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM # →‎ثم‎→ +FC78 ; 0649 06DB 0645 ; MA # ( ‎ﱸ‎ → ‎ىۛم‎ ) ARABIC LIGATURE THEH WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM # →‎ثم‎→ +FC12 ; 0649 06DB 0645 ; MA # ( ‎ﰒ‎ → ‎ىۛم‎ ) ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM # →‎ثم‎→ + +FD9D ; 0649 0645 0645 ; MA # ( ‎ﶝ‎ → ‎ىمم‎ ) ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER MEEM # →‎يمم‎→ +FD9C ; 0649 0645 0645 ; MA # ( ‎ﶜ‎ → ‎ىمم‎ ) ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER MEEM # →‎يمم‎→ + +FDB0 ; 0649 0645 0649 ; MA # ( ‎ﶰ‎ → ‎ىمى‎ ) ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA # →‎يمي‎→ + +FC94 ; 0649 0646 ; MA # ( ‎ﲔ‎ → ‎ىن‎ ) ARABIC LIGATURE YEH WITH NOON FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER NOON # →‎ين‎→ + +FC79 ; 0649 06DB 0646 ; MA # ( ‎ﱹ‎ → ‎ىۛن‎ ) ARABIC LIGATURE THEH WITH NOON FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER NOON # →‎ثن‎→ + +FC95 ; 0649 0649 ; MA # ( ‎ﲕ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA # →‎يى‎→ +FC59 ; 0649 0649 ; MA # ( ‎ﱙ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA # →‎يى‎→ +FC96 ; 0649 0649 ; MA # ( ‎ﲖ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA # →‎يي‎→ +FC5A ; 0649 0649 ; MA # ( ‎ﱚ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA # →‎يي‎→ + +FC7A ; 0649 06DB 0649 ; MA # ( ‎ﱺ‎ → ‎ىۛى‎ ) ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA # →‎ثى‎→ +FC13 ; 0649 06DB 0649 ; MA # ( ‎ﰓ‎ → ‎ىۛى‎ ) ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA # →‎ثى‎→ +FC7B ; 0649 06DB 0649 ; MA # ( ‎ﱻ‎ → ‎ىۛى‎ ) ARABIC LIGATURE THEH WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA # →‎ثي‎→ +FC14 ; 0649 06DB 0649 ; MA # ( ‎ﰔ‎ → ‎ىۛى‎ ) ARABIC LIGATURE THEH WITH YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA # →‎ثي‎→ + +FBB1 ; 06D3 ; MA # ( ‎ﮱ‎ → ‎ۓ‎ ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER YEH BARREE WITH HAMZA ABOVE # +FBB0 ; 06D3 ; MA # ( ‎ﮰ‎ → ‎ۓ‎ ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER YEH BARREE WITH HAMZA ABOVE # + +102B8 ; 2D40 ; MA # ( 𐊸 → ⵀ ) CARIAN LETTER SS → TIFINAGH LETTER YAH # + +205E ; 2D42 ; MA #* ( ⁞ → ⵂ ) VERTICAL FOUR DOTS → TIFINAGH LETTER TUAREG YAH # +2E3D ; 2D42 ; MA #* ( ⸽ → ⵂ ) VERTICAL SIX DOTS → TIFINAGH LETTER TUAREG YAH # →⁞→ +2999 ; 2D42 ; MA #* ( ⦙ → ⵂ ) DOTTED FENCE → TIFINAGH LETTER TUAREG YAH # →⁞→ + +FE19 ; 2D57 ; MA #* ( ︙ → ⵗ ) PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS → TIFINAGH LETTER TUAREG YAGH # →⁝→ +205D ; 2D57 ; MA #* ( ⁝ → ⵗ ) TRICOLON → TIFINAGH LETTER TUAREG YAGH # +22EE ; 2D57 ; MA #* ( ⋮ → ⵗ ) VERTICAL ELLIPSIS → TIFINAGH LETTER TUAREG YAGH # →︙→→⁝→ + +0906 ; 0905 093E ; MA # ( आ → अा ) DEVANAGARI LETTER AA → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA # + +0912 ; 0905 093E 0946 ; MA # ( ऒ → अाॆ ) DEVANAGARI LETTER SHORT O → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN SHORT E # →अॊ→→आॆ→ + +0913 ; 0905 093E 0947 ; MA # ( ओ → अाे ) DEVANAGARI LETTER O → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN E # →अो→→आे→ + +0914 ; 0905 093E 0948 ; MA # ( औ → अाै ) DEVANAGARI LETTER AU → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN AI # →अौ→→आै→ + +0904 ; 0905 0946 ; MA # ( ऄ → अॆ ) DEVANAGARI LETTER SHORT A → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN SHORT E # + +0911 ; 0905 0949 ; MA # ( ऑ → अॉ ) DEVANAGARI LETTER CANDRA O → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN CANDRA O # + +090D ; 090F 0945 ; MA # ( ऍ → एॅ ) DEVANAGARI LETTER CANDRA E → DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN CANDRA E # + +090E ; 090F 0946 ; MA # ( ऎ → एॆ ) DEVANAGARI LETTER SHORT E → DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN SHORT E # + +0910 ; 090F 0947 ; MA # ( ऐ → एे ) DEVANAGARI LETTER AI → DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN E # + +0908 ; 0930 094D 0907 ; MA # ( ई → र्इ ) DEVANAGARI LETTER II → DEVANAGARI LETTER RA, DEVANAGARI SIGN VIRAMA, DEVANAGARI LETTER I # + +0ABD ; 093D ; MA # ( ઽ → ऽ ) GUJARATI SIGN AVAGRAHA → DEVANAGARI SIGN AVAGRAHA # + +111DC ; A8FB ; MA # ( 𑇜 → ꣻ ) SHARADA HEADSTROKE → DEVANAGARI HEADSTROKE # + +0AC1 ; 0941 ; MA # ( ુ → ु ) GUJARATI VOWEL SIGN U → DEVANAGARI VOWEL SIGN U # + +0AC2 ; 0942 ; MA # ( ૂ → ू ) GUJARATI VOWEL SIGN UU → DEVANAGARI VOWEL SIGN UU # + +0A4B ; 0946 ; MA # ( ੋ → ॆ ) GURMUKHI VOWEL SIGN OO → DEVANAGARI VOWEL SIGN SHORT E # + +0A4D ; 094D ; MA # ( ੍ → ् ) GURMUKHI SIGN VIRAMA → DEVANAGARI SIGN VIRAMA # +0ACD ; 094D ; MA # ( ્ → ् ) GUJARATI SIGN VIRAMA → DEVANAGARI SIGN VIRAMA # + +0986 ; 0985 09BE ; MA # ( আ → অা ) BENGALI LETTER AA → BENGALI LETTER A, BENGALI VOWEL SIGN AA # + +09E0 ; 098B 09C3 ; MA # ( ৠ → ঋৃ ) BENGALI LETTER VOCALIC RR → BENGALI LETTER VOCALIC R, BENGALI VOWEL SIGN VOCALIC R # +09E1 ; 098B 09C3 ; MA # ( ৡ → ঋৃ ) BENGALI LETTER VOCALIC LL → BENGALI LETTER VOCALIC R, BENGALI VOWEL SIGN VOCALIC R # →ঌৢ→→ৠ→ + +11492 ; 0998 ; MA # ( 𑒒 → ঘ ) TIRHUTA LETTER GHA → BENGALI LETTER GHA # + +11494 ; 099A ; MA # ( 𑒔 → চ ) TIRHUTA LETTER CA → BENGALI LETTER CA # + +11496 ; 099C ; MA # ( 𑒖 → জ ) TIRHUTA LETTER JA → BENGALI LETTER JA # + +11498 ; 099E ; MA # ( 𑒘 → ঞ ) TIRHUTA LETTER NYA → BENGALI LETTER NYA # + +11499 ; 099F ; MA # ( 𑒙 → ট ) TIRHUTA LETTER TTA → BENGALI LETTER TTA # + +1149B ; 09A1 ; MA # ( 𑒛 → ড ) TIRHUTA LETTER DDA → BENGALI LETTER DDA # + +114AA ; 09A3 ; MA # ( 𑒪 → ণ ) TIRHUTA LETTER LA → BENGALI LETTER NNA # + +1149E ; 09A4 ; MA # ( 𑒞 → ত ) TIRHUTA LETTER TA → BENGALI LETTER TA # + +1149F ; 09A5 ; MA # ( 𑒟 → থ ) TIRHUTA LETTER THA → BENGALI LETTER THA # + +114A0 ; 09A6 ; MA # ( 𑒠 → দ ) TIRHUTA LETTER DA → BENGALI LETTER DA # + +114A1 ; 09A7 ; MA # ( 𑒡 → ধ ) TIRHUTA LETTER DHA → BENGALI LETTER DHA # + +114A2 ; 09A8 ; MA # ( 𑒢 → ন ) TIRHUTA LETTER NA → BENGALI LETTER NA # + +114A3 ; 09AA ; MA # ( 𑒣 → প ) TIRHUTA LETTER PA → BENGALI LETTER PA # + +114A9 ; 09AC ; MA # ( 𑒩 → ব ) TIRHUTA LETTER RA → BENGALI LETTER BA # + +114A7 ; 09AE ; MA # ( 𑒧 → ম ) TIRHUTA LETTER MA → BENGALI LETTER MA # + +114A8 ; 09AF ; MA # ( 𑒨 → য ) TIRHUTA LETTER YA → BENGALI LETTER YA # + +114AB ; 09B0 ; MA # ( 𑒫 → র ) TIRHUTA LETTER VA → BENGALI LETTER RA # + +1149D ; 09B2 ; MA # ( 𑒝 → ল ) TIRHUTA LETTER NNA → BENGALI LETTER LA # + +114AD ; 09B7 ; MA # ( 𑒭 → ষ ) TIRHUTA LETTER SSA → BENGALI LETTER SSA # + +114AE ; 09B8 ; MA # ( 𑒮 → স ) TIRHUTA LETTER SA → BENGALI LETTER SA # + +114C4 ; 09BD ; MA # ( 𑓄 → ঽ ) TIRHUTA SIGN AVAGRAHA → BENGALI SIGN AVAGRAHA # + +114B0 ; 09BE ; MA # ( 𑒰 → া ) TIRHUTA VOWEL SIGN AA → BENGALI VOWEL SIGN AA # + +114B1 ; 09BF ; MA # ( 𑒱 → ি ) TIRHUTA VOWEL SIGN I → BENGALI VOWEL SIGN I # + +114B9 ; 09C7 ; MA # ( 𑒹 → ে ) TIRHUTA VOWEL SIGN E → BENGALI VOWEL SIGN E # + +114BC ; 09CB ; MA # ( 𑒼 → ো ) TIRHUTA VOWEL SIGN O → BENGALI VOWEL SIGN O # + +114BE ; 09CC ; MA # ( 𑒾 → ৌ ) TIRHUTA VOWEL SIGN AU → BENGALI VOWEL SIGN AU # + +114C2 ; 09CD ; MA # ( 𑓂 → ্ ) TIRHUTA SIGN VIRAMA → BENGALI SIGN VIRAMA # + +114BD ; 09D7 ; MA # ( 𑒽 → ৗ ) TIRHUTA VOWEL SIGN SHORT O → BENGALI AU LENGTH MARK # + +0A09 ; 0A73 0A41 ; MA # ( ਉ → ੳੁ ) GURMUKHI LETTER U → GURMUKHI URA, GURMUKHI VOWEL SIGN U # + +0A0A ; 0A73 0A42 ; MA # ( ਊ → ੳੂ ) GURMUKHI LETTER UU → GURMUKHI URA, GURMUKHI VOWEL SIGN UU # + +0A06 ; 0A05 0A3E ; MA # ( ਆ → ਅਾ ) GURMUKHI LETTER AA → GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AA # + +0A10 ; 0A05 0A48 ; MA # ( ਐ → ਅੈ ) GURMUKHI LETTER AI → GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AI # + +0A14 ; 0A05 0A4C ; MA # ( ਔ → ਅੌ ) GURMUKHI LETTER AU → GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AU # + +0A07 ; 0A72 0A3F ; MA # ( ਇ → ੲਿ ) GURMUKHI LETTER I → GURMUKHI IRI, GURMUKHI VOWEL SIGN I # + +0A08 ; 0A72 0A40 ; MA # ( ਈ → ੲੀ ) GURMUKHI LETTER II → GURMUKHI IRI, GURMUKHI VOWEL SIGN II # + +0A0F ; 0A72 0A47 ; MA # ( ਏ → ੲੇ ) GURMUKHI LETTER EE → GURMUKHI IRI, GURMUKHI VOWEL SIGN EE # + +0A86 ; 0A85 0ABE ; MA # ( આ → અા ) GUJARATI LETTER AA → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA # + +0A91 ; 0A85 0ABE 0AC5 ; MA # ( ઑ → અાૅ ) GUJARATI VOWEL CANDRA O → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN CANDRA E # →અૉ→→આૅ→ + +0A93 ; 0A85 0ABE 0AC7 ; MA # ( ઓ → અાે ) GUJARATI LETTER O → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN E # →અો→→આે→ + +0A94 ; 0A85 0ABE 0AC8 ; MA # ( ઔ → અાૈ ) GUJARATI LETTER AU → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN AI # →અૌ→→આૈ→ + +0A8D ; 0A85 0AC5 ; MA # ( ઍ → અૅ ) GUJARATI VOWEL CANDRA E → GUJARATI LETTER A, GUJARATI VOWEL SIGN CANDRA E # + +0A8F ; 0A85 0AC7 ; MA # ( એ → અે ) GUJARATI LETTER E → GUJARATI LETTER A, GUJARATI VOWEL SIGN E # + +0A90 ; 0A85 0AC8 ; MA # ( ઐ → અૈ ) GUJARATI LETTER AI → GUJARATI LETTER A, GUJARATI VOWEL SIGN AI # + +0B06 ; 0B05 0B3E ; MA # ( ଆ → ଅା ) ORIYA LETTER AA → ORIYA LETTER A, ORIYA VOWEL SIGN AA # + +0BEE ; 0B85 ; MA # ( ௮ → அ ) TAMIL DIGIT EIGHT → TAMIL LETTER A # + +0BB0 ; 0B88 ; MA # ( ர → ஈ ) TAMIL LETTER RA → TAMIL LETTER II # →ா→ +0BBE ; 0B88 ; MA # ( ா → ஈ ) TAMIL VOWEL SIGN AA → TAMIL LETTER II # + +0BEB ; 0B88 0BC1 ; MA # ( ௫ → ஈு ) TAMIL DIGIT FIVE → TAMIL LETTER II, TAMIL VOWEL SIGN U # →ரு→ + +0BE8 ; 0B89 ; MA # ( ௨ → உ ) TAMIL DIGIT TWO → TAMIL LETTER U # +0D09 ; 0B89 ; MA # ( ഉ → உ ) MALAYALAM LETTER U → TAMIL LETTER U # + +0B8A ; 0B89 0BB3 ; MA # ( ஊ → உள ) TAMIL LETTER UU → TAMIL LETTER U, TAMIL LETTER LLA # + +0D0A ; 0B89 0D57 ; MA # ( ഊ → உൗ ) MALAYALAM LETTER UU → TAMIL LETTER U, MALAYALAM AU LENGTH MARK # →ഉൗ→ + +0BED ; 0B8E ; MA # ( ௭ → எ ) TAMIL DIGIT SEVEN → TAMIL LETTER E # + +0BF7 ; 0B8E 0BB5 ; MA #* ( ௷ → எவ ) TAMIL CREDIT SIGN → TAMIL LETTER E, TAMIL LETTER VA # + +0B9C ; 0B90 ; MA # ( ஜ → ஐ ) TAMIL LETTER JA → TAMIL LETTER AI # +0D1C ; 0B90 ; MA # ( ജ → ஐ ) MALAYALAM LETTER JA → TAMIL LETTER AI # →ஜ→ + +0BE7 ; 0B95 ; MA # ( ௧ → க ) TAMIL DIGIT ONE → TAMIL LETTER KA # + +0BEA ; 0B9A ; MA # ( ௪ → ச ) TAMIL DIGIT FOUR → TAMIL LETTER CA # + +0BEC ; 0B9A 0BC1 ; MA # ( ௬ → சு ) TAMIL DIGIT SIX → TAMIL LETTER CA, TAMIL VOWEL SIGN U # + +0BF2 ; 0B9A 0BC2 ; MA #* ( ௲ → சூ ) TAMIL NUMBER ONE THOUSAND → TAMIL LETTER CA, TAMIL VOWEL SIGN UU # + +0D3A ; 0B9F 0BBF ; MA # ( ഺ → டி ) MALAYALAM LETTER TTTA → TAMIL LETTER TTA, TAMIL VOWEL SIGN I # + +0D23 ; 0BA3 ; MA # ( ണ → ண ) MALAYALAM LETTER NNA → TAMIL LETTER NNA # + +0BFA ; 0BA8 0BC0 ; MA #* ( ௺ → நீ ) TAMIL NUMBER SIGN → TAMIL LETTER NA, TAMIL VOWEL SIGN II # + +0BF4 ; 0BAE 0BC0 ; MA #* ( ௴ → மீ ) TAMIL MONTH SIGN → TAMIL LETTER MA, TAMIL VOWEL SIGN II # + +0BF0 ; 0BAF ; MA #* ( ௰ → ய ) TAMIL NUMBER TEN → TAMIL LETTER YA # + +0D34 ; 0BB4 ; MA # ( ഴ → ழ ) MALAYALAM LETTER LLLA → TAMIL LETTER LLLA # + +0BD7 ; 0BB3 ; MA # ( ௗ → ள ) TAMIL AU LENGTH MARK → TAMIL LETTER LLA # + +0BC8 ; 0BA9 ; MA # ( ை → ன ) TAMIL VOWEL SIGN AI → TAMIL LETTER NNNA # + +0D36 ; 0BB6 ; MA # ( ശ → ஶ ) MALAYALAM LETTER SHA → TAMIL LETTER SHA # + +0BF8 ; 0BB7 ; MA #* ( ௸ → ஷ ) TAMIL AS ABOVE SIGN → TAMIL LETTER SSA # + +0D3F ; 0BBF ; MA # ( ി → ி ) MALAYALAM VOWEL SIGN I → TAMIL VOWEL SIGN I # +0D40 ; 0BBF ; MA # ( ീ → ி ) MALAYALAM VOWEL SIGN II → TAMIL VOWEL SIGN I # + +0BCA ; 0BC6 0B88 ; MA # ( ொ → ெஈ ) TAMIL VOWEL SIGN O → TAMIL VOWEL SIGN E, TAMIL LETTER II # →ெர→ + +0BCC ; 0BC6 0BB3 ; MA # ( ௌ → ெள ) TAMIL VOWEL SIGN AU → TAMIL VOWEL SIGN E, TAMIL LETTER LLA # + +0BCB ; 0BC7 0B88 ; MA # ( ோ → ேஈ ) TAMIL VOWEL SIGN OO → TAMIL VOWEL SIGN EE, TAMIL LETTER II # →ேர→ + +0C85 ; 0C05 ; MA # ( ಅ → అ ) KANNADA LETTER A → TELUGU LETTER A # + +0C86 ; 0C06 ; MA # ( ಆ → ఆ ) KANNADA LETTER AA → TELUGU LETTER AA # + +0C87 ; 0C07 ; MA # ( ಇ → ఇ ) KANNADA LETTER I → TELUGU LETTER I # + +0C60 ; 0C0B 0C3E ; MA # ( ౠ → ఋా ) TELUGU LETTER VOCALIC RR → TELUGU LETTER VOCALIC R, TELUGU VOWEL SIGN AA # + +0C61 ; 0C0C 0C3E ; MA # ( ౡ → ఌా ) TELUGU LETTER VOCALIC LL → TELUGU LETTER VOCALIC L, TELUGU VOWEL SIGN AA # + +0C92 ; 0C12 ; MA # ( ಒ → ఒ ) KANNADA LETTER O → TELUGU LETTER O # + +0C14 ; 0C12 0C4C ; MA # ( ఔ → ఒౌ ) TELUGU LETTER AU → TELUGU LETTER O, TELUGU VOWEL SIGN AU # +0C94 ; 0C12 0C4C ; MA # ( ಔ → ఒౌ ) KANNADA LETTER AU → TELUGU LETTER O, TELUGU VOWEL SIGN AU # →ఔ→ + +0C13 ; 0C12 0C55 ; MA # ( ఓ → ఒౕ ) TELUGU LETTER OO → TELUGU LETTER O, TELUGU LENGTH MARK # +0C93 ; 0C12 0C55 ; MA # ( ಓ → ఒౕ ) KANNADA LETTER OO → TELUGU LETTER O, TELUGU LENGTH MARK # →ఓ→ + +0C9C ; 0C1C ; MA # ( ಜ → జ ) KANNADA LETTER JA → TELUGU LETTER JA # + +0C9E ; 0C1E ; MA # ( ಞ → ఞ ) KANNADA LETTER NYA → TELUGU LETTER NYA # + +0C22 ; 0C21 0323 ; MA # ( ఢ → డ̣ ) TELUGU LETTER DDHA → TELUGU LETTER DDA, COMBINING DOT BELOW # + +0CA3 ; 0C23 ; MA # ( ಣ → ణ ) KANNADA LETTER NNA → TELUGU LETTER NNA # + +0C25 ; 0C27 05BC ; MA # ( థ → ధּ ) TELUGU LETTER THA → TELUGU LETTER DHA, HEBREW POINT DAGESH OR MAPIQ # + +0C2D ; 0C2C 0323 ; MA # ( భ → బ̣ ) TELUGU LETTER BHA → TELUGU LETTER BA, COMBINING DOT BELOW # + +0CAF ; 0C2F ; MA # ( ಯ → య ) KANNADA LETTER YA → TELUGU LETTER YA # + +0C20 ; 0C30 05BC ; MA # ( ఠ → రּ ) TELUGU LETTER TTHA → TELUGU LETTER RA, HEBREW POINT DAGESH OR MAPIQ # + +0CB1 ; 0C31 ; MA # ( ಱ → ఱ ) KANNADA LETTER RRA → TELUGU LETTER RRA # + +0CB2 ; 0C32 ; MA # ( ಲ → ల ) KANNADA LETTER LA → TELUGU LETTER LA # + +0C37 ; 0C35 0323 ; MA # ( ష → వ̣ ) TELUGU LETTER SSA → TELUGU LETTER VA, COMBINING DOT BELOW # + +0C39 ; 0C35 0C3E ; MA # ( హ → వా ) TELUGU LETTER HA → TELUGU LETTER VA, TELUGU VOWEL SIGN AA # + +0C2E ; 0C35 0C41 ; MA # ( మ → వు ) TELUGU LETTER MA → TELUGU LETTER VA, TELUGU VOWEL SIGN U # + +0C42 ; 0C41 0C3E ; MA # ( ూ → ుా ) TELUGU VOWEL SIGN UU → TELUGU VOWEL SIGN U, TELUGU VOWEL SIGN AA # + +0C44 ; 0C43 0C3E ; MA # ( ౄ → ృా ) TELUGU VOWEL SIGN VOCALIC RR → TELUGU VOWEL SIGN VOCALIC R, TELUGU VOWEL SIGN AA # + +0CE1 ; 0C8C 0CBE ; MA # ( ೡ → ಌಾ ) KANNADA LETTER VOCALIC LL → KANNADA LETTER VOCALIC L, KANNADA VOWEL SIGN AA # + +0D08 ; 0D07 0D57 ; MA # ( ഈ → ഇൗ ) MALAYALAM LETTER II → MALAYALAM LETTER I, MALAYALAM AU LENGTH MARK # + +0D10 ; 0D0E 0D46 ; MA # ( ഐ → എെ ) MALAYALAM LETTER AI → MALAYALAM LETTER E, MALAYALAM VOWEL SIGN E # + +0D13 ; 0D12 0D3E ; MA # ( ഓ → ഒാ ) MALAYALAM LETTER OO → MALAYALAM LETTER O, MALAYALAM VOWEL SIGN AA # + +0D14 ; 0D12 0D57 ; MA # ( ഔ → ഒൗ ) MALAYALAM LETTER AU → MALAYALAM LETTER O, MALAYALAM AU LENGTH MARK # + +0D61 ; 0D1E ; MA # ( ൡ → ഞ ) MALAYALAM LETTER VOCALIC LL → MALAYALAM LETTER NYA # + +0D6B ; 0D26 0D4D 0D30 ; MA # ( ൫ → ദ്ര ) MALAYALAM DIGIT FIVE → MALAYALAM LETTER DA, MALAYALAM SIGN VIRAMA, MALAYALAM LETTER RA # + +0D0C ; 0D28 0D41 ; MA # ( ഌ → നു ) MALAYALAM LETTER VOCALIC L → MALAYALAM LETTER NA, MALAYALAM VOWEL SIGN U # +0D19 ; 0D28 0D41 ; MA # ( ങ → നു ) MALAYALAM LETTER NGA → MALAYALAM LETTER NA, MALAYALAM VOWEL SIGN U # →ഌ→ + +0D6F ; 0D28 0D4D ; MA # ( ൯ → ന് ) MALAYALAM DIGIT NINE → MALAYALAM LETTER NA, MALAYALAM SIGN VIRAMA # + +0D8C ; 0D28 0D4D 0D28 ; MA # ( ඌ → ന്ന ) SINHALA LETTER UUYANNA → MALAYALAM LETTER NA, MALAYALAM SIGN VIRAMA, MALAYALAM LETTER NA # + +0D31 ; 0D30 ; MA # ( റ → ര ) MALAYALAM LETTER RRA → MALAYALAM LETTER RA # + +0D6A ; 0D30 0D4D ; MA # ( ൪ → ര് ) MALAYALAM DIGIT FOUR → MALAYALAM LETTER RA, MALAYALAM SIGN VIRAMA # + +0D6E ; 0D35 0D4D ; MA # ( ൮ → വ് ) MALAYALAM DIGIT EIGHT → MALAYALAM LETTER VA, MALAYALAM SIGN VIRAMA # + +0D42 ; 0D41 ; MA # ( ൂ → ു ) MALAYALAM VOWEL SIGN UU → MALAYALAM VOWEL SIGN U # +0D43 ; 0D41 ; MA # ( ൃ → ു ) MALAYALAM VOWEL SIGN VOCALIC R → MALAYALAM VOWEL SIGN U # →ൂ→ + +0D48 ; 0D46 0D46 ; MA # ( ൈ → െെ ) MALAYALAM VOWEL SIGN AI → MALAYALAM VOWEL SIGN E, MALAYALAM VOWEL SIGN E # + +0DEA ; 0DA2 ; MA # ( ෪ → ජ ) SINHALA LITH DIGIT FOUR → SINHALA LETTER ALPAPRAANA JAYANNA # + +0DEB ; 0DAF ; MA # ( ෫ → ද ) SINHALA LITH DIGIT FIVE → SINHALA LETTER ALPAPRAANA DAYANNA # + +115D8 ; 11582 ; MA # ( 𑗘 → 𑖂 ) SIDDHAM LETTER THREE-CIRCLE ALTERNATE I → SIDDHAM LETTER I # +115D9 ; 11582 ; MA # ( 𑗙 → 𑖂 ) SIDDHAM LETTER TWO-CIRCLE ALTERNATE I → SIDDHAM LETTER I # + +115DA ; 11583 ; MA # ( 𑗚 → 𑖃 ) SIDDHAM LETTER TWO-CIRCLE ALTERNATE II → SIDDHAM LETTER II # + +115DB ; 11584 ; MA # ( 𑗛 → 𑖄 ) SIDDHAM LETTER ALTERNATE U → SIDDHAM LETTER U # + +0E03 ; 0E02 ; MA # ( ฃ → ข ) THAI CHARACTER KHO KHUAT → THAI CHARACTER KHO KHAI # + +0E14 ; 0E04 ; MA # ( ด → ค ) THAI CHARACTER DO DEK → THAI CHARACTER KHO KHWAI # +0E15 ; 0E04 ; MA # ( ต → ค ) THAI CHARACTER TO TAO → THAI CHARACTER KHO KHWAI # →ด→ + +0E21 ; 0E06 ; MA # ( ม → ฆ ) THAI CHARACTER MO MA → THAI CHARACTER KHO RAKHANG # + +0E88 ; 0E08 ; MA # ( ຈ → จ ) LAO LETTER CO → THAI CHARACTER CHO CHAN # + +0E0B ; 0E0A ; MA # ( ซ → ช ) THAI CHARACTER SO SO → THAI CHARACTER CHO CHANG # + +0E0F ; 0E0E ; MA # ( ฏ → ฎ ) THAI CHARACTER TO PATAK → THAI CHARACTER DO CHADA # + +0E17 ; 0E11 ; MA # ( ท → ฑ ) THAI CHARACTER THO THAHAN → THAI CHARACTER THO NANGMONTHO # + +0E9A ; 0E1A ; MA # ( ບ → บ ) LAO LETTER BO → THAI CHARACTER BO BAIMAI # + +0E9B ; 0E1B ; MA # ( ປ → ป ) LAO LETTER PO → THAI CHARACTER PO PLA # + +0E9D ; 0E1D ; MA # ( ຝ → ฝ ) LAO LETTER FO TAM → THAI CHARACTER FO FA # + +0E9E ; 0E1E ; MA # ( ພ → พ ) LAO LETTER PHO TAM → THAI CHARACTER PHO PHAN # + +0E9F ; 0E1F ; MA # ( ຟ → ฟ ) LAO LETTER FO SUNG → THAI CHARACTER FO FAN # + +0E26 ; 0E20 ; MA # ( ฦ → ภ ) THAI CHARACTER LU → THAI CHARACTER PHO SAMPHAO # + +0E8D ; 0E22 ; MA # ( ຍ → ย ) LAO LETTER NYO → THAI CHARACTER YO YAK # + +17D4 ; 0E2F ; MA #* ( ។ → ฯ ) KHMER SIGN KHAN → THAI CHARACTER PAIYANNOI # + +0E45 ; 0E32 ; MA # ( ๅ → า ) THAI CHARACTER LAKKHANGYAO → THAI CHARACTER SARA AA # + +0E33 ; 030A 0E32 ; MA # ( ำ → ̊า ) THAI CHARACTER SARA AM → COMBINING RING ABOVE, THAI CHARACTER SARA AA # →ํา→ + +17B7 ; 0E34 ; MA # ( ិ → ิ ) KHMER VOWEL SIGN I → THAI CHARACTER SARA I # + +17B8 ; 0E35 ; MA # ( ី → ี ) KHMER VOWEL SIGN II → THAI CHARACTER SARA II # + +17B9 ; 0E36 ; MA # ( ឹ → ึ ) KHMER VOWEL SIGN Y → THAI CHARACTER SARA UE # + +17BA ; 0E37 ; MA # ( ឺ → ื ) KHMER VOWEL SIGN YY → THAI CHARACTER SARA UEE # + +0EB8 ; 0E38 ; MA # ( ຸ → ุ ) LAO VOWEL SIGN U → THAI CHARACTER SARA U # + +0EB9 ; 0E39 ; MA # ( ູ → ู ) LAO VOWEL SIGN UU → THAI CHARACTER SARA UU # + +0E41 ; 0E40 0E40 ; MA # ( แ → เเ ) THAI CHARACTER SARA AE → THAI CHARACTER SARA E, THAI CHARACTER SARA E # + +0EDC ; 0EAB 0E99 ; MA # ( ໜ → ຫນ ) LAO HO NO → LAO LETTER HO SUNG, LAO LETTER NO # + +0EDD ; 0EAB 0EA1 ; MA # ( ໝ → ຫມ ) LAO HO MO → LAO LETTER HO SUNG, LAO LETTER MO # + +0EB3 ; 030A 0EB2 ; MA # ( ຳ → ̊າ ) LAO VOWEL SIGN AM → COMBINING RING ABOVE, LAO VOWEL SIGN AA # →ໍາ→ + +0F6A ; 0F62 ; MA # ( ཪ → ར ) TIBETAN LETTER FIXED-FORM RA → TIBETAN LETTER RA # + +0F00 ; 0F68 0F7C 0F7E ; MA # ( ༀ → ཨོཾ ) TIBETAN SYLLABLE OM → TIBETAN LETTER A, TIBETAN VOWEL SIGN O, TIBETAN SIGN RJES SU NGA RO # + +0F77 ; 0FB2 0F71 0F80 ; MA # ( ཷ → ྲཱྀ ) TIBETAN VOWEL SIGN VOCALIC RR → TIBETAN SUBJOINED LETTER RA, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN REVERSED I # + +0F79 ; 0FB3 0F71 0F80 ; MA # ( ཹ → ླཱྀ ) TIBETAN VOWEL SIGN VOCALIC LL → TIBETAN SUBJOINED LETTER LA, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN REVERSED I # + +1081 ; 1002 103E ; MA # ( ႁ → ဂှ ) MYANMAR LETTER SHAN HA → MYANMAR LETTER GA, MYANMAR CONSONANT SIGN MEDIAL HA # + +1000 ; 1002 102C ; MA # ( က → ဂာ ) MYANMAR LETTER KA → MYANMAR LETTER GA, MYANMAR VOWEL SIGN AA # + +1070 ; 1003 103E ; MA # ( ၰ → ဃှ ) MYANMAR LETTER EASTERN PWO KAREN GHWA → MYANMAR LETTER GHA, MYANMAR CONSONANT SIGN MEDIAL HA # + +1066 ; 1015 103E ; MA # ( ၦ → ပှ ) MYANMAR LETTER WESTERN PWO KAREN PWA → MYANMAR LETTER PA, MYANMAR CONSONANT SIGN MEDIAL HA # + +101F ; 1015 102C ; MA # ( ဟ → ပာ ) MYANMAR LETTER HA → MYANMAR LETTER PA, MYANMAR VOWEL SIGN AA # + +106F ; 1015 102C 103E ; MA # ( ၯ → ပာှ ) MYANMAR LETTER EASTERN PWO KAREN YWA → MYANMAR LETTER PA, MYANMAR VOWEL SIGN AA, MYANMAR CONSONANT SIGN MEDIAL HA # →ဟှ→ + +102A ; 1029 1031 102C 103A ; MA # ( ဪ → ဩော် ) MYANMAR LETTER AU → MYANMAR LETTER O, MYANMAR VOWEL SIGN E, MYANMAR VOWEL SIGN AA, MYANMAR SIGN ASAT # + +109E ; 1083 030A ; MA #* ( ႞ → ႃ̊ ) MYANMAR SYMBOL SHAN ONE → MYANMAR VOWEL SIGN SHAN AA, COMBINING RING ABOVE # →ႃံ→ + +17A3 ; 17A2 ; MA # ( ឣ → អ ) KHMER INDEPENDENT VOWEL QAQ → KHMER LETTER QA # + +19D0 ; 199E ; MA # ( ᧐ → ᦞ ) NEW TAI LUE DIGIT ZERO → NEW TAI LUE LETTER LOW VA # + +19D1 ; 19B1 ; MA # ( ᧑ → ᦱ ) NEW TAI LUE DIGIT ONE → NEW TAI LUE VOWEL SIGN AA # + +1A80 ; 1A45 ; MA # ( ᪀ → ᩅ ) TAI THAM HORA DIGIT ZERO → TAI THAM LETTER WA # +1A90 ; 1A45 ; MA # ( ᪐ → ᩅ ) TAI THAM THAM DIGIT ZERO → TAI THAM LETTER WA # + +AA53 ; AA01 ; MA # ( ꩓ → ꨁ ) CHAM DIGIT THREE → CHAM LETTER I # + +AA56 ; AA23 ; MA # ( ꩖ → ꨣ ) CHAM DIGIT SIX → CHAM LETTER RA # + +1B52 ; 1B0D ; MA # ( ᭒ → ᬍ ) BALINESE DIGIT TWO → BALINESE LETTER LA LENGA # + +1B53 ; 1B11 ; MA # ( ᭓ → ᬑ ) BALINESE DIGIT THREE → BALINESE LETTER OKARA # + +1B58 ; 1B28 ; MA # ( ᭘ → ᬨ ) BALINESE DIGIT EIGHT → BALINESE LETTER PA KAPAL # + +1896 ; 185C ; MA # ( ᢖ → ᡜ ) MONGOLIAN LETTER ALI GALI ZA → MONGOLIAN LETTER TODO DZA # + +1855 ; 1835 ; MA # ( ᡕ → ᠵ ) MONGOLIAN LETTER TODO YA → MONGOLIAN LETTER JA # + +1FF6 ; 13EF ; MA # ( ῶ → Ꮿ ) GREEK SMALL LETTER OMEGA WITH PERISPOMENI → CHEROKEE LETTER YA # + +140D ; 1401 00B7 ; MA # ( ᐍ → ᐁ· ) CANADIAN SYLLABICS WEST-CREE WE → CANADIAN SYLLABICS E, MIDDLE DOT # →ᐁᐧ→ + +142B ; 1401 1420 ; MA # ( ᐫ → ᐁᐠ ) CANADIAN SYLLABICS EN → CANADIAN SYLLABICS E, CANADIAN SYLLABICS FINAL GRAVE # + +1411 ; 1404 00B7 ; MA # ( ᐑ → ᐄ· ) CANADIAN SYLLABICS WEST-CREE WII → CANADIAN SYLLABICS II, MIDDLE DOT # →ᐄᐧ→ + +1413 ; 1405 00B7 ; MA # ( ᐓ → ᐅ· ) CANADIAN SYLLABICS WEST-CREE WO → CANADIAN SYLLABICS O, MIDDLE DOT # →ᐅᐧ→ + +142D ; 1405 1420 ; MA # ( ᐭ → ᐅᐠ ) CANADIAN SYLLABICS ON → CANADIAN SYLLABICS O, CANADIAN SYLLABICS FINAL GRAVE # + +1415 ; 1406 00B7 ; MA # ( ᐕ → ᐆ· ) CANADIAN SYLLABICS WEST-CREE WOO → CANADIAN SYLLABICS OO, MIDDLE DOT # →ᐆᐧ→ + +1418 ; 140A 00B7 ; MA # ( ᐘ → ᐊ· ) CANADIAN SYLLABICS WEST-CREE WA → CANADIAN SYLLABICS A, MIDDLE DOT # →ᐊᐧ→ + +142E ; 140A 1420 ; MA # ( ᐮ → ᐊᐠ ) CANADIAN SYLLABICS AN → CANADIAN SYLLABICS A, CANADIAN SYLLABICS FINAL GRAVE # + +141A ; 140B 00B7 ; MA # ( ᐚ → ᐋ· ) CANADIAN SYLLABICS WEST-CREE WAA → CANADIAN SYLLABICS AA, MIDDLE DOT # →ᐋᐧ→ + +14D1 ; 1421 ; MA # ( ᓑ → ᐡ ) CANADIAN SYLLABICS CARRIER NG → CANADIAN SYLLABICS FINAL BOTTOM HALF RING # + +1540 ; 1429 ; MA # ( ᕀ → ᐩ ) CANADIAN SYLLABICS WEST-CREE Y → CANADIAN SYLLABICS FINAL PLUS # + +143F ; 1432 00B7 ; MA # ( ᐿ → ᐲ· ) CANADIAN SYLLABICS WEST-CREE PWII → CANADIAN SYLLABICS PII, MIDDLE DOT # →ᐲᐧ→ + +1443 ; 1434 00B7 ; MA # ( ᑃ → ᐴ· ) CANADIAN SYLLABICS WEST-CREE PWOO → CANADIAN SYLLABICS POO, MIDDLE DOT # →ᐴᐧ→ + +2369 ; 1435 ; MA #* ( ⍩ → ᐵ ) APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS → CANADIAN SYLLABICS Y-CREE POO # + +1447 ; 1439 00B7 ; MA # ( ᑇ → ᐹ· ) CANADIAN SYLLABICS WEST-CREE PWAA → CANADIAN SYLLABICS PAA, MIDDLE DOT # →ᐹᐧ→ + +145C ; 144F 00B7 ; MA # ( ᑜ → ᑏ· ) CANADIAN SYLLABICS WEST-CREE TWII → CANADIAN SYLLABICS TII, MIDDLE DOT # →ᑏᐧ→ + +2E27 ; 1450 ; MA #* ( ⸧ → ᑐ ) RIGHT SIDEWAYS U BRACKET → CANADIAN SYLLABICS TO # →⊃→ +2283 ; 1450 ; MA #* ( ⊃ → ᑐ ) SUPERSET OF → CANADIAN SYLLABICS TO # + +145E ; 1450 00B7 ; MA # ( ᑞ → ᑐ· ) CANADIAN SYLLABICS WEST-CREE TWO → CANADIAN SYLLABICS TO, MIDDLE DOT # →ᑐᐧ→ + +1469 ; 1450 0027 ; MA # ( ᑩ → ᑐ' ) CANADIAN SYLLABICS TTO → CANADIAN SYLLABICS TO, APOSTROPHE # →ᑐᑊ→ + +27C9 ; 1450 002F ; MA #* ( ⟉ → ᑐ/ ) SUPERSET PRECEDING SOLIDUS → CANADIAN SYLLABICS TO, SOLIDUS # →⊃/→ + +2AD7 ; 1450 1455 ; MA #* ( ⫗ → ᑐᑕ ) SUPERSET BESIDE SUBSET → CANADIAN SYLLABICS TO, CANADIAN SYLLABICS TA # →⊃⊂→ + +1460 ; 1451 00B7 ; MA # ( ᑠ → ᑑ· ) CANADIAN SYLLABICS WEST-CREE TWOO → CANADIAN SYLLABICS TOO, MIDDLE DOT # →ᑑᐧ→ + +2E26 ; 1455 ; MA #* ( ⸦ → ᑕ ) LEFT SIDEWAYS U BRACKET → CANADIAN SYLLABICS TA # →⊂→ +2282 ; 1455 ; MA #* ( ⊂ → ᑕ ) SUBSET OF → CANADIAN SYLLABICS TA # + +1462 ; 1455 00B7 ; MA # ( ᑢ → ᑕ· ) CANADIAN SYLLABICS WEST-CREE TWA → CANADIAN SYLLABICS TA, MIDDLE DOT # →ᑕᐧ→ + +146A ; 1455 0027 ; MA # ( ᑪ → ᑕ' ) CANADIAN SYLLABICS TTA → CANADIAN SYLLABICS TA, APOSTROPHE # →ᑕᑊ→ + +1464 ; 1456 00B7 ; MA # ( ᑤ → ᑖ· ) CANADIAN SYLLABICS WEST-CREE TWAA → CANADIAN SYLLABICS TAA, MIDDLE DOT # →ᑖᐧ→ + +1475 ; 146B 00B7 ; MA # ( ᑵ → ᑫ· ) CANADIAN SYLLABICS WEST-CREE KWE → CANADIAN SYLLABICS KE, MIDDLE DOT # →ᑫᐧ→ + +1485 ; 146B 0027 ; MA # ( ᒅ → ᑫ' ) CANADIAN SYLLABICS SOUTH-SLAVEY KEH → CANADIAN SYLLABICS KE, APOSTROPHE # →ᑫᑊ→ + +1479 ; 146E 00B7 ; MA # ( ᑹ → ᑮ· ) CANADIAN SYLLABICS WEST-CREE KWII → CANADIAN SYLLABICS KII, MIDDLE DOT # →ᑮᐧ→ + +147D ; 1470 00B7 ; MA # ( ᑽ → ᑰ· ) CANADIAN SYLLABICS WEST-CREE KWOO → CANADIAN SYLLABICS KOO, MIDDLE DOT # →ᑰᐧ→ + +147F ; 1472 00B7 ; MA # ( ᑿ → ᑲ· ) CANADIAN SYLLABICS WEST-CREE KWA → CANADIAN SYLLABICS KA, MIDDLE DOT # →ᑲᐧ→ + +1488 ; 1472 0027 ; MA # ( ᒈ → ᑲ' ) CANADIAN SYLLABICS SOUTH-SLAVEY KAH → CANADIAN SYLLABICS KA, APOSTROPHE # →ᑲᑊ→ + +1481 ; 1473 00B7 ; MA # ( ᒁ → ᑳ· ) CANADIAN SYLLABICS WEST-CREE KWAA → CANADIAN SYLLABICS KAA, MIDDLE DOT # →ᑳᐧ→ + +1603 ; 1489 ; MA # ( ᘃ → ᒉ ) CANADIAN SYLLABICS CARRIER NO → CANADIAN SYLLABICS CE # + +1493 ; 1489 00B7 ; MA # ( ᒓ → ᒉ· ) CANADIAN SYLLABICS WEST-CREE CWE → CANADIAN SYLLABICS CE, MIDDLE DOT # →ᒉᐧ→ + +1495 ; 148B 00B7 ; MA # ( ᒕ → ᒋ· ) CANADIAN SYLLABICS WEST-CREE CWI → CANADIAN SYLLABICS CI, MIDDLE DOT # →ᒋᐧ→ + +1497 ; 148C 00B7 ; MA # ( ᒗ → ᒌ· ) CANADIAN SYLLABICS WEST-CREE CWII → CANADIAN SYLLABICS CII, MIDDLE DOT # →ᒌᐧ→ + +149B ; 148E 00B7 ; MA # ( ᒛ → ᒎ· ) CANADIAN SYLLABICS WEST-CREE CWOO → CANADIAN SYLLABICS COO, MIDDLE DOT # →ᒎᐧ→ + +1602 ; 1490 ; MA # ( ᘂ → ᒐ ) CANADIAN SYLLABICS CARRIER NU → CANADIAN SYLLABICS CA # + +149D ; 1490 00B7 ; MA # ( ᒝ → ᒐ· ) CANADIAN SYLLABICS WEST-CREE CWA → CANADIAN SYLLABICS CA, MIDDLE DOT # →ᒐᐧ→ + +149F ; 1491 00B7 ; MA # ( ᒟ → ᒑ· ) CANADIAN SYLLABICS WEST-CREE CWAA → CANADIAN SYLLABICS CAA, MIDDLE DOT # →ᒑᐧ→ + +14AD ; 14A3 00B7 ; MA # ( ᒭ → ᒣ· ) CANADIAN SYLLABICS WEST-CREE MWE → CANADIAN SYLLABICS ME, MIDDLE DOT # →ᒣᐧ→ + +14B1 ; 14A6 00B7 ; MA # ( ᒱ → ᒦ· ) CANADIAN SYLLABICS WEST-CREE MWII → CANADIAN SYLLABICS MII, MIDDLE DOT # →ᒦᐧ→ + +14B3 ; 14A7 00B7 ; MA # ( ᒳ → ᒧ· ) CANADIAN SYLLABICS WEST-CREE MWO → CANADIAN SYLLABICS MO, MIDDLE DOT # →ᒧᐧ→ + +14B5 ; 14A8 00B7 ; MA # ( ᒵ → ᒨ· ) CANADIAN SYLLABICS WEST-CREE MWOO → CANADIAN SYLLABICS MOO, MIDDLE DOT # →ᒨᐧ→ + +14B9 ; 14AB 00B7 ; MA # ( ᒹ → ᒫ· ) CANADIAN SYLLABICS WEST-CREE MWAA → CANADIAN SYLLABICS MAA, MIDDLE DOT # →ᒫᐧ→ + +14CA ; 14C0 00B7 ; MA # ( ᓊ → ᓀ· ) CANADIAN SYLLABICS WEST-CREE NWE → CANADIAN SYLLABICS NE, MIDDLE DOT # →ᓀᐧ→ + +14CC ; 14C7 00B7 ; MA # ( ᓌ → ᓇ· ) CANADIAN SYLLABICS WEST-CREE NWA → CANADIAN SYLLABICS NA, MIDDLE DOT # →ᓇᐧ→ + +14CE ; 14C8 00B7 ; MA # ( ᓎ → ᓈ· ) CANADIAN SYLLABICS WEST-CREE NWAA → CANADIAN SYLLABICS NAA, MIDDLE DOT # →ᓈᐧ→ + +1604 ; 14D3 ; MA # ( ᘄ → ᓓ ) CANADIAN SYLLABICS CARRIER NE → CANADIAN SYLLABICS LE # + +14DD ; 14D3 00B7 ; MA # ( ᓝ → ᓓ· ) CANADIAN SYLLABICS WEST-CREE LWE → CANADIAN SYLLABICS LE, MIDDLE DOT # →ᓓᐧ→ + +14DF ; 14D5 00B7 ; MA # ( ᓟ → ᓕ· ) CANADIAN SYLLABICS WEST-CREE LWI → CANADIAN SYLLABICS LI, MIDDLE DOT # →ᓕᐧ→ + +14E1 ; 14D6 00B7 ; MA # ( ᓡ → ᓖ· ) CANADIAN SYLLABICS WEST-CREE LWII → CANADIAN SYLLABICS LII, MIDDLE DOT # →ᓖᐧ→ + +14E3 ; 14D7 00B7 ; MA # ( ᓣ → ᓗ· ) CANADIAN SYLLABICS WEST-CREE LWO → CANADIAN SYLLABICS LO, MIDDLE DOT # →ᓗᐧ→ + +14E5 ; 14D8 00B7 ; MA # ( ᓥ → ᓘ· ) CANADIAN SYLLABICS WEST-CREE LWOO → CANADIAN SYLLABICS LOO, MIDDLE DOT # →ᓘᐧ→ + +1607 ; 14DA ; MA # ( ᘇ → ᓚ ) CANADIAN SYLLABICS CARRIER NA → CANADIAN SYLLABICS LA # + +14E7 ; 14DA 00B7 ; MA # ( ᓧ → ᓚ· ) CANADIAN SYLLABICS WEST-CREE LWA → CANADIAN SYLLABICS LA, MIDDLE DOT # →ᓚᐧ→ + +14E9 ; 14DB 00B7 ; MA # ( ᓩ → ᓛ· ) CANADIAN SYLLABICS WEST-CREE LWAA → CANADIAN SYLLABICS LAA, MIDDLE DOT # →ᓛᐧ→ + +14F7 ; 14ED 00B7 ; MA # ( ᓷ → ᓭ· ) CANADIAN SYLLABICS WEST-CREE SWE → CANADIAN SYLLABICS SE, MIDDLE DOT # →ᓭᐧ→ + +14F9 ; 14EF 00B7 ; MA # ( ᓹ → ᓯ· ) CANADIAN SYLLABICS WEST-CREE SWI → CANADIAN SYLLABICS SI, MIDDLE DOT # →ᓯᐧ→ + +14FB ; 14F0 00B7 ; MA # ( ᓻ → ᓰ· ) CANADIAN SYLLABICS WEST-CREE SWII → CANADIAN SYLLABICS SII, MIDDLE DOT # →ᓰᐧ→ + +14FD ; 14F1 00B7 ; MA # ( ᓽ → ᓱ· ) CANADIAN SYLLABICS WEST-CREE SWO → CANADIAN SYLLABICS SO, MIDDLE DOT # →ᓱᐧ→ + +14FF ; 14F2 00B7 ; MA # ( ᓿ → ᓲ· ) CANADIAN SYLLABICS WEST-CREE SWOO → CANADIAN SYLLABICS SOO, MIDDLE DOT # →ᓲᐧ→ + +1501 ; 14F4 00B7 ; MA # ( ᔁ → ᓴ· ) CANADIAN SYLLABICS WEST-CREE SWA → CANADIAN SYLLABICS SA, MIDDLE DOT # →ᓴᐧ→ + +1503 ; 14F5 00B7 ; MA # ( ᔃ → ᓵ· ) CANADIAN SYLLABICS WEST-CREE SWAA → CANADIAN SYLLABICS SAA, MIDDLE DOT # →ᓵᐧ→ + +150C ; 150B 003C ; MA # ( ᔌ → ᔋ< ) CANADIAN SYLLABICS NASKAPI SPWA → CANADIAN SYLLABICS NASKAPI S-W, LESS-THAN SIGN # →ᔋᐸ→ + +150D ; 150B 1455 ; MA # ( ᔍ → ᔋᑕ ) CANADIAN SYLLABICS NASKAPI STWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS TA # + +150E ; 150B 1472 ; MA # ( ᔎ → ᔋᑲ ) CANADIAN SYLLABICS NASKAPI SKWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS KA # + +150F ; 150B 1490 ; MA # ( ᔏ → ᔋᒐ ) CANADIAN SYLLABICS NASKAPI SCWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS CA # + +1518 ; 1510 00B7 ; MA # ( ᔘ → ᔐ· ) CANADIAN SYLLABICS WEST-CREE SHWE → CANADIAN SYLLABICS SHE, MIDDLE DOT # →ᔐᐧ→ + +151A ; 1511 00B7 ; MA # ( ᔚ → ᔑ· ) CANADIAN SYLLABICS WEST-CREE SHWI → CANADIAN SYLLABICS SHI, MIDDLE DOT # →ᔑᐧ→ + +151C ; 1512 00B7 ; MA # ( ᔜ → ᔒ· ) CANADIAN SYLLABICS WEST-CREE SHWII → CANADIAN SYLLABICS SHII, MIDDLE DOT # →ᔒᐧ→ + +151E ; 1513 00B7 ; MA # ( ᔞ → ᔓ· ) CANADIAN SYLLABICS WEST-CREE SHWO → CANADIAN SYLLABICS SHO, MIDDLE DOT # →ᔓᐧ→ + +1520 ; 1514 00B7 ; MA # ( ᔠ → ᔔ· ) CANADIAN SYLLABICS WEST-CREE SHWOO → CANADIAN SYLLABICS SHOO, MIDDLE DOT # →ᔔᐧ→ + +1522 ; 1515 00B7 ; MA # ( ᔢ → ᔕ· ) CANADIAN SYLLABICS WEST-CREE SHWA → CANADIAN SYLLABICS SHA, MIDDLE DOT # →ᔕᐧ→ + +1524 ; 1516 00B7 ; MA # ( ᔤ → ᔖ· ) CANADIAN SYLLABICS WEST-CREE SHWAA → CANADIAN SYLLABICS SHAA, MIDDLE DOT # →ᔖᐧ→ + +1532 ; 1528 00B7 ; MA # ( ᔲ → ᔨ· ) CANADIAN SYLLABICS WEST-CREE YWI → CANADIAN SYLLABICS YI, MIDDLE DOT # →ᔨᐧ→ + +1534 ; 1529 00B7 ; MA # ( ᔴ → ᔩ· ) CANADIAN SYLLABICS WEST-CREE YWII → CANADIAN SYLLABICS YII, MIDDLE DOT # →ᔩᐧ→ + +1536 ; 152A 00B7 ; MA # ( ᔶ → ᔪ· ) CANADIAN SYLLABICS WEST-CREE YWO → CANADIAN SYLLABICS YO, MIDDLE DOT # →ᔪᐧ→ + +1538 ; 152B 00B7 ; MA # ( ᔸ → ᔫ· ) CANADIAN SYLLABICS WEST-CREE YWOO → CANADIAN SYLLABICS YOO, MIDDLE DOT # →ᔫᐧ→ + +153A ; 152D 00B7 ; MA # ( ᔺ → ᔭ· ) CANADIAN SYLLABICS WEST-CREE YWA → CANADIAN SYLLABICS YA, MIDDLE DOT # →ᔭᐧ→ + +153C ; 152E 00B7 ; MA # ( ᔼ → ᔮ· ) CANADIAN SYLLABICS WEST-CREE YWAA → CANADIAN SYLLABICS YAA, MIDDLE DOT # →ᔮᐧ→ + +1622 ; 1543 ; MA # ( ᘢ → ᕃ ) CANADIAN SYLLABICS CARRIER LU → CANADIAN SYLLABICS R-CREE RE # + +18E0 ; 1543 00B7 ; MA # ( ᣠ → ᕃ· ) CANADIAN SYLLABICS R-CREE RWE → CANADIAN SYLLABICS R-CREE RE, MIDDLE DOT # →ᕃᐧ→ + +1623 ; 1546 ; MA # ( ᘣ → ᕆ ) CANADIAN SYLLABICS CARRIER LO → CANADIAN SYLLABICS RI # + +1624 ; 154A ; MA # ( ᘤ → ᕊ ) CANADIAN SYLLABICS CARRIER LE → CANADIAN SYLLABICS WEST-CREE LO # + +154F ; 154C 00B7 ; MA # ( ᕏ → ᕌ· ) CANADIAN SYLLABICS WEST-CREE RWAA → CANADIAN SYLLABICS RAA, MIDDLE DOT # →ᕌᐧ→ + +1581 ; 1550 0064 ; MA # ( ᖁ → ᕐd ) CANADIAN SYLLABICS QO → CANADIAN SYLLABICS R, LATIN SMALL LETTER D # →ᕐᑯ→ + +157F ; 1550 0050 ; MA # ( ᕿ → ᕐP ) CANADIAN SYLLABICS QI → CANADIAN SYLLABICS R, LATIN CAPITAL LETTER P # →ᕐᑭ→ + +166F ; 1550 146B ; MA # ( ᙯ → ᕐᑫ ) CANADIAN SYLLABICS QAI → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KE # + +157E ; 1550 146C ; MA # ( ᕾ → ᕐᑬ ) CANADIAN SYLLABICS QAAI → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KAAI # + +1580 ; 1550 146E ; MA # ( ᖀ → ᕐᑮ ) CANADIAN SYLLABICS QII → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KII # + +1582 ; 1550 1470 ; MA # ( ᖂ → ᕐᑰ ) CANADIAN SYLLABICS QOO → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KOO # + +1583 ; 1550 1472 ; MA # ( ᖃ → ᕐᑲ ) CANADIAN SYLLABICS QA → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KA # + +1584 ; 1550 1473 ; MA # ( ᖄ → ᕐᑳ ) CANADIAN SYLLABICS QAA → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KAA # + +1585 ; 1550 1483 ; MA # ( ᖅ → ᕐᒃ ) CANADIAN SYLLABICS Q → CANADIAN SYLLABICS R, CANADIAN SYLLABICS K # + +155C ; 155A 00B7 ; MA # ( ᕜ → ᕚ· ) CANADIAN SYLLABICS WEST-CREE FWAA → CANADIAN SYLLABICS FAA, MIDDLE DOT # →ᕚᐧ→ + +18E3 ; 155E 00B7 ; MA # ( ᣣ → ᕞ· ) CANADIAN SYLLABICS THWE → CANADIAN SYLLABICS THE, MIDDLE DOT # →ᕞᐧ→ + +18E4 ; 1566 00B7 ; MA # ( ᣤ → ᕦ· ) CANADIAN SYLLABICS THWA → CANADIAN SYLLABICS THA, MIDDLE DOT # →ᕦᐧ→ + +1569 ; 1567 00B7 ; MA # ( ᕩ → ᕧ· ) CANADIAN SYLLABICS WEST-CREE THWAA → CANADIAN SYLLABICS THAA, MIDDLE DOT # →ᕧᐧ→ + +18E5 ; 156B 00B7 ; MA # ( ᣥ → ᕫ· ) CANADIAN SYLLABICS TTHWE → CANADIAN SYLLABICS TTHE, MIDDLE DOT # →ᕫᐧ→ + +18E8 ; 1586 00B7 ; MA # ( ᣨ → ᖆ· ) CANADIAN SYLLABICS TLHWE → CANADIAN SYLLABICS TLHE, MIDDLE DOT # →ᖆᐧ→ + +1591 ; 1595 004A ; MA # ( ᖑ → ᖕJ ) CANADIAN SYLLABICS NGO → CANADIAN SYLLABICS NG, LATIN CAPITAL LETTER J # →ᖕᒍ→ + +1670 ; 1595 1489 ; MA # ( ᙰ → ᖕᒉ ) CANADIAN SYLLABICS NGAI → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CE # + +158E ; 1595 148A ; MA # ( ᖎ → ᖕᒊ ) CANADIAN SYLLABICS NGAAI → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CAAI # + +158F ; 1595 148B ; MA # ( ᖏ → ᖕᒋ ) CANADIAN SYLLABICS NGI → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CI # + +1590 ; 1595 148C ; MA # ( ᖐ → ᖕᒌ ) CANADIAN SYLLABICS NGII → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CII # + +1592 ; 1595 148E ; MA # ( ᖒ → ᖕᒎ ) CANADIAN SYLLABICS NGOO → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS COO # + +1593 ; 1595 1490 ; MA # ( ᖓ → ᖕᒐ ) CANADIAN SYLLABICS NGA → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CA # + +1594 ; 1595 1491 ; MA # ( ᖔ → ᖕᒑ ) CANADIAN SYLLABICS NGAA → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CAA # + +1673 ; 1596 004A ; MA # ( ᙳ → ᖖJ ) CANADIAN SYLLABICS NNGO → CANADIAN SYLLABICS NNG, LATIN CAPITAL LETTER J # →ᖖᒍ→ + +1671 ; 1596 148B ; MA # ( ᙱ → ᖖᒋ ) CANADIAN SYLLABICS NNGI → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CI # + +1672 ; 1596 148C ; MA # ( ᙲ → ᖖᒌ ) CANADIAN SYLLABICS NNGII → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CII # + +1674 ; 1596 148E ; MA # ( ᙴ → ᖖᒎ ) CANADIAN SYLLABICS NNGOO → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS COO # + +1675 ; 1596 1490 ; MA # ( ᙵ → ᖖᒐ ) CANADIAN SYLLABICS NNGA → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CA # + +1676 ; 1596 1491 ; MA # ( ᙶ → ᖖᒑ ) CANADIAN SYLLABICS NNGAA → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CAA # + +18EA ; 1597 00B7 ; MA # ( ᣪ → ᖗ· ) CANADIAN SYLLABICS SAYISI SHWE → CANADIAN SYLLABICS SAYISI SHE, MIDDLE DOT # →ᖗᐧ→ + +1677 ; 15A7 00B7 ; MA # ( ᙷ → ᖧ· ) CANADIAN SYLLABICS WOODS-CREE THWEE → CANADIAN SYLLABICS TH-CREE THE, MIDDLE DOT # →ᖧᐧ→ + +1678 ; 15A8 00B7 ; MA # ( ᙸ → ᖨ· ) CANADIAN SYLLABICS WOODS-CREE THWI → CANADIAN SYLLABICS TH-CREE THI, MIDDLE DOT # →ᖨᐧ→ + +1679 ; 15A9 00B7 ; MA # ( ᙹ → ᖩ· ) CANADIAN SYLLABICS WOODS-CREE THWII → CANADIAN SYLLABICS TH-CREE THII, MIDDLE DOT # →ᖩᐧ→ + +167A ; 15AA 00B7 ; MA # ( ᙺ → ᖪ· ) CANADIAN SYLLABICS WOODS-CREE THWO → CANADIAN SYLLABICS TH-CREE THO, MIDDLE DOT # →ᖪᐧ→ + +167B ; 15AB 00B7 ; MA # ( ᙻ → ᖫ· ) CANADIAN SYLLABICS WOODS-CREE THWOO → CANADIAN SYLLABICS TH-CREE THOO, MIDDLE DOT # →ᖫᐧ→ + +167C ; 15AC 00B7 ; MA # ( ᙼ → ᖬ· ) CANADIAN SYLLABICS WOODS-CREE THWA → CANADIAN SYLLABICS TH-CREE THA, MIDDLE DOT # →ᖬᐧ→ + +167D ; 15AD 00B7 ; MA # ( ᙽ → ᖭ· ) CANADIAN SYLLABICS WOODS-CREE THWAA → CANADIAN SYLLABICS TH-CREE THAA, MIDDLE DOT # →ᖭᐧ→ + +2AAB ; 15D2 ; MA #* ( ⪫ → ᗒ ) LARGER THAN → CANADIAN SYLLABICS CARRIER WE # + +2AAA ; 15D5 ; MA #* ( ⪪ → ᗕ ) SMALLER THAN → CANADIAN SYLLABICS CARRIER WA # + +A4F7 ; 15E1 ; MA # ( ꓷ → ᗡ ) LISU LETTER OE → CANADIAN SYLLABICS CARRIER THA # + +18F0 ; 15F4 00B7 ; MA # ( ᣰ → ᗴ· ) CANADIAN SYLLABICS CARRIER GWA → CANADIAN SYLLABICS CARRIER GA, MIDDLE DOT # →ᗴᐧ→ + +18F2 ; 161B 00B7 ; MA # ( ᣲ → ᘛ· ) CANADIAN SYLLABICS CARRIER JWA → CANADIAN SYLLABICS CARRIER JA, MIDDLE DOT # →ᘛᐧ→ + +1DBB ; 1646 ; MA # ( ᶻ → ᙆ ) MODIFIER LETTER SMALL Z → CANADIAN SYLLABICS CARRIER Z # + +A4ED ; 1660 ; MA # ( ꓭ → ᙠ ) LISU LETTER GHA → CANADIAN SYLLABICS CARRIER TSA # + +02E1 ; 18F3 ; MA # ( ˡ → ᣳ ) MODIFIER LETTER SMALL L → CANADIAN SYLLABICS BEAVER DENE L # + +02B3 ; 18F4 ; MA # ( ʳ → ᣴ ) MODIFIER LETTER SMALL R → CANADIAN SYLLABICS BEAVER DENE R # + +02E2 ; 18F5 ; MA # ( ˢ → ᣵ ) MODIFIER LETTER SMALL S → CANADIAN SYLLABICS CARRIER DENTAL S # + +16E1 ; 16BC ; MA # ( ᛡ → ᚼ ) RUNIC LETTER IOR → RUNIC LETTER LONG-BRANCH-HAGALL H # + +237F ; 16BD ; MA #* ( ⍿ → ᚽ ) VERTICAL LINE WITH MIDDLE DOT → RUNIC LETTER SHORT-TWIG-HAGALL H # →ᛂ→ +16C2 ; 16BD ; MA # ( ᛂ → ᚽ ) RUNIC LETTER E → RUNIC LETTER SHORT-TWIG-HAGALL H # + +2191 ; 16CF ; MA #* ( ↑ → ᛏ ) UPWARDS ARROW → RUNIC LETTER TIWAZ TIR TYR T # + +21BF ; 16D0 ; MA #* ( ↿ → ᛐ ) UPWARDS HARPOON WITH BARB LEFTWARDS → RUNIC LETTER SHORT-TWIG-TYR T # + +296E ; 16D0 21C2 ; MA #* ( ⥮ → ᛐ⇂ ) UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT → RUNIC LETTER SHORT-TWIG-TYR T, DOWNWARDS HARPOON WITH BARB RIGHTWARDS # →↿⇂→ + +2963 ; 16D0 16DA ; MA #* ( ⥣ → ᛐᛚ ) UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT → RUNIC LETTER SHORT-TWIG-TYR T, RUNIC LETTER LAUKAZ LAGU LOGR L # →↿↾→ + +2D63 ; 16EF ; MA # ( ⵣ → ᛯ ) TIFINAGH LETTER YAZ → RUNIC TVIMADUR SYMBOL # + +21BE ; 16DA ; MA #* ( ↾ → ᛚ ) UPWARDS HARPOON WITH BARB RIGHTWARDS → RUNIC LETTER LAUKAZ LAGU LOGR L # +2A21 ; 16DA ; MA #* ( ⨡ → ᛚ ) Z NOTATION SCHEMA PROJECTION → RUNIC LETTER LAUKAZ LAGU LOGR L # →↾→ + +22C4 ; 16DC ; MA #* ( ⋄ → ᛜ ) DIAMOND OPERATOR → RUNIC LETTER INGWAZ # →◇→ +25C7 ; 16DC ; MA #* ( ◇ → ᛜ ) WHITE DIAMOND → RUNIC LETTER INGWAZ # +25CA ; 16DC ; MA #* ( ◊ → ᛜ ) LOZENGE → RUNIC LETTER INGWAZ # →⋄→→◇→ +2662 ; 16DC ; MA #* ( ♢ → ᛜ ) WHITE DIAMOND SUIT → RUNIC LETTER INGWAZ # →◊→→⋄→→◇→ +1F754 ; 16DC ; MA #* ( 🝔 → ᛜ ) ALCHEMICAL SYMBOL FOR SOAP → RUNIC LETTER INGWAZ # →◇→ +118B7 ; 16DC ; MA # ( 𑢷 → ᛜ ) WARANG CITI CAPITAL LETTER BU → RUNIC LETTER INGWAZ # →◇→ +10294 ; 16DC ; MA # ( 𐊔 → ᛜ ) LYCIAN LETTER KK → RUNIC LETTER INGWAZ # →◇→ + +235A ; 16DC 0332 ; MA #* ( ⍚ → ᛜ̲ ) APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR → RUNIC LETTER INGWAZ, COMBINING LOW LINE # →◇̲→ + +22C8 ; 16DE ; MA #* ( ⋈ → ᛞ ) BOWTIE → RUNIC LETTER DAGAZ DAEG D # +2A1D ; 16DE ; MA #* ( ⨝ → ᛞ ) JOIN → RUNIC LETTER DAGAZ DAEG D # →⋈→ + +2195 ; 16E8 ; MA #* ( ↕ → ᛨ ) UP DOWN ARROW → RUNIC LETTER ICELANDIC-YR # + +3131 ; 1100 ; MA # ( ㄱ → ᄀ ) HANGUL LETTER KIYEOK → HANGUL CHOSEONG KIYEOK # +11A8 ; 1100 ; MA # ( ᆨ → ᄀ ) HANGUL JONGSEONG KIYEOK → HANGUL CHOSEONG KIYEOK # + +1101 ; 1100 1100 ; MA # ( ᄁ → ᄀᄀ ) HANGUL CHOSEONG SSANGKIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK # +3132 ; 1100 1100 ; MA # ( ㄲ → ᄀᄀ ) HANGUL LETTER SSANGKIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK # →ᄁ→ +11A9 ; 1100 1100 ; MA # ( ᆩ → ᄀᄀ ) HANGUL JONGSEONG SSANGKIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK # →ᄁ→ + +11FA ; 1100 1102 ; MA # ( ᇺ → ᄀᄂ ) HANGUL JONGSEONG KIYEOK-NIEUN → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG NIEUN # →ᆨᆫ→ + +115A ; 1100 1103 ; MA # ( ᅚ → ᄀᄃ ) HANGUL CHOSEONG KIYEOK-TIKEUT → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG TIKEUT # + +11C3 ; 1100 1105 ; MA # ( ᇃ → ᄀᄅ ) HANGUL JONGSEONG KIYEOK-RIEUL → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG RIEUL # →ᆨᆯ→ + +11FB ; 1100 1107 ; MA # ( ᇻ → ᄀᄇ ) HANGUL JONGSEONG KIYEOK-PIEUP → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG PIEUP # →ᆨᆸ→ + +11AA ; 1100 1109 ; MA # ( ᆪ → ᄀᄉ ) HANGUL JONGSEONG KIYEOK-SIOS → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS # →ᆨᆺ→ +3133 ; 1100 1109 ; MA # ( ㄳ → ᄀᄉ ) HANGUL LETTER KIYEOK-SIOS → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS # →ᆪ→→ᆨᆺ→ + +11C4 ; 1100 1109 1100 ; MA # ( ᇄ → ᄀᄉᄀ ) HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # →ᆨᆺᆨ→ + +11FC ; 1100 110E ; MA # ( ᇼ → ᄀᄎ ) HANGUL JONGSEONG KIYEOK-CHIEUCH → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG CHIEUCH # →ᆨᆾ→ + +11FD ; 1100 110F ; MA # ( ᇽ → ᄀᄏ ) HANGUL JONGSEONG KIYEOK-KHIEUKH → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KHIEUKH # →ᆨᆿ→ + +11FE ; 1100 1112 ; MA # ( ᇾ → ᄀᄒ ) HANGUL JONGSEONG KIYEOK-HIEUH → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG HIEUH # →ᆨᇂ→ + +3134 ; 1102 ; MA # ( ㄴ → ᄂ ) HANGUL LETTER NIEUN → HANGUL CHOSEONG NIEUN # +11AB ; 1102 ; MA # ( ᆫ → ᄂ ) HANGUL JONGSEONG NIEUN → HANGUL CHOSEONG NIEUN # + +1113 ; 1102 1100 ; MA # ( ᄓ → ᄂᄀ ) HANGUL CHOSEONG NIEUN-KIYEOK → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG KIYEOK # +11C5 ; 1102 1100 ; MA # ( ᇅ → ᄂᄀ ) HANGUL JONGSEONG NIEUN-KIYEOK → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG KIYEOK # →ᄓ→ + +1114 ; 1102 1102 ; MA # ( ᄔ → ᄂᄂ ) HANGUL CHOSEONG SSANGNIEUN → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN # +3165 ; 1102 1102 ; MA # ( ㅥ → ᄂᄂ ) HANGUL LETTER SSANGNIEUN → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN # →ᄔ→ +11FF ; 1102 1102 ; MA # ( ᇿ → ᄂᄂ ) HANGUL JONGSEONG SSANGNIEUN → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN # →ᆫᆫ→ + +1115 ; 1102 1103 ; MA # ( ᄕ → ᄂᄃ ) HANGUL CHOSEONG NIEUN-TIKEUT → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT # +3166 ; 1102 1103 ; MA # ( ㅦ → ᄂᄃ ) HANGUL LETTER NIEUN-TIKEUT → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT # →ᄕ→ +11C6 ; 1102 1103 ; MA # ( ᇆ → ᄂᄃ ) HANGUL JONGSEONG NIEUN-TIKEUT → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT # →ᄕ→ + +D7CB ; 1102 1105 ; MA # ( ퟋ → ᄂᄅ ) HANGUL JONGSEONG NIEUN-RIEUL → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG RIEUL # →ᆫᆯ→ + +1116 ; 1102 1107 ; MA # ( ᄖ → ᄂᄇ ) HANGUL CHOSEONG NIEUN-PIEUP → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PIEUP # + +115B ; 1102 1109 ; MA # ( ᅛ → ᄂᄉ ) HANGUL CHOSEONG NIEUN-SIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS # +11C7 ; 1102 1109 ; MA # ( ᇇ → ᄂᄉ ) HANGUL JONGSEONG NIEUN-SIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS # →ᆫᆺ→ +3167 ; 1102 1109 ; MA # ( ㅧ → ᄂᄉ ) HANGUL LETTER NIEUN-SIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS # →ᇇ→→ᆫᆺ→ + +115C ; 1102 110C ; MA # ( ᅜ → ᄂᄌ ) HANGUL CHOSEONG NIEUN-CIEUC → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC # +11AC ; 1102 110C ; MA # ( ᆬ → ᄂᄌ ) HANGUL JONGSEONG NIEUN-CIEUC → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC # →ᆫᆽ→ +3135 ; 1102 110C ; MA # ( ㄵ → ᄂᄌ ) HANGUL LETTER NIEUN-CIEUC → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC # →ᆬ→→ᆫᆽ→ + +D7CC ; 1102 110E ; MA # ( ퟌ → ᄂᄎ ) HANGUL JONGSEONG NIEUN-CHIEUCH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CHIEUCH # →ᆫᆾ→ + +11C9 ; 1102 1110 ; MA # ( ᇉ → ᄂᄐ ) HANGUL JONGSEONG NIEUN-THIEUTH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG THIEUTH # →ᆫᇀ→ + +115D ; 1102 1112 ; MA # ( ᅝ → ᄂᄒ ) HANGUL CHOSEONG NIEUN-HIEUH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH # +11AD ; 1102 1112 ; MA # ( ᆭ → ᄂᄒ ) HANGUL JONGSEONG NIEUN-HIEUH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH # →ᆫᇂ→ +3136 ; 1102 1112 ; MA # ( ㄶ → ᄂᄒ ) HANGUL LETTER NIEUN-HIEUH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH # →ᆭ→→ᆫᇂ→ + +11C8 ; 1102 1140 ; MA # ( ᇈ → ᄂᅀ ) HANGUL JONGSEONG NIEUN-PANSIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PANSIOS # →ᆫᇫ→ +3168 ; 1102 1140 ; MA # ( ㅨ → ᄂᅀ ) HANGUL LETTER NIEUN-PANSIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PANSIOS # →ᇈ→→ᆫᇫ→ + +3137 ; 1103 ; MA # ( ㄷ → ᄃ ) HANGUL LETTER TIKEUT → HANGUL CHOSEONG TIKEUT # +11AE ; 1103 ; MA # ( ᆮ → ᄃ ) HANGUL JONGSEONG TIKEUT → HANGUL CHOSEONG TIKEUT # + +1117 ; 1103 1100 ; MA # ( ᄗ → ᄃᄀ ) HANGUL CHOSEONG TIKEUT-KIYEOK → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG KIYEOK # +11CA ; 1103 1100 ; MA # ( ᇊ → ᄃᄀ ) HANGUL JONGSEONG TIKEUT-KIYEOK → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG KIYEOK # →ᄗ→ + +1104 ; 1103 1103 ; MA # ( ᄄ → ᄃᄃ ) HANGUL CHOSEONG SSANGTIKEUT → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT # +3138 ; 1103 1103 ; MA # ( ㄸ → ᄃᄃ ) HANGUL LETTER SSANGTIKEUT → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT # →ᄄ→ +D7CD ; 1103 1103 ; MA # ( ퟍ → ᄃᄃ ) HANGUL JONGSEONG SSANGTIKEUT → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT # →ᆮᆮ→ + +D7CE ; 1103 1103 1107 ; MA # ( ퟎ → ᄃᄃᄇ ) HANGUL JONGSEONG SSANGTIKEUT-PIEUP → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP # →ᆮᆮᆸ→ + +115E ; 1103 1105 ; MA # ( ᅞ → ᄃᄅ ) HANGUL CHOSEONG TIKEUT-RIEUL → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG RIEUL # +11CB ; 1103 1105 ; MA # ( ᇋ → ᄃᄅ ) HANGUL JONGSEONG TIKEUT-RIEUL → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG RIEUL # →ᆮᆯ→ + +A960 ; 1103 1106 ; MA # ( ꥠ → ᄃᄆ ) HANGUL CHOSEONG TIKEUT-MIEUM → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG MIEUM # + +A961 ; 1103 1107 ; MA # ( ꥡ → ᄃᄇ ) HANGUL CHOSEONG TIKEUT-PIEUP → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP # +D7CF ; 1103 1107 ; MA # ( ퟏ → ᄃᄇ ) HANGUL JONGSEONG TIKEUT-PIEUP → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP # →ᆮᆸ→ + +A962 ; 1103 1109 ; MA # ( ꥢ → ᄃᄉ ) HANGUL CHOSEONG TIKEUT-SIOS → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS # +D7D0 ; 1103 1109 ; MA # ( ퟐ → ᄃᄉ ) HANGUL JONGSEONG TIKEUT-SIOS → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS # →ᆮᆺ→ + +D7D1 ; 1103 1109 1100 ; MA # ( ퟑ → ᄃᄉᄀ ) HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # →ᆮᆺᆨ→ + +A963 ; 1103 110C ; MA # ( ꥣ → ᄃᄌ ) HANGUL CHOSEONG TIKEUT-CIEUC → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CIEUC # +D7D2 ; 1103 110C ; MA # ( ퟒ → ᄃᄌ ) HANGUL JONGSEONG TIKEUT-CIEUC → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CIEUC # →ᆮᆽ→ + +D7D3 ; 1103 110E ; MA # ( ퟓ → ᄃᄎ ) HANGUL JONGSEONG TIKEUT-CHIEUCH → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CHIEUCH # →ᆮᆾ→ + +D7D4 ; 1103 1110 ; MA # ( ퟔ → ᄃᄐ ) HANGUL JONGSEONG TIKEUT-THIEUTH → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG THIEUTH # →ᆮᇀ→ + +3139 ; 1105 ; MA # ( ㄹ → ᄅ ) HANGUL LETTER RIEUL → HANGUL CHOSEONG RIEUL # +11AF ; 1105 ; MA # ( ᆯ → ᄅ ) HANGUL JONGSEONG RIEUL → HANGUL CHOSEONG RIEUL # + +A964 ; 1105 1100 ; MA # ( ꥤ → ᄅᄀ ) HANGUL CHOSEONG RIEUL-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK # +11B0 ; 1105 1100 ; MA # ( ᆰ → ᄅᄀ ) HANGUL JONGSEONG RIEUL-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK # →ᆯᆨ→ +313A ; 1105 1100 ; MA # ( ㄺ → ᄅᄀ ) HANGUL LETTER RIEUL-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK # →ᆰ→→ᆯᆨ→ + +A965 ; 1105 1100 1100 ; MA # ( ꥥ → ᄅᄀᄀ ) HANGUL CHOSEONG RIEUL-SSANGKIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK # +D7D5 ; 1105 1100 1100 ; MA # ( ퟕ → ᄅᄀᄀ ) HANGUL JONGSEONG RIEUL-SSANGKIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK # →ᆯᆨᆨ→ + +11CC ; 1105 1100 1109 ; MA # ( ᇌ → ᄅᄀᄉ ) HANGUL JONGSEONG RIEUL-KIYEOK-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS # →ᆯᆨᆺ→ +3169 ; 1105 1100 1109 ; MA # ( ㅩ → ᄅᄀᄉ ) HANGUL LETTER RIEUL-KIYEOK-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS # →ᇌ→→ᆯᆨᆺ→ + +D7D6 ; 1105 1100 1112 ; MA # ( ퟖ → ᄅᄀᄒ ) HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG HIEUH # →ᆯᆨᇂ→ + +1118 ; 1105 1102 ; MA # ( ᄘ → ᄅᄂ ) HANGUL CHOSEONG RIEUL-NIEUN → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG NIEUN # +11CD ; 1105 1102 ; MA # ( ᇍ → ᄅᄂ ) HANGUL JONGSEONG RIEUL-NIEUN → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG NIEUN # →ᄘ→ + +A966 ; 1105 1103 ; MA # ( ꥦ → ᄅᄃ ) HANGUL CHOSEONG RIEUL-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT # +11CE ; 1105 1103 ; MA # ( ᇎ → ᄅᄃ ) HANGUL JONGSEONG RIEUL-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT # →ᆯᆮ→ +316A ; 1105 1103 ; MA # ( ㅪ → ᄅᄃ ) HANGUL LETTER RIEUL-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT # →ᇎ→→ᆯᆮ→ + +A967 ; 1105 1103 1103 ; MA # ( ꥧ → ᄅᄃᄃ ) HANGUL CHOSEONG RIEUL-SSANGTIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT # + +11CF ; 1105 1103 1112 ; MA # ( ᇏ → ᄅᄃᄒ ) HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG HIEUH # →ᆯᆮᇂ→ + +1119 ; 1105 1105 ; MA # ( ᄙ → ᄅᄅ ) HANGUL CHOSEONG SSANGRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL # +11D0 ; 1105 1105 ; MA # ( ᇐ → ᄅᄅ ) HANGUL JONGSEONG SSANGRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL # →ᄙ→ + +D7D7 ; 1105 1105 110F ; MA # ( ퟗ → ᄅᄅᄏ ) HANGUL JONGSEONG SSANGRIEUL-KHIEUKH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH # →ᆯᆯᆿ→ + +A968 ; 1105 1106 ; MA # ( ꥨ → ᄅᄆ ) HANGUL CHOSEONG RIEUL-MIEUM → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM # +11B1 ; 1105 1106 ; MA # ( ᆱ → ᄅᄆ ) HANGUL JONGSEONG RIEUL-MIEUM → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM # →ᆯᆷ→ +313B ; 1105 1106 ; MA # ( ㄻ → ᄅᄆ ) HANGUL LETTER RIEUL-MIEUM → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM # →ᆱ→→ᆯᆷ→ + +11D1 ; 1105 1106 1100 ; MA # ( ᇑ → ᄅᄆᄀ ) HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK # →ᆯᆷᆨ→ + +11D2 ; 1105 1106 1109 ; MA # ( ᇒ → ᄅᄆᄉ ) HANGUL JONGSEONG RIEUL-MIEUM-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS # →ᆯᆷᆺ→ + +D7D8 ; 1105 1106 1112 ; MA # ( ퟘ → ᄅᄆᄒ ) HANGUL JONGSEONG RIEUL-MIEUM-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG HIEUH # →ᆯᆷᇂ→ + +A969 ; 1105 1107 ; MA # ( ꥩ → ᄅᄇ ) HANGUL CHOSEONG RIEUL-PIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP # +11B2 ; 1105 1107 ; MA # ( ᆲ → ᄅᄇ ) HANGUL JONGSEONG RIEUL-PIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP # →ᆯᆸ→ +313C ; 1105 1107 ; MA # ( ㄼ → ᄅᄇ ) HANGUL LETTER RIEUL-PIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP # →ᆲ→→ᆯᆸ→ + +D7D9 ; 1105 1107 1103 ; MA # ( ퟙ → ᄅᄇᄃ ) HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT # →ᆯᆸᆮ→ + +A96A ; 1105 1107 1107 ; MA # ( ꥪ → ᄅᄇᄇ ) HANGUL CHOSEONG RIEUL-SSANGPIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP # + +11D3 ; 1105 1107 1109 ; MA # ( ᇓ → ᄅᄇᄉ ) HANGUL JONGSEONG RIEUL-PIEUP-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS # →ᆯᆸᆺ→ +316B ; 1105 1107 1109 ; MA # ( ㅫ → ᄅᄇᄉ ) HANGUL LETTER RIEUL-PIEUP-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS # →ᇓ→→ᆯᆸᆺ→ + +A96B ; 1105 1107 110B ; MA # ( ꥫ → ᄅᄇᄋ ) HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG # +11D5 ; 1105 1107 110B ; MA # ( ᇕ → ᄅᄇᄋ ) HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG # →ᆯᆸᆼ→ + +D7DA ; 1105 1107 1111 ; MA # ( ퟚ → ᄅᄇᄑ ) HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH # →ᆯᆸᇁ→ + +11D4 ; 1105 1107 1112 ; MA # ( ᇔ → ᄅᄇᄒ ) HANGUL JONGSEONG RIEUL-PIEUP-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH # →ᆯᆸᇂ→ + +A96C ; 1105 1109 ; MA # ( ꥬ → ᄅᄉ ) HANGUL CHOSEONG RIEUL-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS # +11B3 ; 1105 1109 ; MA # ( ᆳ → ᄅᄉ ) HANGUL JONGSEONG RIEUL-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS # →ᆯᆺ→ +313D ; 1105 1109 ; MA # ( ㄽ → ᄅᄉ ) HANGUL LETTER RIEUL-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS # →ᆳ→→ᆯᆺ→ + +11D6 ; 1105 1109 1109 ; MA # ( ᇖ → ᄅᄉᄉ ) HANGUL JONGSEONG RIEUL-SSANGSIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS # →ᆯᆺᆺ→ + +111B ; 1105 110B ; MA # ( ᄛ → ᄅᄋ ) HANGUL CHOSEONG KAPYEOUNRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG IEUNG # +D7DD ; 1105 110B ; MA # ( ퟝ → ᄅᄋ ) HANGUL JONGSEONG KAPYEOUNRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG IEUNG # →ᆯᆼ→ + +A96D ; 1105 110C ; MA # ( ꥭ → ᄅᄌ ) HANGUL CHOSEONG RIEUL-CIEUC → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG CIEUC # + +A96E ; 1105 110F ; MA # ( ꥮ → ᄅᄏ ) HANGUL CHOSEONG RIEUL-KHIEUKH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH # +11D8 ; 1105 110F ; MA # ( ᇘ → ᄅᄏ ) HANGUL JONGSEONG RIEUL-KHIEUKH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH # →ᆯᆿ→ + +11B4 ; 1105 1110 ; MA # ( ᆴ → ᄅᄐ ) HANGUL JONGSEONG RIEUL-THIEUTH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG THIEUTH # →ᆯᇀ→ +313E ; 1105 1110 ; MA # ( ㄾ → ᄅᄐ ) HANGUL LETTER RIEUL-THIEUTH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG THIEUTH # →ᆴ→→ᆯᇀ→ + +11B5 ; 1105 1111 ; MA # ( ᆵ → ᄅᄑ ) HANGUL JONGSEONG RIEUL-PHIEUPH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH # →ᆯᇁ→ +313F ; 1105 1111 ; MA # ( ㄿ → ᄅᄑ ) HANGUL LETTER RIEUL-PHIEUPH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH # →ᆵ→→ᆯᇁ→ + +111A ; 1105 1112 ; MA # ( ᄚ → ᄅᄒ ) HANGUL CHOSEONG RIEUL-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH # +3140 ; 1105 1112 ; MA # ( ㅀ → ᄅᄒ ) HANGUL LETTER RIEUL-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH # →ᄚ→ +113B ; 1105 1112 ; MA # ( ᄻ → ᄅᄒ ) HANGUL CHOSEONG SIOS-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH # →ᄚ→ +11B6 ; 1105 1112 ; MA # ( ᆶ → ᄅᄒ ) HANGUL JONGSEONG RIEUL-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH # →ᄚ→ +D7F2 ; 1105 1112 ; MA # ( ퟲ → ᄅᄒ ) HANGUL JONGSEONG SIOS-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH # →ᆺᇂ→→ᄉᄒ→→ᄻ→→ᄚ→ + +11D7 ; 1105 1140 ; MA # ( ᇗ → ᄅᅀ ) HANGUL JONGSEONG RIEUL-PANSIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PANSIOS # →ᆯᇫ→ +316C ; 1105 1140 ; MA # ( ㅬ → ᄅᅀ ) HANGUL LETTER RIEUL-PANSIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PANSIOS # →ᇗ→→ᆯᇫ→ + +D7DB ; 1105 114C ; MA # ( ퟛ → ᄅᅌ ) HANGUL JONGSEONG RIEUL-YESIEUNG → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YESIEUNG # →ᆯᇰ→ + +11D9 ; 1105 1159 ; MA # ( ᇙ → ᄅᅙ ) HANGUL JONGSEONG RIEUL-YEORINHIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH # →ᆯᇹ→ +316D ; 1105 1159 ; MA # ( ㅭ → ᄅᅙ ) HANGUL LETTER RIEUL-YEORINHIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH # →ᇙ→→ᆯᇹ→ + +D7DC ; 1105 1159 1112 ; MA # ( ퟜ → ᄅᅙᄒ ) HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH, HANGUL CHOSEONG HIEUH # →ᆯᇹᇂ→ + +3141 ; 1106 ; MA # ( ㅁ → ᄆ ) HANGUL LETTER MIEUM → HANGUL CHOSEONG MIEUM # +11B7 ; 1106 ; MA # ( ᆷ → ᄆ ) HANGUL JONGSEONG MIEUM → HANGUL CHOSEONG MIEUM # + +A96F ; 1106 1100 ; MA # ( ꥯ → ᄆᄀ ) HANGUL CHOSEONG MIEUM-KIYEOK → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK # +11DA ; 1106 1100 ; MA # ( ᇚ → ᄆᄀ ) HANGUL JONGSEONG MIEUM-KIYEOK → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK # →ᆷᆨ→ + +D7DE ; 1106 1102 ; MA # ( ퟞ → ᄆᄂ ) HANGUL JONGSEONG MIEUM-NIEUN → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG NIEUN # →ᆷᆫ→ + +D7DF ; 1106 1102 1102 ; MA # ( ퟟ → ᄆᄂᄂ ) HANGUL JONGSEONG MIEUM-SSANGNIEUN → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN # →ᆷᆫᆫ→ + +A970 ; 1106 1103 ; MA # ( ꥰ → ᄆᄃ ) HANGUL CHOSEONG MIEUM-TIKEUT → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG TIKEUT # + +11DB ; 1106 1105 ; MA # ( ᇛ → ᄆᄅ ) HANGUL JONGSEONG MIEUM-RIEUL → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG RIEUL # →ᆷᆯ→ + +D7E0 ; 1106 1106 ; MA # ( ퟠ → ᄆᄆ ) HANGUL JONGSEONG SSANGMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG MIEUM # →ᆷᆷ→ + +111C ; 1106 1107 ; MA # ( ᄜ → ᄆᄇ ) HANGUL CHOSEONG MIEUM-PIEUP → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP # +316E ; 1106 1107 ; MA # ( ㅮ → ᄆᄇ ) HANGUL LETTER MIEUM-PIEUP → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP # →ᄜ→ +11DC ; 1106 1107 ; MA # ( ᇜ → ᄆᄇ ) HANGUL JONGSEONG MIEUM-PIEUP → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP # →ᄜ→ + +D7E1 ; 1106 1107 1109 ; MA # ( ퟡ → ᄆᄇᄉ ) HANGUL JONGSEONG MIEUM-PIEUP-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS # →ᆷᆸᆺ→ + +A971 ; 1106 1109 ; MA # ( ꥱ → ᄆᄉ ) HANGUL CHOSEONG MIEUM-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS # +11DD ; 1106 1109 ; MA # ( ᇝ → ᄆᄉ ) HANGUL JONGSEONG MIEUM-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS # →ᆷᆺ→ +316F ; 1106 1109 ; MA # ( ㅯ → ᄆᄉ ) HANGUL LETTER MIEUM-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS # →ᇝ→→ᆷᆺ→ + +11DE ; 1106 1109 1109 ; MA # ( ᇞ → ᄆᄉᄉ ) HANGUL JONGSEONG MIEUM-SSANGSIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS # →ᆷᆺᆺ→ + +111D ; 1106 110B ; MA # ( ᄝ → ᄆᄋ ) HANGUL CHOSEONG KAPYEOUNMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG # +3171 ; 1106 110B ; MA # ( ㅱ → ᄆᄋ ) HANGUL LETTER KAPYEOUNMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG # →ᄝ→ +11E2 ; 1106 110B ; MA # ( ᇢ → ᄆᄋ ) HANGUL JONGSEONG KAPYEOUNMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG # →ᄝ→ + +D7E2 ; 1106 110C ; MA # ( ퟢ → ᄆᄌ ) HANGUL JONGSEONG MIEUM-CIEUC → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG CIEUC # →ᆷᆽ→ + +11E0 ; 1106 110E ; MA # ( ᇠ → ᄆᄎ ) HANGUL JONGSEONG MIEUM-CHIEUCH → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG CHIEUCH # →ᆷᆾ→ + +11E1 ; 1106 1112 ; MA # ( ᇡ → ᄆᄒ ) HANGUL JONGSEONG MIEUM-HIEUH → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG HIEUH # →ᆷᇂ→ + +11DF ; 1106 1140 ; MA # ( ᇟ → ᄆᅀ ) HANGUL JONGSEONG MIEUM-PANSIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PANSIOS # →ᆷᇫ→ +3170 ; 1106 1140 ; MA # ( ㅰ → ᄆᅀ ) HANGUL LETTER MIEUM-PANSIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PANSIOS # →ᇟ→→ᆷᇫ→ + +3142 ; 1107 ; MA # ( ㅂ → ᄇ ) HANGUL LETTER PIEUP → HANGUL CHOSEONG PIEUP # +11B8 ; 1107 ; MA # ( ᆸ → ᄇ ) HANGUL JONGSEONG PIEUP → HANGUL CHOSEONG PIEUP # + +111E ; 1107 1100 ; MA # ( ᄞ → ᄇᄀ ) HANGUL CHOSEONG PIEUP-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK # +3172 ; 1107 1100 ; MA # ( ㅲ → ᄇᄀ ) HANGUL LETTER PIEUP-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK # →ᄞ→ + +111F ; 1107 1102 ; MA # ( ᄟ → ᄇᄂ ) HANGUL CHOSEONG PIEUP-NIEUN → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG NIEUN # + +1120 ; 1107 1103 ; MA # ( ᄠ → ᄇᄃ ) HANGUL CHOSEONG PIEUP-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT # +3173 ; 1107 1103 ; MA # ( ㅳ → ᄇᄃ ) HANGUL LETTER PIEUP-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT # →ᄠ→ +D7E3 ; 1107 1103 ; MA # ( ퟣ → ᄇᄃ ) HANGUL JONGSEONG PIEUP-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT # →ᆸᆮ→ + +11E3 ; 1107 1105 ; MA # ( ᇣ → ᄇᄅ ) HANGUL JONGSEONG PIEUP-RIEUL → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG RIEUL # →ᆸᆯ→ + +D7E4 ; 1107 1105 1111 ; MA # ( ퟤ → ᄇᄅᄑ ) HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH # →ᆸᆯᇁ→ + +D7E5 ; 1107 1106 ; MA # ( ퟥ → ᄇᄆ ) HANGUL JONGSEONG PIEUP-MIEUM → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG MIEUM # →ᆸᆷ→ + +1108 ; 1107 1107 ; MA # ( ᄈ → ᄇᄇ ) HANGUL CHOSEONG SSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP # +3143 ; 1107 1107 ; MA # ( ㅃ → ᄇᄇ ) HANGUL LETTER SSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP # →ᄈ→ +D7E6 ; 1107 1107 ; MA # ( ퟦ → ᄇᄇ ) HANGUL JONGSEONG SSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP # →ᆸᆸ→ + +112C ; 1107 1107 110B ; MA # ( ᄬ → ᄇᄇᄋ ) HANGUL CHOSEONG KAPYEOUNSSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG # +3179 ; 1107 1107 110B ; MA # ( ㅹ → ᄇᄇᄋ ) HANGUL LETTER KAPYEOUNSSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG # →ᄬ→ + +1121 ; 1107 1109 ; MA # ( ᄡ → ᄇᄉ ) HANGUL CHOSEONG PIEUP-SIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS # +3144 ; 1107 1109 ; MA # ( ㅄ → ᄇᄉ ) HANGUL LETTER PIEUP-SIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS # →ᄡ→ +11B9 ; 1107 1109 ; MA # ( ᆹ → ᄇᄉ ) HANGUL JONGSEONG PIEUP-SIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS # →ᄡ→ + +1122 ; 1107 1109 1100 ; MA # ( ᄢ → ᄇᄉᄀ ) HANGUL CHOSEONG PIEUP-SIOS-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # +3174 ; 1107 1109 1100 ; MA # ( ㅴ → ᄇᄉᄀ ) HANGUL LETTER PIEUP-SIOS-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # →ᄢ→ + +1123 ; 1107 1109 1103 ; MA # ( ᄣ → ᄇᄉᄃ ) HANGUL CHOSEONG PIEUP-SIOS-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT # +3175 ; 1107 1109 1103 ; MA # ( ㅵ → ᄇᄉᄃ ) HANGUL LETTER PIEUP-SIOS-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT # →ᄣ→ +D7E7 ; 1107 1109 1103 ; MA # ( ퟧ → ᄇᄉᄃ ) HANGUL JONGSEONG PIEUP-SIOS-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT # →ᆸᆺᆮ→ + +1124 ; 1107 1109 1107 ; MA # ( ᄤ → ᄇᄉᄇ ) HANGUL CHOSEONG PIEUP-SIOS-PIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP # + +1125 ; 1107 1109 1109 ; MA # ( ᄥ → ᄇᄉᄉ ) HANGUL CHOSEONG PIEUP-SSANGSIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS # + +1126 ; 1107 1109 110C ; MA # ( ᄦ → ᄇᄉᄌ ) HANGUL CHOSEONG PIEUP-SIOS-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC # + +A972 ; 1107 1109 1110 ; MA # ( ꥲ → ᄇᄉᄐ ) HANGUL CHOSEONG PIEUP-SIOS-THIEUTH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH # + +112B ; 1107 110B ; MA # ( ᄫ → ᄇᄋ ) HANGUL CHOSEONG KAPYEOUNPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG # +3178 ; 1107 110B ; MA # ( ㅸ → ᄇᄋ ) HANGUL LETTER KAPYEOUNPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG # →ᄫ→ +11E6 ; 1107 110B ; MA # ( ᇦ → ᄇᄋ ) HANGUL JONGSEONG KAPYEOUNPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG # →ᄫ→ + +1127 ; 1107 110C ; MA # ( ᄧ → ᄇᄌ ) HANGUL CHOSEONG PIEUP-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC # +3176 ; 1107 110C ; MA # ( ㅶ → ᄇᄌ ) HANGUL LETTER PIEUP-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC # →ᄧ→ +D7E8 ; 1107 110C ; MA # ( ퟨ → ᄇᄌ ) HANGUL JONGSEONG PIEUP-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC # →ᆸᆽ→ + +1128 ; 1107 110E ; MA # ( ᄨ → ᄇᄎ ) HANGUL CHOSEONG PIEUP-CHIEUCH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CHIEUCH # +D7E9 ; 1107 110E ; MA # ( ퟩ → ᄇᄎ ) HANGUL JONGSEONG PIEUP-CHIEUCH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CHIEUCH # →ᆸᆾ→ + +A973 ; 1107 110F ; MA # ( ꥳ → ᄇᄏ ) HANGUL CHOSEONG PIEUP-KHIEUKH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KHIEUKH # + +1129 ; 1107 1110 ; MA # ( ᄩ → ᄇᄐ ) HANGUL CHOSEONG PIEUP-THIEUTH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG THIEUTH # +3177 ; 1107 1110 ; MA # ( ㅷ → ᄇᄐ ) HANGUL LETTER PIEUP-THIEUTH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG THIEUTH # →ᄩ→ + +112A ; 1107 1111 ; MA # ( ᄪ → ᄇᄑ ) HANGUL CHOSEONG PIEUP-PHIEUPH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH # +11E4 ; 1107 1111 ; MA # ( ᇤ → ᄇᄑ ) HANGUL JONGSEONG PIEUP-PHIEUPH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH # →ᄪ→ + +A974 ; 1107 1112 ; MA # ( ꥴ → ᄇᄒ ) HANGUL CHOSEONG PIEUP-HIEUH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH # +11E5 ; 1107 1112 ; MA # ( ᇥ → ᄇᄒ ) HANGUL JONGSEONG PIEUP-HIEUH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH # →ᆸᇂ→ + +3145 ; 1109 ; MA # ( ㅅ → ᄉ ) HANGUL LETTER SIOS → HANGUL CHOSEONG SIOS # +11BA ; 1109 ; MA # ( ᆺ → ᄉ ) HANGUL JONGSEONG SIOS → HANGUL CHOSEONG SIOS # + +112D ; 1109 1100 ; MA # ( ᄭ → ᄉᄀ ) HANGUL CHOSEONG SIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # +317A ; 1109 1100 ; MA # ( ㅺ → ᄉᄀ ) HANGUL LETTER SIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # →ᄭ→ +11E7 ; 1109 1100 ; MA # ( ᇧ → ᄉᄀ ) HANGUL JONGSEONG SIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # →ᄭ→ + +112E ; 1109 1102 ; MA # ( ᄮ → ᄉᄂ ) HANGUL CHOSEONG SIOS-NIEUN → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG NIEUN # +317B ; 1109 1102 ; MA # ( ㅻ → ᄉᄂ ) HANGUL LETTER SIOS-NIEUN → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG NIEUN # →ᄮ→ + +112F ; 1109 1103 ; MA # ( ᄯ → ᄉᄃ ) HANGUL CHOSEONG SIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT # +317C ; 1109 1103 ; MA # ( ㅼ → ᄉᄃ ) HANGUL LETTER SIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT # →ᄯ→ +11E8 ; 1109 1103 ; MA # ( ᇨ → ᄉᄃ ) HANGUL JONGSEONG SIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT # →ᄯ→ + +1130 ; 1109 1105 ; MA # ( ᄰ → ᄉᄅ ) HANGUL CHOSEONG SIOS-RIEUL → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG RIEUL # +11E9 ; 1109 1105 ; MA # ( ᇩ → ᄉᄅ ) HANGUL JONGSEONG SIOS-RIEUL → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG RIEUL # →ᄰ→ + +1131 ; 1109 1106 ; MA # ( ᄱ → ᄉᄆ ) HANGUL CHOSEONG SIOS-MIEUM → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG MIEUM # +D7EA ; 1109 1106 ; MA # ( ퟪ → ᄉᄆ ) HANGUL JONGSEONG SIOS-MIEUM → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG MIEUM # →ᆺᆷ→ + +1132 ; 1109 1107 ; MA # ( ᄲ → ᄉᄇ ) HANGUL CHOSEONG SIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP # +317D ; 1109 1107 ; MA # ( ㅽ → ᄉᄇ ) HANGUL LETTER SIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP # →ᄲ→ +11EA ; 1109 1107 ; MA # ( ᇪ → ᄉᄇ ) HANGUL JONGSEONG SIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP # →ᄲ→ + +1133 ; 1109 1107 1100 ; MA # ( ᄳ → ᄉᄇᄀ ) HANGUL CHOSEONG SIOS-PIEUP-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK # + +D7EB ; 1109 1107 110B ; MA # ( ퟫ → ᄉᄇᄋ ) HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG # →ᆺᆸᆼ→ + +110A ; 1109 1109 ; MA # ( ᄊ → ᄉᄉ ) HANGUL CHOSEONG SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS # +3146 ; 1109 1109 ; MA # ( ㅆ → ᄉᄉ ) HANGUL LETTER SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS # →ᄊ→ +11BB ; 1109 1109 ; MA # ( ᆻ → ᄉᄉ ) HANGUL JONGSEONG SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS # →ᄊ→ + +D7EC ; 1109 1109 1100 ; MA # ( ퟬ → ᄉᄉᄀ ) HANGUL JONGSEONG SSANGSIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # →ᆺᆺᆨ→ + +D7ED ; 1109 1109 1103 ; MA # ( ퟭ → ᄉᄉᄃ ) HANGUL JONGSEONG SSANGSIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT # →ᆺᆺᆮ→ + +A975 ; 1109 1109 1107 ; MA # ( ꥵ → ᄉᄉᄇ ) HANGUL CHOSEONG SSANGSIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP # + +1134 ; 1109 1109 1109 ; MA # ( ᄴ → ᄉᄉᄉ ) HANGUL CHOSEONG SIOS-SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS # + +1135 ; 1109 110B ; MA # ( ᄵ → ᄉᄋ ) HANGUL CHOSEONG SIOS-IEUNG → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG IEUNG # + +1136 ; 1109 110C ; MA # ( ᄶ → ᄉᄌ ) HANGUL CHOSEONG SIOS-CIEUC → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC # +317E ; 1109 110C ; MA # ( ㅾ → ᄉᄌ ) HANGUL LETTER SIOS-CIEUC → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC # →ᄶ→ +D7EF ; 1109 110C ; MA # ( ퟯ → ᄉᄌ ) HANGUL JONGSEONG SIOS-CIEUC → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC # →ᆺᆽ→ + +1137 ; 1109 110E ; MA # ( ᄷ → ᄉᄎ ) HANGUL CHOSEONG SIOS-CHIEUCH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CHIEUCH # +D7F0 ; 1109 110E ; MA # ( ퟰ → ᄉᄎ ) HANGUL JONGSEONG SIOS-CHIEUCH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CHIEUCH # →ᆺᆾ→ + +1138 ; 1109 110F ; MA # ( ᄸ → ᄉᄏ ) HANGUL CHOSEONG SIOS-KHIEUKH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KHIEUKH # + +1139 ; 1109 1110 ; MA # ( ᄹ → ᄉᄐ ) HANGUL CHOSEONG SIOS-THIEUTH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH # +D7F1 ; 1109 1110 ; MA # ( ퟱ → ᄉᄐ ) HANGUL JONGSEONG SIOS-THIEUTH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH # →ᆺᇀ→ + +113A ; 1109 1111 ; MA # ( ᄺ → ᄉᄑ ) HANGUL CHOSEONG SIOS-PHIEUPH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PHIEUPH # + +D7EE ; 1109 1140 ; MA # ( ퟮ → ᄉᅀ ) HANGUL JONGSEONG SIOS-PANSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PANSIOS # →ᆺᇫ→ + +3147 ; 110B ; MA # ( ㅇ → ᄋ ) HANGUL LETTER IEUNG → HANGUL CHOSEONG IEUNG # +11BC ; 110B ; MA # ( ᆼ → ᄋ ) HANGUL JONGSEONG IEUNG → HANGUL CHOSEONG IEUNG # + +1141 ; 110B 1100 ; MA # ( ᅁ → ᄋᄀ ) HANGUL CHOSEONG IEUNG-KIYEOK → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK # +11EC ; 110B 1100 ; MA # ( ᇬ → ᄋᄀ ) HANGUL JONGSEONG IEUNG-KIYEOK → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK # →ᅁ→ + +11ED ; 110B 1100 1100 ; MA # ( ᇭ → ᄋᄀᄀ ) HANGUL JONGSEONG IEUNG-SSANGKIYEOK → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK # →ᆼᆨᆨ→ + +1142 ; 110B 1103 ; MA # ( ᅂ → ᄋᄃ ) HANGUL CHOSEONG IEUNG-TIKEUT → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG TIKEUT # + +A976 ; 110B 1105 ; MA # ( ꥶ → ᄋᄅ ) HANGUL CHOSEONG IEUNG-RIEUL → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG RIEUL # + +1143 ; 110B 1106 ; MA # ( ᅃ → ᄋᄆ ) HANGUL CHOSEONG IEUNG-MIEUM → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG MIEUM # + +1144 ; 110B 1107 ; MA # ( ᅄ → ᄋᄇ ) HANGUL CHOSEONG IEUNG-PIEUP → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PIEUP # + +1145 ; 110B 1109 ; MA # ( ᅅ → ᄋᄉ ) HANGUL CHOSEONG IEUNG-SIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS # +11F1 ; 110B 1109 ; MA # ( ᇱ → ᄋᄉ ) HANGUL JONGSEONG YESIEUNG-SIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS # →ᅅ→ +3182 ; 110B 1109 ; MA # ( ㆂ → ᄋᄉ ) HANGUL LETTER YESIEUNG-SIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS # →ᇱ→→ᅅ→ + +1147 ; 110B 110B ; MA # ( ᅇ → ᄋᄋ ) HANGUL CHOSEONG SSANGIEUNG → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG # +3180 ; 110B 110B ; MA # ( ㆀ → ᄋᄋ ) HANGUL LETTER SSANGIEUNG → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG # →ᅇ→ +11EE ; 110B 110B ; MA # ( ᇮ → ᄋᄋ ) HANGUL JONGSEONG SSANGIEUNG → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG # →ᅇ→ + +1148 ; 110B 110C ; MA # ( ᅈ → ᄋᄌ ) HANGUL CHOSEONG IEUNG-CIEUC → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG CIEUC # + +1149 ; 110B 110E ; MA # ( ᅉ → ᄋᄎ ) HANGUL CHOSEONG IEUNG-CHIEUCH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG CHIEUCH # + +11EF ; 110B 110F ; MA # ( ᇯ → ᄋᄏ ) HANGUL JONGSEONG IEUNG-KHIEUKH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KHIEUKH # →ᆼᆿ→ + +114A ; 110B 1110 ; MA # ( ᅊ → ᄋᄐ ) HANGUL CHOSEONG IEUNG-THIEUTH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG THIEUTH # + +114B ; 110B 1111 ; MA # ( ᅋ → ᄋᄑ ) HANGUL CHOSEONG IEUNG-PHIEUPH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PHIEUPH # + +A977 ; 110B 1112 ; MA # ( ꥷ → ᄋᄒ ) HANGUL CHOSEONG IEUNG-HIEUH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG HIEUH # + +1146 ; 110B 1140 ; MA # ( ᅆ → ᄋᅀ ) HANGUL CHOSEONG IEUNG-PANSIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS # +11F2 ; 110B 1140 ; MA # ( ᇲ → ᄋᅀ ) HANGUL JONGSEONG YESIEUNG-PANSIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS # →ᅆ→ +3183 ; 110B 1140 ; MA # ( ㆃ → ᄋᅀ ) HANGUL LETTER YESIEUNG-PANSIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS # →ᇲ→→ᅆ→ + +3148 ; 110C ; MA # ( ㅈ → ᄌ ) HANGUL LETTER CIEUC → HANGUL CHOSEONG CIEUC # +11BD ; 110C ; MA # ( ᆽ → ᄌ ) HANGUL JONGSEONG CIEUC → HANGUL CHOSEONG CIEUC # + +D7F7 ; 110C 1107 ; MA # ( ퟷ → ᄌᄇ ) HANGUL JONGSEONG CIEUC-PIEUP → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG PIEUP # →ᆽᆸ→ + +D7F8 ; 110C 1107 1107 ; MA # ( ퟸ → ᄌᄇᄇ ) HANGUL JONGSEONG CIEUC-SSANGPIEUP → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP # →ᆽᆸᆸ→ + +114D ; 110C 110B ; MA # ( ᅍ → ᄌᄋ ) HANGUL CHOSEONG CIEUC-IEUNG → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG IEUNG # + +110D ; 110C 110C ; MA # ( ᄍ → ᄌᄌ ) HANGUL CHOSEONG SSANGCIEUC → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC # +3149 ; 110C 110C ; MA # ( ㅉ → ᄌᄌ ) HANGUL LETTER SSANGCIEUC → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC # →ᄍ→ +D7F9 ; 110C 110C ; MA # ( ퟹ → ᄌᄌ ) HANGUL JONGSEONG SSANGCIEUC → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC # →ᆽᆽ→ + +A978 ; 110C 110C 1112 ; MA # ( ꥸ → ᄌᄌᄒ ) HANGUL CHOSEONG SSANGCIEUC-HIEUH → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG HIEUH # + +314A ; 110E ; MA # ( ㅊ → ᄎ ) HANGUL LETTER CHIEUCH → HANGUL CHOSEONG CHIEUCH # +11BE ; 110E ; MA # ( ᆾ → ᄎ ) HANGUL JONGSEONG CHIEUCH → HANGUL CHOSEONG CHIEUCH # + +1152 ; 110E 110F ; MA # ( ᅒ → ᄎᄏ ) HANGUL CHOSEONG CHIEUCH-KHIEUKH → HANGUL CHOSEONG CHIEUCH, HANGUL CHOSEONG KHIEUKH # + +1153 ; 110E 1112 ; MA # ( ᅓ → ᄎᄒ ) HANGUL CHOSEONG CHIEUCH-HIEUH → HANGUL CHOSEONG CHIEUCH, HANGUL CHOSEONG HIEUH # + +314B ; 110F ; MA # ( ㅋ → ᄏ ) HANGUL LETTER KHIEUKH → HANGUL CHOSEONG KHIEUKH # +11BF ; 110F ; MA # ( ᆿ → ᄏ ) HANGUL JONGSEONG KHIEUKH → HANGUL CHOSEONG KHIEUKH # + +314C ; 1110 ; MA # ( ㅌ → ᄐ ) HANGUL LETTER THIEUTH → HANGUL CHOSEONG THIEUTH # +11C0 ; 1110 ; MA # ( ᇀ → ᄐ ) HANGUL JONGSEONG THIEUTH → HANGUL CHOSEONG THIEUTH # + +A979 ; 1110 1110 ; MA # ( ꥹ → ᄐᄐ ) HANGUL CHOSEONG SSANGTHIEUTH → HANGUL CHOSEONG THIEUTH, HANGUL CHOSEONG THIEUTH # + +314D ; 1111 ; MA # ( ㅍ → ᄑ ) HANGUL LETTER PHIEUPH → HANGUL CHOSEONG PHIEUPH # +11C1 ; 1111 ; MA # ( ᇁ → ᄑ ) HANGUL JONGSEONG PHIEUPH → HANGUL CHOSEONG PHIEUPH # + +1156 ; 1111 1107 ; MA # ( ᅖ → ᄑᄇ ) HANGUL CHOSEONG PHIEUPH-PIEUP → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG PIEUP # +11F3 ; 1111 1107 ; MA # ( ᇳ → ᄑᄇ ) HANGUL JONGSEONG PHIEUPH-PIEUP → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG PIEUP # →ᅖ→ + +D7FA ; 1111 1109 ; MA # ( ퟺ → ᄑᄉ ) HANGUL JONGSEONG PHIEUPH-SIOS → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG SIOS # →ᇁᆺ→ + +1157 ; 1111 110B ; MA # ( ᅗ → ᄑᄋ ) HANGUL CHOSEONG KAPYEOUNPHIEUPH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG # +3184 ; 1111 110B ; MA # ( ㆄ → ᄑᄋ ) HANGUL LETTER KAPYEOUNPHIEUPH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG # →ᅗ→ +11F4 ; 1111 110B ; MA # ( ᇴ → ᄑᄋ ) HANGUL JONGSEONG KAPYEOUNPHIEUPH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG # →ᅗ→ + +D7FB ; 1111 1110 ; MA # ( ퟻ → ᄑᄐ ) HANGUL JONGSEONG PHIEUPH-THIEUTH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG THIEUTH # →ᇁᇀ→ + +A97A ; 1111 1112 ; MA # ( ꥺ → ᄑᄒ ) HANGUL CHOSEONG PHIEUPH-HIEUH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG HIEUH # + +314E ; 1112 ; MA # ( ㅎ → ᄒ ) HANGUL LETTER HIEUH → HANGUL CHOSEONG HIEUH # +11C2 ; 1112 ; MA # ( ᇂ → ᄒ ) HANGUL JONGSEONG HIEUH → HANGUL CHOSEONG HIEUH # + +11F5 ; 1112 1102 ; MA # ( ᇵ → ᄒᄂ ) HANGUL JONGSEONG HIEUH-NIEUN → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG NIEUN # →ᇂᆫ→ + +11F6 ; 1112 1105 ; MA # ( ᇶ → ᄒᄅ ) HANGUL JONGSEONG HIEUH-RIEUL → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG RIEUL # →ᇂᆯ→ + +11F7 ; 1112 1106 ; MA # ( ᇷ → ᄒᄆ ) HANGUL JONGSEONG HIEUH-MIEUM → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG MIEUM # →ᇂᆷ→ + +11F8 ; 1112 1107 ; MA # ( ᇸ → ᄒᄇ ) HANGUL JONGSEONG HIEUH-PIEUP → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG PIEUP # →ᇂᆸ→ + +A97B ; 1112 1109 ; MA # ( ꥻ → ᄒᄉ ) HANGUL CHOSEONG HIEUH-SIOS → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG SIOS # + +1158 ; 1112 1112 ; MA # ( ᅘ → ᄒᄒ ) HANGUL CHOSEONG SSANGHIEUH → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG HIEUH # +3185 ; 1112 1112 ; MA # ( ㆅ → ᄒᄒ ) HANGUL LETTER SSANGHIEUH → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG HIEUH # →ᅘ→ + +113D ; 113C 113C ; MA # ( ᄽ → ᄼᄼ ) HANGUL CHOSEONG CHITUEUMSSANGSIOS → HANGUL CHOSEONG CHITUEUMSIOS, HANGUL CHOSEONG CHITUEUMSIOS # + +113F ; 113E 113E ; MA # ( ᄿ → ᄾᄾ ) HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS → HANGUL CHOSEONG CEONGCHIEUMSIOS, HANGUL CHOSEONG CEONGCHIEUMSIOS # + +317F ; 1140 ; MA # ( ㅿ → ᅀ ) HANGUL LETTER PANSIOS → HANGUL CHOSEONG PANSIOS # +11EB ; 1140 ; MA # ( ᇫ → ᅀ ) HANGUL JONGSEONG PANSIOS → HANGUL CHOSEONG PANSIOS # + +D7F3 ; 1140 1107 ; MA # ( ퟳ → ᅀᄇ ) HANGUL JONGSEONG PANSIOS-PIEUP → HANGUL CHOSEONG PANSIOS, HANGUL CHOSEONG PIEUP # →ᇫᆸ→ + +D7F4 ; 1140 1107 110B ; MA # ( ퟴ → ᅀᄇᄋ ) HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP → HANGUL CHOSEONG PANSIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG # →ᇫᆸᆼ→ + +3181 ; 114C ; MA # ( ㆁ → ᅌ ) HANGUL LETTER YESIEUNG → HANGUL CHOSEONG YESIEUNG # +11F0 ; 114C ; MA # ( ᇰ → ᅌ ) HANGUL JONGSEONG YESIEUNG → HANGUL CHOSEONG YESIEUNG # + +D7F5 ; 114C 1106 ; MA # ( ퟵ → ᅌᄆ ) HANGUL JONGSEONG YESIEUNG-MIEUM → HANGUL CHOSEONG YESIEUNG, HANGUL CHOSEONG MIEUM # →ᇰᆷ→ + +D7F6 ; 114C 1112 ; MA # ( ퟶ → ᅌᄒ ) HANGUL JONGSEONG YESIEUNG-HIEUH → HANGUL CHOSEONG YESIEUNG, HANGUL CHOSEONG HIEUH # →ᇰᇂ→ + +114F ; 114E 114E ; MA # ( ᅏ → ᅎᅎ ) HANGUL CHOSEONG CHITUEUMSSANGCIEUC → HANGUL CHOSEONG CHITUEUMCIEUC, HANGUL CHOSEONG CHITUEUMCIEUC # + +1151 ; 1150 1150 ; MA # ( ᅑ → ᅐᅐ ) HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC → HANGUL CHOSEONG CEONGCHIEUMCIEUC, HANGUL CHOSEONG CEONGCHIEUMCIEUC # + +3186 ; 1159 ; MA # ( ㆆ → ᅙ ) HANGUL LETTER YEORINHIEUH → HANGUL CHOSEONG YEORINHIEUH # +11F9 ; 1159 ; MA # ( ᇹ → ᅙ ) HANGUL JONGSEONG YEORINHIEUH → HANGUL CHOSEONG YEORINHIEUH # + +A97C ; 1159 1159 ; MA # ( ꥼ → ᅙᅙ ) HANGUL CHOSEONG SSANGYEORINHIEUH → HANGUL CHOSEONG YEORINHIEUH, HANGUL CHOSEONG YEORINHIEUH # + +3164 ; 1160 ; MA # ( → ) HANGUL FILLER → HANGUL JUNGSEONG FILLER # + +314F ; 1161 ; MA # ( ㅏ → ᅡ ) HANGUL LETTER A → HANGUL JUNGSEONG A # + +11A3 ; 1161 30FC ; MA # ( ᆣ → ᅡー ) HANGUL JUNGSEONG A-EU → HANGUL JUNGSEONG A, KATAKANA-HIRAGANA PROLONGED SOUND MARK # →ᅡᅳ→ + +1176 ; 1161 1169 ; MA # ( ᅶ → ᅡᅩ ) HANGUL JUNGSEONG A-O → HANGUL JUNGSEONG A, HANGUL JUNGSEONG O # + +1177 ; 1161 116E ; MA # ( ᅷ → ᅡᅮ ) HANGUL JUNGSEONG A-U → HANGUL JUNGSEONG A, HANGUL JUNGSEONG U # + +1162 ; 1161 4E28 ; MA # ( ᅢ → ᅡ丨 ) HANGUL JUNGSEONG AE → HANGUL JUNGSEONG A, CJK UNIFIED IDEOGRAPH-4E28 # →ᅡᅵ→ +3150 ; 1161 4E28 ; MA # ( ㅐ → ᅡ丨 ) HANGUL LETTER AE → HANGUL JUNGSEONG A, CJK UNIFIED IDEOGRAPH-4E28 # →ᅢ→→ᅡᅵ→ + +3151 ; 1163 ; MA # ( ㅑ → ᅣ ) HANGUL LETTER YA → HANGUL JUNGSEONG YA # + +1178 ; 1163 1169 ; MA # ( ᅸ → ᅣᅩ ) HANGUL JUNGSEONG YA-O → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG O # + +1179 ; 1163 116D ; MA # ( ᅹ → ᅣᅭ ) HANGUL JUNGSEONG YA-YO → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG YO # + +11A4 ; 1163 116E ; MA # ( ᆤ → ᅣᅮ ) HANGUL JUNGSEONG YA-U → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG U # + +1164 ; 1163 4E28 ; MA # ( ᅤ → ᅣ丨 ) HANGUL JUNGSEONG YAE → HANGUL JUNGSEONG YA, CJK UNIFIED IDEOGRAPH-4E28 # →ᅣᅵ→ +3152 ; 1163 4E28 ; MA # ( ㅒ → ᅣ丨 ) HANGUL LETTER YAE → HANGUL JUNGSEONG YA, CJK UNIFIED IDEOGRAPH-4E28 # →ᅤ→→ᅣᅵ→ + +3153 ; 1165 ; MA # ( ㅓ → ᅥ ) HANGUL LETTER EO → HANGUL JUNGSEONG EO # + +117C ; 1165 30FC ; MA # ( ᅼ → ᅥー ) HANGUL JUNGSEONG EO-EU → HANGUL JUNGSEONG EO, KATAKANA-HIRAGANA PROLONGED SOUND MARK # →ᅥᅳ→ + +117A ; 1165 1169 ; MA # ( ᅺ → ᅥᅩ ) HANGUL JUNGSEONG EO-O → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG O # + +117B ; 1165 116E ; MA # ( ᅻ → ᅥᅮ ) HANGUL JUNGSEONG EO-U → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG U # + +1166 ; 1165 4E28 ; MA # ( ᅦ → ᅥ丨 ) HANGUL JUNGSEONG E → HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28 # →ᅥᅵ→ +3154 ; 1165 4E28 ; MA # ( ㅔ → ᅥ丨 ) HANGUL LETTER E → HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28 # →ᅦ→→ᅥᅵ→ + +3155 ; 1167 ; MA # ( ㅕ → ᅧ ) HANGUL LETTER YEO → HANGUL JUNGSEONG YEO # + +11A5 ; 1167 1163 ; MA # ( ᆥ → ᅧᅣ ) HANGUL JUNGSEONG YEO-YA → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG YA # + +117D ; 1167 1169 ; MA # ( ᅽ → ᅧᅩ ) HANGUL JUNGSEONG YEO-O → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG O # + +117E ; 1167 116E ; MA # ( ᅾ → ᅧᅮ ) HANGUL JUNGSEONG YEO-U → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG U # + +1168 ; 1167 4E28 ; MA # ( ᅨ → ᅧ丨 ) HANGUL JUNGSEONG YE → HANGUL JUNGSEONG YEO, CJK UNIFIED IDEOGRAPH-4E28 # →ᅧᅵ→ +3156 ; 1167 4E28 ; MA # ( ㅖ → ᅧ丨 ) HANGUL LETTER YE → HANGUL JUNGSEONG YEO, CJK UNIFIED IDEOGRAPH-4E28 # →ᅨ→→ᅧᅵ→ + +3157 ; 1169 ; MA # ( ㅗ → ᅩ ) HANGUL LETTER O → HANGUL JUNGSEONG O # + +116A ; 1169 1161 ; MA # ( ᅪ → ᅩᅡ ) HANGUL JUNGSEONG WA → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A # +3158 ; 1169 1161 ; MA # ( ㅘ → ᅩᅡ ) HANGUL LETTER WA → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A # →ᅪ→ + +116B ; 1169 1161 4E28 ; MA # ( ᅫ → ᅩᅡ丨 ) HANGUL JUNGSEONG WAE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A, CJK UNIFIED IDEOGRAPH-4E28 # →ᅩᅡᅵ→ +3159 ; 1169 1161 4E28 ; MA # ( ㅙ → ᅩᅡ丨 ) HANGUL LETTER WAE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A, CJK UNIFIED IDEOGRAPH-4E28 # →ᅫ→→ᅩᅡᅵ→ + +11A6 ; 1169 1163 ; MA # ( ᆦ → ᅩᅣ ) HANGUL JUNGSEONG O-YA → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YA # + +11A7 ; 1169 1163 4E28 ; MA # ( ᆧ → ᅩᅣ丨 ) HANGUL JUNGSEONG O-YAE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YA, CJK UNIFIED IDEOGRAPH-4E28 # →ᅩᅣᅵ→ + +117F ; 1169 1165 ; MA # ( ᅿ → ᅩᅥ ) HANGUL JUNGSEONG O-EO → HANGUL JUNGSEONG O, HANGUL JUNGSEONG EO # + +1180 ; 1169 1165 4E28 ; MA # ( ᆀ → ᅩᅥ丨 ) HANGUL JUNGSEONG O-E → HANGUL JUNGSEONG O, HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28 # →ᅩᅥᅵ→ + +D7B0 ; 1169 1167 ; MA # ( ힰ → ᅩᅧ ) HANGUL JUNGSEONG O-YEO → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YEO # + +1181 ; 1169 1167 4E28 ; MA # ( ᆁ → ᅩᅧ丨 ) HANGUL JUNGSEONG O-YE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YEO, CJK UNIFIED IDEOGRAPH-4E28 # →ᅩᅧᅵ→ + +1182 ; 1169 1169 ; MA # ( ᆂ → ᅩᅩ ) HANGUL JUNGSEONG O-O → HANGUL JUNGSEONG O, HANGUL JUNGSEONG O # + +D7B1 ; 1169 1169 4E28 ; MA # ( ힱ → ᅩᅩ丨 ) HANGUL JUNGSEONG O-O-I → HANGUL JUNGSEONG O, HANGUL JUNGSEONG O, CJK UNIFIED IDEOGRAPH-4E28 # →ᅩᅩᅵ→ + +1183 ; 1169 116E ; MA # ( ᆃ → ᅩᅮ ) HANGUL JUNGSEONG O-U → HANGUL JUNGSEONG O, HANGUL JUNGSEONG U # + +116C ; 1169 4E28 ; MA # ( ᅬ → ᅩ丨 ) HANGUL JUNGSEONG OE → HANGUL JUNGSEONG O, CJK UNIFIED IDEOGRAPH-4E28 # →ᅩᅵ→ +315A ; 1169 4E28 ; MA # ( ㅚ → ᅩ丨 ) HANGUL LETTER OE → HANGUL JUNGSEONG O, CJK UNIFIED IDEOGRAPH-4E28 # →ᅬ→→ᅩᅵ→ + +315B ; 116D ; MA # ( ㅛ → ᅭ ) HANGUL LETTER YO → HANGUL JUNGSEONG YO # + +D7B2 ; 116D 1161 ; MA # ( ힲ → ᅭᅡ ) HANGUL JUNGSEONG YO-A → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG A # + +D7B3 ; 116D 1161 4E28 ; MA # ( ힳ → ᅭᅡ丨 ) HANGUL JUNGSEONG YO-AE → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG A, CJK UNIFIED IDEOGRAPH-4E28 # →ᅭᅡᅵ→ + +1184 ; 116D 1163 ; MA # ( ᆄ → ᅭᅣ ) HANGUL JUNGSEONG YO-YA → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA # +3187 ; 116D 1163 ; MA # ( ㆇ → ᅭᅣ ) HANGUL LETTER YO-YA → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA # →ᆄ→ +1186 ; 116D 1163 ; MA # ( ᆆ → ᅭᅣ ) HANGUL JUNGSEONG YO-YEO → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA # →ᆄ→ + +1185 ; 116D 1163 4E28 ; MA # ( ᆅ → ᅭᅣ丨 ) HANGUL JUNGSEONG YO-YAE → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA, CJK UNIFIED IDEOGRAPH-4E28 # →ᅭᅣᅵ→ +3188 ; 116D 1163 4E28 ; MA # ( ㆈ → ᅭᅣ丨 ) HANGUL LETTER YO-YAE → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA, CJK UNIFIED IDEOGRAPH-4E28 # →ᆅ→→ᅭᅣᅵ→ + +D7B4 ; 116D 1165 ; MA # ( ힴ → ᅭᅥ ) HANGUL JUNGSEONG YO-EO → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG EO # + +1187 ; 116D 1169 ; MA # ( ᆇ → ᅭᅩ ) HANGUL JUNGSEONG YO-O → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG O # + +1188 ; 116D 4E28 ; MA # ( ᆈ → ᅭ丨 ) HANGUL JUNGSEONG YO-I → HANGUL JUNGSEONG YO, CJK UNIFIED IDEOGRAPH-4E28 # →ᅭᅵ→ +3189 ; 116D 4E28 ; MA # ( ㆉ → ᅭ丨 ) HANGUL LETTER YO-I → HANGUL JUNGSEONG YO, CJK UNIFIED IDEOGRAPH-4E28 # →ᆈ→→ᅭᅵ→ + +315C ; 116E ; MA # ( ㅜ → ᅮ ) HANGUL LETTER U → HANGUL JUNGSEONG U # + +1189 ; 116E 1161 ; MA # ( ᆉ → ᅮᅡ ) HANGUL JUNGSEONG U-A → HANGUL JUNGSEONG U, HANGUL JUNGSEONG A # + +118A ; 116E 1161 4E28 ; MA # ( ᆊ → ᅮᅡ丨 ) HANGUL JUNGSEONG U-AE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG A, CJK UNIFIED IDEOGRAPH-4E28 # →ᅮᅡᅵ→ + +116F ; 116E 1165 ; MA # ( ᅯ → ᅮᅥ ) HANGUL JUNGSEONG WEO → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO # +315D ; 116E 1165 ; MA # ( ㅝ → ᅮᅥ ) HANGUL LETTER WEO → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO # →ᅯ→ + +118B ; 116E 1165 30FC ; MA # ( ᆋ → ᅮᅥー ) HANGUL JUNGSEONG U-EO-EU → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, KATAKANA-HIRAGANA PROLONGED SOUND MARK # →ᅮᅥᅳ→ + +1170 ; 116E 1165 4E28 ; MA # ( ᅰ → ᅮᅥ丨 ) HANGUL JUNGSEONG WE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28 # →ᅮᅥᅵ→ +315E ; 116E 1165 4E28 ; MA # ( ㅞ → ᅮᅥ丨 ) HANGUL LETTER WE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28 # →ᅰ→→ᅮᅥᅵ→ + +D7B5 ; 116E 1167 ; MA # ( ힵ → ᅮᅧ ) HANGUL JUNGSEONG U-YEO → HANGUL JUNGSEONG U, HANGUL JUNGSEONG YEO # + +118C ; 116E 1167 4E28 ; MA # ( ᆌ → ᅮᅧ丨 ) HANGUL JUNGSEONG U-YE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG YEO, CJK UNIFIED IDEOGRAPH-4E28 # →ᅮᅧᅵ→ + +118D ; 116E 116E ; MA # ( ᆍ → ᅮᅮ ) HANGUL JUNGSEONG U-U → HANGUL JUNGSEONG U, HANGUL JUNGSEONG U # + +1171 ; 116E 4E28 ; MA # ( ᅱ → ᅮ丨 ) HANGUL JUNGSEONG WI → HANGUL JUNGSEONG U, CJK UNIFIED IDEOGRAPH-4E28 # →ᅮᅵ→ +315F ; 116E 4E28 ; MA # ( ㅟ → ᅮ丨 ) HANGUL LETTER WI → HANGUL JUNGSEONG U, CJK UNIFIED IDEOGRAPH-4E28 # →ᅱ→→ᅮᅵ→ + +D7B6 ; 116E 4E28 4E28 ; MA # ( ힶ → ᅮ丨丨 ) HANGUL JUNGSEONG U-I-I → HANGUL JUNGSEONG U, CJK UNIFIED IDEOGRAPH-4E28, CJK UNIFIED IDEOGRAPH-4E28 # →ᅮᅵᅵ→ + +3160 ; 1172 ; MA # ( ㅠ → ᅲ ) HANGUL LETTER YU → HANGUL JUNGSEONG YU # + +118E ; 1172 1161 ; MA # ( ᆎ → ᅲᅡ ) HANGUL JUNGSEONG YU-A → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG A # + +D7B7 ; 1172 1161 4E28 ; MA # ( ힷ → ᅲᅡ丨 ) HANGUL JUNGSEONG YU-AE → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG A, CJK UNIFIED IDEOGRAPH-4E28 # →ᅲᅡᅵ→ + +118F ; 1172 1165 ; MA # ( ᆏ → ᅲᅥ ) HANGUL JUNGSEONG YU-EO → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG EO # + +1190 ; 1172 1165 4E28 ; MA # ( ᆐ → ᅲᅥ丨 ) HANGUL JUNGSEONG YU-E → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28 # →ᅲᅥᅵ→ + +1191 ; 1172 1167 ; MA # ( ᆑ → ᅲᅧ ) HANGUL JUNGSEONG YU-YEO → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO # +318A ; 1172 1167 ; MA # ( ㆊ → ᅲᅧ ) HANGUL LETTER YU-YEO → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO # →ᆑ→ + +1192 ; 1172 1167 4E28 ; MA # ( ᆒ → ᅲᅧ丨 ) HANGUL JUNGSEONG YU-YE → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO, CJK UNIFIED IDEOGRAPH-4E28 # →ᅲᅧᅵ→ +318B ; 1172 1167 4E28 ; MA # ( ㆋ → ᅲᅧ丨 ) HANGUL LETTER YU-YE → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO, CJK UNIFIED IDEOGRAPH-4E28 # →ᆒ→→ᅲᅧᅵ→ + +D7B8 ; 1172 1169 ; MA # ( ힸ → ᅲᅩ ) HANGUL JUNGSEONG YU-O → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG O # + +1193 ; 1172 116E ; MA # ( ᆓ → ᅲᅮ ) HANGUL JUNGSEONG YU-U → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG U # + +1194 ; 1172 4E28 ; MA # ( ᆔ → ᅲ丨 ) HANGUL JUNGSEONG YU-I → HANGUL JUNGSEONG YU, CJK UNIFIED IDEOGRAPH-4E28 # →ᅲᅵ→ +318C ; 1172 4E28 ; MA # ( ㆌ → ᅲ丨 ) HANGUL LETTER YU-I → HANGUL JUNGSEONG YU, CJK UNIFIED IDEOGRAPH-4E28 # →ᆔ→→ᅲᅵ→ + +318D ; 119E ; MA # ( ㆍ → ᆞ ) HANGUL LETTER ARAEA → HANGUL JUNGSEONG ARAEA # + +D7C5 ; 119E 1161 ; MA # ( ퟅ → ᆞᅡ ) HANGUL JUNGSEONG ARAEA-A → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG A # + +119F ; 119E 1165 ; MA # ( ᆟ → ᆞᅥ ) HANGUL JUNGSEONG ARAEA-EO → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG EO # + +D7C6 ; 119E 1165 4E28 ; MA # ( ퟆ → ᆞᅥ丨 ) HANGUL JUNGSEONG ARAEA-E → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28 # →ᆞᅥᅵ→ + +11A0 ; 119E 116E ; MA # ( ᆠ → ᆞᅮ ) HANGUL JUNGSEONG ARAEA-U → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG U # + +11A2 ; 119E 119E ; MA # ( ᆢ → ᆞᆞ ) HANGUL JUNGSEONG SSANGARAEA → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG ARAEA # + +11A1 ; 119E 4E28 ; MA # ( ᆡ → ᆞ丨 ) HANGUL JUNGSEONG ARAEA-I → HANGUL JUNGSEONG ARAEA, CJK UNIFIED IDEOGRAPH-4E28 # →ᆞᅵ→ +318E ; 119E 4E28 ; MA # ( ㆎ → ᆞ丨 ) HANGUL LETTER ARAEAE → HANGUL JUNGSEONG ARAEA, CJK UNIFIED IDEOGRAPH-4E28 # →ᆡ→→ᆞᅵ→ + +30D8 ; 3078 ; MA # ( ヘ → へ ) KATAKANA LETTER HE → HIRAGANA LETTER HE # + +2341 ; 303C ; MA #* ( ⍁ → 〼 ) APL FUNCTIONAL SYMBOL QUAD SLASH → MASU MARK # →⧄→ +29C4 ; 303C ; MA #* ( ⧄ → 〼 ) SQUARED RISING DIAGONAL SLASH → MASU MARK # + +A49E ; A04A ; MA #* ( ꒞ → ꁊ ) YI RADICAL PUT → YI SYLLABLE PUT # + +A4AC ; A050 ; MA #* ( ꒬ → ꁐ ) YI RADICAL PYT → YI SYLLABLE PYT # + +A49C ; A0C0 ; MA #* ( ꒜ → ꃀ ) YI RADICAL MOP → YI SYLLABLE MOP # + +A4A8 ; A132 ; MA #* ( ꒨ → ꄲ ) YI RADICAL TU → YI SYLLABLE TU # + +A4BF ; A259 ; MA #* ( ꒿ → ꉙ ) YI RADICAL HXOP → YI SYLLABLE HXOP # + +A4BE ; A2B1 ; MA #* ( ꒾ → ꊱ ) YI RADICAL CIP → YI SYLLABLE CIP # + +A494 ; A2CD ; MA #* ( ꒔ → ꋍ ) YI RADICAL CYP → YI SYLLABLE CYP # + +A4C0 ; A3AB ; MA #* ( ꓀ → ꎫ ) YI RADICAL SHAT → YI SYLLABLE SHAT # + +A4C2 ; A3B5 ; MA #* ( ꓂ → ꎵ ) YI RADICAL SHOP → YI SYLLABLE SHOP # + +A4BA ; A3BF ; MA #* ( ꒺ → ꎿ ) YI RADICAL SHUR → YI SYLLABLE SHUR # + +A4B0 ; A3C2 ; MA #* ( ꒰ → ꏂ ) YI RADICAL SHY → YI SYLLABLE SHY # + +A4A7 ; A458 ; MA #* ( ꒧ → ꑘ ) YI RADICAL NYOP → YI SYLLABLE NYOP # + +22A5 ; A4D5 ; MA #* ( ⊥ → ꓕ ) UP TACK → LISU LETTER THA # +27C2 ; A4D5 ; MA #* ( ⟂ → ꓕ ) PERPENDICULAR → LISU LETTER THA # →⊥→ +A7B1 ; A4D5 ; MA # ( Ʇ → ꓕ ) LATIN CAPITAL LETTER TURNED T → LISU LETTER THA # + +A79E ; A4E4 ; MA # ( Ꞟ → ꓤ ) LATIN CAPITAL LETTER VOLAPUK UE → LISU LETTER ZA # + +2141 ; A4E8 ; MA #* ( ⅁ → ꓨ ) TURNED SANS-SERIF CAPITAL G → LISU LETTER HHA # + +2142 ; A4F6 ; MA #* ( ⅂ → ꓶ ) TURNED SANS-SERIF CAPITAL L → LISU LETTER UH # +10411 ; A4F6 ; MA # ( 𐐑 → ꓶ ) DESERET CAPITAL LETTER PEE → LISU LETTER UH # →⅂→ + +2295 ; 102A8 ; MA #* ( ⊕ → 𐊨 ) CIRCLED PLUS → CARIAN LETTER Q # +2A01 ; 102A8 ; MA #* ( ⨁ → 𐊨 ) N-ARY CIRCLED PLUS OPERATOR → CARIAN LETTER Q # →⊕→ +1F728 ; 102A8 ; MA #* ( 🜨 → 𐊨 ) ALCHEMICAL SYMBOL FOR VERDIGRIS → CARIAN LETTER Q # →⊕→ + +25BD ; 102BC ; MA #* ( ▽ → 𐊼 ) WHITE DOWN-POINTING TRIANGLE → CARIAN LETTER K # +1F704 ; 102BC ; MA #* ( 🜄 → 𐊼 ) ALCHEMICAL SYMBOL FOR WATER → CARIAN LETTER K # →▽→ + +29D6 ; 102C0 ; MA #* ( ⧖ → 𐋀 ) WHITE HOURGLASS → CARIAN LETTER G # + +A79B ; 1043A ; MA # ( ꞛ → 𐐺 ) LATIN SMALL LETTER VOLAPUK AE → DESERET SMALL LETTER BEE # + +A79A ; 10412 ; MA # ( Ꞛ → 𐐒 ) LATIN CAPITAL LETTER VOLAPUK AE → DESERET CAPITAL LETTER BEE # + +104A0 ; 10486 ; MA # ( 𐒠 → 𐒆 ) OSMANYA DIGIT ZERO → OSMANYA LETTER DEEL # + +103D1 ; 10382 ; MA # ( 𐏑 → 𐎂 ) OLD PERSIAN NUMBER ONE → UGARITIC LETTER GAMLA # + +103D3 ; 10393 ; MA # ( 𐏓 → 𐎓 ) OLD PERSIAN NUMBER TEN → UGARITIC LETTER AIN # + +12038 ; 1039A ; MA # ( 𒀸 → 𐎚 ) CUNEIFORM SIGN ASH → UGARITIC LETTER TO # + +2625 ; 1099E ; MA #* ( ☥ → ‎𐦞‎ ) ANKH → MEROITIC HIEROGLYPHIC SYMBOL VIDJ # +132F9 ; 1099E ; MA # ( 𓋹 → ‎𐦞‎ ) EGYPTIAN HIEROGLYPH S034 → MEROITIC HIEROGLYPHIC SYMBOL VIDJ # →☥→ + +3039 ; 5344 ; MA # ( 〹 → 卄 ) HANGZHOU NUMERAL TWENTY → CJK UNIFIED IDEOGRAPH-5344 # + +F967 ; 4E0D ; MA # ( 不 → 不 ) CJK COMPATIBILITY IDEOGRAPH-F967 → CJK UNIFIED IDEOGRAPH-4E0D # + +2F800 ; 4E3D ; MA # ( 丽 → 丽 ) CJK COMPATIBILITY IDEOGRAPH-2F800 → CJK UNIFIED IDEOGRAPH-4E3D # + +FA70 ; 4E26 ; MA # ( 並 → 並 ) CJK COMPATIBILITY IDEOGRAPH-FA70 → CJK UNIFIED IDEOGRAPH-4E26 # + +239C ; 4E28 ; MA #* ( ⎜ → 丨 ) LEFT PARENTHESIS EXTENSION → CJK UNIFIED IDEOGRAPH-4E28 # →⎥→→⎮→ +239F ; 4E28 ; MA #* ( ⎟ → 丨 ) RIGHT PARENTHESIS EXTENSION → CJK UNIFIED IDEOGRAPH-4E28 # →⎥→→⎮→ +23A2 ; 4E28 ; MA #* ( ⎢ → 丨 ) LEFT SQUARE BRACKET EXTENSION → CJK UNIFIED IDEOGRAPH-4E28 # →⎥→→⎮→ +23A5 ; 4E28 ; MA #* ( ⎥ → 丨 ) RIGHT SQUARE BRACKET EXTENSION → CJK UNIFIED IDEOGRAPH-4E28 # →⎮→ +23AA ; 4E28 ; MA #* ( ⎪ → 丨 ) CURLY BRACKET EXTENSION → CJK UNIFIED IDEOGRAPH-4E28 # →⎥→→⎮→ +23AE ; 4E28 ; MA #* ( ⎮ → 丨 ) INTEGRAL EXTENSION → CJK UNIFIED IDEOGRAPH-4E28 # +31D1 ; 4E28 ; MA #* ( ㇑ → 丨 ) CJK STROKE S → CJK UNIFIED IDEOGRAPH-4E28 # +1175 ; 4E28 ; MA # ( ᅵ → 丨 ) HANGUL JUNGSEONG I → CJK UNIFIED IDEOGRAPH-4E28 # →ㅣ→ +3163 ; 4E28 ; MA # ( ㅣ → 丨 ) HANGUL LETTER I → CJK UNIFIED IDEOGRAPH-4E28 # +2F01 ; 4E28 ; MA #* ( ⼁ → 丨 ) KANGXI RADICAL LINE → CJK UNIFIED IDEOGRAPH-4E28 # + +119C ; 4E28 30FC ; MA # ( ᆜ → 丨ー ) HANGUL JUNGSEONG I-EU → CJK UNIFIED IDEOGRAPH-4E28, KATAKANA-HIRAGANA PROLONGED SOUND MARK # →ᅵᅳ→ + +1198 ; 4E28 1161 ; MA # ( ᆘ → 丨ᅡ ) HANGUL JUNGSEONG I-A → CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG A # →ᅵᅡ→ + +1199 ; 4E28 1163 ; MA # ( ᆙ → 丨ᅣ ) HANGUL JUNGSEONG I-YA → CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG YA # →ᅵᅣ→ + +D7BD ; 4E28 1163 1169 ; MA # ( ힽ → 丨ᅣᅩ ) HANGUL JUNGSEONG I-YA-O → CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG O # →ᅵᅣᅩ→ + +D7BE ; 4E28 1163 4E28 ; MA # ( ힾ → 丨ᅣ丨 ) HANGUL JUNGSEONG I-YAE → CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG YA, CJK UNIFIED IDEOGRAPH-4E28 # →ᅵᅣᅵ→ + +D7BF ; 4E28 1167 ; MA # ( ힿ → 丨ᅧ ) HANGUL JUNGSEONG I-YEO → CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG YEO # →ᅵᅧ→ + +D7C0 ; 4E28 1167 4E28 ; MA # ( ퟀ → 丨ᅧ丨 ) HANGUL JUNGSEONG I-YE → CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG YEO, CJK UNIFIED IDEOGRAPH-4E28 # →ᅵᅧᅵ→ + +119A ; 4E28 1169 ; MA # ( ᆚ → 丨ᅩ ) HANGUL JUNGSEONG I-O → CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG O # →ᅵᅩ→ + +D7C1 ; 4E28 1169 4E28 ; MA # ( ퟁ → 丨ᅩ丨 ) HANGUL JUNGSEONG I-O-I → CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG O, CJK UNIFIED IDEOGRAPH-4E28 # →ᅵᅩᅵ→ + +D7C2 ; 4E28 116D ; MA # ( ퟂ → 丨ᅭ ) HANGUL JUNGSEONG I-YO → CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG YO # →ᅵᅭ→ + +119B ; 4E28 116E ; MA # ( ᆛ → 丨ᅮ ) HANGUL JUNGSEONG I-U → CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG U # →ᅵᅮ→ + +D7C3 ; 4E28 1172 ; MA # ( ퟃ → 丨ᅲ ) HANGUL JUNGSEONG I-YU → CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG YU # →ᅵᅲ→ + +119D ; 4E28 119E ; MA # ( ᆝ → 丨ᆞ ) HANGUL JUNGSEONG I-ARAEA → CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG ARAEA # →ᅵᆞ→ + +D7C4 ; 4E28 4E28 ; MA # ( ퟄ → 丨丨 ) HANGUL JUNGSEONG I-I → CJK UNIFIED IDEOGRAPH-4E28, CJK UNIFIED IDEOGRAPH-4E28 # →ᅵᅵ→ + +F905 ; 4E32 ; MA # ( 串 → 串 ) CJK COMPATIBILITY IDEOGRAPH-F905 → CJK UNIFIED IDEOGRAPH-4E32 # + +2F801 ; 4E38 ; MA # ( 丸 → 丸 ) CJK COMPATIBILITY IDEOGRAPH-2F801 → CJK UNIFIED IDEOGRAPH-4E38 # + +F95E ; 4E39 ; MA # ( 丹 → 丹 ) CJK COMPATIBILITY IDEOGRAPH-F95E → CJK UNIFIED IDEOGRAPH-4E39 # + +2F802 ; 4E41 ; MA # ( 乁 → 乁 ) CJK COMPATIBILITY IDEOGRAPH-2F802 → CJK UNIFIED IDEOGRAPH-4E41 # + +31E0 ; 4E59 ; MA #* ( ㇠ → 乙 ) CJK STROKE HXWG → CJK UNIFIED IDEOGRAPH-4E59 # +2F04 ; 4E59 ; MA #* ( ⼄ → 乙 ) KANGXI RADICAL SECOND → CJK UNIFIED IDEOGRAPH-4E59 # + +31DF ; 4E5A ; MA #* ( ㇟ → 乚 ) CJK STROKE SWG → CJK UNIFIED IDEOGRAPH-4E5A # +2E83 ; 4E5A ; MA #* ( ⺃ → 乚 ) CJK RADICAL SECOND TWO → CJK UNIFIED IDEOGRAPH-4E5A # + +31D6 ; 4E5B ; MA #* ( ㇖ → 乛 ) CJK STROKE HG → CJK UNIFIED IDEOGRAPH-4E5B # + +2EF2 ; 4E80 ; MA #* ( ⻲ → 亀 ) CJK RADICAL J-SIMPLIFIED TURTLE → CJK UNIFIED IDEOGRAPH-4E80 # + +F91B ; 4E82 ; MA # ( 亂 → 亂 ) CJK COMPATIBILITY IDEOGRAPH-F91B → CJK UNIFIED IDEOGRAPH-4E82 # + +31DA ; 4E85 ; MA #* ( ㇚ → 亅 ) CJK STROKE SG → CJK UNIFIED IDEOGRAPH-4E85 # +2F05 ; 4E85 ; MA #* ( ⼅ → 亅 ) KANGXI RADICAL HOOK → CJK UNIFIED IDEOGRAPH-4E85 # + +F9BA ; 4E86 ; MA # ( 了 → 了 ) CJK COMPATIBILITY IDEOGRAPH-F9BA → CJK UNIFIED IDEOGRAPH-4E86 # + +2F06 ; 4E8C ; MA #* ( ⼆ → 二 ) KANGXI RADICAL TWO → CJK UNIFIED IDEOGRAPH-4E8C # + +2F803 ; 20122 ; MA # ( 𠄢 → 𠄢 ) CJK COMPATIBILITY IDEOGRAPH-2F803 → CJK UNIFIED IDEOGRAPH-20122 # + +2F07 ; 4EA0 ; MA #* ( ⼇ → 亠 ) KANGXI RADICAL LID → CJK UNIFIED IDEOGRAPH-4EA0 # + +F977 ; 4EAE ; MA # ( 亮 → 亮 ) CJK COMPATIBILITY IDEOGRAPH-F977 → CJK UNIFIED IDEOGRAPH-4EAE # + +2F08 ; 4EBA ; MA #* ( ⼈ → 人 ) KANGXI RADICAL MAN → CJK UNIFIED IDEOGRAPH-4EBA # + +2E85 ; 4EBB ; MA #* ( ⺅ → 亻 ) CJK RADICAL PERSON → CJK UNIFIED IDEOGRAPH-4EBB # + +F9FD ; 4EC0 ; MA # ( 什 → 什 ) CJK COMPATIBILITY IDEOGRAPH-F9FD → CJK UNIFIED IDEOGRAPH-4EC0 # + +2F819 ; 4ECC ; MA # ( 仌 → 仌 ) CJK COMPATIBILITY IDEOGRAPH-2F819 → CJK UNIFIED IDEOGRAPH-4ECC # + +F9A8 ; 4EE4 ; MA # ( 令 → 令 ) CJK COMPATIBILITY IDEOGRAPH-F9A8 → CJK UNIFIED IDEOGRAPH-4EE4 # + +2F804 ; 4F60 ; MA # ( 你 → 你 ) CJK COMPATIBILITY IDEOGRAPH-2F804 → CJK UNIFIED IDEOGRAPH-4F60 # + +5002 ; 4F75 ; MA # ( 倂 → 併 ) CJK UNIFIED IDEOGRAPH-5002 → CJK UNIFIED IDEOGRAPH-4F75 # +2F807 ; 4F75 ; MA # ( 倂 → 併 ) CJK COMPATIBILITY IDEOGRAPH-2F807 → CJK UNIFIED IDEOGRAPH-4F75 # →倂→ + +FA73 ; 4F80 ; MA # ( 侀 → 侀 ) CJK COMPATIBILITY IDEOGRAPH-FA73 → CJK UNIFIED IDEOGRAPH-4F80 # + +F92D ; 4F86 ; MA # ( 來 → 來 ) CJK COMPATIBILITY IDEOGRAPH-F92D → CJK UNIFIED IDEOGRAPH-4F86 # + +F9B5 ; 4F8B ; MA # ( 例 → 例 ) CJK COMPATIBILITY IDEOGRAPH-F9B5 → CJK UNIFIED IDEOGRAPH-4F8B # + +FA30 ; 4FAE ; MA # ( 侮 → 侮 ) CJK COMPATIBILITY IDEOGRAPH-FA30 → CJK UNIFIED IDEOGRAPH-4FAE # +2F805 ; 4FAE ; MA # ( 侮 → 侮 ) CJK COMPATIBILITY IDEOGRAPH-2F805 → CJK UNIFIED IDEOGRAPH-4FAE # + +2F806 ; 4FBB ; MA # ( 侻 → 侻 ) CJK COMPATIBILITY IDEOGRAPH-2F806 → CJK UNIFIED IDEOGRAPH-4FBB # + +F965 ; 4FBF ; MA # ( 便 → 便 ) CJK COMPATIBILITY IDEOGRAPH-F965 → CJK UNIFIED IDEOGRAPH-4FBF # + +503C ; 5024 ; MA # ( 值 → 値 ) CJK UNIFIED IDEOGRAPH-503C → CJK UNIFIED IDEOGRAPH-5024 # + +F9D4 ; 502B ; MA # ( 倫 → 倫 ) CJK COMPATIBILITY IDEOGRAPH-F9D4 → CJK UNIFIED IDEOGRAPH-502B # + +2F808 ; 507A ; MA # ( 偺 → 偺 ) CJK COMPATIBILITY IDEOGRAPH-2F808 → CJK UNIFIED IDEOGRAPH-507A # + +2F809 ; 5099 ; MA # ( 備 → 備 ) CJK COMPATIBILITY IDEOGRAPH-2F809 → CJK UNIFIED IDEOGRAPH-5099 # + +2F80B ; 50CF ; MA # ( 像 → 像 ) CJK COMPATIBILITY IDEOGRAPH-2F80B → CJK UNIFIED IDEOGRAPH-50CF # + +F9BB ; 50DA ; MA # ( 僚 → 僚 ) CJK COMPATIBILITY IDEOGRAPH-F9BB → CJK UNIFIED IDEOGRAPH-50DA # + +FA31 ; 50E7 ; MA # ( 僧 → 僧 ) CJK COMPATIBILITY IDEOGRAPH-FA31 → CJK UNIFIED IDEOGRAPH-50E7 # +2F80A ; 50E7 ; MA # ( 僧 → 僧 ) CJK COMPATIBILITY IDEOGRAPH-2F80A → CJK UNIFIED IDEOGRAPH-50E7 # + +2F80C ; 349E ; MA # ( 㒞 → 㒞 ) CJK COMPATIBILITY IDEOGRAPH-2F80C → CJK UNIFIED IDEOGRAPH-349E # + +2F09 ; 513F ; MA #* ( ⼉ → 儿 ) KANGXI RADICAL LEGS → CJK UNIFIED IDEOGRAPH-513F # + +FA0C ; 5140 ; MA # ( 兀 → 兀 ) CJK COMPATIBILITY IDEOGRAPH-FA0C → CJK UNIFIED IDEOGRAPH-5140 # +2E8E ; 5140 ; MA #* ( ⺎ → 兀 ) CJK RADICAL LAME ONE → CJK UNIFIED IDEOGRAPH-5140 # + +FA74 ; 5145 ; MA # ( 充 → 充 ) CJK COMPATIBILITY IDEOGRAPH-FA74 → CJK UNIFIED IDEOGRAPH-5145 # + +FA32 ; 514D ; MA # ( 免 → 免 ) CJK COMPATIBILITY IDEOGRAPH-FA32 → CJK UNIFIED IDEOGRAPH-514D # +2F80E ; 514D ; MA # ( 免 → 免 ) CJK COMPATIBILITY IDEOGRAPH-2F80E → CJK UNIFIED IDEOGRAPH-514D # + +2F80F ; 5154 ; MA # ( 兔 → 兔 ) CJK COMPATIBILITY IDEOGRAPH-2F80F → CJK UNIFIED IDEOGRAPH-5154 # + +2F810 ; 5164 ; MA # ( 兤 → 兤 ) CJK COMPATIBILITY IDEOGRAPH-2F810 → CJK UNIFIED IDEOGRAPH-5164 # + +2F0A ; 5165 ; MA #* ( ⼊ → 入 ) KANGXI RADICAL ENTER → CJK UNIFIED IDEOGRAPH-5165 # + +2F814 ; 5167 ; MA # ( 內 → 內 ) CJK COMPATIBILITY IDEOGRAPH-2F814 → CJK UNIFIED IDEOGRAPH-5167 # + +FA72 ; 5168 ; MA # ( 全 → 全 ) CJK COMPATIBILITY IDEOGRAPH-FA72 → CJK UNIFIED IDEOGRAPH-5168 # + +F978 ; 5169 ; MA # ( 兩 → 兩 ) CJK COMPATIBILITY IDEOGRAPH-F978 → CJK UNIFIED IDEOGRAPH-5169 # + +2F0B ; 516B ; MA #* ( ⼋ → 八 ) KANGXI RADICAL EIGHT → CJK UNIFIED IDEOGRAPH-516B # + +F9D1 ; 516D ; MA # ( 六 → 六 ) CJK COMPATIBILITY IDEOGRAPH-F9D1 → CJK UNIFIED IDEOGRAPH-516D # + +2F811 ; 5177 ; MA # ( 具 → 具 ) CJK COMPATIBILITY IDEOGRAPH-2F811 → CJK UNIFIED IDEOGRAPH-5177 # + +2F812 ; 2051C ; MA # ( 𠔜 → 𠔜 ) CJK COMPATIBILITY IDEOGRAPH-2F812 → CJK UNIFIED IDEOGRAPH-2051C # + +2F91B ; 20525 ; MA # ( 𠔥 → 𠔥 ) CJK COMPATIBILITY IDEOGRAPH-2F91B → CJK UNIFIED IDEOGRAPH-20525 # + +FA75 ; 5180 ; MA # ( 冀 → 冀 ) CJK COMPATIBILITY IDEOGRAPH-FA75 → CJK UNIFIED IDEOGRAPH-5180 # + +2F813 ; 34B9 ; MA # ( 㒹 → 㒹 ) CJK COMPATIBILITY IDEOGRAPH-2F813 → CJK UNIFIED IDEOGRAPH-34B9 # + +2F0C ; 5182 ; MA #* ( ⼌ → 冂 ) KANGXI RADICAL DOWN BOX → CJK UNIFIED IDEOGRAPH-5182 # + +2F815 ; 518D ; MA # ( 再 → 再 ) CJK COMPATIBILITY IDEOGRAPH-2F815 → CJK UNIFIED IDEOGRAPH-518D # + +2F816 ; 2054B ; MA # ( 𠕋 → 𠕋 ) CJK COMPATIBILITY IDEOGRAPH-2F816 → CJK UNIFIED IDEOGRAPH-2054B # + +2F8D2 ; 5192 ; MA # ( 冒 → 冒 ) CJK COMPATIBILITY IDEOGRAPH-2F8D2 → CJK UNIFIED IDEOGRAPH-5192 # + +2F8D3 ; 5195 ; MA # ( 冕 → 冕 ) CJK COMPATIBILITY IDEOGRAPH-2F8D3 → CJK UNIFIED IDEOGRAPH-5195 # + +2F9CA ; 34BB ; MA # ( 㒻 → 㒻 ) CJK COMPATIBILITY IDEOGRAPH-2F9CA → CJK UNIFIED IDEOGRAPH-34BB # + +2F8D4 ; 6700 ; MA # ( 最 → 最 ) CJK COMPATIBILITY IDEOGRAPH-2F8D4 → CJK UNIFIED IDEOGRAPH-6700 # + +2F0D ; 5196 ; MA #* ( ⼍ → 冖 ) KANGXI RADICAL COVER → CJK UNIFIED IDEOGRAPH-5196 # + +2F817 ; 5197 ; MA # ( 冗 → 冗 ) CJK COMPATIBILITY IDEOGRAPH-2F817 → CJK UNIFIED IDEOGRAPH-5197 # + +2F818 ; 51A4 ; MA # ( 冤 → 冤 ) CJK COMPATIBILITY IDEOGRAPH-2F818 → CJK UNIFIED IDEOGRAPH-51A4 # + +2F0E ; 51AB ; MA #* ( ⼎ → 冫 ) KANGXI RADICAL ICE → CJK UNIFIED IDEOGRAPH-51AB # + +2F81A ; 51AC ; MA # ( 冬 → 冬 ) CJK COMPATIBILITY IDEOGRAPH-2F81A → CJK UNIFIED IDEOGRAPH-51AC # + +FA71 ; 51B5 ; MA # ( 况 → 况 ) CJK COMPATIBILITY IDEOGRAPH-FA71 → CJK UNIFIED IDEOGRAPH-51B5 # +2F81B ; 51B5 ; MA # ( 况 → 况 ) CJK COMPATIBILITY IDEOGRAPH-2F81B → CJK UNIFIED IDEOGRAPH-51B5 # + +F92E ; 51B7 ; MA # ( 冷 → 冷 ) CJK COMPATIBILITY IDEOGRAPH-F92E → CJK UNIFIED IDEOGRAPH-51B7 # + +F979 ; 51C9 ; MA # ( 凉 → 凉 ) CJK COMPATIBILITY IDEOGRAPH-F979 → CJK UNIFIED IDEOGRAPH-51C9 # + +F955 ; 51CC ; MA # ( 凌 → 凌 ) CJK COMPATIBILITY IDEOGRAPH-F955 → CJK UNIFIED IDEOGRAPH-51CC # + +F954 ; 51DC ; MA # ( 凜 → 凜 ) CJK COMPATIBILITY IDEOGRAPH-F954 → CJK UNIFIED IDEOGRAPH-51DC # + +FA15 ; 51DE ; MA # ( 凞 → 凞 ) CJK COMPATIBILITY IDEOGRAPH-FA15 → CJK UNIFIED IDEOGRAPH-51DE # + +2F0F ; 51E0 ; MA #* ( ⼏ → 几 ) KANGXI RADICAL TABLE → CJK UNIFIED IDEOGRAPH-51E0 # + +2F80D ; 2063A ; MA # ( 𠘺 → 𠘺 ) CJK COMPATIBILITY IDEOGRAPH-2F80D → CJK UNIFIED IDEOGRAPH-2063A # + +2F81D ; 51F5 ; MA # ( 凵 → 凵 ) CJK COMPATIBILITY IDEOGRAPH-2F81D → CJK UNIFIED IDEOGRAPH-51F5 # +2F10 ; 51F5 ; MA #* ( ⼐ → 凵 ) KANGXI RADICAL OPEN BOX → CJK UNIFIED IDEOGRAPH-51F5 # + +2F11 ; 5200 ; MA #* ( ⼑ → 刀 ) KANGXI RADICAL KNIFE → CJK UNIFIED IDEOGRAPH-5200 # + +2E89 ; 5202 ; MA #* ( ⺉ → 刂 ) CJK RADICAL KNIFE TWO → CJK UNIFIED IDEOGRAPH-5202 # + +2F81E ; 5203 ; MA # ( 刃 → 刃 ) CJK COMPATIBILITY IDEOGRAPH-2F81E → CJK UNIFIED IDEOGRAPH-5203 # + +FA00 ; 5207 ; MA # ( 切 → 切 ) CJK COMPATIBILITY IDEOGRAPH-FA00 → CJK UNIFIED IDEOGRAPH-5207 # +2F850 ; 5207 ; MA # ( 切 → 切 ) CJK COMPATIBILITY IDEOGRAPH-2F850 → CJK UNIFIED IDEOGRAPH-5207 # + +F99C ; 5217 ; MA # ( 列 → 列 ) CJK COMPATIBILITY IDEOGRAPH-F99C → CJK UNIFIED IDEOGRAPH-5217 # + +F9DD ; 5229 ; MA # ( 利 → 利 ) CJK COMPATIBILITY IDEOGRAPH-F9DD → CJK UNIFIED IDEOGRAPH-5229 # + +2F81F ; 34DF ; MA # ( 㓟 → 㓟 ) CJK COMPATIBILITY IDEOGRAPH-2F81F → CJK UNIFIED IDEOGRAPH-34DF # + +F9FF ; 523A ; MA # ( 刺 → 刺 ) CJK COMPATIBILITY IDEOGRAPH-F9FF → CJK UNIFIED IDEOGRAPH-523A # + +2F820 ; 523B ; MA # ( 刻 → 刻 ) CJK COMPATIBILITY IDEOGRAPH-2F820 → CJK UNIFIED IDEOGRAPH-523B # + +2F821 ; 5246 ; MA # ( 剆 → 剆 ) CJK COMPATIBILITY IDEOGRAPH-2F821 → CJK UNIFIED IDEOGRAPH-5246 # + +2F822 ; 5272 ; MA # ( 割 → 割 ) CJK COMPATIBILITY IDEOGRAPH-2F822 → CJK UNIFIED IDEOGRAPH-5272 # + +2F823 ; 5277 ; MA # ( 剷 → 剷 ) CJK COMPATIBILITY IDEOGRAPH-2F823 → CJK UNIFIED IDEOGRAPH-5277 # + +F9C7 ; 5289 ; MA # ( 劉 → 劉 ) CJK COMPATIBILITY IDEOGRAPH-F9C7 → CJK UNIFIED IDEOGRAPH-5289 # + +2F9D9 ; 20804 ; MA # ( 𠠄 → 𠠄 ) CJK COMPATIBILITY IDEOGRAPH-2F9D9 → CJK UNIFIED IDEOGRAPH-20804 # + +F98A ; 529B ; MA # ( 力 → 力 ) CJK COMPATIBILITY IDEOGRAPH-F98A → CJK UNIFIED IDEOGRAPH-529B # +2F12 ; 529B ; MA #* ( ⼒ → 力 ) KANGXI RADICAL POWER → CJK UNIFIED IDEOGRAPH-529B # + +F99D ; 52A3 ; MA # ( 劣 → 劣 ) CJK COMPATIBILITY IDEOGRAPH-F99D → CJK UNIFIED IDEOGRAPH-52A3 # + +2F824 ; 3515 ; MA # ( 㔕 → 㔕 ) CJK COMPATIBILITY IDEOGRAPH-2F824 → CJK UNIFIED IDEOGRAPH-3515 # + +2F992 ; 52B3 ; MA # ( 劳 → 劳 ) CJK COMPATIBILITY IDEOGRAPH-2F992 → CJK UNIFIED IDEOGRAPH-52B3 # + +FA76 ; 52C7 ; MA # ( 勇 → 勇 ) CJK COMPATIBILITY IDEOGRAPH-FA76 → CJK UNIFIED IDEOGRAPH-52C7 # +2F825 ; 52C7 ; MA # ( 勇 → 勇 ) CJK COMPATIBILITY IDEOGRAPH-2F825 → CJK UNIFIED IDEOGRAPH-52C7 # + +FA33 ; 52C9 ; MA # ( 勉 → 勉 ) CJK COMPATIBILITY IDEOGRAPH-FA33 → CJK UNIFIED IDEOGRAPH-52C9 # +2F826 ; 52C9 ; MA # ( 勉 → 勉 ) CJK COMPATIBILITY IDEOGRAPH-2F826 → CJK UNIFIED IDEOGRAPH-52C9 # + +F952 ; 52D2 ; MA # ( 勒 → 勒 ) CJK COMPATIBILITY IDEOGRAPH-F952 → CJK UNIFIED IDEOGRAPH-52D2 # + +F92F ; 52DE ; MA # ( 勞 → 勞 ) CJK COMPATIBILITY IDEOGRAPH-F92F → CJK UNIFIED IDEOGRAPH-52DE # + +FA34 ; 52E4 ; MA # ( 勤 → 勤 ) CJK COMPATIBILITY IDEOGRAPH-FA34 → CJK UNIFIED IDEOGRAPH-52E4 # +2F827 ; 52E4 ; MA # ( 勤 → 勤 ) CJK COMPATIBILITY IDEOGRAPH-2F827 → CJK UNIFIED IDEOGRAPH-52E4 # + +F97F ; 52F5 ; MA # ( 勵 → 勵 ) CJK COMPATIBILITY IDEOGRAPH-F97F → CJK UNIFIED IDEOGRAPH-52F5 # + +2F13 ; 52F9 ; MA #* ( ⼓ → 勹 ) KANGXI RADICAL WRAP → CJK UNIFIED IDEOGRAPH-52F9 # + +FA77 ; 52FA ; MA # ( 勺 → 勺 ) CJK COMPATIBILITY IDEOGRAPH-FA77 → CJK UNIFIED IDEOGRAPH-52FA # +2F828 ; 52FA ; MA # ( 勺 → 勺 ) CJK COMPATIBILITY IDEOGRAPH-2F828 → CJK UNIFIED IDEOGRAPH-52FA # + +2F829 ; 5305 ; MA # ( 包 → 包 ) CJK COMPATIBILITY IDEOGRAPH-2F829 → CJK UNIFIED IDEOGRAPH-5305 # + +2F82A ; 5306 ; MA # ( 匆 → 匆 ) CJK COMPATIBILITY IDEOGRAPH-2F82A → CJK UNIFIED IDEOGRAPH-5306 # + +2F9DD ; 208DE ; MA # ( 𠣞 → 𠣞 ) CJK COMPATIBILITY IDEOGRAPH-2F9DD → CJK UNIFIED IDEOGRAPH-208DE # + +2F14 ; 5315 ; MA #* ( ⼔ → 匕 ) KANGXI RADICAL SPOON → CJK UNIFIED IDEOGRAPH-5315 # + +F963 ; 5317 ; MA # ( 北 → 北 ) CJK COMPATIBILITY IDEOGRAPH-F963 → CJK UNIFIED IDEOGRAPH-5317 # +2F82B ; 5317 ; MA # ( 北 → 北 ) CJK COMPATIBILITY IDEOGRAPH-2F82B → CJK UNIFIED IDEOGRAPH-5317 # + +2F15 ; 531A ; MA #* ( ⼕ → 匚 ) KANGXI RADICAL RIGHT OPEN BOX → CJK UNIFIED IDEOGRAPH-531A # + +2F16 ; 5338 ; MA #* ( ⼖ → 匸 ) KANGXI RADICAL HIDING ENCLOSURE → CJK UNIFIED IDEOGRAPH-5338 # + +F9EB ; 533F ; MA # ( 匿 → 匿 ) CJK COMPATIBILITY IDEOGRAPH-F9EB → CJK UNIFIED IDEOGRAPH-533F # + +2F17 ; 5341 ; MA #* ( ⼗ → 十 ) KANGXI RADICAL TEN → CJK UNIFIED IDEOGRAPH-5341 # +3038 ; 5341 ; MA # ( 〸 → 十 ) HANGZHOU NUMERAL TEN → CJK UNIFIED IDEOGRAPH-5341 # + +303A ; 5345 ; MA # ( 〺 → 卅 ) HANGZHOU NUMERAL THIRTY → CJK UNIFIED IDEOGRAPH-5345 # + +2F82C ; 5349 ; MA # ( 卉 → 卉 ) CJK COMPATIBILITY IDEOGRAPH-2F82C → CJK UNIFIED IDEOGRAPH-5349 # + +FA35 ; 5351 ; MA # ( 卑 → 卑 ) CJK COMPATIBILITY IDEOGRAPH-FA35 → CJK UNIFIED IDEOGRAPH-5351 # +2F82D ; 5351 ; MA # ( 卑 → 卑 ) CJK COMPATIBILITY IDEOGRAPH-2F82D → CJK UNIFIED IDEOGRAPH-5351 # + +2F82E ; 535A ; MA # ( 博 → 博 ) CJK COMPATIBILITY IDEOGRAPH-2F82E → CJK UNIFIED IDEOGRAPH-535A # + +2F18 ; 535C ; MA #* ( ⼘ → 卜 ) KANGXI RADICAL DIVINATION → CJK UNIFIED IDEOGRAPH-535C # + +2F19 ; 5369 ; MA #* ( ⼙ → 卩 ) KANGXI RADICAL SEAL → CJK UNIFIED IDEOGRAPH-5369 # + +2E8B ; 353E ; MA #* ( ⺋ → 㔾 ) CJK RADICAL SEAL → CJK UNIFIED IDEOGRAPH-353E # + +2F82F ; 5373 ; MA # ( 即 → 即 ) CJK COMPATIBILITY IDEOGRAPH-2F82F → CJK UNIFIED IDEOGRAPH-5373 # + +F91C ; 5375 ; MA # ( 卵 → 卵 ) CJK COMPATIBILITY IDEOGRAPH-F91C → CJK UNIFIED IDEOGRAPH-5375 # + +2F830 ; 537D ; MA # ( 卽 → 卽 ) CJK COMPATIBILITY IDEOGRAPH-2F830 → CJK UNIFIED IDEOGRAPH-537D # + +2F831 ; 537F ; MA # ( 卿 → 卿 ) CJK COMPATIBILITY IDEOGRAPH-2F831 → CJK UNIFIED IDEOGRAPH-537F # +2F832 ; 537F ; MA # ( 卿 → 卿 ) CJK COMPATIBILITY IDEOGRAPH-2F832 → CJK UNIFIED IDEOGRAPH-537F # +2F833 ; 537F ; MA # ( 卿 → 卿 ) CJK COMPATIBILITY IDEOGRAPH-2F833 → CJK UNIFIED IDEOGRAPH-537F # + +2F1A ; 5382 ; MA #* ( ⼚ → 厂 ) KANGXI RADICAL CLIFF → CJK UNIFIED IDEOGRAPH-5382 # + +2F834 ; 20A2C ; MA # ( 𠨬 → 𠨬 ) CJK COMPATIBILITY IDEOGRAPH-2F834 → CJK UNIFIED IDEOGRAPH-20A2C # + +2F1B ; 53B6 ; MA #* ( ⼛ → 厶 ) KANGXI RADICAL PRIVATE → CJK UNIFIED IDEOGRAPH-53B6 # + +F96B ; 53C3 ; MA # ( 參 → 參 ) CJK COMPATIBILITY IDEOGRAPH-F96B → CJK UNIFIED IDEOGRAPH-53C3 # + +2F1C ; 53C8 ; MA #* ( ⼜ → 又 ) KANGXI RADICAL AGAIN → CJK UNIFIED IDEOGRAPH-53C8 # + +2F836 ; 53CA ; MA # ( 及 → 及 ) CJK COMPATIBILITY IDEOGRAPH-2F836 → CJK UNIFIED IDEOGRAPH-53CA # + +2F837 ; 53DF ; MA # ( 叟 → 叟 ) CJK COMPATIBILITY IDEOGRAPH-2F837 → CJK UNIFIED IDEOGRAPH-53DF # + +2F838 ; 20B63 ; MA # ( 𠭣 → 𠭣 ) CJK COMPATIBILITY IDEOGRAPH-2F838 → CJK UNIFIED IDEOGRAPH-20B63 # + +2F1D ; 53E3 ; MA #* ( ⼝ → 口 ) KANGXI RADICAL MOUTH → CJK UNIFIED IDEOGRAPH-53E3 # + +F906 ; 53E5 ; MA # ( 句 → 句 ) CJK COMPATIBILITY IDEOGRAPH-F906 → CJK UNIFIED IDEOGRAPH-53E5 # + +2F839 ; 53EB ; MA # ( 叫 → 叫 ) CJK COMPATIBILITY IDEOGRAPH-2F839 → CJK UNIFIED IDEOGRAPH-53EB # + +2F83A ; 53F1 ; MA # ( 叱 → 叱 ) CJK COMPATIBILITY IDEOGRAPH-2F83A → CJK UNIFIED IDEOGRAPH-53F1 # + +2F83B ; 5406 ; MA # ( 吆 → 吆 ) CJK COMPATIBILITY IDEOGRAPH-2F83B → CJK UNIFIED IDEOGRAPH-5406 # + +F9DE ; 540F ; MA # ( 吏 → 吏 ) CJK COMPATIBILITY IDEOGRAPH-F9DE → CJK UNIFIED IDEOGRAPH-540F # + +F9ED ; 541D ; MA # ( 吝 → 吝 ) CJK COMPATIBILITY IDEOGRAPH-F9ED → CJK UNIFIED IDEOGRAPH-541D # + +2F83D ; 5438 ; MA # ( 吸 → 吸 ) CJK COMPATIBILITY IDEOGRAPH-2F83D → CJK UNIFIED IDEOGRAPH-5438 # + +F980 ; 5442 ; MA # ( 呂 → 呂 ) CJK COMPATIBILITY IDEOGRAPH-F980 → CJK UNIFIED IDEOGRAPH-5442 # + +2F83E ; 5448 ; MA # ( 呈 → 呈 ) CJK COMPATIBILITY IDEOGRAPH-2F83E → CJK UNIFIED IDEOGRAPH-5448 # + +2F83F ; 5468 ; MA # ( 周 → 周 ) CJK COMPATIBILITY IDEOGRAPH-2F83F → CJK UNIFIED IDEOGRAPH-5468 # + +2F83C ; 549E ; MA # ( 咞 → 咞 ) CJK COMPATIBILITY IDEOGRAPH-2F83C → CJK UNIFIED IDEOGRAPH-549E # + +2F840 ; 54A2 ; MA # ( 咢 → 咢 ) CJK COMPATIBILITY IDEOGRAPH-2F840 → CJK UNIFIED IDEOGRAPH-54A2 # + +F99E ; 54BD ; MA # ( 咽 → 咽 ) CJK COMPATIBILITY IDEOGRAPH-F99E → CJK UNIFIED IDEOGRAPH-54BD # + +439B ; 3588 ; MA # ( 䎛 → 㖈 ) CJK UNIFIED IDEOGRAPH-439B → CJK UNIFIED IDEOGRAPH-3588 # + +2F841 ; 54F6 ; MA # ( 哶 → 哶 ) CJK COMPATIBILITY IDEOGRAPH-2F841 → CJK UNIFIED IDEOGRAPH-54F6 # + +2F842 ; 5510 ; MA # ( 唐 → 唐 ) CJK COMPATIBILITY IDEOGRAPH-2F842 → CJK UNIFIED IDEOGRAPH-5510 # + +2F843 ; 5553 ; MA # ( 啓 → 啓 ) CJK COMPATIBILITY IDEOGRAPH-2F843 → CJK UNIFIED IDEOGRAPH-5553 # +555F ; 5553 ; MA # ( 啟 → 啓 ) CJK UNIFIED IDEOGRAPH-555F → CJK UNIFIED IDEOGRAPH-5553 # + +FA79 ; 5555 ; MA # ( 啕 → 啕 ) CJK COMPATIBILITY IDEOGRAPH-FA79 → CJK UNIFIED IDEOGRAPH-5555 # + +2F844 ; 5563 ; MA # ( 啣 → 啣 ) CJK COMPATIBILITY IDEOGRAPH-2F844 → CJK UNIFIED IDEOGRAPH-5563 # + +2F845 ; 5584 ; MA # ( 善 → 善 ) CJK COMPATIBILITY IDEOGRAPH-2F845 → CJK UNIFIED IDEOGRAPH-5584 # +2F846 ; 5584 ; MA # ( 善 → 善 ) CJK COMPATIBILITY IDEOGRAPH-2F846 → CJK UNIFIED IDEOGRAPH-5584 # + +F90B ; 5587 ; MA # ( 喇 → 喇 ) CJK COMPATIBILITY IDEOGRAPH-F90B → CJK UNIFIED IDEOGRAPH-5587 # + +FA7A ; 5599 ; MA # ( 喙 → 喙 ) CJK COMPATIBILITY IDEOGRAPH-FA7A → CJK UNIFIED IDEOGRAPH-5599 # +2F847 ; 5599 ; MA # ( 喙 → 喙 ) CJK COMPATIBILITY IDEOGRAPH-2F847 → CJK UNIFIED IDEOGRAPH-5599 # + +FA36 ; 559D ; MA # ( 喝 → 喝 ) CJK COMPATIBILITY IDEOGRAPH-FA36 → CJK UNIFIED IDEOGRAPH-559D # +FA78 ; 559D ; MA # ( 喝 → 喝 ) CJK COMPATIBILITY IDEOGRAPH-FA78 → CJK UNIFIED IDEOGRAPH-559D # + +2F848 ; 55AB ; MA # ( 喫 → 喫 ) CJK COMPATIBILITY IDEOGRAPH-2F848 → CJK UNIFIED IDEOGRAPH-55AB # + +2F849 ; 55B3 ; MA # ( 喳 → 喳 ) CJK COMPATIBILITY IDEOGRAPH-2F849 → CJK UNIFIED IDEOGRAPH-55B3 # + +FA0D ; 55C0 ; MA # ( 嗀 → 嗀 ) CJK COMPATIBILITY IDEOGRAPH-FA0D → CJK UNIFIED IDEOGRAPH-55C0 # + +2F84A ; 55C2 ; MA # ( 嗂 → 嗂 ) CJK COMPATIBILITY IDEOGRAPH-2F84A → CJK UNIFIED IDEOGRAPH-55C2 # + +FA7B ; 55E2 ; MA # ( 嗢 → 嗢 ) CJK COMPATIBILITY IDEOGRAPH-FA7B → CJK UNIFIED IDEOGRAPH-55E2 # + +FA37 ; 5606 ; MA # ( 嘆 → 嘆 ) CJK COMPATIBILITY IDEOGRAPH-FA37 → CJK UNIFIED IDEOGRAPH-5606 # +2F84C ; 5606 ; MA # ( 嘆 → 嘆 ) CJK COMPATIBILITY IDEOGRAPH-2F84C → CJK UNIFIED IDEOGRAPH-5606 # + +2F84E ; 5651 ; MA # ( 噑 → 噑 ) CJK COMPATIBILITY IDEOGRAPH-2F84E → CJK UNIFIED IDEOGRAPH-5651 # + +2F84F ; 5674 ; MA # ( 噴 → 噴 ) CJK COMPATIBILITY IDEOGRAPH-2F84F → CJK UNIFIED IDEOGRAPH-5674 # + +FA38 ; 5668 ; MA # ( 器 → 器 ) CJK COMPATIBILITY IDEOGRAPH-FA38 → CJK UNIFIED IDEOGRAPH-5668 # + +2F1E ; 56D7 ; MA #* ( ⼞ → 囗 ) KANGXI RADICAL ENCLOSURE → CJK UNIFIED IDEOGRAPH-56D7 # + +F9A9 ; 56F9 ; MA # ( 囹 → 囹 ) CJK COMPATIBILITY IDEOGRAPH-F9A9 → CJK UNIFIED IDEOGRAPH-56F9 # + +2F84B ; 5716 ; MA # ( 圖 → 圖 ) CJK COMPATIBILITY IDEOGRAPH-2F84B → CJK UNIFIED IDEOGRAPH-5716 # + +2F84D ; 5717 ; MA # ( 圗 → 圗 ) CJK COMPATIBILITY IDEOGRAPH-2F84D → CJK UNIFIED IDEOGRAPH-5717 # + +2F1F ; 571F ; MA #* ( ⼟ → 土 ) KANGXI RADICAL EARTH → CJK UNIFIED IDEOGRAPH-571F # + +2F855 ; 578B ; MA # ( 型 → 型 ) CJK COMPATIBILITY IDEOGRAPH-2F855 → CJK UNIFIED IDEOGRAPH-578B # + +2F852 ; 57CE ; MA # ( 城 → 城 ) CJK COMPATIBILITY IDEOGRAPH-2F852 → CJK UNIFIED IDEOGRAPH-57CE # + +39B3 ; 363D ; MA # ( 㦳 → 㘽 ) CJK UNIFIED IDEOGRAPH-39B3 → CJK UNIFIED IDEOGRAPH-363D # + +2F853 ; 57F4 ; MA # ( 埴 → 埴 ) CJK COMPATIBILITY IDEOGRAPH-2F853 → CJK UNIFIED IDEOGRAPH-57F4 # + +2F854 ; 580D ; MA # ( 堍 → 堍 ) CJK COMPATIBILITY IDEOGRAPH-2F854 → CJK UNIFIED IDEOGRAPH-580D # + +2F857 ; 5831 ; MA # ( 報 → 報 ) CJK COMPATIBILITY IDEOGRAPH-2F857 → CJK UNIFIED IDEOGRAPH-5831 # + +2F856 ; 5832 ; MA # ( 堲 → 堲 ) CJK COMPATIBILITY IDEOGRAPH-2F856 → CJK UNIFIED IDEOGRAPH-5832 # + +FA39 ; 5840 ; MA # ( 塀 → 塀 ) CJK COMPATIBILITY IDEOGRAPH-FA39 → CJK UNIFIED IDEOGRAPH-5840 # + +FA10 ; 585A ; MA # ( 塚 → 塚 ) CJK COMPATIBILITY IDEOGRAPH-FA10 → CJK UNIFIED IDEOGRAPH-585A # +FA7C ; 585A ; MA # ( 塚 → 塚 ) CJK COMPATIBILITY IDEOGRAPH-FA7C → CJK UNIFIED IDEOGRAPH-585A # + +F96C ; 585E ; MA # ( 塞 → 塞 ) CJK COMPATIBILITY IDEOGRAPH-F96C → CJK UNIFIED IDEOGRAPH-585E # + +586B ; 5861 ; MA # ( 填 → 塡 ) CJK UNIFIED IDEOGRAPH-586B → CJK UNIFIED IDEOGRAPH-5861 # + +58FF ; 58AB ; MA # ( 壿 → 墫 ) CJK UNIFIED IDEOGRAPH-58FF → CJK UNIFIED IDEOGRAPH-58AB # + +2F858 ; 58AC ; MA # ( 墬 → 墬 ) CJK COMPATIBILITY IDEOGRAPH-2F858 → CJK UNIFIED IDEOGRAPH-58AC # + +FA7D ; 58B3 ; MA # ( 墳 → 墳 ) CJK COMPATIBILITY IDEOGRAPH-FA7D → CJK UNIFIED IDEOGRAPH-58B3 # + +F94A ; 58D8 ; MA # ( 壘 → 壘 ) CJK COMPATIBILITY IDEOGRAPH-F94A → CJK UNIFIED IDEOGRAPH-58D8 # + +F942 ; 58DF ; MA # ( 壟 → 壟 ) CJK COMPATIBILITY IDEOGRAPH-F942 → CJK UNIFIED IDEOGRAPH-58DF # + +2F859 ; 214E4 ; MA # ( 𡓤 → 𡓤 ) CJK COMPATIBILITY IDEOGRAPH-2F859 → CJK UNIFIED IDEOGRAPH-214E4 # + +2F20 ; 58EB ; MA #* ( ⼠ → 士 ) KANGXI RADICAL SCHOLAR → CJK UNIFIED IDEOGRAPH-58EB # + +2F851 ; 58EE ; MA # ( 壮 → 壮 ) CJK COMPATIBILITY IDEOGRAPH-2F851 → CJK UNIFIED IDEOGRAPH-58EE # + +2F85A ; 58F2 ; MA # ( 売 → 売 ) CJK COMPATIBILITY IDEOGRAPH-2F85A → CJK UNIFIED IDEOGRAPH-58F2 # + +2F85B ; 58F7 ; MA # ( 壷 → 壷 ) CJK COMPATIBILITY IDEOGRAPH-2F85B → CJK UNIFIED IDEOGRAPH-58F7 # + +2F21 ; 5902 ; MA #* ( ⼡ → 夂 ) KANGXI RADICAL GO → CJK UNIFIED IDEOGRAPH-5902 # + +2F85C ; 5906 ; MA # ( 夆 → 夆 ) CJK COMPATIBILITY IDEOGRAPH-2F85C → CJK UNIFIED IDEOGRAPH-5906 # + +2F22 ; 590A ; MA #* ( ⼢ → 夊 ) KANGXI RADICAL GO SLOWLY → CJK UNIFIED IDEOGRAPH-590A # + +2F23 ; 5915 ; MA #* ( ⼣ → 夕 ) KANGXI RADICAL EVENING → CJK UNIFIED IDEOGRAPH-5915 # + +2F85D ; 591A ; MA # ( 多 → 多 ) CJK COMPATIBILITY IDEOGRAPH-2F85D → CJK UNIFIED IDEOGRAPH-591A # + +2F85E ; 5922 ; MA # ( 夢 → 夢 ) CJK COMPATIBILITY IDEOGRAPH-2F85E → CJK UNIFIED IDEOGRAPH-5922 # + +2F24 ; 5927 ; MA #* ( ⼤ → 大 ) KANGXI RADICAL BIG → CJK UNIFIED IDEOGRAPH-5927 # + +FA7E ; 5944 ; MA # ( 奄 → 奄 ) CJK COMPATIBILITY IDEOGRAPH-FA7E → CJK UNIFIED IDEOGRAPH-5944 # + +F90C ; 5948 ; MA # ( 奈 → 奈 ) CJK COMPATIBILITY IDEOGRAPH-F90C → CJK UNIFIED IDEOGRAPH-5948 # + +F909 ; 5951 ; MA # ( 契 → 契 ) CJK COMPATIBILITY IDEOGRAPH-F909 → CJK UNIFIED IDEOGRAPH-5951 # + +FA7F ; 5954 ; MA # ( 奔 → 奔 ) CJK COMPATIBILITY IDEOGRAPH-FA7F → CJK UNIFIED IDEOGRAPH-5954 # + +2F85F ; 5962 ; MA # ( 奢 → 奢 ) CJK COMPATIBILITY IDEOGRAPH-2F85F → CJK UNIFIED IDEOGRAPH-5962 # + +F981 ; 5973 ; MA # ( 女 → 女 ) CJK COMPATIBILITY IDEOGRAPH-F981 → CJK UNIFIED IDEOGRAPH-5973 # +2F25 ; 5973 ; MA #* ( ⼥ → 女 ) KANGXI RADICAL WOMAN → CJK UNIFIED IDEOGRAPH-5973 # + +2F860 ; 216A8 ; MA # ( 𡚨 → 𡚨 ) CJK COMPATIBILITY IDEOGRAPH-2F860 → CJK UNIFIED IDEOGRAPH-216A8 # + +2F861 ; 216EA ; MA # ( 𡛪 → 𡛪 ) CJK COMPATIBILITY IDEOGRAPH-2F861 → CJK UNIFIED IDEOGRAPH-216EA # + +2F865 ; 59D8 ; MA # ( 姘 → 姘 ) CJK COMPATIBILITY IDEOGRAPH-2F865 → CJK UNIFIED IDEOGRAPH-59D8 # + +2F862 ; 59EC ; MA # ( 姬 → 姬 ) CJK COMPATIBILITY IDEOGRAPH-2F862 → CJK UNIFIED IDEOGRAPH-59EC # + +2F863 ; 5A1B ; MA # ( 娛 → 娛 ) CJK COMPATIBILITY IDEOGRAPH-2F863 → CJK UNIFIED IDEOGRAPH-5A1B # + +2F864 ; 5A27 ; MA # ( 娧 → 娧 ) CJK COMPATIBILITY IDEOGRAPH-2F864 → CJK UNIFIED IDEOGRAPH-5A27 # + +FA80 ; 5A62 ; MA # ( 婢 → 婢 ) CJK COMPATIBILITY IDEOGRAPH-FA80 → CJK UNIFIED IDEOGRAPH-5A62 # + +2F866 ; 5A66 ; MA # ( 婦 → 婦 ) CJK COMPATIBILITY IDEOGRAPH-2F866 → CJK UNIFIED IDEOGRAPH-5A66 # + +5B00 ; 5AAF ; MA # ( 嬀 → 媯 ) CJK UNIFIED IDEOGRAPH-5B00 → CJK UNIFIED IDEOGRAPH-5AAF # + +2F867 ; 36EE ; MA # ( 㛮 → 㛮 ) CJK COMPATIBILITY IDEOGRAPH-2F867 → CJK UNIFIED IDEOGRAPH-36EE # + +2F868 ; 36FC ; MA # ( 㛼 → 㛼 ) CJK COMPATIBILITY IDEOGRAPH-2F868 → CJK UNIFIED IDEOGRAPH-36FC # + +2F986 ; 5AB5 ; MA # ( 媵 → 媵 ) CJK COMPATIBILITY IDEOGRAPH-2F986 → CJK UNIFIED IDEOGRAPH-5AB5 # + +2F869 ; 5B08 ; MA # ( 嬈 → 嬈 ) CJK COMPATIBILITY IDEOGRAPH-2F869 → CJK UNIFIED IDEOGRAPH-5B08 # + +FA81 ; 5B28 ; MA # ( 嬨 → 嬨 ) CJK COMPATIBILITY IDEOGRAPH-FA81 → CJK UNIFIED IDEOGRAPH-5B28 # + +2F86A ; 5B3E ; MA # ( 嬾 → 嬾 ) CJK COMPATIBILITY IDEOGRAPH-2F86A → CJK UNIFIED IDEOGRAPH-5B3E # +2F86B ; 5B3E ; MA # ( 嬾 → 嬾 ) CJK COMPATIBILITY IDEOGRAPH-2F86B → CJK UNIFIED IDEOGRAPH-5B3E # + +2F26 ; 5B50 ; MA #* ( ⼦ → 子 ) KANGXI RADICAL CHILD → CJK UNIFIED IDEOGRAPH-5B50 # + +2F27 ; 5B80 ; MA #* ( ⼧ → 宀 ) KANGXI RADICAL ROOF → CJK UNIFIED IDEOGRAPH-5B80 # + +FA04 ; 5B85 ; MA # ( 宅 → 宅 ) CJK COMPATIBILITY IDEOGRAPH-FA04 → CJK UNIFIED IDEOGRAPH-5B85 # + +2F86C ; 219C8 ; MA # ( 𡧈 → 𡧈 ) CJK COMPATIBILITY IDEOGRAPH-2F86C → CJK UNIFIED IDEOGRAPH-219C8 # + +2F86D ; 5BC3 ; MA # ( 寃 → 寃 ) CJK COMPATIBILITY IDEOGRAPH-2F86D → CJK UNIFIED IDEOGRAPH-5BC3 # + +2F86E ; 5BD8 ; MA # ( 寘 → 寘 ) CJK COMPATIBILITY IDEOGRAPH-2F86E → CJK UNIFIED IDEOGRAPH-5BD8 # + +F95F ; 5BE7 ; MA # ( 寧 → 寧 ) CJK COMPATIBILITY IDEOGRAPH-F95F → CJK UNIFIED IDEOGRAPH-5BE7 # +F9AA ; 5BE7 ; MA # ( 寧 → 寧 ) CJK COMPATIBILITY IDEOGRAPH-F9AA → CJK UNIFIED IDEOGRAPH-5BE7 # +2F86F ; 5BE7 ; MA # ( 寧 → 寧 ) CJK COMPATIBILITY IDEOGRAPH-2F86F → CJK UNIFIED IDEOGRAPH-5BE7 # + +F9BC ; 5BEE ; MA # ( 寮 → 寮 ) CJK COMPATIBILITY IDEOGRAPH-F9BC → CJK UNIFIED IDEOGRAPH-5BEE # + +2F870 ; 5BF3 ; MA # ( 寳 → 寳 ) CJK COMPATIBILITY IDEOGRAPH-2F870 → CJK UNIFIED IDEOGRAPH-5BF3 # + +2F871 ; 21B18 ; MA # ( 𡬘 → 𡬘 ) CJK COMPATIBILITY IDEOGRAPH-2F871 → CJK UNIFIED IDEOGRAPH-21B18 # + +2F28 ; 5BF8 ; MA #* ( ⼨ → 寸 ) KANGXI RADICAL INCH → CJK UNIFIED IDEOGRAPH-5BF8 # + +2F872 ; 5BFF ; MA # ( 寿 → 寿 ) CJK COMPATIBILITY IDEOGRAPH-2F872 → CJK UNIFIED IDEOGRAPH-5BFF # + +2F873 ; 5C06 ; MA # ( 将 → 将 ) CJK COMPATIBILITY IDEOGRAPH-2F873 → CJK UNIFIED IDEOGRAPH-5C06 # + +2F29 ; 5C0F ; MA #* ( ⼩ → 小 ) KANGXI RADICAL SMALL → CJK UNIFIED IDEOGRAPH-5C0F # + +2F875 ; 5C22 ; MA # ( 尢 → 尢 ) CJK COMPATIBILITY IDEOGRAPH-2F875 → CJK UNIFIED IDEOGRAPH-5C22 # +2E90 ; 5C22 ; MA #* ( ⺐ → 尢 ) CJK RADICAL LAME THREE → CJK UNIFIED IDEOGRAPH-5C22 # +2F2A ; 5C22 ; MA #* ( ⼪ → 尢 ) KANGXI RADICAL LAME → CJK UNIFIED IDEOGRAPH-5C22 # + +2E8F ; 5C23 ; MA #* ( ⺏ → 尣 ) CJK RADICAL LAME TWO → CJK UNIFIED IDEOGRAPH-5C23 # + +2F876 ; 3781 ; MA # ( 㞁 → 㞁 ) CJK COMPATIBILITY IDEOGRAPH-2F876 → CJK UNIFIED IDEOGRAPH-3781 # + +2F2B ; 5C38 ; MA #* ( ⼫ → 尸 ) KANGXI RADICAL CORPSE → CJK UNIFIED IDEOGRAPH-5C38 # + +F9BD ; 5C3F ; MA # ( 尿 → 尿 ) CJK COMPATIBILITY IDEOGRAPH-F9BD → CJK UNIFIED IDEOGRAPH-5C3F # + +2F877 ; 5C60 ; MA # ( 屠 → 屠 ) CJK COMPATIBILITY IDEOGRAPH-2F877 → CJK UNIFIED IDEOGRAPH-5C60 # + +F94B ; 5C62 ; MA # ( 屢 → 屢 ) CJK COMPATIBILITY IDEOGRAPH-F94B → CJK UNIFIED IDEOGRAPH-5C62 # + +FA3B ; 5C64 ; MA # ( 層 → 層 ) CJK COMPATIBILITY IDEOGRAPH-FA3B → CJK UNIFIED IDEOGRAPH-5C64 # + +F9DF ; 5C65 ; MA # ( 履 → 履 ) CJK COMPATIBILITY IDEOGRAPH-F9DF → CJK UNIFIED IDEOGRAPH-5C65 # + +FA3C ; 5C6E ; MA # ( 屮 → 屮 ) CJK COMPATIBILITY IDEOGRAPH-FA3C → CJK UNIFIED IDEOGRAPH-5C6E # +2F878 ; 5C6E ; MA # ( 屮 → 屮 ) CJK COMPATIBILITY IDEOGRAPH-2F878 → CJK UNIFIED IDEOGRAPH-5C6E # +2F2C ; 5C6E ; MA #* ( ⼬ → 屮 ) KANGXI RADICAL SPROUT → CJK UNIFIED IDEOGRAPH-5C6E # + +2F8F8 ; 21D0B ; MA # ( 𡴋 → 𡴋 ) CJK COMPATIBILITY IDEOGRAPH-2F8F8 → CJK UNIFIED IDEOGRAPH-21D0B # + +2F2D ; 5C71 ; MA #* ( ⼭ → 山 ) KANGXI RADICAL MOUNTAIN → CJK UNIFIED IDEOGRAPH-5C71 # + +2F879 ; 5CC0 ; MA # ( 峀 → 峀 ) CJK COMPATIBILITY IDEOGRAPH-2F879 → CJK UNIFIED IDEOGRAPH-5CC0 # + +2F87A ; 5C8D ; MA # ( 岍 → 岍 ) CJK COMPATIBILITY IDEOGRAPH-2F87A → CJK UNIFIED IDEOGRAPH-5C8D # + +2F87B ; 21DE4 ; MA # ( 𡷤 → 𡷤 ) CJK COMPATIBILITY IDEOGRAPH-2F87B → CJK UNIFIED IDEOGRAPH-21DE4 # + +2F87D ; 21DE6 ; MA # ( 𡷦 → 𡷦 ) CJK COMPATIBILITY IDEOGRAPH-2F87D → CJK UNIFIED IDEOGRAPH-21DE6 # + +F9D5 ; 5D19 ; MA # ( 崙 → 崙 ) CJK COMPATIBILITY IDEOGRAPH-F9D5 → CJK UNIFIED IDEOGRAPH-5D19 # + +2F87C ; 5D43 ; MA # ( 嵃 → 嵃 ) CJK COMPATIBILITY IDEOGRAPH-2F87C → CJK UNIFIED IDEOGRAPH-5D43 # + +F921 ; 5D50 ; MA # ( 嵐 → 嵐 ) CJK COMPATIBILITY IDEOGRAPH-F921 → CJK UNIFIED IDEOGRAPH-5D50 # + +2F87F ; 5D6B ; MA # ( 嵫 → 嵫 ) CJK COMPATIBILITY IDEOGRAPH-2F87F → CJK UNIFIED IDEOGRAPH-5D6B # + +2F87E ; 5D6E ; MA # ( 嵮 → 嵮 ) CJK COMPATIBILITY IDEOGRAPH-2F87E → CJK UNIFIED IDEOGRAPH-5D6E # + +2F880 ; 5D7C ; MA # ( 嵼 → 嵼 ) CJK COMPATIBILITY IDEOGRAPH-2F880 → CJK UNIFIED IDEOGRAPH-5D7C # + +2F9F4 ; 5DB2 ; MA # ( 嶲 → 嶲 ) CJK COMPATIBILITY IDEOGRAPH-2F9F4 → CJK UNIFIED IDEOGRAPH-5DB2 # + +F9AB ; 5DBA ; MA # ( 嶺 → 嶺 ) CJK COMPATIBILITY IDEOGRAPH-F9AB → CJK UNIFIED IDEOGRAPH-5DBA # + +2F2E ; 5DDB ; MA #* ( ⼮ → 巛 ) KANGXI RADICAL RIVER → CJK UNIFIED IDEOGRAPH-5DDB # + +2F882 ; 5DE2 ; MA # ( 巢 → 巢 ) CJK COMPATIBILITY IDEOGRAPH-2F882 → CJK UNIFIED IDEOGRAPH-5DE2 # + +2F2F ; 5DE5 ; MA #* ( ⼯ → 工 ) KANGXI RADICAL WORK → CJK UNIFIED IDEOGRAPH-5DE5 # + +2F30 ; 5DF1 ; MA #* ( ⼰ → 己 ) KANGXI RADICAL ONESELF → CJK UNIFIED IDEOGRAPH-5DF1 # + +2E92 ; 5DF3 ; MA #* ( ⺒ → 巳 ) CJK RADICAL SNAKE → CJK UNIFIED IDEOGRAPH-5DF3 # + +2F883 ; 382F ; MA # ( 㠯 → 㠯 ) CJK COMPATIBILITY IDEOGRAPH-2F883 → CJK UNIFIED IDEOGRAPH-382F # + +2F884 ; 5DFD ; MA # ( 巽 → 巽 ) CJK COMPATIBILITY IDEOGRAPH-2F884 → CJK UNIFIED IDEOGRAPH-5DFD # + +2F31 ; 5DFE ; MA #* ( ⼱ → 巾 ) KANGXI RADICAL TURBAN → CJK UNIFIED IDEOGRAPH-5DFE # + +5E32 ; 5E21 ; MA # ( 帲 → 帡 ) CJK UNIFIED IDEOGRAPH-5E32 → CJK UNIFIED IDEOGRAPH-5E21 # + +2F885 ; 5E28 ; MA # ( 帨 → 帨 ) CJK COMPATIBILITY IDEOGRAPH-2F885 → CJK UNIFIED IDEOGRAPH-5E28 # + +2F886 ; 5E3D ; MA # ( 帽 → 帽 ) CJK COMPATIBILITY IDEOGRAPH-2F886 → CJK UNIFIED IDEOGRAPH-5E3D # + +2F887 ; 5E69 ; MA # ( 幩 → 幩 ) CJK COMPATIBILITY IDEOGRAPH-2F887 → CJK UNIFIED IDEOGRAPH-5E69 # + +2F888 ; 3862 ; MA # ( 㡢 → 㡢 ) CJK COMPATIBILITY IDEOGRAPH-2F888 → CJK UNIFIED IDEOGRAPH-3862 # + +2F889 ; 22183 ; MA # ( 𢆃 → 𢆃 ) CJK COMPATIBILITY IDEOGRAPH-2F889 → CJK UNIFIED IDEOGRAPH-22183 # + +2F32 ; 5E72 ; MA #* ( ⼲ → 干 ) KANGXI RADICAL DRY → CJK UNIFIED IDEOGRAPH-5E72 # + +F98E ; 5E74 ; MA # ( 年 → 年 ) CJK COMPATIBILITY IDEOGRAPH-F98E → CJK UNIFIED IDEOGRAPH-5E74 # + +2F939 ; 2219F ; MA # ( 𢆟 → 𢆟 ) CJK COMPATIBILITY IDEOGRAPH-2F939 → CJK UNIFIED IDEOGRAPH-2219F # + +2E93 ; 5E7A ; MA #* ( ⺓ → 幺 ) CJK RADICAL THREAD → CJK UNIFIED IDEOGRAPH-5E7A # +2F33 ; 5E7A ; MA #* ( ⼳ → 幺 ) KANGXI RADICAL SHORT THREAD → CJK UNIFIED IDEOGRAPH-5E7A # + +2F34 ; 5E7F ; MA #* ( ⼴ → 广 ) KANGXI RADICAL DOTTED CLIFF → CJK UNIFIED IDEOGRAPH-5E7F # + +FA01 ; 5EA6 ; MA # ( 度 → 度 ) CJK COMPATIBILITY IDEOGRAPH-FA01 → CJK UNIFIED IDEOGRAPH-5EA6 # + +2F88A ; 387C ; MA # ( 㡼 → 㡼 ) CJK COMPATIBILITY IDEOGRAPH-2F88A → CJK UNIFIED IDEOGRAPH-387C # + +2F88B ; 5EB0 ; MA # ( 庰 → 庰 ) CJK COMPATIBILITY IDEOGRAPH-2F88B → CJK UNIFIED IDEOGRAPH-5EB0 # + +2F88C ; 5EB3 ; MA # ( 庳 → 庳 ) CJK COMPATIBILITY IDEOGRAPH-2F88C → CJK UNIFIED IDEOGRAPH-5EB3 # + +2F88D ; 5EB6 ; MA # ( 庶 → 庶 ) CJK COMPATIBILITY IDEOGRAPH-2F88D → CJK UNIFIED IDEOGRAPH-5EB6 # + +F928 ; 5ECA ; MA # ( 廊 → 廊 ) CJK COMPATIBILITY IDEOGRAPH-F928 → CJK UNIFIED IDEOGRAPH-5ECA # +2F88E ; 5ECA ; MA # ( 廊 → 廊 ) CJK COMPATIBILITY IDEOGRAPH-2F88E → CJK UNIFIED IDEOGRAPH-5ECA # + +F9A2 ; 5EC9 ; MA # ( 廉 → 廉 ) CJK COMPATIBILITY IDEOGRAPH-F9A2 → CJK UNIFIED IDEOGRAPH-5EC9 # + +FA82 ; 5ED2 ; MA # ( 廒 → 廒 ) CJK COMPATIBILITY IDEOGRAPH-FA82 → CJK UNIFIED IDEOGRAPH-5ED2 # + +FA0B ; 5ED3 ; MA # ( 廓 → 廓 ) CJK COMPATIBILITY IDEOGRAPH-FA0B → CJK UNIFIED IDEOGRAPH-5ED3 # + +FA83 ; 5ED9 ; MA # ( 廙 → 廙 ) CJK COMPATIBILITY IDEOGRAPH-FA83 → CJK UNIFIED IDEOGRAPH-5ED9 # + +F982 ; 5EEC ; MA # ( 廬 → 廬 ) CJK COMPATIBILITY IDEOGRAPH-F982 → CJK UNIFIED IDEOGRAPH-5EEC # + +2F35 ; 5EF4 ; MA #* ( ⼵ → 廴 ) KANGXI RADICAL LONG STRIDE → CJK UNIFIED IDEOGRAPH-5EF4 # + +2F890 ; 5EFE ; MA # ( 廾 → 廾 ) CJK COMPATIBILITY IDEOGRAPH-2F890 → CJK UNIFIED IDEOGRAPH-5EFE # +2F36 ; 5EFE ; MA #* ( ⼶ → 廾 ) KANGXI RADICAL TWO HANDS → CJK UNIFIED IDEOGRAPH-5EFE # + +2F891 ; 22331 ; MA # ( 𢌱 → 𢌱 ) CJK COMPATIBILITY IDEOGRAPH-2F891 → CJK UNIFIED IDEOGRAPH-22331 # +2F892 ; 22331 ; MA # ( 𢌱 → 𢌱 ) CJK COMPATIBILITY IDEOGRAPH-2F892 → CJK UNIFIED IDEOGRAPH-22331 # + +F943 ; 5F04 ; MA # ( 弄 → 弄 ) CJK COMPATIBILITY IDEOGRAPH-F943 → CJK UNIFIED IDEOGRAPH-5F04 # + +2F37 ; 5F0B ; MA #* ( ⼷ → 弋 ) KANGXI RADICAL SHOOT → CJK UNIFIED IDEOGRAPH-5F0B # + +2F38 ; 5F13 ; MA #* ( ⼸ → 弓 ) KANGXI RADICAL BOW → CJK UNIFIED IDEOGRAPH-5F13 # + +2F894 ; 5F22 ; MA # ( 弢 → 弢 ) CJK COMPATIBILITY IDEOGRAPH-2F894 → CJK UNIFIED IDEOGRAPH-5F22 # +2F895 ; 5F22 ; MA # ( 弢 → 弢 ) CJK COMPATIBILITY IDEOGRAPH-2F895 → CJK UNIFIED IDEOGRAPH-5F22 # + +2F39 ; 5F50 ; MA #* ( ⼹ → 彐 ) KANGXI RADICAL SNOUT → CJK UNIFIED IDEOGRAPH-5F50 # + +2E94 ; 5F51 ; MA #* ( ⺔ → 彑 ) CJK RADICAL SNOUT ONE → CJK UNIFIED IDEOGRAPH-5F51 # + +2F874 ; 5F53 ; MA # ( 当 → 当 ) CJK COMPATIBILITY IDEOGRAPH-2F874 → CJK UNIFIED IDEOGRAPH-5F53 # + +2F896 ; 38C7 ; MA # ( 㣇 → 㣇 ) CJK COMPATIBILITY IDEOGRAPH-2F896 → CJK UNIFIED IDEOGRAPH-38C7 # + +2F3A ; 5F61 ; MA #* ( ⼺ → 彡 ) KANGXI RADICAL BRISTLE → CJK UNIFIED IDEOGRAPH-5F61 # + +2F899 ; 5F62 ; MA # ( 形 → 形 ) CJK COMPATIBILITY IDEOGRAPH-2F899 → CJK UNIFIED IDEOGRAPH-5F62 # + +FA84 ; 5F69 ; MA # ( 彩 → 彩 ) CJK COMPATIBILITY IDEOGRAPH-FA84 → CJK UNIFIED IDEOGRAPH-5F69 # + +2F89A ; 5F6B ; MA # ( 彫 → 彫 ) CJK COMPATIBILITY IDEOGRAPH-2F89A → CJK UNIFIED IDEOGRAPH-5F6B # + +2F3B ; 5F73 ; MA #* ( ⼻ → 彳 ) KANGXI RADICAL STEP → CJK UNIFIED IDEOGRAPH-5F73 # + +F9D8 ; 5F8B ; MA # ( 律 → 律 ) CJK COMPATIBILITY IDEOGRAPH-F9D8 → CJK UNIFIED IDEOGRAPH-5F8B # + +2F89B ; 38E3 ; MA # ( 㣣 → 㣣 ) CJK COMPATIBILITY IDEOGRAPH-2F89B → CJK UNIFIED IDEOGRAPH-38E3 # + +2F89C ; 5F9A ; MA # ( 徚 → 徚 ) CJK COMPATIBILITY IDEOGRAPH-2F89C → CJK UNIFIED IDEOGRAPH-5F9A # + +F966 ; 5FA9 ; MA # ( 復 → 復 ) CJK COMPATIBILITY IDEOGRAPH-F966 → CJK UNIFIED IDEOGRAPH-5FA9 # + +FA85 ; 5FAD ; MA # ( 徭 → 徭 ) CJK COMPATIBILITY IDEOGRAPH-FA85 → CJK UNIFIED IDEOGRAPH-5FAD # + +2F3C ; 5FC3 ; MA #* ( ⼼ → 心 ) KANGXI RADICAL HEART → CJK UNIFIED IDEOGRAPH-5FC3 # + +2E96 ; 5FC4 ; MA #* ( ⺖ → 忄 ) CJK RADICAL HEART ONE → CJK UNIFIED IDEOGRAPH-5FC4 # + +2E97 ; 38FA ; MA #* ( ⺗ → 㣺 ) CJK RADICAL HEART TWO → CJK UNIFIED IDEOGRAPH-38FA # + +2F89D ; 5FCD ; MA # ( 忍 → 忍 ) CJK COMPATIBILITY IDEOGRAPH-2F89D → CJK UNIFIED IDEOGRAPH-5FCD # + +2F89E ; 5FD7 ; MA # ( 志 → 志 ) CJK COMPATIBILITY IDEOGRAPH-2F89E → CJK UNIFIED IDEOGRAPH-5FD7 # + +F9A3 ; 5FF5 ; MA # ( 念 → 念 ) CJK COMPATIBILITY IDEOGRAPH-F9A3 → CJK UNIFIED IDEOGRAPH-5FF5 # + +2F89F ; 5FF9 ; MA # ( 忹 → 忹 ) CJK COMPATIBILITY IDEOGRAPH-2F89F → CJK UNIFIED IDEOGRAPH-5FF9 # + +F960 ; 6012 ; MA # ( 怒 → 怒 ) CJK COMPATIBILITY IDEOGRAPH-F960 → CJK UNIFIED IDEOGRAPH-6012 # + +F9AC ; 601C ; MA # ( 怜 → 怜 ) CJK COMPATIBILITY IDEOGRAPH-F9AC → CJK UNIFIED IDEOGRAPH-601C # + +FA6B ; 6075 ; MA # ( 恵 → 恵 ) CJK COMPATIBILITY IDEOGRAPH-FA6B → CJK UNIFIED IDEOGRAPH-6075 # + +2F8A2 ; 391C ; MA # ( 㤜 → 㤜 ) CJK COMPATIBILITY IDEOGRAPH-2F8A2 → CJK UNIFIED IDEOGRAPH-391C # + +2F8A1 ; 393A ; MA # ( 㤺 → 㤺 ) CJK COMPATIBILITY IDEOGRAPH-2F8A1 → CJK UNIFIED IDEOGRAPH-393A # + +2F8A0 ; 6081 ; MA # ( 悁 → 悁 ) CJK COMPATIBILITY IDEOGRAPH-2F8A0 → CJK UNIFIED IDEOGRAPH-6081 # + +FA3D ; 6094 ; MA # ( 悔 → 悔 ) CJK COMPATIBILITY IDEOGRAPH-FA3D → CJK UNIFIED IDEOGRAPH-6094 # +2F8A3 ; 6094 ; MA # ( 悔 → 悔 ) CJK COMPATIBILITY IDEOGRAPH-2F8A3 → CJK UNIFIED IDEOGRAPH-6094 # + +2F8A5 ; 60C7 ; MA # ( 惇 → 惇 ) CJK COMPATIBILITY IDEOGRAPH-2F8A5 → CJK UNIFIED IDEOGRAPH-60C7 # + +FA86 ; 60D8 ; MA # ( 惘 → 惘 ) CJK COMPATIBILITY IDEOGRAPH-FA86 → CJK UNIFIED IDEOGRAPH-60D8 # + +F9B9 ; 60E1 ; MA # ( 惡 → 惡 ) CJK COMPATIBILITY IDEOGRAPH-F9B9 → CJK UNIFIED IDEOGRAPH-60E1 # + +2F8A4 ; 226D4 ; MA # ( 𢛔 → 𢛔 ) CJK COMPATIBILITY IDEOGRAPH-2F8A4 → CJK UNIFIED IDEOGRAPH-226D4 # + +FA88 ; 6108 ; MA # ( 愈 → 愈 ) CJK COMPATIBILITY IDEOGRAPH-FA88 → CJK UNIFIED IDEOGRAPH-6108 # + +FA3E ; 6168 ; MA # ( 慨 → 慨 ) CJK COMPATIBILITY IDEOGRAPH-FA3E → CJK UNIFIED IDEOGRAPH-6168 # + +F9D9 ; 6144 ; MA # ( 慄 → 慄 ) CJK COMPATIBILITY IDEOGRAPH-F9D9 → CJK UNIFIED IDEOGRAPH-6144 # + +2F8A6 ; 6148 ; MA # ( 慈 → 慈 ) CJK COMPATIBILITY IDEOGRAPH-2F8A6 → CJK UNIFIED IDEOGRAPH-6148 # + +2F8A7 ; 614C ; MA # ( 慌 → 慌 ) CJK COMPATIBILITY IDEOGRAPH-2F8A7 → CJK UNIFIED IDEOGRAPH-614C # +2F8A9 ; 614C ; MA # ( 慌 → 慌 ) CJK COMPATIBILITY IDEOGRAPH-2F8A9 → CJK UNIFIED IDEOGRAPH-614C # + +FA87 ; 614E ; MA # ( 慎 → 慎 ) CJK COMPATIBILITY IDEOGRAPH-FA87 → CJK UNIFIED IDEOGRAPH-614E # +2F8A8 ; 614E ; MA # ( 慎 → 慎 ) CJK COMPATIBILITY IDEOGRAPH-2F8A8 → CJK UNIFIED IDEOGRAPH-614E # + +FA8A ; 6160 ; MA # ( 慠 → 慠 ) CJK COMPATIBILITY IDEOGRAPH-FA8A → CJK UNIFIED IDEOGRAPH-6160 # + +2F8AA ; 617A ; MA # ( 慺 → 慺 ) CJK COMPATIBILITY IDEOGRAPH-2F8AA → CJK UNIFIED IDEOGRAPH-617A # + +FA3F ; 618E ; MA # ( 憎 → 憎 ) CJK COMPATIBILITY IDEOGRAPH-FA3F → CJK UNIFIED IDEOGRAPH-618E # +FA89 ; 618E ; MA # ( 憎 → 憎 ) CJK COMPATIBILITY IDEOGRAPH-FA89 → CJK UNIFIED IDEOGRAPH-618E # +2F8AB ; 618E ; MA # ( 憎 → 憎 ) CJK COMPATIBILITY IDEOGRAPH-2F8AB → CJK UNIFIED IDEOGRAPH-618E # + +F98F ; 6190 ; MA # ( 憐 → 憐 ) CJK COMPATIBILITY IDEOGRAPH-F98F → CJK UNIFIED IDEOGRAPH-6190 # + +2F8AD ; 61A4 ; MA # ( 憤 → 憤 ) CJK COMPATIBILITY IDEOGRAPH-2F8AD → CJK UNIFIED IDEOGRAPH-61A4 # + +2F8AE ; 61AF ; MA # ( 憯 → 憯 ) CJK COMPATIBILITY IDEOGRAPH-2F8AE → CJK UNIFIED IDEOGRAPH-61AF # + +2F8AC ; 61B2 ; MA # ( 憲 → 憲 ) CJK COMPATIBILITY IDEOGRAPH-2F8AC → CJK UNIFIED IDEOGRAPH-61B2 # + +FAD0 ; 22844 ; MA # ( 𢡄 → 𢡄 ) CJK COMPATIBILITY IDEOGRAPH-FAD0 → CJK UNIFIED IDEOGRAPH-22844 # + +FACF ; 2284A ; MA # ( 𢡊 → 𢡊 ) CJK COMPATIBILITY IDEOGRAPH-FACF → CJK UNIFIED IDEOGRAPH-2284A # + +2F8AF ; 61DE ; MA # ( 懞 → 懞 ) CJK COMPATIBILITY IDEOGRAPH-2F8AF → CJK UNIFIED IDEOGRAPH-61DE # + +FA40 ; 61F2 ; MA # ( 懲 → 懲 ) CJK COMPATIBILITY IDEOGRAPH-FA40 → CJK UNIFIED IDEOGRAPH-61F2 # +FA8B ; 61F2 ; MA # ( 懲 → 懲 ) CJK COMPATIBILITY IDEOGRAPH-FA8B → CJK UNIFIED IDEOGRAPH-61F2 # +2F8B0 ; 61F2 ; MA # ( 懲 → 懲 ) CJK COMPATIBILITY IDEOGRAPH-2F8B0 → CJK UNIFIED IDEOGRAPH-61F2 # + +F90D ; 61F6 ; MA # ( 懶 → 懶 ) CJK COMPATIBILITY IDEOGRAPH-F90D → CJK UNIFIED IDEOGRAPH-61F6 # +2F8B1 ; 61F6 ; MA # ( 懶 → 懶 ) CJK COMPATIBILITY IDEOGRAPH-2F8B1 → CJK UNIFIED IDEOGRAPH-61F6 # + +F990 ; 6200 ; MA # ( 戀 → 戀 ) CJK COMPATIBILITY IDEOGRAPH-F990 → CJK UNIFIED IDEOGRAPH-6200 # + +2F3D ; 6208 ; MA #* ( ⼽ → 戈 ) KANGXI RADICAL HALBERD → CJK UNIFIED IDEOGRAPH-6208 # + +2F8B2 ; 6210 ; MA # ( 成 → 成 ) CJK COMPATIBILITY IDEOGRAPH-2F8B2 → CJK UNIFIED IDEOGRAPH-6210 # + +2F8B3 ; 621B ; MA # ( 戛 → 戛 ) CJK COMPATIBILITY IDEOGRAPH-2F8B3 → CJK UNIFIED IDEOGRAPH-621B # + +F9D2 ; 622E ; MA # ( 戮 → 戮 ) CJK COMPATIBILITY IDEOGRAPH-F9D2 → CJK UNIFIED IDEOGRAPH-622E # + +FA8C ; 6234 ; MA # ( 戴 → 戴 ) CJK COMPATIBILITY IDEOGRAPH-FA8C → CJK UNIFIED IDEOGRAPH-6234 # + +2F3E ; 6236 ; MA #* ( ⼾ → 戶 ) KANGXI RADICAL DOOR → CJK UNIFIED IDEOGRAPH-6236 # +6238 ; 6236 ; MA # ( 戸 → 戶 ) CJK UNIFIED IDEOGRAPH-6238 → CJK UNIFIED IDEOGRAPH-6236 # →⼾→ + +2F3F ; 624B ; MA #* ( ⼿ → 手 ) KANGXI RADICAL HAND → CJK UNIFIED IDEOGRAPH-624B # + +2E98 ; 624C ; MA #* ( ⺘ → 扌 ) CJK RADICAL HAND → CJK UNIFIED IDEOGRAPH-624C # + +2F8B4 ; 625D ; MA # ( 扝 → 扝 ) CJK COMPATIBILITY IDEOGRAPH-2F8B4 → CJK UNIFIED IDEOGRAPH-625D # + +2F8B5 ; 62B1 ; MA # ( 抱 → 抱 ) CJK COMPATIBILITY IDEOGRAPH-2F8B5 → CJK UNIFIED IDEOGRAPH-62B1 # + +F925 ; 62C9 ; MA # ( 拉 → 拉 ) CJK COMPATIBILITY IDEOGRAPH-F925 → CJK UNIFIED IDEOGRAPH-62C9 # + +F95B ; 62CF ; MA # ( 拏 → 拏 ) CJK COMPATIBILITY IDEOGRAPH-F95B → CJK UNIFIED IDEOGRAPH-62CF # + +FA02 ; 62D3 ; MA # ( 拓 → 拓 ) CJK COMPATIBILITY IDEOGRAPH-FA02 → CJK UNIFIED IDEOGRAPH-62D3 # + +2F8B6 ; 62D4 ; MA # ( 拔 → 拔 ) CJK COMPATIBILITY IDEOGRAPH-2F8B6 → CJK UNIFIED IDEOGRAPH-62D4 # + +2F8BA ; 62FC ; MA # ( 拼 → 拼 ) CJK COMPATIBILITY IDEOGRAPH-2F8BA → CJK UNIFIED IDEOGRAPH-62FC # + +F973 ; 62FE ; MA # ( 拾 → 拾 ) CJK COMPATIBILITY IDEOGRAPH-F973 → CJK UNIFIED IDEOGRAPH-62FE # + +2F8B8 ; 22B0C ; MA # ( 𢬌 → 𢬌 ) CJK COMPATIBILITY IDEOGRAPH-2F8B8 → CJK UNIFIED IDEOGRAPH-22B0C # + +2F8B9 ; 633D ; MA # ( 挽 → 挽 ) CJK COMPATIBILITY IDEOGRAPH-2F8B9 → CJK UNIFIED IDEOGRAPH-633D # + +2F8B7 ; 6350 ; MA # ( 捐 → 捐 ) CJK COMPATIBILITY IDEOGRAPH-2F8B7 → CJK UNIFIED IDEOGRAPH-6350 # + +2F8BB ; 6368 ; MA # ( 捨 → 捨 ) CJK COMPATIBILITY IDEOGRAPH-2F8BB → CJK UNIFIED IDEOGRAPH-6368 # + +F9A4 ; 637B ; MA # ( 捻 → 捻 ) CJK COMPATIBILITY IDEOGRAPH-F9A4 → CJK UNIFIED IDEOGRAPH-637B # + +2F8BC ; 6383 ; MA # ( 掃 → 掃 ) CJK COMPATIBILITY IDEOGRAPH-2F8BC → CJK UNIFIED IDEOGRAPH-6383 # + +F975 ; 63A0 ; MA # ( 掠 → 掠 ) CJK COMPATIBILITY IDEOGRAPH-F975 → CJK UNIFIED IDEOGRAPH-63A0 # + +2F8C1 ; 63A9 ; MA # ( 掩 → 掩 ) CJK COMPATIBILITY IDEOGRAPH-2F8C1 → CJK UNIFIED IDEOGRAPH-63A9 # + +FA8D ; 63C4 ; MA # ( 揄 → 揄 ) CJK COMPATIBILITY IDEOGRAPH-FA8D → CJK UNIFIED IDEOGRAPH-63C4 # + +2F8BD ; 63E4 ; MA # ( 揤 → 揤 ) CJK COMPATIBILITY IDEOGRAPH-2F8BD → CJK UNIFIED IDEOGRAPH-63E4 # + +FA8F ; 6452 ; MA # ( 摒 → 摒 ) CJK COMPATIBILITY IDEOGRAPH-FA8F → CJK UNIFIED IDEOGRAPH-6452 # + +2F8BE ; 22BF1 ; MA # ( 𢯱 → 𢯱 ) CJK COMPATIBILITY IDEOGRAPH-2F8BE → CJK UNIFIED IDEOGRAPH-22BF1 # + +FA8E ; 641C ; MA # ( 搜 → 搜 ) CJK COMPATIBILITY IDEOGRAPH-FA8E → CJK UNIFIED IDEOGRAPH-641C # + +2F8BF ; 6422 ; MA # ( 搢 → 搢 ) CJK COMPATIBILITY IDEOGRAPH-2F8BF → CJK UNIFIED IDEOGRAPH-6422 # + +2F8C0 ; 63C5 ; MA # ( 揅 → 揅 ) CJK COMPATIBILITY IDEOGRAPH-2F8C0 → CJK UNIFIED IDEOGRAPH-63C5 # + +2F8C3 ; 6469 ; MA # ( 摩 → 摩 ) CJK COMPATIBILITY IDEOGRAPH-2F8C3 → CJK UNIFIED IDEOGRAPH-6469 # + +2F8C6 ; 6477 ; MA # ( 摷 → 摷 ) CJK COMPATIBILITY IDEOGRAPH-2F8C6 → CJK UNIFIED IDEOGRAPH-6477 # + +2F8C4 ; 647E ; MA # ( 摾 → 摾 ) CJK COMPATIBILITY IDEOGRAPH-2F8C4 → CJK UNIFIED IDEOGRAPH-647E # + +2F8C2 ; 3A2E ; MA # ( 㨮 → 㨮 ) CJK COMPATIBILITY IDEOGRAPH-2F8C2 → CJK UNIFIED IDEOGRAPH-3A2E # + +6409 ; 3A41 ; MA # ( 搉 → 㩁 ) CJK UNIFIED IDEOGRAPH-6409 → CJK UNIFIED IDEOGRAPH-3A41 # + +F991 ; 649A ; MA # ( 撚 → 撚 ) CJK COMPATIBILITY IDEOGRAPH-F991 → CJK UNIFIED IDEOGRAPH-649A # + +2F8C5 ; 649D ; MA # ( 撝 → 撝 ) CJK COMPATIBILITY IDEOGRAPH-2F8C5 → CJK UNIFIED IDEOGRAPH-649D # + +F930 ; 64C4 ; MA # ( 擄 → 擄 ) CJK COMPATIBILITY IDEOGRAPH-F930 → CJK UNIFIED IDEOGRAPH-64C4 # + +2F8C7 ; 3A6C ; MA # ( 㩬 → 㩬 ) CJK COMPATIBILITY IDEOGRAPH-2F8C7 → CJK UNIFIED IDEOGRAPH-3A6C # + +2F40 ; 652F ; MA #* ( ⽀ → 支 ) KANGXI RADICAL BRANCH → CJK UNIFIED IDEOGRAPH-652F # + +2F41 ; 6534 ; MA #* ( ⽁ → 攴 ) KANGXI RADICAL RAP → CJK UNIFIED IDEOGRAPH-6534 # + +2E99 ; 6535 ; MA #* ( ⺙ → 攵 ) CJK RADICAL RAP → CJK UNIFIED IDEOGRAPH-6535 # + +FA41 ; 654F ; MA # ( 敏 → 敏 ) CJK COMPATIBILITY IDEOGRAPH-FA41 → CJK UNIFIED IDEOGRAPH-654F # +2F8C8 ; 654F ; MA # ( 敏 → 敏 ) CJK COMPATIBILITY IDEOGRAPH-2F8C8 → CJK UNIFIED IDEOGRAPH-654F # + +FA90 ; 6556 ; MA # ( 敖 → 敖 ) CJK COMPATIBILITY IDEOGRAPH-FA90 → CJK UNIFIED IDEOGRAPH-6556 # + +2F8C9 ; 656C ; MA # ( 敬 → 敬 ) CJK COMPATIBILITY IDEOGRAPH-2F8C9 → CJK UNIFIED IDEOGRAPH-656C # + +F969 ; 6578 ; MA # ( 數 → 數 ) CJK COMPATIBILITY IDEOGRAPH-F969 → CJK UNIFIED IDEOGRAPH-6578 # + +2F8CA ; 2300A ; MA # ( 𣀊 → 𣀊 ) CJK COMPATIBILITY IDEOGRAPH-2F8CA → CJK UNIFIED IDEOGRAPH-2300A # + +2F42 ; 6587 ; MA #* ( ⽂ → 文 ) KANGXI RADICAL SCRIPT → CJK UNIFIED IDEOGRAPH-6587 # + +2EEB ; 6589 ; MA #* ( ⻫ → 斉 ) CJK RADICAL J-SIMPLIFIED EVEN → CJK UNIFIED IDEOGRAPH-6589 # + +2F43 ; 6597 ; MA #* ( ⽃ → 斗 ) KANGXI RADICAL DIPPER → CJK UNIFIED IDEOGRAPH-6597 # + +F9BE ; 6599 ; MA # ( 料 → 料 ) CJK COMPATIBILITY IDEOGRAPH-F9BE → CJK UNIFIED IDEOGRAPH-6599 # + +2F44 ; 65A4 ; MA #* ( ⽄ → 斤 ) KANGXI RADICAL AXE → CJK UNIFIED IDEOGRAPH-65A4 # + +2F45 ; 65B9 ; MA #* ( ⽅ → 方 ) KANGXI RADICAL SQUARE → CJK UNIFIED IDEOGRAPH-65B9 # + +F983 ; 65C5 ; MA # ( 旅 → 旅 ) CJK COMPATIBILITY IDEOGRAPH-F983 → CJK UNIFIED IDEOGRAPH-65C5 # + +2F46 ; 65E0 ; MA #* ( ⽆ → 无 ) KANGXI RADICAL NOT → CJK UNIFIED IDEOGRAPH-65E0 # + +2E9B ; 65E1 ; MA #* ( ⺛ → 旡 ) CJK RADICAL CHOKE → CJK UNIFIED IDEOGRAPH-65E1 # + +FA42 ; 65E2 ; MA # ( 既 → 既 ) CJK COMPATIBILITY IDEOGRAPH-FA42 → CJK UNIFIED IDEOGRAPH-65E2 # + +2F8CB ; 65E3 ; MA # ( 旣 → 旣 ) CJK COMPATIBILITY IDEOGRAPH-2F8CB → CJK UNIFIED IDEOGRAPH-65E3 # + +2F47 ; 65E5 ; MA #* ( ⽇ → 日 ) KANGXI RADICAL SUN → CJK UNIFIED IDEOGRAPH-65E5 # + +F9E0 ; 6613 ; MA # ( 易 → 易 ) CJK COMPATIBILITY IDEOGRAPH-F9E0 → CJK UNIFIED IDEOGRAPH-6613 # + +66F6 ; 3ADA ; MA # ( 曶 → 㫚 ) CJK UNIFIED IDEOGRAPH-66F6 → CJK UNIFIED IDEOGRAPH-3ADA # + +2F8D1 ; 3AE4 ; MA # ( 㫤 → 㫤 ) CJK COMPATIBILITY IDEOGRAPH-2F8D1 → CJK UNIFIED IDEOGRAPH-3AE4 # + +2F8CD ; 6649 ; MA # ( 晉 → 晉 ) CJK COMPATIBILITY IDEOGRAPH-2F8CD → CJK UNIFIED IDEOGRAPH-6649 # + +6669 ; 665A ; MA # ( 晩 → 晚 ) CJK UNIFIED IDEOGRAPH-6669 → CJK UNIFIED IDEOGRAPH-665A # + +FA12 ; 6674 ; MA # ( 晴 → 晴 ) CJK COMPATIBILITY IDEOGRAPH-FA12 → CJK UNIFIED IDEOGRAPH-6674 # +FA91 ; 6674 ; MA # ( 晴 → 晴 ) CJK COMPATIBILITY IDEOGRAPH-FA91 → CJK UNIFIED IDEOGRAPH-6674 # + +FA43 ; 6691 ; MA # ( 暑 → 暑 ) CJK COMPATIBILITY IDEOGRAPH-FA43 → CJK UNIFIED IDEOGRAPH-6691 # +2F8CF ; 6691 ; MA # ( 暑 → 暑 ) CJK COMPATIBILITY IDEOGRAPH-2F8CF → CJK UNIFIED IDEOGRAPH-6691 # + +F9C5 ; 6688 ; MA # ( 暈 → 暈 ) CJK COMPATIBILITY IDEOGRAPH-F9C5 → CJK UNIFIED IDEOGRAPH-6688 # + +2F8D0 ; 3B08 ; MA # ( 㬈 → 㬈 ) CJK COMPATIBILITY IDEOGRAPH-2F8D0 → CJK UNIFIED IDEOGRAPH-3B08 # + +2F8D5 ; 669C ; MA # ( 暜 → 暜 ) CJK COMPATIBILITY IDEOGRAPH-2F8D5 → CJK UNIFIED IDEOGRAPH-669C # + +FA06 ; 66B4 ; MA # ( 暴 → 暴 ) CJK COMPATIBILITY IDEOGRAPH-FA06 → CJK UNIFIED IDEOGRAPH-66B4 # + +F98B ; 66C6 ; MA # ( 曆 → 曆 ) CJK COMPATIBILITY IDEOGRAPH-F98B → CJK UNIFIED IDEOGRAPH-66C6 # + +2F8CE ; 3B19 ; MA # ( 㬙 → 㬙 ) CJK COMPATIBILITY IDEOGRAPH-2F8CE → CJK UNIFIED IDEOGRAPH-3B19 # + +2F897 ; 232B8 ; MA # ( 𣊸 → 𣊸 ) CJK COMPATIBILITY IDEOGRAPH-2F897 → CJK UNIFIED IDEOGRAPH-232B8 # + +2F48 ; 66F0 ; MA #* ( ⽈ → 曰 ) KANGXI RADICAL SAY → CJK UNIFIED IDEOGRAPH-66F0 # + +F901 ; 66F4 ; MA # ( 更 → 更 ) CJK COMPATIBILITY IDEOGRAPH-F901 → CJK UNIFIED IDEOGRAPH-66F4 # + +2F8CC ; 66F8 ; MA # ( 書 → 書 ) CJK COMPATIBILITY IDEOGRAPH-2F8CC → CJK UNIFIED IDEOGRAPH-66F8 # + +2F49 ; 6708 ; MA #* ( ⽉ → 月 ) KANGXI RADICAL MOON → CJK UNIFIED IDEOGRAPH-6708 # + +2F980 ; 2335F ; MA # ( 𣍟 → 𣍟 ) CJK COMPATIBILITY IDEOGRAPH-2F980 → CJK UNIFIED IDEOGRAPH-2335F # + +80A6 ; 670C ; MA # ( 肦 → 朌 ) CJK UNIFIED IDEOGRAPH-80A6 → CJK UNIFIED IDEOGRAPH-670C # + +80D0 ; 670F ; MA # ( 胐 → 朏 ) CJK UNIFIED IDEOGRAPH-80D0 → CJK UNIFIED IDEOGRAPH-670F # + +80CA ; 6710 ; MA # ( 胊 → 朐 ) CJK UNIFIED IDEOGRAPH-80CA → CJK UNIFIED IDEOGRAPH-6710 # + +8101 ; 6713 ; MA # ( 脁 → 朓 ) CJK UNIFIED IDEOGRAPH-8101 → CJK UNIFIED IDEOGRAPH-6713 # + +80F6 ; 3B35 ; MA # ( 胶 → 㬵 ) CJK UNIFIED IDEOGRAPH-80F6 → CJK UNIFIED IDEOGRAPH-3B35 # + +F929 ; 6717 ; MA # ( 朗 → 朗 ) CJK COMPATIBILITY IDEOGRAPH-F929 → CJK UNIFIED IDEOGRAPH-6717 # +FA92 ; 6717 ; MA # ( 朗 → 朗 ) CJK COMPATIBILITY IDEOGRAPH-FA92 → CJK UNIFIED IDEOGRAPH-6717 # +2F8D8 ; 6717 ; MA # ( 朗 → 朗 ) CJK COMPATIBILITY IDEOGRAPH-2F8D8 → CJK UNIFIED IDEOGRAPH-6717 # + +8127 ; 6718 ; MA # ( 脧 → 朘 ) CJK UNIFIED IDEOGRAPH-8127 → CJK UNIFIED IDEOGRAPH-6718 # + +FA93 ; 671B ; MA # ( 望 → 望 ) CJK COMPATIBILITY IDEOGRAPH-FA93 → CJK UNIFIED IDEOGRAPH-671B # +2F8D9 ; 671B ; MA # ( 望 → 望 ) CJK COMPATIBILITY IDEOGRAPH-2F8D9 → CJK UNIFIED IDEOGRAPH-671B # + +2F8DA ; 6721 ; MA # ( 朡 → 朡 ) CJK COMPATIBILITY IDEOGRAPH-2F8DA → CJK UNIFIED IDEOGRAPH-6721 # + +5E50 ; 3B3A ; MA # ( 幐 → 㬺 ) CJK UNIFIED IDEOGRAPH-5E50 → CJK UNIFIED IDEOGRAPH-3B3A # + +4420 ; 3B3B ; MA # ( 䐠 → 㬻 ) CJK UNIFIED IDEOGRAPH-4420 → CJK UNIFIED IDEOGRAPH-3B3B # + +2F989 ; 23393 ; MA # ( 𣎓 → 𣎓 ) CJK COMPATIBILITY IDEOGRAPH-2F989 → CJK UNIFIED IDEOGRAPH-23393 # + +81A7 ; 6723 ; MA # ( 膧 → 朣 ) CJK UNIFIED IDEOGRAPH-81A7 → CJK UNIFIED IDEOGRAPH-6723 # + +2F98A ; 2339C ; MA # ( 𣎜 → 𣎜 ) CJK COMPATIBILITY IDEOGRAPH-2F98A → CJK UNIFIED IDEOGRAPH-2339C # + +2F4A ; 6728 ; MA #* ( ⽊ → 木 ) KANGXI RADICAL TREE → CJK UNIFIED IDEOGRAPH-6728 # + +F9E1 ; 674E ; MA # ( 李 → 李 ) CJK COMPATIBILITY IDEOGRAPH-F9E1 → CJK UNIFIED IDEOGRAPH-674E # + +2F8DC ; 6753 ; MA # ( 杓 → 杓 ) CJK COMPATIBILITY IDEOGRAPH-2F8DC → CJK UNIFIED IDEOGRAPH-6753 # + +FA94 ; 6756 ; MA # ( 杖 → 杖 ) CJK COMPATIBILITY IDEOGRAPH-FA94 → CJK UNIFIED IDEOGRAPH-6756 # + +2F8DB ; 675E ; MA # ( 杞 → 杞 ) CJK COMPATIBILITY IDEOGRAPH-2F8DB → CJK UNIFIED IDEOGRAPH-675E # + +2F8DD ; 233C3 ; MA # ( 𣏃 → 𣏃 ) CJK COMPATIBILITY IDEOGRAPH-2F8DD → CJK UNIFIED IDEOGRAPH-233C3 # + +67FF ; 676E ; MA # ( 柿 → 杮 ) CJK UNIFIED IDEOGRAPH-67FF → CJK UNIFIED IDEOGRAPH-676E # + +F9C8 ; 677B ; MA # ( 杻 → 杻 ) CJK COMPATIBILITY IDEOGRAPH-F9C8 → CJK UNIFIED IDEOGRAPH-677B # + +2F8E0 ; 6785 ; MA # ( 枅 → 枅 ) CJK COMPATIBILITY IDEOGRAPH-2F8E0 → CJK UNIFIED IDEOGRAPH-6785 # + +F9F4 ; 6797 ; MA # ( 林 → 林 ) CJK COMPATIBILITY IDEOGRAPH-F9F4 → CJK UNIFIED IDEOGRAPH-6797 # + +2F8DE ; 3B49 ; MA # ( 㭉 → 㭉 ) CJK COMPATIBILITY IDEOGRAPH-2F8DE → CJK UNIFIED IDEOGRAPH-3B49 # + +FAD1 ; 233D5 ; MA # ( 𣏕 → 𣏕 ) CJK COMPATIBILITY IDEOGRAPH-FAD1 → CJK UNIFIED IDEOGRAPH-233D5 # + +F9C9 ; 67F3 ; MA # ( 柳 → 柳 ) CJK COMPATIBILITY IDEOGRAPH-F9C9 → CJK UNIFIED IDEOGRAPH-67F3 # + +2F8DF ; 67FA ; MA # ( 柺 → 柺 ) CJK COMPATIBILITY IDEOGRAPH-2F8DF → CJK UNIFIED IDEOGRAPH-67FA # + +F9DA ; 6817 ; MA # ( 栗 → 栗 ) CJK COMPATIBILITY IDEOGRAPH-F9DA → CJK UNIFIED IDEOGRAPH-6817 # + +2F8E5 ; 681F ; MA # ( 栟 → 栟 ) CJK COMPATIBILITY IDEOGRAPH-2F8E5 → CJK UNIFIED IDEOGRAPH-681F # + +2F8E1 ; 6852 ; MA # ( 桒 → 桒 ) CJK COMPATIBILITY IDEOGRAPH-2F8E1 → CJK UNIFIED IDEOGRAPH-6852 # + +2F8E3 ; 2346D ; MA # ( 𣑭 → 𣑭 ) CJK COMPATIBILITY IDEOGRAPH-2F8E3 → CJK UNIFIED IDEOGRAPH-2346D # + +F97A ; 6881 ; MA # ( 梁 → 梁 ) CJK COMPATIBILITY IDEOGRAPH-F97A → CJK UNIFIED IDEOGRAPH-6881 # + +FA44 ; 6885 ; MA # ( 梅 → 梅 ) CJK COMPATIBILITY IDEOGRAPH-FA44 → CJK UNIFIED IDEOGRAPH-6885 # +2F8E2 ; 6885 ; MA # ( 梅 → 梅 ) CJK COMPATIBILITY IDEOGRAPH-2F8E2 → CJK UNIFIED IDEOGRAPH-6885 # + +2F8E4 ; 688E ; MA # ( 梎 → 梎 ) CJK COMPATIBILITY IDEOGRAPH-2F8E4 → CJK UNIFIED IDEOGRAPH-688E # + +F9E2 ; 68A8 ; MA # ( 梨 → 梨 ) CJK COMPATIBILITY IDEOGRAPH-F9E2 → CJK UNIFIED IDEOGRAPH-68A8 # + +2F8E6 ; 6914 ; MA # ( 椔 → 椔 ) CJK COMPATIBILITY IDEOGRAPH-2F8E6 → CJK UNIFIED IDEOGRAPH-6914 # + +2F8E8 ; 6942 ; MA # ( 楂 → 楂 ) CJK COMPATIBILITY IDEOGRAPH-2F8E8 → CJK UNIFIED IDEOGRAPH-6942 # + +FAD2 ; 3B9D ; MA # ( 㮝 → 㮝 ) CJK COMPATIBILITY IDEOGRAPH-FAD2 → CJK UNIFIED IDEOGRAPH-3B9D # +2F8E7 ; 3B9D ; MA # ( 㮝 → 㮝 ) CJK COMPATIBILITY IDEOGRAPH-2F8E7 → CJK UNIFIED IDEOGRAPH-3B9D # + +69E9 ; 3BA3 ; MA # ( 槩 → 㮣 ) CJK UNIFIED IDEOGRAPH-69E9 → CJK UNIFIED IDEOGRAPH-3BA3 # + +6A27 ; 699D ; MA # ( 樧 → 榝 ) CJK UNIFIED IDEOGRAPH-6A27 → CJK UNIFIED IDEOGRAPH-699D # + +2F8E9 ; 69A3 ; MA # ( 榣 → 榣 ) CJK COMPATIBILITY IDEOGRAPH-2F8E9 → CJK UNIFIED IDEOGRAPH-69A3 # + +2F8EA ; 69EA ; MA # ( 槪 → 槪 ) CJK COMPATIBILITY IDEOGRAPH-2F8EA → CJK UNIFIED IDEOGRAPH-69EA # + +F914 ; 6A02 ; MA # ( 樂 → 樂 ) CJK COMPATIBILITY IDEOGRAPH-F914 → CJK UNIFIED IDEOGRAPH-6A02 # +F95C ; 6A02 ; MA # ( 樂 → 樂 ) CJK COMPATIBILITY IDEOGRAPH-F95C → CJK UNIFIED IDEOGRAPH-6A02 # +F9BF ; 6A02 ; MA # ( 樂 → 樂 ) CJK COMPATIBILITY IDEOGRAPH-F9BF → CJK UNIFIED IDEOGRAPH-6A02 # + +F94C ; 6A13 ; MA # ( 樓 → 樓 ) CJK COMPATIBILITY IDEOGRAPH-F94C → CJK UNIFIED IDEOGRAPH-6A13 # + +2F8EC ; 236A3 ; MA # ( 𣚣 → 𣚣 ) CJK COMPATIBILITY IDEOGRAPH-2F8EC → CJK UNIFIED IDEOGRAPH-236A3 # + +2F8EB ; 6AA8 ; MA # ( 檨 → 檨 ) CJK COMPATIBILITY IDEOGRAPH-2F8EB → CJK UNIFIED IDEOGRAPH-6AA8 # + +F931 ; 6AD3 ; MA # ( 櫓 → 櫓 ) CJK COMPATIBILITY IDEOGRAPH-F931 → CJK UNIFIED IDEOGRAPH-6AD3 # + +2F8ED ; 6ADB ; MA # ( 櫛 → 櫛 ) CJK COMPATIBILITY IDEOGRAPH-2F8ED → CJK UNIFIED IDEOGRAPH-6ADB # + +F91D ; 6B04 ; MA # ( 欄 → 欄 ) CJK COMPATIBILITY IDEOGRAPH-F91D → CJK UNIFIED IDEOGRAPH-6B04 # + +2F8EE ; 3C18 ; MA # ( 㰘 → 㰘 ) CJK COMPATIBILITY IDEOGRAPH-2F8EE → CJK UNIFIED IDEOGRAPH-3C18 # + +2F4B ; 6B20 ; MA #* ( ⽋ → 欠 ) KANGXI RADICAL LACK → CJK UNIFIED IDEOGRAPH-6B20 # + +2F8EF ; 6B21 ; MA # ( 次 → 次 ) CJK COMPATIBILITY IDEOGRAPH-2F8EF → CJK UNIFIED IDEOGRAPH-6B21 # + +2F8F0 ; 238A7 ; MA # ( 𣢧 → 𣢧 ) CJK COMPATIBILITY IDEOGRAPH-2F8F0 → CJK UNIFIED IDEOGRAPH-238A7 # + +2F8F1 ; 6B54 ; MA # ( 歔 → 歔 ) CJK COMPATIBILITY IDEOGRAPH-2F8F1 → CJK UNIFIED IDEOGRAPH-6B54 # + +2F8F2 ; 3C4E ; MA # ( 㱎 → 㱎 ) CJK COMPATIBILITY IDEOGRAPH-2F8F2 → CJK UNIFIED IDEOGRAPH-3C4E # + +2F4C ; 6B62 ; MA #* ( ⽌ → 止 ) KANGXI RADICAL STOP → CJK UNIFIED IDEOGRAPH-6B62 # + +2EED ; 6B6F ; MA #* ( ⻭ → 歯 ) CJK RADICAL J-SIMPLIFIED TOOTH → CJK UNIFIED IDEOGRAPH-6B6F # + +2F8F3 ; 6B72 ; MA # ( 歲 → 歲 ) CJK COMPATIBILITY IDEOGRAPH-2F8F3 → CJK UNIFIED IDEOGRAPH-6B72 # + +F98C ; 6B77 ; MA # ( 歷 → 歷 ) CJK COMPATIBILITY IDEOGRAPH-F98C → CJK UNIFIED IDEOGRAPH-6B77 # + +FA95 ; 6B79 ; MA # ( 歹 → 歹 ) CJK COMPATIBILITY IDEOGRAPH-FA95 → CJK UNIFIED IDEOGRAPH-6B79 # +2F4D ; 6B79 ; MA #* ( ⽍ → 歹 ) KANGXI RADICAL DEATH → CJK UNIFIED IDEOGRAPH-6B79 # + +2E9E ; 6B7A ; MA #* ( ⺞ → 歺 ) CJK RADICAL DEATH → CJK UNIFIED IDEOGRAPH-6B7A # + +2F8F4 ; 6B9F ; MA # ( 殟 → 殟 ) CJK COMPATIBILITY IDEOGRAPH-2F8F4 → CJK UNIFIED IDEOGRAPH-6B9F # + +F9A5 ; 6BAE ; MA # ( 殮 → 殮 ) CJK COMPATIBILITY IDEOGRAPH-F9A5 → CJK UNIFIED IDEOGRAPH-6BAE # + +2F4E ; 6BB3 ; MA #* ( ⽎ → 殳 ) KANGXI RADICAL WEAPON → CJK UNIFIED IDEOGRAPH-6BB3 # + +F970 ; 6BBA ; MA # ( 殺 → 殺 ) CJK COMPATIBILITY IDEOGRAPH-F970 → CJK UNIFIED IDEOGRAPH-6BBA # +FA96 ; 6BBA ; MA # ( 殺 → 殺 ) CJK COMPATIBILITY IDEOGRAPH-FA96 → CJK UNIFIED IDEOGRAPH-6BBA # +2F8F5 ; 6BBA ; MA # ( 殺 → 殺 ) CJK COMPATIBILITY IDEOGRAPH-2F8F5 → CJK UNIFIED IDEOGRAPH-6BBA # + +2F8F6 ; 6BBB ; MA # ( 殻 → 殻 ) CJK COMPATIBILITY IDEOGRAPH-2F8F6 → CJK UNIFIED IDEOGRAPH-6BBB # + +2F8F7 ; 23A8D ; MA # ( 𣪍 → 𣪍 ) CJK COMPATIBILITY IDEOGRAPH-2F8F7 → CJK UNIFIED IDEOGRAPH-23A8D # + +2F4F ; 6BCB ; MA #* ( ⽏ → 毋 ) KANGXI RADICAL DO NOT → CJK UNIFIED IDEOGRAPH-6BCB # + +2E9F ; 6BCD ; MA #* ( ⺟ → 母 ) CJK RADICAL MOTHER → CJK UNIFIED IDEOGRAPH-6BCD # + +2F8F9 ; 23AFA ; MA # ( 𣫺 → 𣫺 ) CJK COMPATIBILITY IDEOGRAPH-2F8F9 → CJK UNIFIED IDEOGRAPH-23AFA # + +2F50 ; 6BD4 ; MA #* ( ⽐ → 比 ) KANGXI RADICAL COMPARE → CJK UNIFIED IDEOGRAPH-6BD4 # + +2F51 ; 6BDB ; MA #* ( ⽑ → 毛 ) KANGXI RADICAL FUR → CJK UNIFIED IDEOGRAPH-6BDB # + +2F52 ; 6C0F ; MA #* ( ⽒ → 氏 ) KANGXI RADICAL CLAN → CJK UNIFIED IDEOGRAPH-6C0F # + +2EA0 ; 6C11 ; MA #* ( ⺠ → 民 ) CJK RADICAL CIVILIAN → CJK UNIFIED IDEOGRAPH-6C11 # + +2F53 ; 6C14 ; MA #* ( ⽓ → 气 ) KANGXI RADICAL STEAM → CJK UNIFIED IDEOGRAPH-6C14 # + +2F54 ; 6C34 ; MA #* ( ⽔ → 水 ) KANGXI RADICAL WATER → CJK UNIFIED IDEOGRAPH-6C34 # + +2EA1 ; 6C35 ; MA #* ( ⺡ → 氵 ) CJK RADICAL WATER ONE → CJK UNIFIED IDEOGRAPH-6C35 # + +2EA2 ; 6C3A ; MA #* ( ⺢ → 氺 ) CJK RADICAL WATER TWO → CJK UNIFIED IDEOGRAPH-6C3A # + +2F8FA ; 6C4E ; MA # ( 汎 → 汎 ) CJK COMPATIBILITY IDEOGRAPH-2F8FA → CJK UNIFIED IDEOGRAPH-6C4E # + +2F8FE ; 6C67 ; MA # ( 汧 → 汧 ) CJK COMPATIBILITY IDEOGRAPH-2F8FE → CJK UNIFIED IDEOGRAPH-6C67 # + +F972 ; 6C88 ; MA # ( 沈 → 沈 ) CJK COMPATIBILITY IDEOGRAPH-F972 → CJK UNIFIED IDEOGRAPH-6C88 # + +2F8FC ; 6CBF ; MA # ( 沿 → 沿 ) CJK COMPATIBILITY IDEOGRAPH-2F8FC → CJK UNIFIED IDEOGRAPH-6CBF # + +F968 ; 6CCC ; MA # ( 泌 → 泌 ) CJK COMPATIBILITY IDEOGRAPH-F968 → CJK UNIFIED IDEOGRAPH-6CCC # + +2F8FD ; 6CCD ; MA # ( 泍 → 泍 ) CJK COMPATIBILITY IDEOGRAPH-2F8FD → CJK UNIFIED IDEOGRAPH-6CCD # + +F9E3 ; 6CE5 ; MA # ( 泥 → 泥 ) CJK COMPATIBILITY IDEOGRAPH-F9E3 → CJK UNIFIED IDEOGRAPH-6CE5 # + +2F8FB ; 23CBC ; MA # ( 𣲼 → 𣲼 ) CJK COMPATIBILITY IDEOGRAPH-2F8FB → CJK UNIFIED IDEOGRAPH-23CBC # + +F915 ; 6D1B ; MA # ( 洛 → 洛 ) CJK COMPATIBILITY IDEOGRAPH-F915 → CJK UNIFIED IDEOGRAPH-6D1B # + +FA05 ; 6D1E ; MA # ( 洞 → 洞 ) CJK COMPATIBILITY IDEOGRAPH-FA05 → CJK UNIFIED IDEOGRAPH-6D1E # + +2F907 ; 6D34 ; MA # ( 洴 → 洴 ) CJK COMPATIBILITY IDEOGRAPH-2F907 → CJK UNIFIED IDEOGRAPH-6D34 # + +2F900 ; 6D3E ; MA # ( 派 → 派 ) CJK COMPATIBILITY IDEOGRAPH-2F900 → CJK UNIFIED IDEOGRAPH-6D3E # + +F9CA ; 6D41 ; MA # ( 流 → 流 ) CJK COMPATIBILITY IDEOGRAPH-F9CA → CJK UNIFIED IDEOGRAPH-6D41 # +FA97 ; 6D41 ; MA # ( 流 → 流 ) CJK COMPATIBILITY IDEOGRAPH-FA97 → CJK UNIFIED IDEOGRAPH-6D41 # +2F902 ; 6D41 ; MA # ( 流 → 流 ) CJK COMPATIBILITY IDEOGRAPH-2F902 → CJK UNIFIED IDEOGRAPH-6D41 # + +2F8FF ; 6D16 ; MA # ( 洖 → 洖 ) CJK COMPATIBILITY IDEOGRAPH-2F8FF → CJK UNIFIED IDEOGRAPH-6D16 # + +2F903 ; 6D69 ; MA # ( 浩 → 浩 ) CJK COMPATIBILITY IDEOGRAPH-2F903 → CJK UNIFIED IDEOGRAPH-6D69 # + +F92A ; 6D6A ; MA # ( 浪 → 浪 ) CJK COMPATIBILITY IDEOGRAPH-F92A → CJK UNIFIED IDEOGRAPH-6D6A # + +FA45 ; 6D77 ; MA # ( 海 → 海 ) CJK COMPATIBILITY IDEOGRAPH-FA45 → CJK UNIFIED IDEOGRAPH-6D77 # +2F901 ; 6D77 ; MA # ( 海 → 海 ) CJK COMPATIBILITY IDEOGRAPH-2F901 → CJK UNIFIED IDEOGRAPH-6D77 # + +2F904 ; 6D78 ; MA # ( 浸 → 浸 ) CJK COMPATIBILITY IDEOGRAPH-2F904 → CJK UNIFIED IDEOGRAPH-6D78 # + +2F905 ; 6D85 ; MA # ( 涅 → 涅 ) CJK COMPATIBILITY IDEOGRAPH-2F905 → CJK UNIFIED IDEOGRAPH-6D85 # + +2F906 ; 23D1E ; MA # ( 𣴞 → 𣴞 ) CJK COMPATIBILITY IDEOGRAPH-2F906 → CJK UNIFIED IDEOGRAPH-23D1E # + +F9F5 ; 6DCB ; MA # ( 淋 → 淋 ) CJK COMPATIBILITY IDEOGRAPH-F9F5 → CJK UNIFIED IDEOGRAPH-6DCB # + +F94D ; 6DDA ; MA # ( 淚 → 淚 ) CJK COMPATIBILITY IDEOGRAPH-F94D → CJK UNIFIED IDEOGRAPH-6DDA # + +F9D6 ; 6DEA ; MA # ( 淪 → 淪 ) CJK COMPATIBILITY IDEOGRAPH-F9D6 → CJK UNIFIED IDEOGRAPH-6DEA # + +2F90E ; 6DF9 ; MA # ( 淹 → 淹 ) CJK COMPATIBILITY IDEOGRAPH-2F90E → CJK UNIFIED IDEOGRAPH-6DF9 # + +FA46 ; 6E1A ; MA # ( 渚 → 渚 ) CJK COMPATIBILITY IDEOGRAPH-FA46 → CJK UNIFIED IDEOGRAPH-6E1A # + +2F908 ; 6E2F ; MA # ( 港 → 港 ) CJK COMPATIBILITY IDEOGRAPH-2F908 → CJK UNIFIED IDEOGRAPH-6E2F # + +2F909 ; 6E6E ; MA # ( 湮 → 湮 ) CJK COMPATIBILITY IDEOGRAPH-2F909 → CJK UNIFIED IDEOGRAPH-6E6E # + +6F59 ; 6E88 ; MA # ( 潙 → 溈 ) CJK UNIFIED IDEOGRAPH-6F59 → CJK UNIFIED IDEOGRAPH-6E88 # + +FA99 ; 6ECB ; MA # ( 滋 → 滋 ) CJK COMPATIBILITY IDEOGRAPH-FA99 → CJK UNIFIED IDEOGRAPH-6ECB # +2F90B ; 6ECB ; MA # ( 滋 → 滋 ) CJK COMPATIBILITY IDEOGRAPH-2F90B → CJK UNIFIED IDEOGRAPH-6ECB # + +F9CB ; 6E9C ; MA # ( 溜 → 溜 ) CJK COMPATIBILITY IDEOGRAPH-F9CB → CJK UNIFIED IDEOGRAPH-6E9C # + +F9EC ; 6EBA ; MA # ( 溺 → 溺 ) CJK COMPATIBILITY IDEOGRAPH-F9EC → CJK UNIFIED IDEOGRAPH-6EBA # + +2F90C ; 6EC7 ; MA # ( 滇 → 滇 ) CJK COMPATIBILITY IDEOGRAPH-2F90C → CJK UNIFIED IDEOGRAPH-6EC7 # + +F904 ; 6ED1 ; MA # ( 滑 → 滑 ) CJK COMPATIBILITY IDEOGRAPH-F904 → CJK UNIFIED IDEOGRAPH-6ED1 # + +FA98 ; 6EDB ; MA # ( 滛 → 滛 ) CJK COMPATIBILITY IDEOGRAPH-FA98 → CJK UNIFIED IDEOGRAPH-6EDB # + +2F90A ; 3D33 ; MA # ( 㴳 → 㴳 ) CJK COMPATIBILITY IDEOGRAPH-2F90A → CJK UNIFIED IDEOGRAPH-3D33 # + +F94E ; 6F0F ; MA # ( 漏 → 漏 ) CJK COMPATIBILITY IDEOGRAPH-F94E → CJK UNIFIED IDEOGRAPH-6F0F # + +FA47 ; 6F22 ; MA # ( 漢 → 漢 ) CJK COMPATIBILITY IDEOGRAPH-FA47 → CJK UNIFIED IDEOGRAPH-6F22 # +FA9A ; 6F22 ; MA # ( 漢 → 漢 ) CJK COMPATIBILITY IDEOGRAPH-FA9A → CJK UNIFIED IDEOGRAPH-6F22 # + +F992 ; 6F23 ; MA # ( 漣 → 漣 ) CJK COMPATIBILITY IDEOGRAPH-F992 → CJK UNIFIED IDEOGRAPH-6F23 # + +2F90D ; 23ED1 ; MA # ( 𣻑 → 𣻑 ) CJK COMPATIBILITY IDEOGRAPH-2F90D → CJK UNIFIED IDEOGRAPH-23ED1 # + +2F90F ; 6F6E ; MA # ( 潮 → 潮 ) CJK COMPATIBILITY IDEOGRAPH-2F90F → CJK UNIFIED IDEOGRAPH-6F6E # + +2F910 ; 23F5E ; MA # ( 𣽞 → 𣽞 ) CJK COMPATIBILITY IDEOGRAPH-2F910 → CJK UNIFIED IDEOGRAPH-23F5E # + +2F911 ; 23F8E ; MA # ( 𣾎 → 𣾎 ) CJK COMPATIBILITY IDEOGRAPH-2F911 → CJK UNIFIED IDEOGRAPH-23F8E # + +2F912 ; 6FC6 ; MA # ( 濆 → 濆 ) CJK COMPATIBILITY IDEOGRAPH-2F912 → CJK UNIFIED IDEOGRAPH-6FC6 # + +F922 ; 6FEB ; MA # ( 濫 → 濫 ) CJK COMPATIBILITY IDEOGRAPH-F922 → CJK UNIFIED IDEOGRAPH-6FEB # + +F984 ; 6FFE ; MA # ( 濾 → 濾 ) CJK COMPATIBILITY IDEOGRAPH-F984 → CJK UNIFIED IDEOGRAPH-6FFE # + +2F915 ; 701B ; MA # ( 瀛 → 瀛 ) CJK COMPATIBILITY IDEOGRAPH-2F915 → CJK UNIFIED IDEOGRAPH-701B # + +FA9B ; 701E ; MA # ( 瀞 → 瀞 ) CJK COMPATIBILITY IDEOGRAPH-FA9B → CJK UNIFIED IDEOGRAPH-701E # +2F914 ; 701E ; MA # ( 瀞 → 瀞 ) CJK COMPATIBILITY IDEOGRAPH-2F914 → CJK UNIFIED IDEOGRAPH-701E # + +2F913 ; 7039 ; MA # ( 瀹 → 瀹 ) CJK COMPATIBILITY IDEOGRAPH-2F913 → CJK UNIFIED IDEOGRAPH-7039 # + +2F917 ; 704A ; MA # ( 灊 → 灊 ) CJK COMPATIBILITY IDEOGRAPH-2F917 → CJK UNIFIED IDEOGRAPH-704A # + +2F916 ; 3D96 ; MA # ( 㶖 → 㶖 ) CJK COMPATIBILITY IDEOGRAPH-2F916 → CJK UNIFIED IDEOGRAPH-3D96 # + +2F55 ; 706B ; MA #* ( ⽕ → 火 ) KANGXI RADICAL FIRE → CJK UNIFIED IDEOGRAPH-706B # + +2EA3 ; 706C ; MA #* ( ⺣ → 灬 ) CJK RADICAL FIRE → CJK UNIFIED IDEOGRAPH-706C # + +2F835 ; 7070 ; MA # ( 灰 → 灰 ) CJK COMPATIBILITY IDEOGRAPH-2F835 → CJK UNIFIED IDEOGRAPH-7070 # + +2F919 ; 7077 ; MA # ( 灷 → 灷 ) CJK COMPATIBILITY IDEOGRAPH-2F919 → CJK UNIFIED IDEOGRAPH-7077 # + +2F918 ; 707D ; MA # ( 災 → 災 ) CJK COMPATIBILITY IDEOGRAPH-2F918 → CJK UNIFIED IDEOGRAPH-707D # + +F9FB ; 7099 ; MA # ( 炙 → 炙 ) CJK COMPATIBILITY IDEOGRAPH-F9FB → CJK UNIFIED IDEOGRAPH-7099 # + +2F91A ; 70AD ; MA # ( 炭 → 炭 ) CJK COMPATIBILITY IDEOGRAPH-2F91A → CJK UNIFIED IDEOGRAPH-70AD # + +F99F ; 70C8 ; MA # ( 烈 → 烈 ) CJK COMPATIBILITY IDEOGRAPH-F99F → CJK UNIFIED IDEOGRAPH-70C8 # + +F916 ; 70D9 ; MA # ( 烙 → 烙 ) CJK COMPATIBILITY IDEOGRAPH-F916 → CJK UNIFIED IDEOGRAPH-70D9 # + +FA48 ; 716E ; MA # ( 煮 → 煮 ) CJK COMPATIBILITY IDEOGRAPH-FA48 → CJK UNIFIED IDEOGRAPH-716E # +FA9C ; 716E ; MA # ( 煮 → 煮 ) CJK COMPATIBILITY IDEOGRAPH-FA9C → CJK UNIFIED IDEOGRAPH-716E # + +2F91D ; 24263 ; MA # ( 𤉣 → 𤉣 ) CJK COMPATIBILITY IDEOGRAPH-2F91D → CJK UNIFIED IDEOGRAPH-24263 # + +2F91C ; 7145 ; MA # ( 煅 → 煅 ) CJK COMPATIBILITY IDEOGRAPH-2F91C → CJK UNIFIED IDEOGRAPH-7145 # + +F993 ; 7149 ; MA # ( 煉 → 煉 ) CJK COMPATIBILITY IDEOGRAPH-F993 → CJK UNIFIED IDEOGRAPH-7149 # + +FA6C ; 242EE ; MA # ( 𤋮 → 𤋮 ) CJK COMPATIBILITY IDEOGRAPH-FA6C → CJK UNIFIED IDEOGRAPH-242EE # + +2F91E ; 719C ; MA # ( 熜 → 熜 ) CJK COMPATIBILITY IDEOGRAPH-2F91E → CJK UNIFIED IDEOGRAPH-719C # + +F9C0 ; 71CE ; MA # ( 燎 → 燎 ) CJK COMPATIBILITY IDEOGRAPH-F9C0 → CJK UNIFIED IDEOGRAPH-71CE # + +F9EE ; 71D0 ; MA # ( 燐 → 燐 ) CJK COMPATIBILITY IDEOGRAPH-F9EE → CJK UNIFIED IDEOGRAPH-71D0 # + +2F91F ; 243AB ; MA # ( 𤎫 → 𤎫 ) CJK COMPATIBILITY IDEOGRAPH-2F91F → CJK UNIFIED IDEOGRAPH-243AB # + +F932 ; 7210 ; MA # ( 爐 → 爐 ) CJK COMPATIBILITY IDEOGRAPH-F932 → CJK UNIFIED IDEOGRAPH-7210 # + +F91E ; 721B ; MA # ( 爛 → 爛 ) CJK COMPATIBILITY IDEOGRAPH-F91E → CJK UNIFIED IDEOGRAPH-721B # + +2F920 ; 7228 ; MA # ( 爨 → 爨 ) CJK COMPATIBILITY IDEOGRAPH-2F920 → CJK UNIFIED IDEOGRAPH-7228 # + +2F56 ; 722A ; MA #* ( ⽖ → 爪 ) KANGXI RADICAL CLAW → CJK UNIFIED IDEOGRAPH-722A # + +FA49 ; 722B ; MA # ( 爫 → 爫 ) CJK COMPATIBILITY IDEOGRAPH-FA49 → CJK UNIFIED IDEOGRAPH-722B # +2EA4 ; 722B ; MA #* ( ⺤ → 爫 ) CJK RADICAL PAW ONE → CJK UNIFIED IDEOGRAPH-722B # + +FA9E ; 7235 ; MA # ( 爵 → 爵 ) CJK COMPATIBILITY IDEOGRAPH-FA9E → CJK UNIFIED IDEOGRAPH-7235 # +2F921 ; 7235 ; MA # ( 爵 → 爵 ) CJK COMPATIBILITY IDEOGRAPH-2F921 → CJK UNIFIED IDEOGRAPH-7235 # + +2F57 ; 7236 ; MA #* ( ⽗ → 父 ) KANGXI RADICAL FATHER → CJK UNIFIED IDEOGRAPH-7236 # + +2F58 ; 723B ; MA #* ( ⽘ → 爻 ) KANGXI RADICAL DOUBLE X → CJK UNIFIED IDEOGRAPH-723B # + +2EA6 ; 4E2C ; MA #* ( ⺦ → 丬 ) CJK RADICAL SIMPLIFIED HALF TREE TRUNK → CJK UNIFIED IDEOGRAPH-4E2C # + +2F59 ; 723F ; MA #* ( ⽙ → 爿 ) KANGXI RADICAL HALF TREE TRUNK → CJK UNIFIED IDEOGRAPH-723F # + +2F5A ; 7247 ; MA #* ( ⽚ → 片 ) KANGXI RADICAL SLICE → CJK UNIFIED IDEOGRAPH-7247 # + +2F922 ; 7250 ; MA # ( 牐 → 牐 ) CJK COMPATIBILITY IDEOGRAPH-2F922 → CJK UNIFIED IDEOGRAPH-7250 # + +2F5B ; 7259 ; MA #* ( ⽛ → 牙 ) KANGXI RADICAL FANG → CJK UNIFIED IDEOGRAPH-7259 # + +2F923 ; 24608 ; MA # ( 𤘈 → 𤘈 ) CJK COMPATIBILITY IDEOGRAPH-2F923 → CJK UNIFIED IDEOGRAPH-24608 # + +2F5C ; 725B ; MA #* ( ⽜ → 牛 ) KANGXI RADICAL COW → CJK UNIFIED IDEOGRAPH-725B # + +F946 ; 7262 ; MA # ( 牢 → 牢 ) CJK COMPATIBILITY IDEOGRAPH-F946 → CJK UNIFIED IDEOGRAPH-7262 # + +2F924 ; 7280 ; MA # ( 犀 → 犀 ) CJK COMPATIBILITY IDEOGRAPH-2F924 → CJK UNIFIED IDEOGRAPH-7280 # + +2F925 ; 7295 ; MA # ( 犕 → 犕 ) CJK COMPATIBILITY IDEOGRAPH-2F925 → CJK UNIFIED IDEOGRAPH-7295 # + +2F5D ; 72AC ; MA #* ( ⽝ → 犬 ) KANGXI RADICAL DOG → CJK UNIFIED IDEOGRAPH-72AC # + +2EA8 ; 72AD ; MA #* ( ⺨ → 犭 ) CJK RADICAL DOG → CJK UNIFIED IDEOGRAPH-72AD # + +FA9F ; 72AF ; MA # ( 犯 → 犯 ) CJK COMPATIBILITY IDEOGRAPH-FA9F → CJK UNIFIED IDEOGRAPH-72AF # + +F9FA ; 72C0 ; MA # ( 狀 → 狀 ) CJK COMPATIBILITY IDEOGRAPH-F9FA → CJK UNIFIED IDEOGRAPH-72C0 # + +2F926 ; 24735 ; MA # ( 𤜵 → 𤜵 ) CJK COMPATIBILITY IDEOGRAPH-2F926 → CJK UNIFIED IDEOGRAPH-24735 # + +F92B ; 72FC ; MA # ( 狼 → 狼 ) CJK COMPATIBILITY IDEOGRAPH-F92B → CJK UNIFIED IDEOGRAPH-72FC # + +FA16 ; 732A ; MA # ( 猪 → 猪 ) CJK COMPATIBILITY IDEOGRAPH-FA16 → CJK UNIFIED IDEOGRAPH-732A # +FAA0 ; 732A ; MA # ( 猪 → 猪 ) CJK COMPATIBILITY IDEOGRAPH-FAA0 → CJK UNIFIED IDEOGRAPH-732A # + +2F927 ; 24814 ; MA # ( 𤠔 → 𤠔 ) CJK COMPATIBILITY IDEOGRAPH-2F927 → CJK UNIFIED IDEOGRAPH-24814 # + +F9A7 ; 7375 ; MA # ( 獵 → 獵 ) CJK COMPATIBILITY IDEOGRAPH-F9A7 → CJK UNIFIED IDEOGRAPH-7375 # + +2F928 ; 737A ; MA # ( 獺 → 獺 ) CJK COMPATIBILITY IDEOGRAPH-2F928 → CJK UNIFIED IDEOGRAPH-737A # + +2F5E ; 7384 ; MA #* ( ⽞ → 玄 ) KANGXI RADICAL PROFOUND → CJK UNIFIED IDEOGRAPH-7384 # + +F961 ; 7387 ; MA # ( 率 → 率 ) CJK COMPATIBILITY IDEOGRAPH-F961 → CJK UNIFIED IDEOGRAPH-7387 # +F9DB ; 7387 ; MA # ( 率 → 率 ) CJK COMPATIBILITY IDEOGRAPH-F9DB → CJK UNIFIED IDEOGRAPH-7387 # + +2F5F ; 7389 ; MA #* ( ⽟ → 玉 ) KANGXI RADICAL JADE → CJK UNIFIED IDEOGRAPH-7389 # + +2F929 ; 738B ; MA # ( 王 → 王 ) CJK COMPATIBILITY IDEOGRAPH-2F929 → CJK UNIFIED IDEOGRAPH-738B # + +2F92A ; 3EAC ; MA # ( 㺬 → 㺬 ) CJK COMPATIBILITY IDEOGRAPH-2F92A → CJK UNIFIED IDEOGRAPH-3EAC # + +2F92B ; 73A5 ; MA # ( 玥 → 玥 ) CJK COMPATIBILITY IDEOGRAPH-2F92B → CJK UNIFIED IDEOGRAPH-73A5 # + +F9AD ; 73B2 ; MA # ( 玲 → 玲 ) CJK COMPATIBILITY IDEOGRAPH-F9AD → CJK UNIFIED IDEOGRAPH-73B2 # + +2F92C ; 3EB8 ; MA # ( 㺸 → 㺸 ) CJK COMPATIBILITY IDEOGRAPH-2F92C → CJK UNIFIED IDEOGRAPH-3EB8 # +2F92D ; 3EB8 ; MA # ( 㺸 → 㺸 ) CJK COMPATIBILITY IDEOGRAPH-2F92D → CJK UNIFIED IDEOGRAPH-3EB8 # + +F917 ; 73DE ; MA # ( 珞 → 珞 ) CJK COMPATIBILITY IDEOGRAPH-F917 → CJK UNIFIED IDEOGRAPH-73DE # + +F9CC ; 7409 ; MA # ( 琉 → 琉 ) CJK COMPATIBILITY IDEOGRAPH-F9CC → CJK UNIFIED IDEOGRAPH-7409 # + +F9E4 ; 7406 ; MA # ( 理 → 理 ) CJK COMPATIBILITY IDEOGRAPH-F9E4 → CJK UNIFIED IDEOGRAPH-7406 # + +FA4A ; 7422 ; MA # ( 琢 → 琢 ) CJK COMPATIBILITY IDEOGRAPH-FA4A → CJK UNIFIED IDEOGRAPH-7422 # + +2F92E ; 7447 ; MA # ( 瑇 → 瑇 ) CJK COMPATIBILITY IDEOGRAPH-2F92E → CJK UNIFIED IDEOGRAPH-7447 # + +2F92F ; 745C ; MA # ( 瑜 → 瑜 ) CJK COMPATIBILITY IDEOGRAPH-2F92F → CJK UNIFIED IDEOGRAPH-745C # + +F9AE ; 7469 ; MA # ( 瑩 → 瑩 ) CJK COMPATIBILITY IDEOGRAPH-F9AE → CJK UNIFIED IDEOGRAPH-7469 # + +FAA1 ; 7471 ; MA # ( 瑱 → 瑱 ) CJK COMPATIBILITY IDEOGRAPH-FAA1 → CJK UNIFIED IDEOGRAPH-7471 # +2F930 ; 7471 ; MA # ( 瑱 → 瑱 ) CJK COMPATIBILITY IDEOGRAPH-2F930 → CJK UNIFIED IDEOGRAPH-7471 # + +2F931 ; 7485 ; MA # ( 璅 → 璅 ) CJK COMPATIBILITY IDEOGRAPH-2F931 → CJK UNIFIED IDEOGRAPH-7485 # + +F994 ; 7489 ; MA # ( 璉 → 璉 ) CJK COMPATIBILITY IDEOGRAPH-F994 → CJK UNIFIED IDEOGRAPH-7489 # + +F9EF ; 7498 ; MA # ( 璘 → 璘 ) CJK COMPATIBILITY IDEOGRAPH-F9EF → CJK UNIFIED IDEOGRAPH-7498 # + +2F932 ; 74CA ; MA # ( 瓊 → 瓊 ) CJK COMPATIBILITY IDEOGRAPH-2F932 → CJK UNIFIED IDEOGRAPH-74CA # + +2F60 ; 74DC ; MA #* ( ⽠ → 瓜 ) KANGXI RADICAL MELON → CJK UNIFIED IDEOGRAPH-74DC # + +2F61 ; 74E6 ; MA #* ( ⽡ → 瓦 ) KANGXI RADICAL TILE → CJK UNIFIED IDEOGRAPH-74E6 # + +2F933 ; 3F1B ; MA # ( 㼛 → 㼛 ) CJK COMPATIBILITY IDEOGRAPH-2F933 → CJK UNIFIED IDEOGRAPH-3F1B # + +FAA2 ; 7506 ; MA # ( 甆 → 甆 ) CJK COMPATIBILITY IDEOGRAPH-FAA2 → CJK UNIFIED IDEOGRAPH-7506 # + +2F62 ; 7518 ; MA #* ( ⽢ → 甘 ) KANGXI RADICAL SWEET → CJK UNIFIED IDEOGRAPH-7518 # + +2F63 ; 751F ; MA #* ( ⽣ → 生 ) KANGXI RADICAL LIFE → CJK UNIFIED IDEOGRAPH-751F # + +2F934 ; 7524 ; MA # ( 甤 → 甤 ) CJK COMPATIBILITY IDEOGRAPH-2F934 → CJK UNIFIED IDEOGRAPH-7524 # + +2F64 ; 7528 ; MA #* ( ⽤ → 用 ) KANGXI RADICAL USE → CJK UNIFIED IDEOGRAPH-7528 # + +2F65 ; 7530 ; MA #* ( ⽥ → 田 ) KANGXI RADICAL FIELD → CJK UNIFIED IDEOGRAPH-7530 # + +FAA3 ; 753B ; MA # ( 画 → 画 ) CJK COMPATIBILITY IDEOGRAPH-FAA3 → CJK UNIFIED IDEOGRAPH-753B # + +2F936 ; 753E ; MA # ( 甾 → 甾 ) CJK COMPATIBILITY IDEOGRAPH-2F936 → CJK UNIFIED IDEOGRAPH-753E # + +2F935 ; 24C36 ; MA # ( 𤰶 → 𤰶 ) CJK COMPATIBILITY IDEOGRAPH-2F935 → CJK UNIFIED IDEOGRAPH-24C36 # + +F9CD ; 7559 ; MA # ( 留 → 留 ) CJK COMPATIBILITY IDEOGRAPH-F9CD → CJK UNIFIED IDEOGRAPH-7559 # + +F976 ; 7565 ; MA # ( 略 → 略 ) CJK COMPATIBILITY IDEOGRAPH-F976 → CJK UNIFIED IDEOGRAPH-7565 # + +F962 ; 7570 ; MA # ( 異 → 異 ) CJK COMPATIBILITY IDEOGRAPH-F962 → CJK UNIFIED IDEOGRAPH-7570 # +2F938 ; 7570 ; MA # ( 異 → 異 ) CJK COMPATIBILITY IDEOGRAPH-2F938 → CJK UNIFIED IDEOGRAPH-7570 # + +2F937 ; 24C92 ; MA # ( 𤲒 → 𤲒 ) CJK COMPATIBILITY IDEOGRAPH-2F937 → CJK UNIFIED IDEOGRAPH-24C92 # + +2F66 ; 758B ; MA #* ( ⽦ → 疋 ) KANGXI RADICAL BOLT OF CLOTH → CJK UNIFIED IDEOGRAPH-758B # + +2F67 ; 7592 ; MA #* ( ⽧ → 疒 ) KANGXI RADICAL SICKNESS → CJK UNIFIED IDEOGRAPH-7592 # + +F9E5 ; 75E2 ; MA # ( 痢 → 痢 ) CJK COMPATIBILITY IDEOGRAPH-F9E5 → CJK UNIFIED IDEOGRAPH-75E2 # + +2F93A ; 7610 ; MA # ( 瘐 → 瘐 ) CJK COMPATIBILITY IDEOGRAPH-2F93A → CJK UNIFIED IDEOGRAPH-7610 # + +FAA5 ; 761F ; MA # ( 瘟 → 瘟 ) CJK COMPATIBILITY IDEOGRAPH-FAA5 → CJK UNIFIED IDEOGRAPH-761F # + +FAA4 ; 761D ; MA # ( 瘝 → 瘝 ) CJK COMPATIBILITY IDEOGRAPH-FAA4 → CJK UNIFIED IDEOGRAPH-761D # + +F9C1 ; 7642 ; MA # ( 療 → 療 ) CJK COMPATIBILITY IDEOGRAPH-F9C1 → CJK UNIFIED IDEOGRAPH-7642 # + +F90E ; 7669 ; MA # ( 癩 → 癩 ) CJK COMPATIBILITY IDEOGRAPH-F90E → CJK UNIFIED IDEOGRAPH-7669 # + +2F68 ; 7676 ; MA #* ( ⽨ → 癶 ) KANGXI RADICAL DOTTED TENT → CJK UNIFIED IDEOGRAPH-7676 # + +2F69 ; 767D ; MA #* ( ⽩ → 白 ) KANGXI RADICAL WHITE → CJK UNIFIED IDEOGRAPH-767D # + +2F93B ; 24FA1 ; MA # ( 𤾡 → 𤾡 ) CJK COMPATIBILITY IDEOGRAPH-2F93B → CJK UNIFIED IDEOGRAPH-24FA1 # + +2F93C ; 24FB8 ; MA # ( 𤾸 → 𤾸 ) CJK COMPATIBILITY IDEOGRAPH-2F93C → CJK UNIFIED IDEOGRAPH-24FB8 # + +2F6A ; 76AE ; MA #* ( ⽪ → 皮 ) KANGXI RADICAL SKIN → CJK UNIFIED IDEOGRAPH-76AE # + +2F6B ; 76BF ; MA #* ( ⽫ → 皿 ) KANGXI RADICAL DISH → CJK UNIFIED IDEOGRAPH-76BF # + +2F93D ; 25044 ; MA # ( 𥁄 → 𥁄 ) CJK COMPATIBILITY IDEOGRAPH-2F93D → CJK UNIFIED IDEOGRAPH-25044 # + +2F93E ; 3FFC ; MA # ( 㿼 → 㿼 ) CJK COMPATIBILITY IDEOGRAPH-2F93E → CJK UNIFIED IDEOGRAPH-3FFC # + +FA17 ; 76CA ; MA # ( 益 → 益 ) CJK COMPATIBILITY IDEOGRAPH-FA17 → CJK UNIFIED IDEOGRAPH-76CA # +FAA6 ; 76CA ; MA # ( 益 → 益 ) CJK COMPATIBILITY IDEOGRAPH-FAA6 → CJK UNIFIED IDEOGRAPH-76CA # + +FAA7 ; 76DB ; MA # ( 盛 → 盛 ) CJK COMPATIBILITY IDEOGRAPH-FAA7 → CJK UNIFIED IDEOGRAPH-76DB # + +F933 ; 76E7 ; MA # ( 盧 → 盧 ) CJK COMPATIBILITY IDEOGRAPH-F933 → CJK UNIFIED IDEOGRAPH-76E7 # + +2F93F ; 4008 ; MA # ( 䀈 → 䀈 ) CJK COMPATIBILITY IDEOGRAPH-2F93F → CJK UNIFIED IDEOGRAPH-4008 # + +2F6C ; 76EE ; MA #* ( ⽬ → 目 ) KANGXI RADICAL EYE → CJK UNIFIED IDEOGRAPH-76EE # + +FAA8 ; 76F4 ; MA # ( 直 → 直 ) CJK COMPATIBILITY IDEOGRAPH-FAA8 → CJK UNIFIED IDEOGRAPH-76F4 # +2F940 ; 76F4 ; MA # ( 直 → 直 ) CJK COMPATIBILITY IDEOGRAPH-2F940 → CJK UNIFIED IDEOGRAPH-76F4 # + +2F942 ; 250F2 ; MA # ( 𥃲 → 𥃲 ) CJK COMPATIBILITY IDEOGRAPH-2F942 → CJK UNIFIED IDEOGRAPH-250F2 # + +2F941 ; 250F3 ; MA # ( 𥃳 → 𥃳 ) CJK COMPATIBILITY IDEOGRAPH-2F941 → CJK UNIFIED IDEOGRAPH-250F3 # + +F96D ; 7701 ; MA # ( 省 → 省 ) CJK COMPATIBILITY IDEOGRAPH-F96D → CJK UNIFIED IDEOGRAPH-7701 # + +FAD3 ; 4018 ; MA # ( 䀘 → 䀘 ) CJK COMPATIBILITY IDEOGRAPH-FAD3 → CJK UNIFIED IDEOGRAPH-4018 # + +2F943 ; 25119 ; MA # ( 𥄙 → 𥄙 ) CJK COMPATIBILITY IDEOGRAPH-2F943 → CJK UNIFIED IDEOGRAPH-25119 # + +2F945 ; 771E ; MA # ( 眞 → 眞 ) CJK COMPATIBILITY IDEOGRAPH-2F945 → CJK UNIFIED IDEOGRAPH-771E # + +2F946 ; 771F ; MA # ( 真 → 真 ) CJK COMPATIBILITY IDEOGRAPH-2F946 → CJK UNIFIED IDEOGRAPH-771F # +2F947 ; 771F ; MA # ( 真 → 真 ) CJK COMPATIBILITY IDEOGRAPH-2F947 → CJK UNIFIED IDEOGRAPH-771F # + +2F944 ; 25133 ; MA # ( 𥄳 → 𥄳 ) CJK COMPATIBILITY IDEOGRAPH-2F944 → CJK UNIFIED IDEOGRAPH-25133 # + +FAAA ; 7740 ; MA # ( 着 → 着 ) CJK COMPATIBILITY IDEOGRAPH-FAAA → CJK UNIFIED IDEOGRAPH-7740 # + +FAA9 ; 774A ; MA # ( 睊 → 睊 ) CJK COMPATIBILITY IDEOGRAPH-FAA9 → CJK UNIFIED IDEOGRAPH-774A # +2F948 ; 774A ; MA # ( 睊 → 睊 ) CJK COMPATIBILITY IDEOGRAPH-2F948 → CJK UNIFIED IDEOGRAPH-774A # + +9FC3 ; 4039 ; MA # ( 鿃 → 䀹 ) CJK UNIFIED IDEOGRAPH-9FC3 → CJK UNIFIED IDEOGRAPH-4039 # →䀹→ +FAD4 ; 4039 ; MA # ( 䀹 → 䀹 ) CJK COMPATIBILITY IDEOGRAPH-FAD4 → CJK UNIFIED IDEOGRAPH-4039 # +2F949 ; 4039 ; MA # ( 䀹 → 䀹 ) CJK COMPATIBILITY IDEOGRAPH-2F949 → CJK UNIFIED IDEOGRAPH-4039 # + +6663 ; 403F ; MA # ( 晣 → 䀿 ) CJK UNIFIED IDEOGRAPH-6663 → CJK UNIFIED IDEOGRAPH-403F # + +2F94B ; 4046 ; MA # ( 䁆 → 䁆 ) CJK COMPATIBILITY IDEOGRAPH-2F94B → CJK UNIFIED IDEOGRAPH-4046 # + +2F94A ; 778B ; MA # ( 瞋 → 瞋 ) CJK COMPATIBILITY IDEOGRAPH-2F94A → CJK UNIFIED IDEOGRAPH-778B # + +FAD5 ; 25249 ; MA # ( 𥉉 → 𥉉 ) CJK COMPATIBILITY IDEOGRAPH-FAD5 → CJK UNIFIED IDEOGRAPH-25249 # + +FA9D ; 77A7 ; MA # ( 瞧 → 瞧 ) CJK COMPATIBILITY IDEOGRAPH-FA9D → CJK UNIFIED IDEOGRAPH-77A7 # + +2F6D ; 77DB ; MA #* ( ⽭ → 矛 ) KANGXI RADICAL SPEAR → CJK UNIFIED IDEOGRAPH-77DB # + +2F6E ; 77E2 ; MA #* ( ⽮ → 矢 ) KANGXI RADICAL ARROW → CJK UNIFIED IDEOGRAPH-77E2 # + +2F6F ; 77F3 ; MA #* ( ⽯ → 石 ) KANGXI RADICAL STONE → CJK UNIFIED IDEOGRAPH-77F3 # + +2F94C ; 4096 ; MA # ( 䂖 → 䂖 ) CJK COMPATIBILITY IDEOGRAPH-2F94C → CJK UNIFIED IDEOGRAPH-4096 # + +2F94D ; 2541D ; MA # ( 𥐝 → 𥐝 ) CJK COMPATIBILITY IDEOGRAPH-2F94D → CJK UNIFIED IDEOGRAPH-2541D # + +784F ; 7814 ; MA # ( 硏 → 研 ) CJK UNIFIED IDEOGRAPH-784F → CJK UNIFIED IDEOGRAPH-7814 # + +2F94E ; 784E ; MA # ( 硎 → 硎 ) CJK COMPATIBILITY IDEOGRAPH-2F94E → CJK UNIFIED IDEOGRAPH-784E # + +F9CE ; 786B ; MA # ( 硫 → 硫 ) CJK COMPATIBILITY IDEOGRAPH-F9CE → CJK UNIFIED IDEOGRAPH-786B # + +F93B ; 788C ; MA # ( 碌 → 碌 ) CJK COMPATIBILITY IDEOGRAPH-F93B → CJK UNIFIED IDEOGRAPH-788C # +2F94F ; 788C ; MA # ( 碌 → 碌 ) CJK COMPATIBILITY IDEOGRAPH-2F94F → CJK UNIFIED IDEOGRAPH-788C # + +FA4B ; 7891 ; MA # ( 碑 → 碑 ) CJK COMPATIBILITY IDEOGRAPH-FA4B → CJK UNIFIED IDEOGRAPH-7891 # + +F947 ; 78CA ; MA # ( 磊 → 磊 ) CJK COMPATIBILITY IDEOGRAPH-F947 → CJK UNIFIED IDEOGRAPH-78CA # + +FAAB ; 78CC ; MA # ( 磌 → 磌 ) CJK COMPATIBILITY IDEOGRAPH-FAAB → CJK UNIFIED IDEOGRAPH-78CC # +2F950 ; 78CC ; MA # ( 磌 → 磌 ) CJK COMPATIBILITY IDEOGRAPH-2F950 → CJK UNIFIED IDEOGRAPH-78CC # + +F964 ; 78FB ; MA # ( 磻 → 磻 ) CJK COMPATIBILITY IDEOGRAPH-F964 → CJK UNIFIED IDEOGRAPH-78FB # + +2F951 ; 40E3 ; MA # ( 䃣 → 䃣 ) CJK COMPATIBILITY IDEOGRAPH-2F951 → CJK UNIFIED IDEOGRAPH-40E3 # + +F985 ; 792A ; MA # ( 礪 → 礪 ) CJK COMPATIBILITY IDEOGRAPH-F985 → CJK UNIFIED IDEOGRAPH-792A # + +2F70 ; 793A ; MA #* ( ⽰ → 示 ) KANGXI RADICAL SPIRIT → CJK UNIFIED IDEOGRAPH-793A # + +2EAD ; 793B ; MA #* ( ⺭ → 礻 ) CJK RADICAL SPIRIT TWO → CJK UNIFIED IDEOGRAPH-793B # + +FA18 ; 793C ; MA # ( 礼 → 礼 ) CJK COMPATIBILITY IDEOGRAPH-FA18 → CJK UNIFIED IDEOGRAPH-793C # + +FA4C ; 793E ; MA # ( 社 → 社 ) CJK COMPATIBILITY IDEOGRAPH-FA4C → CJK UNIFIED IDEOGRAPH-793E # + +FA4E ; 7948 ; MA # ( 祈 → 祈 ) CJK COMPATIBILITY IDEOGRAPH-FA4E → CJK UNIFIED IDEOGRAPH-7948 # + +FA4D ; 7949 ; MA # ( 祉 → 祉 ) CJK COMPATIBILITY IDEOGRAPH-FA4D → CJK UNIFIED IDEOGRAPH-7949 # + +2F952 ; 25626 ; MA # ( 𥘦 → 𥘦 ) CJK COMPATIBILITY IDEOGRAPH-2F952 → CJK UNIFIED IDEOGRAPH-25626 # + +FA4F ; 7950 ; MA # ( 祐 → 祐 ) CJK COMPATIBILITY IDEOGRAPH-FA4F → CJK UNIFIED IDEOGRAPH-7950 # + +FA50 ; 7956 ; MA # ( 祖 → 祖 ) CJK COMPATIBILITY IDEOGRAPH-FA50 → CJK UNIFIED IDEOGRAPH-7956 # +2F953 ; 7956 ; MA # ( 祖 → 祖 ) CJK COMPATIBILITY IDEOGRAPH-2F953 → CJK UNIFIED IDEOGRAPH-7956 # + +FA51 ; 795D ; MA # ( 祝 → 祝 ) CJK COMPATIBILITY IDEOGRAPH-FA51 → CJK UNIFIED IDEOGRAPH-795D # + +FA19 ; 795E ; MA # ( 神 → 神 ) CJK COMPATIBILITY IDEOGRAPH-FA19 → CJK UNIFIED IDEOGRAPH-795E # + +FA1A ; 7965 ; MA # ( 祥 → 祥 ) CJK COMPATIBILITY IDEOGRAPH-FA1A → CJK UNIFIED IDEOGRAPH-7965 # + +FA61 ; 8996 ; MA # ( 視 → 視 ) CJK COMPATIBILITY IDEOGRAPH-FA61 → CJK UNIFIED IDEOGRAPH-8996 # +FAB8 ; 8996 ; MA # ( 視 → 視 ) CJK COMPATIBILITY IDEOGRAPH-FAB8 → CJK UNIFIED IDEOGRAPH-8996 # + +F93C ; 797F ; MA # ( 祿 → 祿 ) CJK COMPATIBILITY IDEOGRAPH-F93C → CJK UNIFIED IDEOGRAPH-797F # + +2F954 ; 2569A ; MA # ( 𥚚 → 𥚚 ) CJK COMPATIBILITY IDEOGRAPH-2F954 → CJK UNIFIED IDEOGRAPH-2569A # + +FA52 ; 798D ; MA # ( 禍 → 禍 ) CJK COMPATIBILITY IDEOGRAPH-FA52 → CJK UNIFIED IDEOGRAPH-798D # + +FA53 ; 798E ; MA # ( 禎 → 禎 ) CJK COMPATIBILITY IDEOGRAPH-FA53 → CJK UNIFIED IDEOGRAPH-798E # + +FA1B ; 798F ; MA # ( 福 → 福 ) CJK COMPATIBILITY IDEOGRAPH-FA1B → CJK UNIFIED IDEOGRAPH-798F # +2F956 ; 798F ; MA # ( 福 → 福 ) CJK COMPATIBILITY IDEOGRAPH-2F956 → CJK UNIFIED IDEOGRAPH-798F # + +2F955 ; 256C5 ; MA # ( 𥛅 → 𥛅 ) CJK COMPATIBILITY IDEOGRAPH-2F955 → CJK UNIFIED IDEOGRAPH-256C5 # + +F9B6 ; 79AE ; MA # ( 禮 → 禮 ) CJK COMPATIBILITY IDEOGRAPH-F9B6 → CJK UNIFIED IDEOGRAPH-79AE # + +2F71 ; 79B8 ; MA #* ( ⽱ → 禸 ) KANGXI RADICAL TRACK → CJK UNIFIED IDEOGRAPH-79B8 # + +2F72 ; 79BE ; MA #* ( ⽲ → 禾 ) KANGXI RADICAL GRAIN → CJK UNIFIED IDEOGRAPH-79BE # + +F995 ; 79CA ; MA # ( 秊 → 秊 ) CJK COMPATIBILITY IDEOGRAPH-F995 → CJK UNIFIED IDEOGRAPH-79CA # + +2F958 ; 412F ; MA # ( 䄯 → 䄯 ) CJK COMPATIBILITY IDEOGRAPH-2F958 → CJK UNIFIED IDEOGRAPH-412F # + +2F957 ; 79EB ; MA # ( 秫 → 秫 ) CJK COMPATIBILITY IDEOGRAPH-2F957 → CJK UNIFIED IDEOGRAPH-79EB # + +F956 ; 7A1C ; MA # ( 稜 → 稜 ) CJK COMPATIBILITY IDEOGRAPH-F956 → CJK UNIFIED IDEOGRAPH-7A1C # + +2F95A ; 7A4A ; MA # ( 穊 → 穊 ) CJK COMPATIBILITY IDEOGRAPH-2F95A → CJK UNIFIED IDEOGRAPH-7A4A # + +FA54 ; 7A40 ; MA # ( 穀 → 穀 ) CJK COMPATIBILITY IDEOGRAPH-FA54 → CJK UNIFIED IDEOGRAPH-7A40 # +2F959 ; 7A40 ; MA # ( 穀 → 穀 ) CJK COMPATIBILITY IDEOGRAPH-2F959 → CJK UNIFIED IDEOGRAPH-7A40 # + +2F95B ; 7A4F ; MA # ( 穏 → 穏 ) CJK COMPATIBILITY IDEOGRAPH-2F95B → CJK UNIFIED IDEOGRAPH-7A4F # + +2F73 ; 7A74 ; MA #* ( ⽳ → 穴 ) KANGXI RADICAL CAVE → CJK UNIFIED IDEOGRAPH-7A74 # + +FA55 ; 7A81 ; MA # ( 突 → 突 ) CJK COMPATIBILITY IDEOGRAPH-FA55 → CJK UNIFIED IDEOGRAPH-7A81 # + +2F95C ; 2597C ; MA # ( 𥥼 → 𥥼 ) CJK COMPATIBILITY IDEOGRAPH-2F95C → CJK UNIFIED IDEOGRAPH-2597C # + +FAAC ; 7AB1 ; MA # ( 窱 → 窱 ) CJK COMPATIBILITY IDEOGRAPH-FAAC → CJK UNIFIED IDEOGRAPH-7AB1 # + +F9F7 ; 7ACB ; MA # ( 立 → 立 ) CJK COMPATIBILITY IDEOGRAPH-F9F7 → CJK UNIFIED IDEOGRAPH-7ACB # +2F74 ; 7ACB ; MA #* ( ⽴ → 立 ) KANGXI RADICAL STAND → CJK UNIFIED IDEOGRAPH-7ACB # + +2EEF ; 7ADC ; MA #* ( ⻯ → 竜 ) CJK RADICAL J-SIMPLIFIED DRAGON → CJK UNIFIED IDEOGRAPH-7ADC # + +2F95D ; 25AA7 ; MA # ( 𥪧 → 𥪧 ) CJK COMPATIBILITY IDEOGRAPH-2F95D → CJK UNIFIED IDEOGRAPH-25AA7 # +2F95E ; 25AA7 ; MA # ( 𥪧 → 𥪧 ) CJK COMPATIBILITY IDEOGRAPH-2F95E → CJK UNIFIED IDEOGRAPH-25AA7 # + +2F95F ; 7AEE ; MA # ( 竮 → 竮 ) CJK COMPATIBILITY IDEOGRAPH-2F95F → CJK UNIFIED IDEOGRAPH-7AEE # + +2F75 ; 7AF9 ; MA #* ( ⽵ → 竹 ) KANGXI RADICAL BAMBOO → CJK UNIFIED IDEOGRAPH-7AF9 # + +F9F8 ; 7B20 ; MA # ( 笠 → 笠 ) CJK COMPATIBILITY IDEOGRAPH-F9F8 → CJK UNIFIED IDEOGRAPH-7B20 # + +FA56 ; 7BC0 ; MA # ( 節 → 節 ) CJK COMPATIBILITY IDEOGRAPH-FA56 → CJK UNIFIED IDEOGRAPH-7BC0 # +FAAD ; 7BC0 ; MA # ( 節 → 節 ) CJK COMPATIBILITY IDEOGRAPH-FAAD → CJK UNIFIED IDEOGRAPH-7BC0 # + +2F960 ; 4202 ; MA # ( 䈂 → 䈂 ) CJK COMPATIBILITY IDEOGRAPH-2F960 → CJK UNIFIED IDEOGRAPH-4202 # + +2F961 ; 25BAB ; MA # ( 𥮫 → 𥮫 ) CJK COMPATIBILITY IDEOGRAPH-2F961 → CJK UNIFIED IDEOGRAPH-25BAB # + +2F962 ; 7BC6 ; MA # ( 篆 → 篆 ) CJK COMPATIBILITY IDEOGRAPH-2F962 → CJK UNIFIED IDEOGRAPH-7BC6 # + +2F964 ; 4227 ; MA # ( 䈧 → 䈧 ) CJK COMPATIBILITY IDEOGRAPH-2F964 → CJK UNIFIED IDEOGRAPH-4227 # + +2F963 ; 7BC9 ; MA # ( 築 → 築 ) CJK COMPATIBILITY IDEOGRAPH-2F963 → CJK UNIFIED IDEOGRAPH-7BC9 # + +2F965 ; 25C80 ; MA # ( 𥲀 → 𥲀 ) CJK COMPATIBILITY IDEOGRAPH-2F965 → CJK UNIFIED IDEOGRAPH-25C80 # + +FAD6 ; 25CD0 ; MA # ( 𥳐 → 𥳐 ) CJK COMPATIBILITY IDEOGRAPH-FAD6 → CJK UNIFIED IDEOGRAPH-25CD0 # + +F9A6 ; 7C3E ; MA # ( 簾 → 簾 ) CJK COMPATIBILITY IDEOGRAPH-F9A6 → CJK UNIFIED IDEOGRAPH-7C3E # + +F944 ; 7C60 ; MA # ( 籠 → 籠 ) CJK COMPATIBILITY IDEOGRAPH-F944 → CJK UNIFIED IDEOGRAPH-7C60 # + +2F76 ; 7C73 ; MA #* ( ⽶ → 米 ) KANGXI RADICAL RICE → CJK UNIFIED IDEOGRAPH-7C73 # + +FAAE ; 7C7B ; MA # ( 类 → 类 ) CJK COMPATIBILITY IDEOGRAPH-FAAE → CJK UNIFIED IDEOGRAPH-7C7B # + +F9F9 ; 7C92 ; MA # ( 粒 → 粒 ) CJK COMPATIBILITY IDEOGRAPH-F9F9 → CJK UNIFIED IDEOGRAPH-7C92 # + +FA1D ; 7CBE ; MA # ( 精 → 精 ) CJK COMPATIBILITY IDEOGRAPH-FA1D → CJK UNIFIED IDEOGRAPH-7CBE # + +2F966 ; 7CD2 ; MA # ( 糒 → 糒 ) CJK COMPATIBILITY IDEOGRAPH-2F966 → CJK UNIFIED IDEOGRAPH-7CD2 # + +FA03 ; 7CD6 ; MA # ( 糖 → 糖 ) CJK COMPATIBILITY IDEOGRAPH-FA03 → CJK UNIFIED IDEOGRAPH-7CD6 # + +2F968 ; 7CE8 ; MA # ( 糨 → 糨 ) CJK COMPATIBILITY IDEOGRAPH-2F968 → CJK UNIFIED IDEOGRAPH-7CE8 # + +2F967 ; 42A0 ; MA # ( 䊠 → 䊠 ) CJK COMPATIBILITY IDEOGRAPH-2F967 → CJK UNIFIED IDEOGRAPH-42A0 # + +2F969 ; 7CE3 ; MA # ( 糣 → 糣 ) CJK COMPATIBILITY IDEOGRAPH-2F969 → CJK UNIFIED IDEOGRAPH-7CE3 # + +F97B ; 7CE7 ; MA # ( 糧 → 糧 ) CJK COMPATIBILITY IDEOGRAPH-F97B → CJK UNIFIED IDEOGRAPH-7CE7 # + +2F77 ; 7CF8 ; MA #* ( ⽷ → 糸 ) KANGXI RADICAL SILK → CJK UNIFIED IDEOGRAPH-7CF8 # + +2EAF ; 7CF9 ; MA #* ( ⺯ → 糹 ) CJK RADICAL SILK → CJK UNIFIED IDEOGRAPH-7CF9 # + +2F96B ; 25F86 ; MA # ( 𥾆 → 𥾆 ) CJK COMPATIBILITY IDEOGRAPH-2F96B → CJK UNIFIED IDEOGRAPH-25F86 # + +2F96A ; 7D00 ; MA # ( 紀 → 紀 ) CJK COMPATIBILITY IDEOGRAPH-2F96A → CJK UNIFIED IDEOGRAPH-7D00 # + +F9CF ; 7D10 ; MA # ( 紐 → 紐 ) CJK COMPATIBILITY IDEOGRAPH-F9CF → CJK UNIFIED IDEOGRAPH-7D10 # + +F96A ; 7D22 ; MA # ( 索 → 索 ) CJK COMPATIBILITY IDEOGRAPH-F96A → CJK UNIFIED IDEOGRAPH-7D22 # + +F94F ; 7D2F ; MA # ( 累 → 累 ) CJK COMPATIBILITY IDEOGRAPH-F94F → CJK UNIFIED IDEOGRAPH-7D2F # + +7D76 ; 7D55 ; MA # ( 絶 → 絕 ) CJK UNIFIED IDEOGRAPH-7D76 → CJK UNIFIED IDEOGRAPH-7D55 # + +2F96C ; 7D63 ; MA # ( 絣 → 絣 ) CJK COMPATIBILITY IDEOGRAPH-2F96C → CJK UNIFIED IDEOGRAPH-7D63 # + +FAAF ; 7D5B ; MA # ( 絛 → 絛 ) CJK COMPATIBILITY IDEOGRAPH-FAAF → CJK UNIFIED IDEOGRAPH-7D5B # + +F93D ; 7DA0 ; MA # ( 綠 → 綠 ) CJK COMPATIBILITY IDEOGRAPH-F93D → CJK UNIFIED IDEOGRAPH-7DA0 # + +F957 ; 7DBE ; MA # ( 綾 → 綾 ) CJK COMPATIBILITY IDEOGRAPH-F957 → CJK UNIFIED IDEOGRAPH-7DBE # + +2F96E ; 7DC7 ; MA # ( 緇 → 緇 ) CJK COMPATIBILITY IDEOGRAPH-2F96E → CJK UNIFIED IDEOGRAPH-7DC7 # + +F996 ; 7DF4 ; MA # ( 練 → 練 ) CJK COMPATIBILITY IDEOGRAPH-F996 → CJK UNIFIED IDEOGRAPH-7DF4 # +FA57 ; 7DF4 ; MA # ( 練 → 練 ) CJK COMPATIBILITY IDEOGRAPH-FA57 → CJK UNIFIED IDEOGRAPH-7DF4 # +FAB0 ; 7DF4 ; MA # ( 練 → 練 ) CJK COMPATIBILITY IDEOGRAPH-FAB0 → CJK UNIFIED IDEOGRAPH-7DF4 # + +2F96F ; 7E02 ; MA # ( 縂 → 縂 ) CJK COMPATIBILITY IDEOGRAPH-2F96F → CJK UNIFIED IDEOGRAPH-7E02 # + +2F96D ; 4301 ; MA # ( 䌁 → 䌁 ) CJK COMPATIBILITY IDEOGRAPH-2F96D → CJK UNIFIED IDEOGRAPH-4301 # + +FA58 ; 7E09 ; MA # ( 縉 → 縉 ) CJK COMPATIBILITY IDEOGRAPH-FA58 → CJK UNIFIED IDEOGRAPH-7E09 # + +F950 ; 7E37 ; MA # ( 縷 → 縷 ) CJK COMPATIBILITY IDEOGRAPH-F950 → CJK UNIFIED IDEOGRAPH-7E37 # + +FA59 ; 7E41 ; MA # ( 繁 → 繁 ) CJK COMPATIBILITY IDEOGRAPH-FA59 → CJK UNIFIED IDEOGRAPH-7E41 # + +2F970 ; 7E45 ; MA # ( 繅 → 繅 ) CJK COMPATIBILITY IDEOGRAPH-2F970 → CJK UNIFIED IDEOGRAPH-7E45 # + +2F898 ; 261DA ; MA # ( 𦇚 → 𦇚 ) CJK COMPATIBILITY IDEOGRAPH-2F898 → CJK UNIFIED IDEOGRAPH-261DA # + +2F971 ; 4334 ; MA # ( 䌴 → 䌴 ) CJK COMPATIBILITY IDEOGRAPH-2F971 → CJK UNIFIED IDEOGRAPH-4334 # + +2F78 ; 7F36 ; MA #* ( ⽸ → 缶 ) KANGXI RADICAL JAR → CJK UNIFIED IDEOGRAPH-7F36 # + +2F972 ; 26228 ; MA # ( 𦈨 → 𦈨 ) CJK COMPATIBILITY IDEOGRAPH-2F972 → CJK UNIFIED IDEOGRAPH-26228 # + +FAB1 ; 7F3E ; MA # ( 缾 → 缾 ) CJK COMPATIBILITY IDEOGRAPH-FAB1 → CJK UNIFIED IDEOGRAPH-7F3E # + +2F973 ; 26247 ; MA # ( 𦉇 → 𦉇 ) CJK COMPATIBILITY IDEOGRAPH-2F973 → CJK UNIFIED IDEOGRAPH-26247 # + +2F79 ; 7F51 ; MA #* ( ⽹ → 网 ) KANGXI RADICAL NET → CJK UNIFIED IDEOGRAPH-7F51 # + +2EAB ; 7F52 ; MA #* ( ⺫ → 罒 ) CJK RADICAL EYE → CJK UNIFIED IDEOGRAPH-7F52 # +2EB2 ; 7F52 ; MA #* ( ⺲ → 罒 ) CJK RADICAL NET TWO → CJK UNIFIED IDEOGRAPH-7F52 # + +2EB1 ; 7F53 ; MA #* ( ⺱ → 罓 ) CJK RADICAL NET ONE → CJK UNIFIED IDEOGRAPH-7F53 # + +2F974 ; 4359 ; MA # ( 䍙 → 䍙 ) CJK COMPATIBILITY IDEOGRAPH-2F974 → CJK UNIFIED IDEOGRAPH-4359 # + +FA5A ; 7F72 ; MA # ( 署 → 署 ) CJK COMPATIBILITY IDEOGRAPH-FA5A → CJK UNIFIED IDEOGRAPH-7F72 # + +2F975 ; 262D9 ; MA # ( 𦋙 → 𦋙 ) CJK COMPATIBILITY IDEOGRAPH-2F975 → CJK UNIFIED IDEOGRAPH-262D9 # + +F9E6 ; 7F79 ; MA # ( 罹 → 罹 ) CJK COMPATIBILITY IDEOGRAPH-F9E6 → CJK UNIFIED IDEOGRAPH-7F79 # + +2F976 ; 7F7A ; MA # ( 罺 → 罺 ) CJK COMPATIBILITY IDEOGRAPH-2F976 → CJK UNIFIED IDEOGRAPH-7F7A # + +F90F ; 7F85 ; MA # ( 羅 → 羅 ) CJK COMPATIBILITY IDEOGRAPH-F90F → CJK UNIFIED IDEOGRAPH-7F85 # + +2F977 ; 2633E ; MA # ( 𦌾 → 𦌾 ) CJK COMPATIBILITY IDEOGRAPH-2F977 → CJK UNIFIED IDEOGRAPH-2633E # + +2F7A ; 7F8A ; MA #* ( ⽺ → 羊 ) KANGXI RADICAL SHEEP → CJK UNIFIED IDEOGRAPH-7F8A # + +2F978 ; 7F95 ; MA # ( 羕 → 羕 ) CJK COMPATIBILITY IDEOGRAPH-2F978 → CJK UNIFIED IDEOGRAPH-7F95 # + +F9AF ; 7F9A ; MA # ( 羚 → 羚 ) CJK COMPATIBILITY IDEOGRAPH-F9AF → CJK UNIFIED IDEOGRAPH-7F9A # + +FA1E ; 7FBD ; MA # ( 羽 → 羽 ) CJK COMPATIBILITY IDEOGRAPH-FA1E → CJK UNIFIED IDEOGRAPH-7FBD # +2F7B ; 7FBD ; MA #* ( ⽻ → 羽 ) KANGXI RADICAL FEATHER → CJK UNIFIED IDEOGRAPH-7FBD # + +2F979 ; 7FFA ; MA # ( 翺 → 翺 ) CJK COMPATIBILITY IDEOGRAPH-2F979 → CJK UNIFIED IDEOGRAPH-7FFA # + +F934 ; 8001 ; MA # ( 老 → 老 ) CJK COMPATIBILITY IDEOGRAPH-F934 → CJK UNIFIED IDEOGRAPH-8001 # +2F7C ; 8001 ; MA #* ( ⽼ → 老 ) KANGXI RADICAL OLD → CJK UNIFIED IDEOGRAPH-8001 # + +2EB9 ; 8002 ; MA #* ( ⺹ → 耂 ) CJK RADICAL OLD → CJK UNIFIED IDEOGRAPH-8002 # + +FA5B ; 8005 ; MA # ( 者 → 者 ) CJK COMPATIBILITY IDEOGRAPH-FA5B → CJK UNIFIED IDEOGRAPH-8005 # +FAB2 ; 8005 ; MA # ( 者 → 者 ) CJK COMPATIBILITY IDEOGRAPH-FAB2 → CJK UNIFIED IDEOGRAPH-8005 # +2F97A ; 8005 ; MA # ( 者 → 者 ) CJK COMPATIBILITY IDEOGRAPH-2F97A → CJK UNIFIED IDEOGRAPH-8005 # + +2F7D ; 800C ; MA #* ( ⽽ → 而 ) KANGXI RADICAL AND → CJK UNIFIED IDEOGRAPH-800C # + +2F97B ; 264DA ; MA # ( 𦓚 → 𦓚 ) CJK COMPATIBILITY IDEOGRAPH-2F97B → CJK UNIFIED IDEOGRAPH-264DA # + +2F7E ; 8012 ; MA #* ( ⽾ → 耒 ) KANGXI RADICAL PLOW → CJK UNIFIED IDEOGRAPH-8012 # + +2F97C ; 26523 ; MA # ( 𦔣 → 𦔣 ) CJK COMPATIBILITY IDEOGRAPH-2F97C → CJK UNIFIED IDEOGRAPH-26523 # + +2F7F ; 8033 ; MA #* ( ⽿ → 耳 ) KANGXI RADICAL EAR → CJK UNIFIED IDEOGRAPH-8033 # + +F9B0 ; 8046 ; MA # ( 聆 → 聆 ) CJK COMPATIBILITY IDEOGRAPH-F9B0 → CJK UNIFIED IDEOGRAPH-8046 # + +2F97D ; 8060 ; MA # ( 聠 → 聠 ) CJK COMPATIBILITY IDEOGRAPH-2F97D → CJK UNIFIED IDEOGRAPH-8060 # + +2F97E ; 265A8 ; MA # ( 𦖨 → 𦖨 ) CJK COMPATIBILITY IDEOGRAPH-2F97E → CJK UNIFIED IDEOGRAPH-265A8 # + +F997 ; 806F ; MA # ( 聯 → 聯 ) CJK COMPATIBILITY IDEOGRAPH-F997 → CJK UNIFIED IDEOGRAPH-806F # + +2F97F ; 8070 ; MA # ( 聰 → 聰 ) CJK COMPATIBILITY IDEOGRAPH-2F97F → CJK UNIFIED IDEOGRAPH-8070 # + +F945 ; 807E ; MA # ( 聾 → 聾 ) CJK COMPATIBILITY IDEOGRAPH-F945 → CJK UNIFIED IDEOGRAPH-807E # + +2F80 ; 807F ; MA #* ( ⾀ → 聿 ) KANGXI RADICAL BRUSH → CJK UNIFIED IDEOGRAPH-807F # + +2EBA ; 8080 ; MA #* ( ⺺ → 肀 ) CJK RADICAL BRUSH ONE → CJK UNIFIED IDEOGRAPH-8080 # + +2F81 ; 8089 ; MA #* ( ⾁ → 肉 ) KANGXI RADICAL MEAT → CJK UNIFIED IDEOGRAPH-8089 # + +F953 ; 808B ; MA # ( 肋 → 肋 ) CJK COMPATIBILITY IDEOGRAPH-F953 → CJK UNIFIED IDEOGRAPH-808B # + +2F8D6 ; 80AD ; MA # ( 肭 → 肭 ) CJK COMPATIBILITY IDEOGRAPH-2F8D6 → CJK UNIFIED IDEOGRAPH-80AD # + +2F982 ; 80B2 ; MA # ( 育 → 育 ) CJK COMPATIBILITY IDEOGRAPH-2F982 → CJK UNIFIED IDEOGRAPH-80B2 # + +2F981 ; 43D5 ; MA # ( 䏕 → 䏕 ) CJK COMPATIBILITY IDEOGRAPH-2F981 → CJK UNIFIED IDEOGRAPH-43D5 # + +2F8D7 ; 43D9 ; MA # ( 䏙 → 䏙 ) CJK COMPATIBILITY IDEOGRAPH-2F8D7 → CJK UNIFIED IDEOGRAPH-43D9 # + +8141 ; 80FC ; MA # ( 腁 → 胼 ) CJK UNIFIED IDEOGRAPH-8141 → CJK UNIFIED IDEOGRAPH-80FC # + +2F983 ; 8103 ; MA # ( 脃 → 脃 ) CJK COMPATIBILITY IDEOGRAPH-2F983 → CJK UNIFIED IDEOGRAPH-8103 # + +2F985 ; 813E ; MA # ( 脾 → 脾 ) CJK COMPATIBILITY IDEOGRAPH-2F985 → CJK UNIFIED IDEOGRAPH-813E # + +2F984 ; 440B ; MA # ( 䐋 → 䐋 ) CJK COMPATIBILITY IDEOGRAPH-2F984 → CJK UNIFIED IDEOGRAPH-440B # + +2F987 ; 267A7 ; MA # ( 𦞧 → 𦞧 ) CJK COMPATIBILITY IDEOGRAPH-2F987 → CJK UNIFIED IDEOGRAPH-267A7 # + +2F988 ; 267B5 ; MA # ( 𦞵 → 𦞵 ) CJK COMPATIBILITY IDEOGRAPH-2F988 → CJK UNIFIED IDEOGRAPH-267B5 # + +6726 ; 4443 ; MA # ( 朦 → 䑃 ) CJK UNIFIED IDEOGRAPH-6726 → CJK UNIFIED IDEOGRAPH-4443 # + +F926 ; 81D8 ; MA # ( 臘 → 臘 ) CJK COMPATIBILITY IDEOGRAPH-F926 → CJK UNIFIED IDEOGRAPH-81D8 # + +2F82 ; 81E3 ; MA #* ( ⾂ → 臣 ) KANGXI RADICAL MINISTER → CJK UNIFIED IDEOGRAPH-81E3 # + +F9F6 ; 81E8 ; MA # ( 臨 → 臨 ) CJK COMPATIBILITY IDEOGRAPH-F9F6 → CJK UNIFIED IDEOGRAPH-81E8 # + +2F83 ; 81EA ; MA #* ( ⾃ → 自 ) KANGXI RADICAL SELF → CJK UNIFIED IDEOGRAPH-81EA # + +FA5C ; 81ED ; MA # ( 臭 → 臭 ) CJK COMPATIBILITY IDEOGRAPH-FA5C → CJK UNIFIED IDEOGRAPH-81ED # + +2F84 ; 81F3 ; MA #* ( ⾄ → 至 ) KANGXI RADICAL ARRIVE → CJK UNIFIED IDEOGRAPH-81F3 # + +2F85 ; 81FC ; MA #* ( ⾅ → 臼 ) KANGXI RADICAL MORTAR → CJK UNIFIED IDEOGRAPH-81FC # + +2F893 ; 8201 ; MA # ( 舁 → 舁 ) CJK COMPATIBILITY IDEOGRAPH-2F893 → CJK UNIFIED IDEOGRAPH-8201 # +2F98B ; 8201 ; MA # ( 舁 → 舁 ) CJK COMPATIBILITY IDEOGRAPH-2F98B → CJK UNIFIED IDEOGRAPH-8201 # + +2F98C ; 8204 ; MA # ( 舄 → 舄 ) CJK COMPATIBILITY IDEOGRAPH-2F98C → CJK UNIFIED IDEOGRAPH-8204 # + +2F86 ; 820C ; MA #* ( ⾆ → 舌 ) KANGXI RADICAL TONGUE → CJK UNIFIED IDEOGRAPH-820C # + +FA6D ; 8218 ; MA # ( 舘 → 舘 ) CJK COMPATIBILITY IDEOGRAPH-FA6D → CJK UNIFIED IDEOGRAPH-8218 # + +2F87 ; 821B ; MA #* ( ⾇ → 舛 ) KANGXI RADICAL OPPOSE → CJK UNIFIED IDEOGRAPH-821B # + +2F88 ; 821F ; MA #* ( ⾈ → 舟 ) KANGXI RADICAL BOAT → CJK UNIFIED IDEOGRAPH-821F # + +2F98E ; 446B ; MA # ( 䑫 → 䑫 ) CJK COMPATIBILITY IDEOGRAPH-2F98E → CJK UNIFIED IDEOGRAPH-446B # + +2F89 ; 826E ; MA #* ( ⾉ → 艮 ) KANGXI RADICAL STOPPING → CJK UNIFIED IDEOGRAPH-826E # + +F97C ; 826F ; MA # ( 良 → 良 ) CJK COMPATIBILITY IDEOGRAPH-F97C → CJK UNIFIED IDEOGRAPH-826F # + +2F8A ; 8272 ; MA #* ( ⾊ → 色 ) KANGXI RADICAL COLOR → CJK UNIFIED IDEOGRAPH-8272 # + +2F8B ; 8278 ; MA #* ( ⾋ → 艸 ) KANGXI RADICAL GRASS → CJK UNIFIED IDEOGRAPH-8278 # + +FA5D ; 8279 ; MA # ( 艹 → 艹 ) CJK COMPATIBILITY IDEOGRAPH-FA5D → CJK UNIFIED IDEOGRAPH-8279 # +FA5E ; 8279 ; MA # ( 艹 → 艹 ) CJK COMPATIBILITY IDEOGRAPH-FA5E → CJK UNIFIED IDEOGRAPH-8279 # +2EBE ; 8279 ; MA #* ( ⺾ → 艹 ) CJK RADICAL GRASS ONE → CJK UNIFIED IDEOGRAPH-8279 # +2EBF ; 8279 ; MA #* ( ⺿ → 艹 ) CJK RADICAL GRASS TWO → CJK UNIFIED IDEOGRAPH-8279 # →艹→ +2EC0 ; 8279 ; MA #* ( ⻀ → 艹 ) CJK RADICAL GRASS THREE → CJK UNIFIED IDEOGRAPH-8279 # →艹→ + +2F990 ; 828B ; MA # ( 芋 → 芋 ) CJK COMPATIBILITY IDEOGRAPH-2F990 → CJK UNIFIED IDEOGRAPH-828B # + +2F98F ; 8291 ; MA # ( 芑 → 芑 ) CJK COMPATIBILITY IDEOGRAPH-2F98F → CJK UNIFIED IDEOGRAPH-8291 # + +2F991 ; 829D ; MA # ( 芝 → 芝 ) CJK COMPATIBILITY IDEOGRAPH-2F991 → CJK UNIFIED IDEOGRAPH-829D # + +2F993 ; 82B1 ; MA # ( 花 → 花 ) CJK COMPATIBILITY IDEOGRAPH-2F993 → CJK UNIFIED IDEOGRAPH-82B1 # + +2F994 ; 82B3 ; MA # ( 芳 → 芳 ) CJK COMPATIBILITY IDEOGRAPH-2F994 → CJK UNIFIED IDEOGRAPH-82B3 # + +2F995 ; 82BD ; MA # ( 芽 → 芽 ) CJK COMPATIBILITY IDEOGRAPH-2F995 → CJK UNIFIED IDEOGRAPH-82BD # + +F974 ; 82E5 ; MA # ( 若 → 若 ) CJK COMPATIBILITY IDEOGRAPH-F974 → CJK UNIFIED IDEOGRAPH-82E5 # +2F998 ; 82E5 ; MA # ( 若 → 若 ) CJK COMPATIBILITY IDEOGRAPH-2F998 → CJK UNIFIED IDEOGRAPH-82E5 # + +2F996 ; 82E6 ; MA # ( 苦 → 苦 ) CJK COMPATIBILITY IDEOGRAPH-2F996 → CJK UNIFIED IDEOGRAPH-82E6 # + +2F997 ; 26B3C ; MA # ( 𦬼 → 𦬼 ) CJK COMPATIBILITY IDEOGRAPH-2F997 → CJK UNIFIED IDEOGRAPH-26B3C # + +F9FE ; 8336 ; MA # ( 茶 → 茶 ) CJK COMPATIBILITY IDEOGRAPH-F9FE → CJK UNIFIED IDEOGRAPH-8336 # + +FAB3 ; 8352 ; MA # ( 荒 → 荒 ) CJK COMPATIBILITY IDEOGRAPH-FAB3 → CJK UNIFIED IDEOGRAPH-8352 # + +2F99A ; 8363 ; MA # ( 荣 → 荣 ) CJK COMPATIBILITY IDEOGRAPH-2F99A → CJK UNIFIED IDEOGRAPH-8363 # + +2F999 ; 831D ; MA # ( 茝 → 茝 ) CJK COMPATIBILITY IDEOGRAPH-2F999 → CJK UNIFIED IDEOGRAPH-831D # + +2F99C ; 8323 ; MA # ( 茣 → 茣 ) CJK COMPATIBILITY IDEOGRAPH-2F99C → CJK UNIFIED IDEOGRAPH-8323 # + +2F99D ; 83BD ; MA # ( 莽 → 莽 ) CJK COMPATIBILITY IDEOGRAPH-2F99D → CJK UNIFIED IDEOGRAPH-83BD # + +2F9A0 ; 8353 ; MA # ( 荓 → 荓 ) CJK COMPATIBILITY IDEOGRAPH-2F9A0 → CJK UNIFIED IDEOGRAPH-8353 # + +F93E ; 83C9 ; MA # ( 菉 → 菉 ) CJK COMPATIBILITY IDEOGRAPH-F93E → CJK UNIFIED IDEOGRAPH-83C9 # + +2F9A1 ; 83CA ; MA # ( 菊 → 菊 ) CJK COMPATIBILITY IDEOGRAPH-2F9A1 → CJK UNIFIED IDEOGRAPH-83CA # + +2F9A2 ; 83CC ; MA # ( 菌 → 菌 ) CJK COMPATIBILITY IDEOGRAPH-2F9A2 → CJK UNIFIED IDEOGRAPH-83CC # + +2F9A3 ; 83DC ; MA # ( 菜 → 菜 ) CJK COMPATIBILITY IDEOGRAPH-2F9A3 → CJK UNIFIED IDEOGRAPH-83DC # + +2F99E ; 83E7 ; MA # ( 菧 → 菧 ) CJK COMPATIBILITY IDEOGRAPH-2F99E → CJK UNIFIED IDEOGRAPH-83E7 # + +FAB4 ; 83EF ; MA # ( 華 → 華 ) CJK COMPATIBILITY IDEOGRAPH-FAB4 → CJK UNIFIED IDEOGRAPH-83EF # + +F958 ; 83F1 ; MA # ( 菱 → 菱 ) CJK COMPATIBILITY IDEOGRAPH-F958 → CJK UNIFIED IDEOGRAPH-83F1 # + +FA5F ; 8457 ; MA # ( 著 → 著 ) CJK COMPATIBILITY IDEOGRAPH-FA5F → CJK UNIFIED IDEOGRAPH-8457 # +2F99F ; 8457 ; MA # ( 著 → 著 ) CJK COMPATIBILITY IDEOGRAPH-2F99F → CJK UNIFIED IDEOGRAPH-8457 # + +2F9A4 ; 26C36 ; MA # ( 𦰶 → 𦰶 ) CJK COMPATIBILITY IDEOGRAPH-2F9A4 → CJK UNIFIED IDEOGRAPH-26C36 # + +2F99B ; 83AD ; MA # ( 莭 → 莭 ) CJK COMPATIBILITY IDEOGRAPH-2F99B → CJK UNIFIED IDEOGRAPH-83AD # + +F918 ; 843D ; MA # ( 落 → 落 ) CJK COMPATIBILITY IDEOGRAPH-F918 → CJK UNIFIED IDEOGRAPH-843D # + +F96E ; 8449 ; MA # ( 葉 → 葉 ) CJK COMPATIBILITY IDEOGRAPH-F96E → CJK UNIFIED IDEOGRAPH-8449 # + +853F ; 848D ; MA # ( 蔿 → 蒍 ) CJK UNIFIED IDEOGRAPH-853F → CJK UNIFIED IDEOGRAPH-848D # + +2F9A6 ; 26CD5 ; MA # ( 𦳕 → 𦳕 ) CJK COMPATIBILITY IDEOGRAPH-2F9A6 → CJK UNIFIED IDEOGRAPH-26CD5 # + +2F9A5 ; 26D6B ; MA # ( 𦵫 → 𦵫 ) CJK COMPATIBILITY IDEOGRAPH-2F9A5 → CJK UNIFIED IDEOGRAPH-26D6B # + +F999 ; 84EE ; MA # ( 蓮 → 蓮 ) CJK COMPATIBILITY IDEOGRAPH-F999 → CJK UNIFIED IDEOGRAPH-84EE # + +2F9A8 ; 84F1 ; MA # ( 蓱 → 蓱 ) CJK COMPATIBILITY IDEOGRAPH-2F9A8 → CJK UNIFIED IDEOGRAPH-84F1 # + +2F9A9 ; 84F3 ; MA # ( 蓳 → 蓳 ) CJK COMPATIBILITY IDEOGRAPH-2F9A9 → CJK UNIFIED IDEOGRAPH-84F3 # + +F9C2 ; 84FC ; MA # ( 蓼 → 蓼 ) CJK COMPATIBILITY IDEOGRAPH-F9C2 → CJK UNIFIED IDEOGRAPH-84FC # + +2F9AA ; 8516 ; MA # ( 蔖 → 蔖 ) CJK COMPATIBILITY IDEOGRAPH-2F9AA → CJK UNIFIED IDEOGRAPH-8516 # + +2F9A7 ; 452B ; MA # ( 䔫 → 䔫 ) CJK COMPATIBILITY IDEOGRAPH-2F9A7 → CJK UNIFIED IDEOGRAPH-452B # + +2F9AC ; 8564 ; MA # ( 蕤 → 蕤 ) CJK COMPATIBILITY IDEOGRAPH-2F9AC → CJK UNIFIED IDEOGRAPH-8564 # + +2F9AD ; 26F2C ; MA # ( 𦼬 → 𦼬 ) CJK COMPATIBILITY IDEOGRAPH-2F9AD → CJK UNIFIED IDEOGRAPH-26F2C # + +F923 ; 85CD ; MA # ( 藍 → 藍 ) CJK COMPATIBILITY IDEOGRAPH-F923 → CJK UNIFIED IDEOGRAPH-85CD # + +2F9AE ; 455D ; MA # ( 䕝 → 䕝 ) CJK COMPATIBILITY IDEOGRAPH-2F9AE → CJK UNIFIED IDEOGRAPH-455D # + +2F9B0 ; 26FB1 ; MA # ( 𦾱 → 𦾱 ) CJK COMPATIBILITY IDEOGRAPH-2F9B0 → CJK UNIFIED IDEOGRAPH-26FB1 # + +2F9AF ; 4561 ; MA # ( 䕡 → 䕡 ) CJK COMPATIBILITY IDEOGRAPH-2F9AF → CJK UNIFIED IDEOGRAPH-4561 # + +F9F0 ; 85FA ; MA # ( 藺 → 藺 ) CJK COMPATIBILITY IDEOGRAPH-F9F0 → CJK UNIFIED IDEOGRAPH-85FA # + +F935 ; 8606 ; MA # ( 蘆 → 蘆 ) CJK COMPATIBILITY IDEOGRAPH-F935 → CJK UNIFIED IDEOGRAPH-8606 # + +2F9B2 ; 456B ; MA # ( 䕫 → 䕫 ) CJK COMPATIBILITY IDEOGRAPH-2F9B2 → CJK UNIFIED IDEOGRAPH-456B # + +FA20 ; 8612 ; MA # ( 蘒 → 蘒 ) CJK COMPATIBILITY IDEOGRAPH-FA20 → CJK UNIFIED IDEOGRAPH-8612 # + +F91F ; 862D ; MA # ( 蘭 → 蘭 ) CJK COMPATIBILITY IDEOGRAPH-F91F → CJK UNIFIED IDEOGRAPH-862D # + +2F9B1 ; 270D2 ; MA # ( 𧃒 → 𧃒 ) CJK COMPATIBILITY IDEOGRAPH-2F9B1 → CJK UNIFIED IDEOGRAPH-270D2 # + +8641 ; 8637 ; MA # ( 虁 → 蘷 ) CJK UNIFIED IDEOGRAPH-8641 → CJK UNIFIED IDEOGRAPH-8637 # + +F910 ; 863F ; MA # ( 蘿 → 蘿 ) CJK COMPATIBILITY IDEOGRAPH-F910 → CJK UNIFIED IDEOGRAPH-863F # + +2F8C ; 864D ; MA #* ( ⾌ → 虍 ) KANGXI RADICAL TIGER → CJK UNIFIED IDEOGRAPH-864D # + +2EC1 ; 864E ; MA #* ( ⻁ → 虎 ) CJK RADICAL TIGER → CJK UNIFIED IDEOGRAPH-864E # + +2F9B3 ; 8650 ; MA # ( 虐 → 虐 ) CJK COMPATIBILITY IDEOGRAPH-2F9B3 → CJK UNIFIED IDEOGRAPH-8650 # + +F936 ; 865C ; MA # ( 虜 → 虜 ) CJK COMPATIBILITY IDEOGRAPH-F936 → CJK UNIFIED IDEOGRAPH-865C # +2F9B4 ; 865C ; MA # ( 虜 → 虜 ) CJK COMPATIBILITY IDEOGRAPH-2F9B4 → CJK UNIFIED IDEOGRAPH-865C # + +2F9B5 ; 8667 ; MA # ( 虧 → 虧 ) CJK COMPATIBILITY IDEOGRAPH-2F9B5 → CJK UNIFIED IDEOGRAPH-8667 # + +2F9B6 ; 8669 ; MA # ( 虩 → 虩 ) CJK COMPATIBILITY IDEOGRAPH-2F9B6 → CJK UNIFIED IDEOGRAPH-8669 # + +2F8D ; 866B ; MA #* ( ⾍ → 虫 ) KANGXI RADICAL INSECT → CJK UNIFIED IDEOGRAPH-866B # + +2F9B7 ; 86A9 ; MA # ( 蚩 → 蚩 ) CJK COMPATIBILITY IDEOGRAPH-2F9B7 → CJK UNIFIED IDEOGRAPH-86A9 # + +2F9B8 ; 8688 ; MA # ( 蚈 → 蚈 ) CJK COMPATIBILITY IDEOGRAPH-2F9B8 → CJK UNIFIED IDEOGRAPH-8688 # + +2F9BA ; 86E2 ; MA # ( 蛢 → 蛢 ) CJK COMPATIBILITY IDEOGRAPH-2F9BA → CJK UNIFIED IDEOGRAPH-86E2 # + +2F9B9 ; 870E ; MA # ( 蜎 → 蜎 ) CJK COMPATIBILITY IDEOGRAPH-2F9B9 → CJK UNIFIED IDEOGRAPH-870E # + +2F9BC ; 8728 ; MA # ( 蜨 → 蜨 ) CJK COMPATIBILITY IDEOGRAPH-2F9BC → CJK UNIFIED IDEOGRAPH-8728 # + +2F9BD ; 876B ; MA # ( 蝫 → 蝫 ) CJK COMPATIBILITY IDEOGRAPH-2F9BD → CJK UNIFIED IDEOGRAPH-876B # + +2F9C0 ; 87E1 ; MA # ( 蟡 → 蟡 ) CJK COMPATIBILITY IDEOGRAPH-2F9C0 → CJK UNIFIED IDEOGRAPH-87E1 # + +FAB5 ; 8779 ; MA # ( 蝹 → 蝹 ) CJK COMPATIBILITY IDEOGRAPH-FAB5 → CJK UNIFIED IDEOGRAPH-8779 # +2F9BB ; 8779 ; MA # ( 蝹 → 蝹 ) CJK COMPATIBILITY IDEOGRAPH-2F9BB → CJK UNIFIED IDEOGRAPH-8779 # + +2F9BE ; 8786 ; MA # ( 螆 → 螆 ) CJK COMPATIBILITY IDEOGRAPH-2F9BE → CJK UNIFIED IDEOGRAPH-8786 # + +2F9BF ; 45D7 ; MA # ( 䗗 → 䗗 ) CJK COMPATIBILITY IDEOGRAPH-2F9BF → CJK UNIFIED IDEOGRAPH-45D7 # + +2F9AB ; 273CA ; MA # ( 𧏊 → 𧏊 ) CJK COMPATIBILITY IDEOGRAPH-2F9AB → CJK UNIFIED IDEOGRAPH-273CA # + +F911 ; 87BA ; MA # ( 螺 → 螺 ) CJK COMPATIBILITY IDEOGRAPH-F911 → CJK UNIFIED IDEOGRAPH-87BA # + +2F9C1 ; 8801 ; MA # ( 蠁 → 蠁 ) CJK COMPATIBILITY IDEOGRAPH-2F9C1 → CJK UNIFIED IDEOGRAPH-8801 # + +2F9C2 ; 45F9 ; MA # ( 䗹 → 䗹 ) CJK COMPATIBILITY IDEOGRAPH-2F9C2 → CJK UNIFIED IDEOGRAPH-45F9 # + +F927 ; 881F ; MA # ( 蠟 → 蠟 ) CJK COMPATIBILITY IDEOGRAPH-F927 → CJK UNIFIED IDEOGRAPH-881F # + +2F8E ; 8840 ; MA #* ( ⾎ → 血 ) KANGXI RADICAL BLOOD → CJK UNIFIED IDEOGRAPH-8840 # + +FA08 ; 884C ; MA # ( 行 → 行 ) CJK COMPATIBILITY IDEOGRAPH-FA08 → CJK UNIFIED IDEOGRAPH-884C # +2F8F ; 884C ; MA #* ( ⾏ → 行 ) KANGXI RADICAL WALK ENCLOSURE → CJK UNIFIED IDEOGRAPH-884C # + +2F9C3 ; 8860 ; MA # ( 衠 → 衠 ) CJK COMPATIBILITY IDEOGRAPH-2F9C3 → CJK UNIFIED IDEOGRAPH-8860 # + +2F9C4 ; 8863 ; MA # ( 衣 → 衣 ) CJK COMPATIBILITY IDEOGRAPH-2F9C4 → CJK UNIFIED IDEOGRAPH-8863 # +2F90 ; 8863 ; MA #* ( ⾐ → 衣 ) KANGXI RADICAL CLOTHES → CJK UNIFIED IDEOGRAPH-8863 # + +2EC2 ; 8864 ; MA #* ( ⻂ → 衤 ) CJK RADICAL CLOTHES → CJK UNIFIED IDEOGRAPH-8864 # + +F9A0 ; 88C2 ; MA # ( 裂 → 裂 ) CJK COMPATIBILITY IDEOGRAPH-F9A0 → CJK UNIFIED IDEOGRAPH-88C2 # + +2F9C5 ; 27667 ; MA # ( 𧙧 → 𧙧 ) CJK COMPATIBILITY IDEOGRAPH-2F9C5 → CJK UNIFIED IDEOGRAPH-27667 # + +F9E7 ; 88CF ; MA # ( 裏 → 裏 ) CJK COMPATIBILITY IDEOGRAPH-F9E7 → CJK UNIFIED IDEOGRAPH-88CF # + +2F9C6 ; 88D7 ; MA # ( 裗 → 裗 ) CJK COMPATIBILITY IDEOGRAPH-2F9C6 → CJK UNIFIED IDEOGRAPH-88D7 # + +2F9C7 ; 88DE ; MA # ( 裞 → 裞 ) CJK COMPATIBILITY IDEOGRAPH-2F9C7 → CJK UNIFIED IDEOGRAPH-88DE # + +F9E8 ; 88E1 ; MA # ( 裡 → 裡 ) CJK COMPATIBILITY IDEOGRAPH-F9E8 → CJK UNIFIED IDEOGRAPH-88E1 # + +F912 ; 88F8 ; MA # ( 裸 → 裸 ) CJK COMPATIBILITY IDEOGRAPH-F912 → CJK UNIFIED IDEOGRAPH-88F8 # + +2F9C9 ; 88FA ; MA # ( 裺 → 裺 ) CJK COMPATIBILITY IDEOGRAPH-2F9C9 → CJK UNIFIED IDEOGRAPH-88FA # + +2F9C8 ; 4635 ; MA # ( 䘵 → 䘵 ) CJK COMPATIBILITY IDEOGRAPH-2F9C8 → CJK UNIFIED IDEOGRAPH-4635 # + +FA60 ; 8910 ; MA # ( 褐 → 褐 ) CJK COMPATIBILITY IDEOGRAPH-FA60 → CJK UNIFIED IDEOGRAPH-8910 # + +FAB6 ; 8941 ; MA # ( 襁 → 襁 ) CJK COMPATIBILITY IDEOGRAPH-FAB6 → CJK UNIFIED IDEOGRAPH-8941 # + +F924 ; 8964 ; MA # ( 襤 → 襤 ) CJK COMPATIBILITY IDEOGRAPH-F924 → CJK UNIFIED IDEOGRAPH-8964 # + +2F91 ; 897E ; MA #* ( ⾑ → 襾 ) KANGXI RADICAL WEST → CJK UNIFIED IDEOGRAPH-897E # + +2EC4 ; 897F ; MA #* ( ⻄ → 西 ) CJK RADICAL WEST TWO → CJK UNIFIED IDEOGRAPH-897F # + +2EC3 ; 8980 ; MA #* ( ⻃ → 覀 ) CJK RADICAL WEST ONE → CJK UNIFIED IDEOGRAPH-8980 # + +FAB7 ; 8986 ; MA # ( 覆 → 覆 ) CJK COMPATIBILITY IDEOGRAPH-FAB7 → CJK UNIFIED IDEOGRAPH-8986 # + +FA0A ; 898B ; MA # ( 見 → 見 ) CJK COMPATIBILITY IDEOGRAPH-FA0A → CJK UNIFIED IDEOGRAPH-898B # +2F92 ; 898B ; MA #* ( ⾒ → 見 ) KANGXI RADICAL SEE → CJK UNIFIED IDEOGRAPH-898B # + +2F9CB ; 278AE ; MA # ( 𧢮 → 𧢮 ) CJK COMPATIBILITY IDEOGRAPH-2F9CB → CJK UNIFIED IDEOGRAPH-278AE # + +2EC5 ; 89C1 ; MA #* ( ⻅ → 见 ) CJK RADICAL C-SIMPLIFIED SEE → CJK UNIFIED IDEOGRAPH-89C1 # + +2F93 ; 89D2 ; MA #* ( ⾓ → 角 ) KANGXI RADICAL HORN → CJK UNIFIED IDEOGRAPH-89D2 # + +2F94 ; 8A00 ; MA #* ( ⾔ → 言 ) KANGXI RADICAL SPEECH → CJK UNIFIED IDEOGRAPH-8A00 # + +2F9CC ; 27966 ; MA # ( 𧥦 → 𧥦 ) CJK COMPATIBILITY IDEOGRAPH-2F9CC → CJK UNIFIED IDEOGRAPH-27966 # + +8A7D ; 8A2E ; MA # ( 詽 → 訮 ) CJK UNIFIED IDEOGRAPH-8A7D → CJK UNIFIED IDEOGRAPH-8A2E # + +8A1E ; 46B6 ; MA # ( 訞 → 䚶 ) CJK UNIFIED IDEOGRAPH-8A1E → CJK UNIFIED IDEOGRAPH-46B6 # + +2F9CD ; 46BE ; MA # ( 䚾 → 䚾 ) CJK COMPATIBILITY IDEOGRAPH-2F9CD → CJK UNIFIED IDEOGRAPH-46BE # + +2F9CE ; 46C7 ; MA # ( 䛇 → 䛇 ) CJK COMPATIBILITY IDEOGRAPH-2F9CE → CJK UNIFIED IDEOGRAPH-46C7 # + +2F9CF ; 8AA0 ; MA # ( 誠 → 誠 ) CJK COMPATIBILITY IDEOGRAPH-2F9CF → CJK UNIFIED IDEOGRAPH-8AA0 # + +F96F ; 8AAA ; MA # ( 說 → 說 ) CJK COMPATIBILITY IDEOGRAPH-F96F → CJK UNIFIED IDEOGRAPH-8AAA # +F9A1 ; 8AAA ; MA # ( 說 → 說 ) CJK COMPATIBILITY IDEOGRAPH-F9A1 → CJK UNIFIED IDEOGRAPH-8AAA # + +FAB9 ; 8ABF ; MA # ( 調 → 調 ) CJK COMPATIBILITY IDEOGRAPH-FAB9 → CJK UNIFIED IDEOGRAPH-8ABF # + +FABB ; 8ACB ; MA # ( 請 → 請 ) CJK COMPATIBILITY IDEOGRAPH-FABB → CJK UNIFIED IDEOGRAPH-8ACB # + +F97D ; 8AD2 ; MA # ( 諒 → 諒 ) CJK COMPATIBILITY IDEOGRAPH-F97D → CJK UNIFIED IDEOGRAPH-8AD2 # + +F941 ; 8AD6 ; MA # ( 論 → 論 ) CJK COMPATIBILITY IDEOGRAPH-F941 → CJK UNIFIED IDEOGRAPH-8AD6 # + +FABE ; 8AED ; MA # ( 諭 → 諭 ) CJK COMPATIBILITY IDEOGRAPH-FABE → CJK UNIFIED IDEOGRAPH-8AED # +2F9D0 ; 8AED ; MA # ( 諭 → 諭 ) CJK COMPATIBILITY IDEOGRAPH-2F9D0 → CJK UNIFIED IDEOGRAPH-8AED # + +FA22 ; 8AF8 ; MA # ( 諸 → 諸 ) CJK COMPATIBILITY IDEOGRAPH-FA22 → CJK UNIFIED IDEOGRAPH-8AF8 # +FABA ; 8AF8 ; MA # ( 諸 → 諸 ) CJK COMPATIBILITY IDEOGRAPH-FABA → CJK UNIFIED IDEOGRAPH-8AF8 # + +F95D ; 8AFE ; MA # ( 諾 → 諾 ) CJK COMPATIBILITY IDEOGRAPH-F95D → CJK UNIFIED IDEOGRAPH-8AFE # +FABD ; 8AFE ; MA # ( 諾 → 諾 ) CJK COMPATIBILITY IDEOGRAPH-FABD → CJK UNIFIED IDEOGRAPH-8AFE # + +FA62 ; 8B01 ; MA # ( 謁 → 謁 ) CJK COMPATIBILITY IDEOGRAPH-FA62 → CJK UNIFIED IDEOGRAPH-8B01 # +FABC ; 8B01 ; MA # ( 謁 → 謁 ) CJK COMPATIBILITY IDEOGRAPH-FABC → CJK UNIFIED IDEOGRAPH-8B01 # + +FA63 ; 8B39 ; MA # ( 謹 → 謹 ) CJK COMPATIBILITY IDEOGRAPH-FA63 → CJK UNIFIED IDEOGRAPH-8B39 # +FABF ; 8B39 ; MA # ( 謹 → 謹 ) CJK COMPATIBILITY IDEOGRAPH-FABF → CJK UNIFIED IDEOGRAPH-8B39 # + +F9FC ; 8B58 ; MA # ( 識 → 識 ) CJK COMPATIBILITY IDEOGRAPH-F9FC → CJK UNIFIED IDEOGRAPH-8B58 # + +F95A ; 8B80 ; MA # ( 讀 → 讀 ) CJK COMPATIBILITY IDEOGRAPH-F95A → CJK UNIFIED IDEOGRAPH-8B80 # + +8B8F ; 8B86 ; MA # ( 讏 → 讆 ) CJK UNIFIED IDEOGRAPH-8B8F → CJK UNIFIED IDEOGRAPH-8B86 # + +FAC0 ; 8B8A ; MA # ( 變 → 變 ) CJK COMPATIBILITY IDEOGRAPH-FAC0 → CJK UNIFIED IDEOGRAPH-8B8A # +2F9D1 ; 8B8A ; MA # ( 變 → 變 ) CJK COMPATIBILITY IDEOGRAPH-2F9D1 → CJK UNIFIED IDEOGRAPH-8B8A # + +2EC8 ; 8BA0 ; MA #* ( ⻈ → 讠 ) CJK RADICAL C-SIMPLIFIED SPEECH → CJK UNIFIED IDEOGRAPH-8BA0 # + +2F95 ; 8C37 ; MA #* ( ⾕ → 谷 ) KANGXI RADICAL VALLEY → CJK UNIFIED IDEOGRAPH-8C37 # + +2F96 ; 8C46 ; MA #* ( ⾖ → 豆 ) KANGXI RADICAL BEAN → CJK UNIFIED IDEOGRAPH-8C46 # + +F900 ; 8C48 ; MA # ( 豈 → 豈 ) CJK COMPATIBILITY IDEOGRAPH-F900 → CJK UNIFIED IDEOGRAPH-8C48 # + +2F9D2 ; 8C55 ; MA # ( 豕 → 豕 ) CJK COMPATIBILITY IDEOGRAPH-2F9D2 → CJK UNIFIED IDEOGRAPH-8C55 # +2F97 ; 8C55 ; MA #* ( ⾗ → 豕 ) KANGXI RADICAL PIG → CJK UNIFIED IDEOGRAPH-8C55 # + +8C63 ; 8C5C ; MA # ( 豣 → 豜 ) CJK UNIFIED IDEOGRAPH-8C63 → CJK UNIFIED IDEOGRAPH-8C5C # + +2F98 ; 8C78 ; MA #* ( ⾘ → 豸 ) KANGXI RADICAL BADGER → CJK UNIFIED IDEOGRAPH-8C78 # + +2F9D3 ; 27CA8 ; MA # ( 𧲨 → 𧲨 ) CJK COMPATIBILITY IDEOGRAPH-2F9D3 → CJK UNIFIED IDEOGRAPH-27CA8 # + +2F99 ; 8C9D ; MA #* ( ⾙ → 貝 ) KANGXI RADICAL SHELL → CJK UNIFIED IDEOGRAPH-8C9D # + +2F9D4 ; 8CAB ; MA # ( 貫 → 貫 ) CJK COMPATIBILITY IDEOGRAPH-2F9D4 → CJK UNIFIED IDEOGRAPH-8CAB # + +2F9D5 ; 8CC1 ; MA # ( 賁 → 賁 ) CJK COMPATIBILITY IDEOGRAPH-2F9D5 → CJK UNIFIED IDEOGRAPH-8CC1 # + +F948 ; 8CC2 ; MA # ( 賂 → 賂 ) CJK COMPATIBILITY IDEOGRAPH-F948 → CJK UNIFIED IDEOGRAPH-8CC2 # + +F903 ; 8CC8 ; MA # ( 賈 → 賈 ) CJK COMPATIBILITY IDEOGRAPH-F903 → CJK UNIFIED IDEOGRAPH-8CC8 # + +FA64 ; 8CD3 ; MA # ( 賓 → 賓 ) CJK COMPATIBILITY IDEOGRAPH-FA64 → CJK UNIFIED IDEOGRAPH-8CD3 # + +FA65 ; 8D08 ; MA # ( 贈 → 贈 ) CJK COMPATIBILITY IDEOGRAPH-FA65 → CJK UNIFIED IDEOGRAPH-8D08 # +FAC1 ; 8D08 ; MA # ( 贈 → 贈 ) CJK COMPATIBILITY IDEOGRAPH-FAC1 → CJK UNIFIED IDEOGRAPH-8D08 # + +2F9D6 ; 8D1B ; MA # ( 贛 → 贛 ) CJK COMPATIBILITY IDEOGRAPH-2F9D6 → CJK UNIFIED IDEOGRAPH-8D1B # + +2EC9 ; 8D1D ; MA #* ( ⻉ → 贝 ) CJK RADICAL C-SIMPLIFIED SHELL → CJK UNIFIED IDEOGRAPH-8D1D # + +2F9A ; 8D64 ; MA #* ( ⾚ → 赤 ) KANGXI RADICAL RED → CJK UNIFIED IDEOGRAPH-8D64 # + +2F9B ; 8D70 ; MA #* ( ⾛ → 走 ) KANGXI RADICAL RUN → CJK UNIFIED IDEOGRAPH-8D70 # + +2F9D7 ; 8D77 ; MA # ( 起 → 起 ) CJK COMPATIBILITY IDEOGRAPH-2F9D7 → CJK UNIFIED IDEOGRAPH-8D77 # + +8D86 ; 8D7F ; MA # ( 趆 → 赿 ) CJK UNIFIED IDEOGRAPH-8D86 → CJK UNIFIED IDEOGRAPH-8D7F # + +FAD7 ; 27ED3 ; MA # ( 𧻓 → 𧻓 ) CJK COMPATIBILITY IDEOGRAPH-FAD7 → CJK UNIFIED IDEOGRAPH-27ED3 # + +2F9D8 ; 27F2F ; MA # ( 𧼯 → 𧼯 ) CJK COMPATIBILITY IDEOGRAPH-2F9D8 → CJK UNIFIED IDEOGRAPH-27F2F # + +2F9C ; 8DB3 ; MA #* ( ⾜ → 足 ) KANGXI RADICAL FOOT → CJK UNIFIED IDEOGRAPH-8DB3 # + +2F9DA ; 8DCB ; MA # ( 跋 → 跋 ) CJK COMPATIBILITY IDEOGRAPH-2F9DA → CJK UNIFIED IDEOGRAPH-8DCB # + +2F9DB ; 8DBC ; MA # ( 趼 → 趼 ) CJK COMPATIBILITY IDEOGRAPH-2F9DB → CJK UNIFIED IDEOGRAPH-8DBC # + +8DFA ; 8DE5 ; MA # ( 跺 → 跥 ) CJK UNIFIED IDEOGRAPH-8DFA → CJK UNIFIED IDEOGRAPH-8DE5 # + +F937 ; 8DEF ; MA # ( 路 → 路 ) CJK COMPATIBILITY IDEOGRAPH-F937 → CJK UNIFIED IDEOGRAPH-8DEF # + +2F9DC ; 8DF0 ; MA # ( 跰 → 跰 ) CJK COMPATIBILITY IDEOGRAPH-2F9DC → CJK UNIFIED IDEOGRAPH-8DF0 # + +8E9B ; 8E97 ; MA # ( 躛 → 躗 ) CJK UNIFIED IDEOGRAPH-8E9B → CJK UNIFIED IDEOGRAPH-8E97 # + +2F9D ; 8EAB ; MA #* ( ⾝ → 身 ) KANGXI RADICAL BODY → CJK UNIFIED IDEOGRAPH-8EAB # + +F902 ; 8ECA ; MA # ( 車 → 車 ) CJK COMPATIBILITY IDEOGRAPH-F902 → CJK UNIFIED IDEOGRAPH-8ECA # +2F9E ; 8ECA ; MA #* ( ⾞ → 車 ) KANGXI RADICAL CART → CJK UNIFIED IDEOGRAPH-8ECA # + +2F9DE ; 8ED4 ; MA # ( 軔 → 軔 ) CJK COMPATIBILITY IDEOGRAPH-2F9DE → CJK UNIFIED IDEOGRAPH-8ED4 # + +8F27 ; 8EFF ; MA # ( 輧 → 軿 ) CJK UNIFIED IDEOGRAPH-8F27 → CJK UNIFIED IDEOGRAPH-8EFF # + +F998 ; 8F26 ; MA # ( 輦 → 輦 ) CJK COMPATIBILITY IDEOGRAPH-F998 → CJK UNIFIED IDEOGRAPH-8F26 # + +F9D7 ; 8F2A ; MA # ( 輪 → 輪 ) CJK COMPATIBILITY IDEOGRAPH-F9D7 → CJK UNIFIED IDEOGRAPH-8F2A # + +FAC2 ; 8F38 ; MA # ( 輸 → 輸 ) CJK COMPATIBILITY IDEOGRAPH-FAC2 → CJK UNIFIED IDEOGRAPH-8F38 # +2F9DF ; 8F38 ; MA # ( 輸 → 輸 ) CJK COMPATIBILITY IDEOGRAPH-2F9DF → CJK UNIFIED IDEOGRAPH-8F38 # + +FA07 ; 8F3B ; MA # ( 輻 → 輻 ) CJK COMPATIBILITY IDEOGRAPH-FA07 → CJK UNIFIED IDEOGRAPH-8F3B # + +F98D ; 8F62 ; MA # ( 轢 → 轢 ) CJK COMPATIBILITY IDEOGRAPH-F98D → CJK UNIFIED IDEOGRAPH-8F62 # + +2ECB ; 8F66 ; MA #* ( ⻋ → 车 ) CJK RADICAL C-SIMPLIFIED CART → CJK UNIFIED IDEOGRAPH-8F66 # + +2F9F ; 8F9B ; MA #* ( ⾟ → 辛 ) KANGXI RADICAL BITTER → CJK UNIFIED IDEOGRAPH-8F9B # + +2F98D ; 8F9E ; MA # ( 辞 → 辞 ) CJK COMPATIBILITY IDEOGRAPH-2F98D → CJK UNIFIED IDEOGRAPH-8F9E # + +F971 ; 8FB0 ; MA # ( 辰 → 辰 ) CJK COMPATIBILITY IDEOGRAPH-F971 → CJK UNIFIED IDEOGRAPH-8FB0 # +2FA0 ; 8FB0 ; MA #* ( ⾠ → 辰 ) KANGXI RADICAL MORNING → CJK UNIFIED IDEOGRAPH-8FB0 # + +2FA1 ; 8FB5 ; MA #* ( ⾡ → 辵 ) KANGXI RADICAL WALK → CJK UNIFIED IDEOGRAPH-8FB5 # + +FA66 ; 8FB6 ; MA # ( 辶 → 辶 ) CJK COMPATIBILITY IDEOGRAPH-FA66 → CJK UNIFIED IDEOGRAPH-8FB6 # +2ECC ; 8FB6 ; MA #* ( ⻌ → 辶 ) CJK RADICAL SIMPLIFIED WALK → CJK UNIFIED IDEOGRAPH-8FB6 # +2ECD ; 8FB6 ; MA #* ( ⻍ → 辶 ) CJK RADICAL WALK ONE → CJK UNIFIED IDEOGRAPH-8FB6 # + +2F881 ; 5DE1 ; MA # ( 巡 → 巡 ) CJK COMPATIBILITY IDEOGRAPH-2F881 → CJK UNIFIED IDEOGRAPH-5DE1 # + +F99A ; 9023 ; MA # ( 連 → 連 ) CJK COMPATIBILITY IDEOGRAPH-F99A → CJK UNIFIED IDEOGRAPH-9023 # + +FA25 ; 9038 ; MA # ( 逸 → 逸 ) CJK COMPATIBILITY IDEOGRAPH-FA25 → CJK UNIFIED IDEOGRAPH-9038 # +FA67 ; 9038 ; MA # ( 逸 → 逸 ) CJK COMPATIBILITY IDEOGRAPH-FA67 → CJK UNIFIED IDEOGRAPH-9038 # + +FAC3 ; 9072 ; MA # ( 遲 → 遲 ) CJK COMPATIBILITY IDEOGRAPH-FAC3 → CJK UNIFIED IDEOGRAPH-9072 # + +F9C3 ; 907C ; MA # ( 遼 → 遼 ) CJK COMPATIBILITY IDEOGRAPH-F9C3 → CJK UNIFIED IDEOGRAPH-907C # + +2F9E0 ; 285D2 ; MA # ( 𨗒 → 𨗒 ) CJK COMPATIBILITY IDEOGRAPH-2F9E0 → CJK UNIFIED IDEOGRAPH-285D2 # + +2F9E1 ; 285ED ; MA # ( 𨗭 → 𨗭 ) CJK COMPATIBILITY IDEOGRAPH-2F9E1 → CJK UNIFIED IDEOGRAPH-285ED # + +F913 ; 908F ; MA # ( 邏 → 邏 ) CJK COMPATIBILITY IDEOGRAPH-F913 → CJK UNIFIED IDEOGRAPH-908F # + +2FA2 ; 9091 ; MA #* ( ⾢ → 邑 ) KANGXI RADICAL CITY → CJK UNIFIED IDEOGRAPH-9091 # + +2F9E2 ; 9094 ; MA # ( 邔 → 邔 ) CJK COMPATIBILITY IDEOGRAPH-2F9E2 → CJK UNIFIED IDEOGRAPH-9094 # + +F92C ; 90CE ; MA # ( 郎 → 郎 ) CJK COMPATIBILITY IDEOGRAPH-F92C → CJK UNIFIED IDEOGRAPH-90CE # +90DE ; 90CE ; MA # ( 郞 → 郎 ) CJK UNIFIED IDEOGRAPH-90DE → CJK UNIFIED IDEOGRAPH-90CE # →郎→ +FA2E ; 90CE ; MA # ( 郞 → 郎 ) CJK COMPATIBILITY IDEOGRAPH-FA2E → CJK UNIFIED IDEOGRAPH-90CE # →郞→→郎→ + +2F9E3 ; 90F1 ; MA # ( 郱 → 郱 ) CJK COMPATIBILITY IDEOGRAPH-2F9E3 → CJK UNIFIED IDEOGRAPH-90F1 # + +FA26 ; 90FD ; MA # ( 都 → 都 ) CJK COMPATIBILITY IDEOGRAPH-FA26 → CJK UNIFIED IDEOGRAPH-90FD # + +2F9E5 ; 2872E ; MA # ( 𨜮 → 𨜮 ) CJK COMPATIBILITY IDEOGRAPH-2F9E5 → CJK UNIFIED IDEOGRAPH-2872E # + +2F9E4 ; 9111 ; MA # ( 鄑 → 鄑 ) CJK COMPATIBILITY IDEOGRAPH-2F9E4 → CJK UNIFIED IDEOGRAPH-9111 # + +2F9E6 ; 911B ; MA # ( 鄛 → 鄛 ) CJK COMPATIBILITY IDEOGRAPH-2F9E6 → CJK UNIFIED IDEOGRAPH-911B # + +2FA3 ; 9149 ; MA #* ( ⾣ → 酉 ) KANGXI RADICAL WINE → CJK UNIFIED IDEOGRAPH-9149 # + +F919 ; 916A ; MA # ( 酪 → 酪 ) CJK COMPATIBILITY IDEOGRAPH-F919 → CJK UNIFIED IDEOGRAPH-916A # + +FAC4 ; 9199 ; MA # ( 醙 → 醙 ) CJK COMPATIBILITY IDEOGRAPH-FAC4 → CJK UNIFIED IDEOGRAPH-9199 # + +F9B7 ; 91B4 ; MA # ( 醴 → 醴 ) CJK COMPATIBILITY IDEOGRAPH-F9B7 → CJK UNIFIED IDEOGRAPH-91B4 # + +2FA4 ; 91C6 ; MA #* ( ⾤ → 釆 ) KANGXI RADICAL DISTINGUISH → CJK UNIFIED IDEOGRAPH-91C6 # + +F9E9 ; 91CC ; MA # ( 里 → 里 ) CJK COMPATIBILITY IDEOGRAPH-F9E9 → CJK UNIFIED IDEOGRAPH-91CC # +2FA5 ; 91CC ; MA #* ( ⾥ → 里 ) KANGXI RADICAL VILLAGE → CJK UNIFIED IDEOGRAPH-91CC # + +F97E ; 91CF ; MA # ( 量 → 量 ) CJK COMPATIBILITY IDEOGRAPH-F97E → CJK UNIFIED IDEOGRAPH-91CF # + +F90A ; 91D1 ; MA # ( 金 → 金 ) CJK COMPATIBILITY IDEOGRAPH-F90A → CJK UNIFIED IDEOGRAPH-91D1 # +2FA6 ; 91D1 ; MA #* ( ⾦ → 金 ) KANGXI RADICAL GOLD → CJK UNIFIED IDEOGRAPH-91D1 # + +F9B1 ; 9234 ; MA # ( 鈴 → 鈴 ) CJK COMPATIBILITY IDEOGRAPH-F9B1 → CJK UNIFIED IDEOGRAPH-9234 # + +2F9E7 ; 9238 ; MA # ( 鈸 → 鈸 ) CJK COMPATIBILITY IDEOGRAPH-2F9E7 → CJK UNIFIED IDEOGRAPH-9238 # + +FAC5 ; 9276 ; MA # ( 鉶 → 鉶 ) CJK COMPATIBILITY IDEOGRAPH-FAC5 → CJK UNIFIED IDEOGRAPH-9276 # + +2F9E8 ; 92D7 ; MA # ( 鋗 → 鋗 ) CJK COMPATIBILITY IDEOGRAPH-2F9E8 → CJK UNIFIED IDEOGRAPH-92D7 # + +2F9E9 ; 92D8 ; MA # ( 鋘 → 鋘 ) CJK COMPATIBILITY IDEOGRAPH-2F9E9 → CJK UNIFIED IDEOGRAPH-92D8 # + +2F9EA ; 927C ; MA # ( 鉼 → 鉼 ) CJK COMPATIBILITY IDEOGRAPH-2F9EA → CJK UNIFIED IDEOGRAPH-927C # + +F93F ; 9304 ; MA # ( 錄 → 錄 ) CJK COMPATIBILITY IDEOGRAPH-F93F → CJK UNIFIED IDEOGRAPH-9304 # + +F99B ; 934A ; MA # ( 鍊 → 鍊 ) CJK COMPATIBILITY IDEOGRAPH-F99B → CJK UNIFIED IDEOGRAPH-934A # + +93AE ; 93AD ; MA # ( 鎮 → 鎭 ) CJK UNIFIED IDEOGRAPH-93AE → CJK UNIFIED IDEOGRAPH-93AD # + +2F9EB ; 93F9 ; MA # ( 鏹 → 鏹 ) CJK COMPATIBILITY IDEOGRAPH-2F9EB → CJK UNIFIED IDEOGRAPH-93F9 # + +2F9EC ; 9415 ; MA # ( 鐕 → 鐕 ) CJK COMPATIBILITY IDEOGRAPH-2F9EC → CJK UNIFIED IDEOGRAPH-9415 # + +2F9ED ; 28BFA ; MA # ( 𨯺 → 𨯺 ) CJK COMPATIBILITY IDEOGRAPH-2F9ED → CJK UNIFIED IDEOGRAPH-28BFA # + +2ED0 ; 9485 ; MA #* ( ⻐ → 钅 ) CJK RADICAL C-SIMPLIFIED GOLD → CJK UNIFIED IDEOGRAPH-9485 # + +2ED1 ; 9577 ; MA #* ( ⻑ → 長 ) CJK RADICAL LONG ONE → CJK UNIFIED IDEOGRAPH-9577 # +2FA7 ; 9577 ; MA #* ( ⾧ → 長 ) KANGXI RADICAL LONG → CJK UNIFIED IDEOGRAPH-9577 # + +2ED2 ; 9578 ; MA #* ( ⻒ → 镸 ) CJK RADICAL LONG TWO → CJK UNIFIED IDEOGRAPH-9578 # + +2ED3 ; 957F ; MA #* ( ⻓ → 长 ) CJK RADICAL C-SIMPLIFIED LONG → CJK UNIFIED IDEOGRAPH-957F # + +2FA8 ; 9580 ; MA #* ( ⾨ → 門 ) KANGXI RADICAL GATE → CJK UNIFIED IDEOGRAPH-9580 # + +2F9EE ; 958B ; MA # ( 開 → 開 ) CJK COMPATIBILITY IDEOGRAPH-2F9EE → CJK UNIFIED IDEOGRAPH-958B # + +2F9EF ; 4995 ; MA # ( 䦕 → 䦕 ) CJK COMPATIBILITY IDEOGRAPH-2F9EF → CJK UNIFIED IDEOGRAPH-4995 # + +F986 ; 95AD ; MA # ( 閭 → 閭 ) CJK COMPATIBILITY IDEOGRAPH-F986 → CJK UNIFIED IDEOGRAPH-95AD # + +2F9F0 ; 95B7 ; MA # ( 閷 → 閷 ) CJK COMPATIBILITY IDEOGRAPH-2F9F0 → CJK UNIFIED IDEOGRAPH-95B7 # + +2F9F1 ; 28D77 ; MA # ( 𨵷 → 𨵷 ) CJK COMPATIBILITY IDEOGRAPH-2F9F1 → CJK UNIFIED IDEOGRAPH-28D77 # + +2ED4 ; 95E8 ; MA #* ( ⻔ → 门 ) CJK RADICAL C-SIMPLIFIED GATE → CJK UNIFIED IDEOGRAPH-95E8 # + +2FA9 ; 961C ; MA #* ( ⾩ → 阜 ) KANGXI RADICAL MOUND → CJK UNIFIED IDEOGRAPH-961C # + +2ECF ; 961D ; MA #* ( ⻏ → 阝 ) CJK RADICAL CITY → CJK UNIFIED IDEOGRAPH-961D # +2ED6 ; 961D ; MA #* ( ⻖ → 阝 ) CJK RADICAL MOUND TWO → CJK UNIFIED IDEOGRAPH-961D # + +F9C6 ; 962E ; MA # ( 阮 → 阮 ) CJK COMPATIBILITY IDEOGRAPH-F9C6 → CJK UNIFIED IDEOGRAPH-962E # + +F951 ; 964B ; MA # ( 陋 → 陋 ) CJK COMPATIBILITY IDEOGRAPH-F951 → CJK UNIFIED IDEOGRAPH-964B # + +FA09 ; 964D ; MA # ( 降 → 降 ) CJK COMPATIBILITY IDEOGRAPH-FA09 → CJK UNIFIED IDEOGRAPH-964D # + +F959 ; 9675 ; MA # ( 陵 → 陵 ) CJK COMPATIBILITY IDEOGRAPH-F959 → CJK UNIFIED IDEOGRAPH-9675 # + +F9D3 ; 9678 ; MA # ( 陸 → 陸 ) CJK COMPATIBILITY IDEOGRAPH-F9D3 → CJK UNIFIED IDEOGRAPH-9678 # + +FAC6 ; 967C ; MA # ( 陼 → 陼 ) CJK COMPATIBILITY IDEOGRAPH-FAC6 → CJK UNIFIED IDEOGRAPH-967C # + +F9DC ; 9686 ; MA # ( 隆 → 隆 ) CJK COMPATIBILITY IDEOGRAPH-F9DC → CJK UNIFIED IDEOGRAPH-9686 # + +F9F1 ; 96A3 ; MA # ( 隣 → 隣 ) CJK COMPATIBILITY IDEOGRAPH-F9F1 → CJK UNIFIED IDEOGRAPH-96A3 # + +2F9F2 ; 49E6 ; MA # ( 䧦 → 䧦 ) CJK COMPATIBILITY IDEOGRAPH-2F9F2 → CJK UNIFIED IDEOGRAPH-49E6 # + +2FAA ; 96B6 ; MA #* ( ⾪ → 隶 ) KANGXI RADICAL SLAVE → CJK UNIFIED IDEOGRAPH-96B6 # + +FA2F ; 96B7 ; MA # ( 隷 → 隷 ) CJK COMPATIBILITY IDEOGRAPH-FA2F → CJK UNIFIED IDEOGRAPH-96B7 # +96B8 ; 96B7 ; MA # ( 隸 → 隷 ) CJK UNIFIED IDEOGRAPH-96B8 → CJK UNIFIED IDEOGRAPH-96B7 # →隸→ +F9B8 ; 96B7 ; MA # ( 隸 → 隷 ) CJK COMPATIBILITY IDEOGRAPH-F9B8 → CJK UNIFIED IDEOGRAPH-96B7 # + +2FAB ; 96B9 ; MA #* ( ⾫ → 隹 ) KANGXI RADICAL SHORT TAILED BIRD → CJK UNIFIED IDEOGRAPH-96B9 # + +2F9F3 ; 96C3 ; MA # ( 雃 → 雃 ) CJK COMPATIBILITY IDEOGRAPH-2F9F3 → CJK UNIFIED IDEOGRAPH-96C3 # + +F9EA ; 96E2 ; MA # ( 離 → 離 ) CJK COMPATIBILITY IDEOGRAPH-F9EA → CJK UNIFIED IDEOGRAPH-96E2 # + +FA68 ; 96E3 ; MA # ( 難 → 難 ) CJK COMPATIBILITY IDEOGRAPH-FA68 → CJK UNIFIED IDEOGRAPH-96E3 # +FAC7 ; 96E3 ; MA # ( 難 → 難 ) CJK COMPATIBILITY IDEOGRAPH-FAC7 → CJK UNIFIED IDEOGRAPH-96E3 # + +2FAC ; 96E8 ; MA #* ( ⾬ → 雨 ) KANGXI RADICAL RAIN → CJK UNIFIED IDEOGRAPH-96E8 # + +F9B2 ; 96F6 ; MA # ( 零 → 零 ) CJK COMPATIBILITY IDEOGRAPH-F9B2 → CJK UNIFIED IDEOGRAPH-96F6 # + +F949 ; 96F7 ; MA # ( 雷 → 雷 ) CJK COMPATIBILITY IDEOGRAPH-F949 → CJK UNIFIED IDEOGRAPH-96F7 # + +2F9F5 ; 9723 ; MA # ( 霣 → 霣 ) CJK COMPATIBILITY IDEOGRAPH-2F9F5 → CJK UNIFIED IDEOGRAPH-9723 # + +2F9F6 ; 29145 ; MA # ( 𩅅 → 𩅅 ) CJK COMPATIBILITY IDEOGRAPH-2F9F6 → CJK UNIFIED IDEOGRAPH-29145 # + +F938 ; 9732 ; MA # ( 露 → 露 ) CJK COMPATIBILITY IDEOGRAPH-F938 → CJK UNIFIED IDEOGRAPH-9732 # + +F9B3 ; 9748 ; MA # ( 靈 → 靈 ) CJK COMPATIBILITY IDEOGRAPH-F9B3 → CJK UNIFIED IDEOGRAPH-9748 # + +2FAD ; 9751 ; MA #* ( ⾭ → 靑 ) KANGXI RADICAL BLUE → CJK UNIFIED IDEOGRAPH-9751 # + +2ED8 ; 9752 ; MA #* ( ⻘ → 青 ) CJK RADICAL BLUE → CJK UNIFIED IDEOGRAPH-9752 # + +FA1C ; 9756 ; MA # ( 靖 → 靖 ) CJK COMPATIBILITY IDEOGRAPH-FA1C → CJK UNIFIED IDEOGRAPH-9756 # +FAC8 ; 9756 ; MA # ( 靖 → 靖 ) CJK COMPATIBILITY IDEOGRAPH-FAC8 → CJK UNIFIED IDEOGRAPH-9756 # + +2F81C ; 291DF ; MA # ( 𩇟 → 𩇟 ) CJK COMPATIBILITY IDEOGRAPH-2F81C → CJK UNIFIED IDEOGRAPH-291DF # + +2FAE ; 975E ; MA #* ( ⾮ → 非 ) KANGXI RADICAL WRONG → CJK UNIFIED IDEOGRAPH-975E # + +2FAF ; 9762 ; MA #* ( ⾯ → 面 ) KANGXI RADICAL FACE → CJK UNIFIED IDEOGRAPH-9762 # + +2F9F7 ; 2921A ; MA # ( 𩈚 → 𩈚 ) CJK COMPATIBILITY IDEOGRAPH-2F9F7 → CJK UNIFIED IDEOGRAPH-2921A # + +2FB0 ; 9769 ; MA #* ( ⾰ → 革 ) KANGXI RADICAL LEATHER → CJK UNIFIED IDEOGRAPH-9769 # + +2F9F8 ; 4A6E ; MA # ( 䩮 → 䩮 ) CJK COMPATIBILITY IDEOGRAPH-2F9F8 → CJK UNIFIED IDEOGRAPH-4A6E # + +2F9F9 ; 4A76 ; MA # ( 䩶 → 䩶 ) CJK COMPATIBILITY IDEOGRAPH-2F9F9 → CJK UNIFIED IDEOGRAPH-4A76 # + +2FB1 ; 97CB ; MA #* ( ⾱ → 韋 ) KANGXI RADICAL TANNED LEATHER → CJK UNIFIED IDEOGRAPH-97CB # + +FAC9 ; 97DB ; MA # ( 韛 → 韛 ) CJK COMPATIBILITY IDEOGRAPH-FAC9 → CJK UNIFIED IDEOGRAPH-97DB # + +2F9FA ; 97E0 ; MA # ( 韠 → 韠 ) CJK COMPATIBILITY IDEOGRAPH-2F9FA → CJK UNIFIED IDEOGRAPH-97E0 # + +2ED9 ; 97E6 ; MA #* ( ⻙ → 韦 ) CJK RADICAL C-SIMPLIFIED TANNED LEATHER → CJK UNIFIED IDEOGRAPH-97E6 # + +2FB2 ; 97ED ; MA #* ( ⾲ → 韭 ) KANGXI RADICAL LEEK → CJK UNIFIED IDEOGRAPH-97ED # + +2F9FB ; 2940A ; MA # ( 𩐊 → 𩐊 ) CJK COMPATIBILITY IDEOGRAPH-2F9FB → CJK UNIFIED IDEOGRAPH-2940A # + +2FB3 ; 97F3 ; MA #* ( ⾳ → 音 ) KANGXI RADICAL SOUND → CJK UNIFIED IDEOGRAPH-97F3 # + +FA69 ; 97FF ; MA # ( 響 → 響 ) CJK COMPATIBILITY IDEOGRAPH-FA69 → CJK UNIFIED IDEOGRAPH-97FF # +FACA ; 97FF ; MA # ( 響 → 響 ) CJK COMPATIBILITY IDEOGRAPH-FACA → CJK UNIFIED IDEOGRAPH-97FF # + +2FB4 ; 9801 ; MA #* ( ⾴ → 頁 ) KANGXI RADICAL LEAF → CJK UNIFIED IDEOGRAPH-9801 # + +2F9FC ; 4AB2 ; MA # ( 䪲 → 䪲 ) CJK COMPATIBILITY IDEOGRAPH-2F9FC → CJK UNIFIED IDEOGRAPH-4AB2 # + +FACB ; 980B ; MA # ( 頋 → 頋 ) CJK COMPATIBILITY IDEOGRAPH-FACB → CJK UNIFIED IDEOGRAPH-980B # +2F9FE ; 980B ; MA # ( 頋 → 頋 ) CJK COMPATIBILITY IDEOGRAPH-2F9FE → CJK UNIFIED IDEOGRAPH-980B # +2F9FF ; 980B ; MA # ( 頋 → 頋 ) CJK COMPATIBILITY IDEOGRAPH-2F9FF → CJK UNIFIED IDEOGRAPH-980B # + +F9B4 ; 9818 ; MA # ( 領 → 領 ) CJK COMPATIBILITY IDEOGRAPH-F9B4 → CJK UNIFIED IDEOGRAPH-9818 # + +2FA00 ; 9829 ; MA # ( 頩 → 頩 ) CJK COMPATIBILITY IDEOGRAPH-2FA00 → CJK UNIFIED IDEOGRAPH-9829 # + +2F9FD ; 29496 ; MA # ( 𩒖 → 𩒖 ) CJK COMPATIBILITY IDEOGRAPH-2F9FD → CJK UNIFIED IDEOGRAPH-29496 # + +FA6A ; 983B ; MA # ( 頻 → 頻 ) CJK COMPATIBILITY IDEOGRAPH-FA6A → CJK UNIFIED IDEOGRAPH-983B # +FACC ; 983B ; MA # ( 頻 → 頻 ) CJK COMPATIBILITY IDEOGRAPH-FACC → CJK UNIFIED IDEOGRAPH-983B # + +F9D0 ; 985E ; MA # ( 類 → 類 ) CJK COMPATIBILITY IDEOGRAPH-F9D0 → CJK UNIFIED IDEOGRAPH-985E # + +2EDA ; 9875 ; MA #* ( ⻚ → 页 ) CJK RADICAL C-SIMPLIFIED LEAF → CJK UNIFIED IDEOGRAPH-9875 # + +2FB5 ; 98A8 ; MA #* ( ⾵ → 風 ) KANGXI RADICAL WIND → CJK UNIFIED IDEOGRAPH-98A8 # + +2FA01 ; 295B6 ; MA # ( 𩖶 → 𩖶 ) CJK COMPATIBILITY IDEOGRAPH-2FA01 → CJK UNIFIED IDEOGRAPH-295B6 # + +2EDB ; 98CE ; MA #* ( ⻛ → 风 ) CJK RADICAL C-SIMPLIFIED WIND → CJK UNIFIED IDEOGRAPH-98CE # + +2FB6 ; 98DB ; MA #* ( ⾶ → 飛 ) KANGXI RADICAL FLY → CJK UNIFIED IDEOGRAPH-98DB # + +2EDC ; 98DE ; MA #* ( ⻜ → 飞 ) CJK RADICAL C-SIMPLIFIED FLY → CJK UNIFIED IDEOGRAPH-98DE # + +2EDD ; 98DF ; MA #* ( ⻝ → 食 ) CJK RADICAL EAT ONE → CJK UNIFIED IDEOGRAPH-98DF # +2FB7 ; 98DF ; MA #* ( ⾷ → 食 ) KANGXI RADICAL EAT → CJK UNIFIED IDEOGRAPH-98DF # + +2EDF ; 98E0 ; MA #* ( ⻟ → 飠 ) CJK RADICAL EAT THREE → CJK UNIFIED IDEOGRAPH-98E0 # + +2FA02 ; 98E2 ; MA # ( 飢 → 飢 ) CJK COMPATIBILITY IDEOGRAPH-2FA02 → CJK UNIFIED IDEOGRAPH-98E2 # + +FA2A ; 98EF ; MA # ( 飯 → 飯 ) CJK COMPATIBILITY IDEOGRAPH-FA2A → CJK UNIFIED IDEOGRAPH-98EF # + +FA2B ; 98FC ; MA # ( 飼 → 飼 ) CJK COMPATIBILITY IDEOGRAPH-FA2B → CJK UNIFIED IDEOGRAPH-98FC # + +2FA03 ; 4B33 ; MA # ( 䬳 → 䬳 ) CJK COMPATIBILITY IDEOGRAPH-2FA03 → CJK UNIFIED IDEOGRAPH-4B33 # + +FA2C ; 9928 ; MA # ( 館 → 館 ) CJK COMPATIBILITY IDEOGRAPH-FA2C → CJK UNIFIED IDEOGRAPH-9928 # + +2FA04 ; 9929 ; MA # ( 餩 → 餩 ) CJK COMPATIBILITY IDEOGRAPH-2FA04 → CJK UNIFIED IDEOGRAPH-9929 # + +2EE0 ; 9963 ; MA #* ( ⻠ → 饣 ) CJK RADICAL C-SIMPLIFIED EAT → CJK UNIFIED IDEOGRAPH-9963 # + +2FB8 ; 9996 ; MA #* ( ⾸ → 首 ) KANGXI RADICAL HEAD → CJK UNIFIED IDEOGRAPH-9996 # + +2FB9 ; 9999 ; MA #* ( ⾹ → 香 ) KANGXI RADICAL FRAGRANT → CJK UNIFIED IDEOGRAPH-9999 # + +2FA05 ; 99A7 ; MA # ( 馧 → 馧 ) CJK COMPATIBILITY IDEOGRAPH-2FA05 → CJK UNIFIED IDEOGRAPH-99A7 # + +2FBA ; 99AC ; MA #* ( ⾺ → 馬 ) KANGXI RADICAL HORSE → CJK UNIFIED IDEOGRAPH-99AC # + +2FA06 ; 99C2 ; MA # ( 駂 → 駂 ) CJK COMPATIBILITY IDEOGRAPH-2FA06 → CJK UNIFIED IDEOGRAPH-99C2 # + +F91A ; 99F1 ; MA # ( 駱 → 駱 ) CJK COMPATIBILITY IDEOGRAPH-F91A → CJK UNIFIED IDEOGRAPH-99F1 # + +2FA07 ; 99FE ; MA # ( 駾 → 駾 ) CJK COMPATIBILITY IDEOGRAPH-2FA07 → CJK UNIFIED IDEOGRAPH-99FE # + +F987 ; 9A6A ; MA # ( 驪 → 驪 ) CJK COMPATIBILITY IDEOGRAPH-F987 → CJK UNIFIED IDEOGRAPH-9A6A # + +2EE2 ; 9A6C ; MA #* ( ⻢ → 马 ) CJK RADICAL C-SIMPLIFIED HORSE → CJK UNIFIED IDEOGRAPH-9A6C # + +2FBB ; 9AA8 ; MA #* ( ⾻ → 骨 ) KANGXI RADICAL BONE → CJK UNIFIED IDEOGRAPH-9AA8 # + +2FA08 ; 4BCE ; MA # ( 䯎 → 䯎 ) CJK COMPATIBILITY IDEOGRAPH-2FA08 → CJK UNIFIED IDEOGRAPH-4BCE # + +2FBC ; 9AD8 ; MA #* ( ⾼ → 高 ) KANGXI RADICAL TALL → CJK UNIFIED IDEOGRAPH-9AD8 # + +2FBD ; 9ADF ; MA #* ( ⾽ → 髟 ) KANGXI RADICAL HAIR → CJK UNIFIED IDEOGRAPH-9ADF # + +2FA09 ; 29B30 ; MA # ( 𩬰 → 𩬰 ) CJK COMPATIBILITY IDEOGRAPH-2FA09 → CJK UNIFIED IDEOGRAPH-29B30 # + +FACD ; 9B12 ; MA # ( 鬒 → 鬒 ) CJK COMPATIBILITY IDEOGRAPH-FACD → CJK UNIFIED IDEOGRAPH-9B12 # +2FA0A ; 9B12 ; MA # ( 鬒 → 鬒 ) CJK COMPATIBILITY IDEOGRAPH-2FA0A → CJK UNIFIED IDEOGRAPH-9B12 # + +2FBE ; 9B25 ; MA #* ( ⾾ → 鬥 ) KANGXI RADICAL FIGHT → CJK UNIFIED IDEOGRAPH-9B25 # + +2FBF ; 9B2F ; MA #* ( ⾿ → 鬯 ) KANGXI RADICAL SACRIFICIAL WINE → CJK UNIFIED IDEOGRAPH-9B2F # + +2FC0 ; 9B32 ; MA #* ( ⿀ → 鬲 ) KANGXI RADICAL CAULDRON → CJK UNIFIED IDEOGRAPH-9B32 # + +2FC1 ; 9B3C ; MA #* ( ⿁ → 鬼 ) KANGXI RADICAL GHOST → CJK UNIFIED IDEOGRAPH-9B3C # +2EE4 ; 9B3C ; MA #* ( ⻤ → 鬼 ) CJK RADICAL GHOST → CJK UNIFIED IDEOGRAPH-9B3C # + +2FC2 ; 9B5A ; MA #* ( ⿂ → 魚 ) KANGXI RADICAL FISH → CJK UNIFIED IDEOGRAPH-9B5A # + +F939 ; 9B6F ; MA # ( 魯 → 魯 ) CJK COMPATIBILITY IDEOGRAPH-F939 → CJK UNIFIED IDEOGRAPH-9B6F # + +2FA0B ; 9C40 ; MA # ( 鱀 → 鱀 ) CJK COMPATIBILITY IDEOGRAPH-2FA0B → CJK UNIFIED IDEOGRAPH-9C40 # + +F9F2 ; 9C57 ; MA # ( 鱗 → 鱗 ) CJK COMPATIBILITY IDEOGRAPH-F9F2 → CJK UNIFIED IDEOGRAPH-9C57 # + +2EE5 ; 9C7C ; MA #* ( ⻥ → 鱼 ) CJK RADICAL C-SIMPLIFIED FISH → CJK UNIFIED IDEOGRAPH-9C7C # + +2FC3 ; 9CE5 ; MA #* ( ⿃ → 鳥 ) KANGXI RADICAL BIRD → CJK UNIFIED IDEOGRAPH-9CE5 # + +2FA0C ; 9CFD ; MA # ( 鳽 → 鳽 ) CJK COMPATIBILITY IDEOGRAPH-2FA0C → CJK UNIFIED IDEOGRAPH-9CFD # + +2FA0D ; 4CCE ; MA # ( 䳎 → 䳎 ) CJK COMPATIBILITY IDEOGRAPH-2FA0D → CJK UNIFIED IDEOGRAPH-4CCE # + +2FA0F ; 9D67 ; MA # ( 鵧 → 鵧 ) CJK COMPATIBILITY IDEOGRAPH-2FA0F → CJK UNIFIED IDEOGRAPH-9D67 # + +2FA0E ; 4CED ; MA # ( 䳭 → 䳭 ) CJK COMPATIBILITY IDEOGRAPH-2FA0E → CJK UNIFIED IDEOGRAPH-4CED # + +2FA10 ; 2A0CE ; MA # ( 𪃎 → 𪃎 ) CJK COMPATIBILITY IDEOGRAPH-2FA10 → CJK UNIFIED IDEOGRAPH-2A0CE # + +FA2D ; 9DB4 ; MA # ( 鶴 → 鶴 ) CJK COMPATIBILITY IDEOGRAPH-FA2D → CJK UNIFIED IDEOGRAPH-9DB4 # + +2FA12 ; 2A105 ; MA # ( 𪄅 → 𪄅 ) CJK COMPATIBILITY IDEOGRAPH-2FA12 → CJK UNIFIED IDEOGRAPH-2A105 # + +2FA11 ; 4CF8 ; MA # ( 䳸 → 䳸 ) CJK COMPATIBILITY IDEOGRAPH-2FA11 → CJK UNIFIED IDEOGRAPH-4CF8 # + +F93A ; 9DFA ; MA # ( 鷺 → 鷺 ) CJK COMPATIBILITY IDEOGRAPH-F93A → CJK UNIFIED IDEOGRAPH-9DFA # + +2FA13 ; 2A20E ; MA # ( 𪈎 → 𪈎 ) CJK COMPATIBILITY IDEOGRAPH-2FA13 → CJK UNIFIED IDEOGRAPH-2A20E # + +F920 ; 9E1E ; MA # ( 鸞 → 鸞 ) CJK COMPATIBILITY IDEOGRAPH-F920 → CJK UNIFIED IDEOGRAPH-9E1E # + +9E43 ; 9E42 ; MA # ( 鹃 → 鹂 ) CJK UNIFIED IDEOGRAPH-9E43 → CJK UNIFIED IDEOGRAPH-9E42 # + +2FC4 ; 9E75 ; MA #* ( ⿄ → 鹵 ) KANGXI RADICAL SALT → CJK UNIFIED IDEOGRAPH-9E75 # + +F940 ; 9E7F ; MA # ( 鹿 → 鹿 ) CJK COMPATIBILITY IDEOGRAPH-F940 → CJK UNIFIED IDEOGRAPH-9E7F # +2FC5 ; 9E7F ; MA #* ( ⿅ → 鹿 ) KANGXI RADICAL DEER → CJK UNIFIED IDEOGRAPH-9E7F # + +2FA14 ; 2A291 ; MA # ( 𪊑 → 𪊑 ) CJK COMPATIBILITY IDEOGRAPH-2FA14 → CJK UNIFIED IDEOGRAPH-2A291 # + +F988 ; 9E97 ; MA # ( 麗 → 麗 ) CJK COMPATIBILITY IDEOGRAPH-F988 → CJK UNIFIED IDEOGRAPH-9E97 # + +F9F3 ; 9E9F ; MA # ( 麟 → 麟 ) CJK COMPATIBILITY IDEOGRAPH-F9F3 → CJK UNIFIED IDEOGRAPH-9E9F # + +2FC6 ; 9EA5 ; MA #* ( ⿆ → 麥 ) KANGXI RADICAL WHEAT → CJK UNIFIED IDEOGRAPH-9EA5 # + +2EE8 ; 9EA6 ; MA #* ( ⻨ → 麦 ) CJK RADICAL SIMPLIFIED WHEAT → CJK UNIFIED IDEOGRAPH-9EA6 # + +2FA15 ; 9EBB ; MA # ( 麻 → 麻 ) CJK COMPATIBILITY IDEOGRAPH-2FA15 → CJK UNIFIED IDEOGRAPH-9EBB # +2FC7 ; 9EBB ; MA #* ( ⿇ → 麻 ) KANGXI RADICAL HEMP → CJK UNIFIED IDEOGRAPH-9EBB # + +2F88F ; 2A392 ; MA # ( 𪎒 → 𪎒 ) CJK COMPATIBILITY IDEOGRAPH-2F88F → CJK UNIFIED IDEOGRAPH-2A392 # + +2FC8 ; 9EC3 ; MA #* ( ⿈ → 黃 ) KANGXI RADICAL YELLOW → CJK UNIFIED IDEOGRAPH-9EC3 # + +2EE9 ; 9EC4 ; MA #* ( ⻩ → 黄 ) CJK RADICAL SIMPLIFIED YELLOW → CJK UNIFIED IDEOGRAPH-9EC4 # + +2FC9 ; 9ECD ; MA #* ( ⿉ → 黍 ) KANGXI RADICAL MILLET → CJK UNIFIED IDEOGRAPH-9ECD # + +F989 ; 9ECE ; MA # ( 黎 → 黎 ) CJK COMPATIBILITY IDEOGRAPH-F989 → CJK UNIFIED IDEOGRAPH-9ECE # + +2FA16 ; 4D56 ; MA # ( 䵖 → 䵖 ) CJK COMPATIBILITY IDEOGRAPH-2FA16 → CJK UNIFIED IDEOGRAPH-4D56 # + +2FCA ; 9ED1 ; MA #* ( ⿊ → 黑 ) KANGXI RADICAL BLACK → CJK UNIFIED IDEOGRAPH-9ED1 # +9ED2 ; 9ED1 ; MA # ( 黒 → 黑 ) CJK UNIFIED IDEOGRAPH-9ED2 → CJK UNIFIED IDEOGRAPH-9ED1 # →⿊→ + +FA3A ; 58A8 ; MA # ( 墨 → 墨 ) CJK COMPATIBILITY IDEOGRAPH-FA3A → CJK UNIFIED IDEOGRAPH-58A8 # + +2FA17 ; 9EF9 ; MA # ( 黹 → 黹 ) CJK COMPATIBILITY IDEOGRAPH-2FA17 → CJK UNIFIED IDEOGRAPH-9EF9 # +2FCB ; 9EF9 ; MA #* ( ⿋ → 黹 ) KANGXI RADICAL EMBROIDERY → CJK UNIFIED IDEOGRAPH-9EF9 # + +2FCC ; 9EFD ; MA #* ( ⿌ → 黽 ) KANGXI RADICAL FROG → CJK UNIFIED IDEOGRAPH-9EFD # + +2FA19 ; 9F05 ; MA # ( 鼅 → 鼅 ) CJK COMPATIBILITY IDEOGRAPH-2FA19 → CJK UNIFIED IDEOGRAPH-9F05 # + +2FA18 ; 9EFE ; MA # ( 黾 → 黾 ) CJK COMPATIBILITY IDEOGRAPH-2FA18 → CJK UNIFIED IDEOGRAPH-9EFE # + +2FCD ; 9F0E ; MA #* ( ⿍ → 鼎 ) KANGXI RADICAL TRIPOD → CJK UNIFIED IDEOGRAPH-9F0E # + +2FA1A ; 9F0F ; MA # ( 鼏 → 鼏 ) CJK COMPATIBILITY IDEOGRAPH-2FA1A → CJK UNIFIED IDEOGRAPH-9F0F # + +2FCE ; 9F13 ; MA #* ( ⿎ → 鼓 ) KANGXI RADICAL DRUM → CJK UNIFIED IDEOGRAPH-9F13 # + +2FA1B ; 9F16 ; MA # ( 鼖 → 鼖 ) CJK COMPATIBILITY IDEOGRAPH-2FA1B → CJK UNIFIED IDEOGRAPH-9F16 # + +2FCF ; 9F20 ; MA #* ( ⿏ → 鼠 ) KANGXI RADICAL RAT → CJK UNIFIED IDEOGRAPH-9F20 # + +2FA1C ; 9F3B ; MA # ( 鼻 → 鼻 ) CJK COMPATIBILITY IDEOGRAPH-2FA1C → CJK UNIFIED IDEOGRAPH-9F3B # +2FD0 ; 9F3B ; MA #* ( ⿐ → 鼻 ) KANGXI RADICAL NOSE → CJK UNIFIED IDEOGRAPH-9F3B # + +FAD8 ; 9F43 ; MA # ( 齃 → 齃 ) CJK COMPATIBILITY IDEOGRAPH-FAD8 → CJK UNIFIED IDEOGRAPH-9F43 # + +2FD1 ; 9F4A ; MA #* ( ⿑ → 齊 ) KANGXI RADICAL EVEN → CJK UNIFIED IDEOGRAPH-9F4A # + +2EEC ; 9F50 ; MA #* ( ⻬ → 齐 ) CJK RADICAL C-SIMPLIFIED EVEN → CJK UNIFIED IDEOGRAPH-9F50 # + +2FD2 ; 9F52 ; MA #* ( ⿒ → 齒 ) KANGXI RADICAL TOOTH → CJK UNIFIED IDEOGRAPH-9F52 # + +2FA1D ; 2A600 ; MA # ( 𪘀 → 𪘀 ) CJK COMPATIBILITY IDEOGRAPH-2FA1D → CJK UNIFIED IDEOGRAPH-2A600 # + +2EEE ; 9F7F ; MA #* ( ⻮ → 齿 ) CJK RADICAL C-SIMPLIFIED TOOTH → CJK UNIFIED IDEOGRAPH-9F7F # + +F9C4 ; 9F8D ; MA # ( 龍 → 龍 ) CJK COMPATIBILITY IDEOGRAPH-F9C4 → CJK UNIFIED IDEOGRAPH-9F8D # +2FD3 ; 9F8D ; MA #* ( ⿓ → 龍 ) KANGXI RADICAL DRAGON → CJK UNIFIED IDEOGRAPH-9F8D # + +FAD9 ; 9F8E ; MA # ( 龎 → 龎 ) CJK COMPATIBILITY IDEOGRAPH-FAD9 → CJK UNIFIED IDEOGRAPH-9F8E # + +2EF0 ; 9F99 ; MA #* ( ⻰ → 龙 ) CJK RADICAL C-SIMPLIFIED DRAGON → CJK UNIFIED IDEOGRAPH-9F99 # + +F907 ; 9F9C ; MA # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-F907 → CJK UNIFIED IDEOGRAPH-9F9C # +F908 ; 9F9C ; MA # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-F908 → CJK UNIFIED IDEOGRAPH-9F9C # +FACE ; 9F9C ; MA # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-FACE → CJK UNIFIED IDEOGRAPH-9F9C # +2FD4 ; 9F9C ; MA #* ( ⿔ → 龜 ) KANGXI RADICAL TURTLE → CJK UNIFIED IDEOGRAPH-9F9C # + +2EF3 ; 9F9F ; MA #* ( ⻳ → 龟 ) CJK RADICAL C-SIMPLIFIED TURTLE → CJK UNIFIED IDEOGRAPH-9F9F # + +2FD5 ; 9FA0 ; MA #* ( ⿕ → 龠 ) KANGXI RADICAL FLUTE → CJK UNIFIED IDEOGRAPH-9FA0 # + +111DB ; A8FC ; MA #* ( 𑇛 → ꣼ ) SHARADA SIGN SIDDHAM → DEVANAGARI SIGN SIDDHAM # + +# total: 6069 + diff --git a/stringsx/confusables_test.go b/stringsx/confusables_test.go new file mode 100644 index 0000000..c9a4d6a --- /dev/null +++ b/stringsx/confusables_test.go @@ -0,0 +1,25 @@ +package stringsx_test + +import ( + "testing" + + "github.com/nyaruka/gocommon/stringsx" + "github.com/stretchr/testify/assert" +) + +func TestSkeleton(t *testing.T) { + assert.Equal(t, "", stringsx.Skeleton("")) + assert.Equal(t, "foo", stringsx.Skeleton("foo")) + assert.Equal(t, "nyaruka", stringsx.Skeleton("𝕟𝔂𝛼𝐫ᴜ𝞳𝕒")) +} + +func TestConfusable(t *testing.T) { + assert.True(t, stringsx.Confusable("", "")) + assert.True(t, stringsx.Confusable("foo", "foo")) + assert.True(t, stringsx.Confusable("١", "۱")) // 0x661 vs 0x6f1 + assert.True(t, stringsx.Confusable("بلی", "بلى")) // 0x6cc vs 0x649 + assert.True(t, stringsx.Confusable("nyaruka", "𝕟𝔂𝛼𝐫ᴜ𝞳𝕒")) + + assert.False(t, stringsx.Confusable("foo", "bar")) + assert.False(t, stringsx.Confusable("foo", "Foo")) +} From 47b355e7e9febd70285b789be63036de515177bc Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 7 Aug 2023 13:51:53 -0500 Subject: [PATCH 009/141] Update CHANGELOG.md for v1.38.0 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e08ac2..174261d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.38.0 (2023-08-07) +------------------------- + * Add confusables implementation to stringsx + v1.37.0 (2023-07-20) ------------------------- * Storage paths shouldn't need to start with slash From ae830934450be79e68e23f60ecd571c0704b3d7e Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 9 Aug 2023 11:51:45 -0500 Subject: [PATCH 010/141] Update deps including phonenumbers --- go.mod | 29 ++++++++++++++-------------- go.sum | 60 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 44 insertions(+), 45 deletions(-) diff --git a/go.mod b/go.mod index 7e02536..d6b1183 100644 --- a/go.mod +++ b/go.mod @@ -3,34 +3,33 @@ module github.com/nyaruka/gocommon go 1.19 require ( - github.com/aws/aws-sdk-go v1.44.191 - github.com/gabriel-vasile/mimetype v1.4.1 + github.com/aws/aws-sdk-go v1.44.319 + github.com/gabriel-vasile/mimetype v1.4.2 github.com/go-chi/chi v4.1.2+incompatible - github.com/go-playground/validator/v10 v10.11.2 + github.com/go-playground/validator/v10 v10.15.0 github.com/gofrs/uuid v4.4.0+incompatible github.com/jmoiron/sqlx v1.3.5 - github.com/lib/pq v1.10.7 + github.com/lib/pq v1.10.9 github.com/nyaruka/librato v1.0.0 - github.com/nyaruka/phonenumbers v1.1.6 + github.com/nyaruka/phonenumbers v1.1.8 github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.3.1 - github.com/stretchr/testify v1.8.1 - golang.org/x/net v0.7.0 + github.com/stretchr/testify v1.8.4 + golang.org/x/net v0.14.0 + golang.org/x/text v0.12.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/leodido/go-urn v1.2.1 // indirect + github.com/leodido/go-urn v1.2.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect - golang.org/x/crypto v0.5.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/sys v0.11.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 118a49b..2e20022 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,10 @@ -github.com/aws/aws-sdk-go v1.44.191 h1:GnbkalCx/AgobaorDMFCa248acmk+91+aHBQOk7ljzU= -github.com/aws/aws-sdk-go v1.44.191/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/aws/aws-sdk-go v1.44.319 h1:cwynvM8DBwWGzlINTZ6XLkGy5O99wZIS0197j3B61Fs= +github.com/aws/aws-sdk-go v1.44.319/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gabriel-vasile/mimetype v1.4.1 h1:TRWk7se+TOjCYgRth7+1/OYLNiRNIotknkFtf/dnN7Q= -github.com/gabriel-vasile/mimetype v1.4.1/go.mod h1:05Vi0w3Y9c/lNvJOdmIwvrrAhX3rYhfQQCaf9VJcv7M= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= @@ -13,8 +12,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU= -github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s= +github.com/go-playground/validator/v10 v10.15.0 h1:nDU5XeOKtB3GEa+uB7GNYwhVKsgjAR7VgKoNB6ryXfw= +github.com/go-playground/validator/v10 v10.15.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= @@ -22,6 +21,8 @@ github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -31,55 +32,52 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/nyaruka/librato v1.0.0 h1:Vznj9WCeC1yZXbBYyYp40KnbmXLbEkjKmHesV/v2SR0= github.com/nyaruka/librato v1.0.0/go.mod h1:pkRNLFhFurOz0QqBz6/DuTFhHHxAubWxs4Jx+J7yUgg= -github.com/nyaruka/phonenumbers v1.1.6 h1:DcueYq7QrOArAprAYNoQfDgp0KetO4LqtnBtQC6Wyes= -github.com/nyaruka/phonenumbers v1.1.6/go.mod h1:yShPJHDSH3aTKzCbXyVxNpbl2kA+F+Ne5Pun/MvFRos= +github.com/nyaruka/phonenumbers v1.1.8 h1:mjFu85FeoH2Wy18aOMUvxqi1GgAqiQSJsa/cCC5yu2s= +github.com/nyaruka/phonenumbers v1.1.8/go.mod h1:DC7jZd321FqUe+qWSNcHi10tyIyGNXGcNbfkPvdp1Vs= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -90,8 +88,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -99,8 +97,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= @@ -111,8 +109,10 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From b997dbc3a05ff591dc8c0131242fb9ac60886697 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 9 Aug 2023 11:52:10 -0500 Subject: [PATCH 011/141] Update CHANGELOG.md for v1.38.1 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 174261d..0b62358 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.38.1 (2023-08-09) +------------------------- + * Update deps including phonenumbers + v1.38.0 (2023-08-07) ------------------------- * Add confusables implementation to stringsx From 214dd38953a8576be12d475ae057f167ddf073af Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 9 Aug 2023 13:37:42 -0500 Subject: [PATCH 012/141] Revert validator dep upgrade --- go.mod | 2 +- go.sum | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index d6b1183..df5d8e4 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/aws/aws-sdk-go v1.44.319 github.com/gabriel-vasile/mimetype v1.4.2 github.com/go-chi/chi v4.1.2+incompatible - github.com/go-playground/validator/v10 v10.15.0 + github.com/go-playground/validator/v10 v10.14.1 github.com/gofrs/uuid v4.4.0+incompatible github.com/jmoiron/sqlx v1.3.5 github.com/lib/pq v1.10.9 diff --git a/go.sum b/go.sum index 2e20022..8865099 100644 --- a/go.sum +++ b/go.sum @@ -12,15 +12,13 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.15.0 h1:nDU5XeOKtB3GEa+uB7GNYwhVKsgjAR7VgKoNB6ryXfw= -github.com/go-playground/validator/v10 v10.15.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k= +github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= @@ -50,8 +48,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -107,8 +103,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IV golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= From be914e223191cc0ac3b3d3d701e3ff7989b4070b Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 9 Aug 2023 13:38:12 -0500 Subject: [PATCH 013/141] Update CHANGELOG.md for v1.38.2 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b62358..5e41aa3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.38.2 (2023-08-09) +------------------------- + * Revert validator dep upgrade + v1.38.1 (2023-08-09) ------------------------- * Update deps including phonenumbers From 1ee744849f3fa9e25626d2a3bd320b5ba64f2762 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 24 Aug 2023 16:25:43 -0500 Subject: [PATCH 014/141] Test on go 1.21 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c9c8343..fafc904 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - go-version: [1.19.x, 1.20.x] + go-version: [1.19.x, 1.20.x, 1.21.x] services: redis: From f332d228e7b4d8ef90a188f43acc93d93a0042e0 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 28 Aug 2023 13:28:47 -0500 Subject: [PATCH 015/141] Add dbutil.SliceScan and MapScan --- dbutil/scan.go | 34 ++++++++++++++++++++++++ dbutil/scan_test.go | 63 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 dbutil/scan.go create mode 100644 dbutil/scan_test.go diff --git a/dbutil/scan.go b/dbutil/scan.go new file mode 100644 index 0000000..f33884a --- /dev/null +++ b/dbutil/scan.go @@ -0,0 +1,34 @@ +package dbutil + +import "database/sql" + +// SliceScan scans a single value from each row into the given slice +func SliceScan[V any](rows *sql.Rows, s []V) ([]V, error) { + defer rows.Close() + + var v V + + for rows.Next() { + if err := rows.Scan(&v); err != nil { + return nil, err + } + s = append(s, v) + } + return s, rows.Err() +} + +// MapScan scans a key and value from each row into the given map +func MapScan[K comparable, V any](rows *sql.Rows, m map[K]V) error { + defer rows.Close() + + var k K + var v V + + for rows.Next() { + if err := rows.Scan(&k, &v); err != nil { + return err + } + m[k] = v + } + return rows.Err() +} diff --git a/dbutil/scan_test.go b/dbutil/scan_test.go new file mode 100644 index 0000000..c778767 --- /dev/null +++ b/dbutil/scan_test.go @@ -0,0 +1,63 @@ +package dbutil_test + +import ( + "testing" + + "github.com/nyaruka/gocommon/dbutil" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestSliceScan(t *testing.T) { + db := getTestDB() + + defer func() { db.MustExec(`DROP TABLE foo`) }() + + db.MustExec(`CREATE TABLE foo (id serial NOT NULL PRIMARY KEY, name VARCHAR(10))`) + db.MustExec(`INSERT INTO foo (name) VALUES('Ann')`) + db.MustExec(`INSERT INTO foo (name) VALUES('Bob')`) + db.MustExec(`INSERT INTO foo (name) VALUES('Cat')`) + + rows, err := db.Query(`SELECT id FROM foo ORDER BY id`) + require.NoError(t, err) + + ids := make([]int, 0, 2) + ids, err = dbutil.SliceScan(rows, ids) + require.NoError(t, err) + assert.Equal(t, []int{1, 2, 3}, ids) + + rows, err = db.Query(`SELECT name FROM foo ORDER BY id DESC`) + require.NoError(t, err) + + names := make([]string, 0, 2) + names, err = dbutil.SliceScan(rows, names) + require.NoError(t, err) + assert.Equal(t, []string{"Cat", "Bob", "Ann"}, names) +} + +func TestMapScan(t *testing.T) { + db := getTestDB() + + defer func() { db.MustExec(`DROP TABLE foo`) }() + + db.MustExec(`CREATE TABLE foo (id serial NOT NULL PRIMARY KEY, name VARCHAR(10))`) + db.MustExec(`INSERT INTO foo (name) VALUES('Ann')`) + db.MustExec(`INSERT INTO foo (name) VALUES('Bob')`) + db.MustExec(`INSERT INTO foo (name) VALUES('Cat')`) + + rows, err := db.Query(`SELECT id, name FROM foo`) + require.NoError(t, err) + + nameByID := make(map[int]string, 2) + err = dbutil.MapScan(rows, nameByID) + require.NoError(t, err) + assert.Equal(t, map[int]string{1: "Ann", 2: "Bob", 3: "Cat"}, nameByID) + + rows, err = db.Query(`SELECT name, id FROM foo`) + require.NoError(t, err) + + idByName := make(map[string]int, 2) + err = dbutil.MapScan(rows, idByName) + require.NoError(t, err) + assert.Equal(t, map[string]int{"Ann": 1, "Bob": 2, "Cat": 3}, idByName) +} From fcbdb06b0503fc8b699f179d1f04f839f760c178 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 28 Aug 2023 13:50:09 -0500 Subject: [PATCH 016/141] Use any instead of interface{} --- dates/date.go | 2 +- dbutil/assertdb/assert.go | 10 +++++----- dbutil/errors.go | 6 +++--- dbutil/errors_test.go | 4 ++-- dbutil/json.go | 4 ++-- dbutil/json_test.go | 2 +- dbutil/query.go | 6 +++--- dbutil/query_test.go | 26 ++++++++++++++++---------- jsonx/json.go | 20 ++++++++++---------- jsonx/json_test.go | 12 ++++++------ 10 files changed, 49 insertions(+), 43 deletions(-) diff --git a/dates/date.go b/dates/date.go index ddeafdd..98fa406 100644 --- a/dates/date.go +++ b/dates/date.go @@ -85,7 +85,7 @@ func (d Date) Value() (driver.Value, error) { } // Scan scans from the db value -func (d *Date) Scan(value interface{}) error { +func (d *Date) Scan(value any) error { *d = ExtractDate(value.(time.Time)) return nil } diff --git a/dbutil/assertdb/assert.go b/dbutil/assertdb/assert.go index 0749f62..de79718 100644 --- a/dbutil/assertdb/assert.go +++ b/dbutil/assertdb/assert.go @@ -8,7 +8,7 @@ import ( ) // Query creates a new query on which one can assert things -func Query(t *testing.T, db *sqlx.DB, sql string, args ...interface{}) *TestQuery { +func Query(t *testing.T, db *sqlx.DB, sql string, args ...any) *TestQuery { return &TestQuery{t, db, sql, args} } @@ -17,11 +17,11 @@ type TestQuery struct { t *testing.T db *sqlx.DB sql string - args []interface{} + args []any } // Returns asserts that the query returns a single value -func (q *TestQuery) Returns(expected interface{}, msgAndArgs ...interface{}) { +func (q *TestQuery) Returns(expected any, msgAndArgs ...any) { q.t.Helper() // get a variable of same type to hold actual result @@ -40,10 +40,10 @@ func (q *TestQuery) Returns(expected interface{}, msgAndArgs ...interface{}) { } // Columns asserts that the query returns the given column values -func (q *TestQuery) Columns(expected map[string]interface{}, msgAndArgs ...interface{}) { +func (q *TestQuery) Columns(expected map[string]any, msgAndArgs ...any) { q.t.Helper() - actual := make(map[string]interface{}, len(expected)) + actual := make(map[string]any, len(expected)) err := q.db.QueryRowx(q.sql, q.args...).MapScan(actual) assert.NoError(q.t, err, msgAndArgs...) diff --git a/dbutil/errors.go b/dbutil/errors.go index 255baf9..cb56c66 100644 --- a/dbutil/errors.go +++ b/dbutil/errors.go @@ -21,7 +21,7 @@ type QueryError struct { cause error message string sql string - sqlArgs []interface{} + sqlArgs []any } func (e *QueryError) Error() string { @@ -32,11 +32,11 @@ func (e *QueryError) Unwrap() error { return e.cause } -func (e *QueryError) Query() (string, []interface{}) { +func (e *QueryError) Query() (string, []any) { return e.sql, e.sqlArgs } -func NewQueryErrorf(cause error, sql string, sqlArgs []interface{}, message string, msgArgs ...interface{}) error { +func NewQueryErrorf(cause error, sql string, sqlArgs []any, message string, msgArgs ...any) error { return &QueryError{ cause: cause, message: fmt.Sprintf(message, msgArgs...), diff --git a/dbutil/errors_test.go b/dbutil/errors_test.go index 83c94f4..505bdb0 100644 --- a/dbutil/errors_test.go +++ b/dbutil/errors_test.go @@ -21,7 +21,7 @@ func TestIsUniqueViolation(t *testing.T) { func TestQueryError(t *testing.T) { var err error = &pq.Error{Code: pq.ErrorCode("22025"), Message: "unsupported Unicode escape sequence"} - qerr := dbutil.NewQueryErrorf(err, "SELECT * FROM foo WHERE id = $1", []interface{}{234}, "error selecting foo %d", 234) + qerr := dbutil.NewQueryErrorf(err, "SELECT * FROM foo WHERE id = $1", []any{234}, "error selecting foo %d", 234) assert.Error(t, qerr) assert.Equal(t, `error selecting foo 234: pq: unsupported Unicode escape sequence`, qerr.Error()) @@ -41,5 +41,5 @@ func TestQueryError(t *testing.T) { query, params := unwrapped.Query() assert.Equal(t, "SELECT * FROM foo WHERE id = $1", query) - assert.Equal(t, []interface{}{234}, params) + assert.Equal(t, []any{234}, params) } diff --git a/dbutil/json.go b/dbutil/json.go index a2de217..b657368 100644 --- a/dbutil/json.go +++ b/dbutil/json.go @@ -11,7 +11,7 @@ import ( var validate = validator.New() // ScanJSON scans a row which is JSON into a destination struct -func ScanJSON(rows *sqlx.Rows, destination interface{}) error { +func ScanJSON(rows *sqlx.Rows, destination any) error { var raw json.RawMessage err := rows.Scan(&raw) if err != nil { @@ -27,7 +27,7 @@ func ScanJSON(rows *sqlx.Rows, destination interface{}) error { } // ScanAndValidateJSON scans a row which is JSON into a destination struct and validates it -func ScanAndValidateJSON(rows *sqlx.Rows, destination interface{}) error { +func ScanAndValidateJSON(rows *sqlx.Rows, destination any) error { if err := ScanJSON(rows, destination); err != nil { return err } diff --git a/dbutil/json_test.go b/dbutil/json_test.go index df0bae4..a9af471 100644 --- a/dbutil/json_test.go +++ b/dbutil/json_test.go @@ -29,7 +29,7 @@ func TestScanJSON(t *testing.T) { Age int `json:"age" validate:"min=0"` } - queryRows := func(sql string, args ...interface{}) *sqlx.Rows { + queryRows := func(sql string, args ...any) *sqlx.Rows { rows, err := db.QueryxContext(ctx, sql, args...) require.NoError(t, err) require.True(t, rows.Next()) diff --git a/dbutil/query.go b/dbutil/query.go index 243549b..1774c2e 100644 --- a/dbutil/query.go +++ b/dbutil/query.go @@ -11,7 +11,7 @@ import ( // Queryer is the DB/TX functionality needed for operations in this package type Queryer interface { Rebind(query string) string - QueryxContext(ctx context.Context, query string, args ...interface{}) (*sqlx.Rows, error) + QueryxContext(ctx context.Context, query string, args ...any) (*sqlx.Rows, error) } // BulkQuery runs the query as a bulk operation with the given structs @@ -61,7 +61,7 @@ func BulkQuery[T any](ctx context.Context, tx Queryer, query string, structs []T // BulkSQL takes a query which uses VALUES with struct bindings and rewrites it as a bulk operation. // It returns the new SQL query and the args to pass to it. -func BulkSQL[T any](tx Queryer, sql string, structs []T) (string, []interface{}, error) { +func BulkSQL[T any](tx Queryer, sql string, structs []T) (string, []any, error) { if len(structs) == 0 { return "", nil, errors.New("can't generate bulk sql with zero structs") } @@ -71,7 +71,7 @@ func BulkSQL[T any](tx Queryer, sql string, structs []T) (string, []interface{}, values.Grow(7 * len(structs)) // this will be each of the arguments to match the positional values above - args := make([]interface{}, 0, len(structs)*5) + args := make([]any, 0, len(structs)*5) // for each value we build a bound SQL statement, then extract the values clause for i, value := range structs { diff --git a/dbutil/query_test.go b/dbutil/query_test.go index c0f4a10..3f5d482 100644 --- a/dbutil/query_test.go +++ b/dbutil/query_test.go @@ -27,30 +27,36 @@ func TestBulkSQL(t *testing.T) { } // error if we use a query without a VALUES clause - _, _, err := dbutil.BulkSQL(db, `UPDATE foo SET name = :name WHERE id = :id`, []interface{}{contact{ID: 1, Name: "Bob"}}) + _, _, err := dbutil.BulkSQL(db, `UPDATE foo SET name = :name WHERE id = :id`, []any{contact{ID: 1, Name: "Bob"}}) assert.EqualError(t, err, "error extracting VALUES from sql: UPDATE foo SET name = ? WHERE id = ?") // try with missing parentheses - _, _, err = dbutil.BulkSQL(db, `INSERT INTO foo (id, name) VALUES(:id, :name`, []interface{}{contact{ID: 1, Name: "Bob"}}) + _, _, err = dbutil.BulkSQL(db, `INSERT INTO foo (id, name) VALUES(:id, :name`, []any{contact{ID: 1, Name: "Bob"}}) assert.EqualError(t, err, "error extracting VALUES from sql: INSERT INTO foo (id, name) VALUES(?, ?") sql := `INSERT INTO foo (id, name) VALUES(:id, :name)` // try with zero structs - _, _, err = dbutil.BulkSQL(db, sql, []interface{}{}) + _, _, err = dbutil.BulkSQL(db, sql, []any{}) assert.EqualError(t, err, "can't generate bulk sql with zero structs") // try with one struct - query, args, err := dbutil.BulkSQL(db, sql, []interface{}{contact{ID: 1, Name: "Bob"}}) + query, args, err := dbutil.BulkSQL(db, sql, []any{contact{ID: 1, Name: "Bob"}}) assert.NoError(t, err) assert.Equal(t, `INSERT INTO foo (id, name) VALUES($1, $2)`, query) - assert.Equal(t, []interface{}{1, "Bob"}, args) + assert.Equal(t, []any{1, "Bob"}, args) // try with multiple... - query, args, err = dbutil.BulkSQL(db, sql, []interface{}{contact{ID: 1, Name: "Bob"}, contact{ID: 2, Name: "Cathy"}, contact{ID: 3, Name: "George"}}) + query, args, err = dbutil.BulkSQL(db, sql, []any{contact{ID: 1, Name: "Bob"}, contact{ID: 2, Name: "Cathy"}, contact{ID: 3, Name: "George"}}) assert.NoError(t, err) assert.Equal(t, `INSERT INTO foo (id, name) VALUES($1, $2),($3, $4),($5, $6)`, query) - assert.Equal(t, []interface{}{1, "Bob", 2, "Cathy", 3, "George"}, args) + assert.Equal(t, []any{1, "Bob", 2, "Cathy", 3, "George"}, args) + + // try with multiple... + query, args, err = dbutil.BulkSQL(db, sql, []any{contact{ID: 1, Name: "Bob"}, contact{ID: 2, Name: "Cathy"}, contact{ID: 3, Name: "George"}}) + assert.NoError(t, err) + assert.Equal(t, `INSERT INTO foo (id, name) VALUES($1, $2),($3, $4),($5, $6)`, query) + assert.Equal(t, []any{1, "Bob", 2, "Cathy", 3, "George"}, args) } func TestBulkQuery(t *testing.T) { @@ -73,7 +79,7 @@ func TestBulkQuery(t *testing.T) { foo2 := &foo{Name: "Jon", Age: 34} // error if no VALUES clause - err := dbutil.BulkQuery(ctx, db, `INSERT INTO foo (name, age) RETURNING id`, []interface{}{foo1, foo2}) + err := dbutil.BulkQuery(ctx, db, `INSERT INTO foo (name, age) RETURNING id`, []any{foo1, foo2}) assert.EqualError(t, err, "error extracting VALUES from sql: INSERT INTO foo (name, age) RETURNING id") sql := `INSERT INTO foo (name, age) VALUES(:name, :age) RETURNING id` @@ -93,7 +99,7 @@ func TestBulkQuery(t *testing.T) { // returning ids is optional foo3 := &foo{Name: "Jim", Age: 54} - err = dbutil.BulkQuery(ctx, db, `INSERT INTO foo (name, age) VALUES(:name, :age)`, []interface{}{foo3}) + err = dbutil.BulkQuery(ctx, db, `INSERT INTO foo (name, age) VALUES(:name, :age)`, []any{foo3}) assert.NoError(t, err) assert.Equal(t, 0, foo3.ID) @@ -101,7 +107,7 @@ func TestBulkQuery(t *testing.T) { // try with a struct that is invalid foo4 := &foo{Name: "Jonny", Age: 34} - err = dbutil.BulkQuery(ctx, db, `INSERT INTO foo (name, age) VALUES(:name, :age)`, []interface{}{foo4}) + err = dbutil.BulkQuery(ctx, db, `INSERT INTO foo (name, age) VALUES(:name, :age)`, []any{foo4}) assert.EqualError(t, err, "error making bulk query: pq: value too long for type character varying(3)") assert.Equal(t, 0, foo4.ID) } diff --git a/jsonx/json.go b/jsonx/json.go index 092e94e..5828142 100644 --- a/jsonx/json.go +++ b/jsonx/json.go @@ -7,17 +7,17 @@ import ( ) // Marshal marshals the given object to JSON -func Marshal(v interface{}) ([]byte, error) { +func Marshal(v any) ([]byte, error) { return marshal(v, "") } // MarshalPretty marshals the given object to pretty JSON -func MarshalPretty(v interface{}) ([]byte, error) { +func MarshalPretty(v any) ([]byte, error) { return marshal(v, " ") } // MarshalMerged marshals the properties of two objects as one object -func MarshalMerged(v1 interface{}, v2 interface{}) ([]byte, error) { +func MarshalMerged(v1 any, v2 any) ([]byte, error) { b1, err := marshal(v1, "") if err != nil { return nil, err @@ -32,7 +32,7 @@ func MarshalMerged(v1 interface{}, v2 interface{}) ([]byte, error) { } // MustMarshal marshals the given object to JSON, panicking on an error -func MustMarshal(v interface{}) []byte { +func MustMarshal(v any) []byte { data, err := marshal(v, "") if err != nil { panic(err) @@ -40,7 +40,7 @@ func MustMarshal(v interface{}) []byte { return data } -func marshal(v interface{}, indent string) ([]byte, error) { +func marshal(v any, indent string) ([]byte, error) { buffer := &bytes.Buffer{} encoder := json.NewEncoder(buffer) encoder.SetEscapeHTML(false) // see https://github.com/golang/go/issues/8592 @@ -57,7 +57,7 @@ func marshal(v interface{}, indent string) ([]byte, error) { } // Unmarshal is just a shortcut for json.Unmarshal so all calls can be made via the jsonx package -func Unmarshal(data json.RawMessage, v interface{}) error { +func Unmarshal(data json.RawMessage, v any) error { return json.Unmarshal(data, v) } @@ -69,7 +69,7 @@ func UnmarshalArray(data json.RawMessage) ([]json.RawMessage, error) { } // UnmarshalWithLimit unmarsmals a struct with a limit on how many bytes can be read from the given reader -func UnmarshalWithLimit(reader io.ReadCloser, s interface{}, limit int64) error { +func UnmarshalWithLimit(reader io.ReadCloser, s any, limit int64) error { body, err := io.ReadAll(io.LimitReader(reader, limit)) if err != nil { return err @@ -81,15 +81,15 @@ func UnmarshalWithLimit(reader io.ReadCloser, s interface{}, limit int64) error } // MustUnmarshal unmarshals the given JSON, panicking on an error -func MustUnmarshal(data json.RawMessage, v interface{}) { +func MustUnmarshal(data json.RawMessage, v any) { if err := json.Unmarshal(data, v); err != nil { panic(err) } } // DecodeGeneric decodes the given JSON as a generic map or slice -func DecodeGeneric(data []byte) (interface{}, error) { - var asGeneric interface{} +func DecodeGeneric(data []byte) (any, error) { + var asGeneric any decoder := json.NewDecoder(bytes.NewBuffer(data)) decoder.UseNumber() return asGeneric, decoder.Decode(&asGeneric) diff --git a/jsonx/json_test.go b/jsonx/json_test.go index 5966d8d..4fc3f85 100644 --- a/jsonx/json_test.go +++ b/jsonx/json_test.go @@ -116,19 +116,19 @@ func TestDecodeGeneric(t *testing.T) { vals, err := jsonx.DecodeGeneric(data) assert.NoError(t, err) - asMap := vals.(map[string]interface{}) + asMap := vals.(map[string]any) assert.Equal(t, true, asMap["bool"]) assert.Equal(t, json.Number("123.34"), asMap["number"]) assert.Equal(t, "hello", asMap["text"]) - assert.Equal(t, map[string]interface{}{"foo": "bar"}, asMap["object"]) - assert.Equal(t, []interface{}{json.Number("1"), "x"}, asMap["array"]) + assert.Equal(t, map[string]any{"foo": "bar"}, asMap["object"]) + assert.Equal(t, []any{json.Number("1"), "x"}, asMap["array"]) // parse a JSON array into a slice data = []byte(`[{"foo": 123}, {"foo": 456}]`) vals, err = jsonx.DecodeGeneric(data) assert.NoError(t, err) - asSlice := vals.([]interface{}) - assert.Equal(t, map[string]interface{}{"foo": json.Number("123")}, asSlice[0]) - assert.Equal(t, map[string]interface{}{"foo": json.Number("456")}, asSlice[1]) + asSlice := vals.([]any) + assert.Equal(t, map[string]any{"foo": json.Number("123")}, asSlice[0]) + assert.Equal(t, map[string]any{"foo": json.Number("456")}, asSlice[1]) } From c616cdff1ca3b086f87bd1883dd4f51cfc600d0d Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 28 Aug 2023 14:22:15 -0500 Subject: [PATCH 017/141] Add test for using BulkSQL with a SELECT --- dbutil/query_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/dbutil/query_test.go b/dbutil/query_test.go index 3f5d482..251375c 100644 --- a/dbutil/query_test.go +++ b/dbutil/query_test.go @@ -57,6 +57,14 @@ func TestBulkSQL(t *testing.T) { assert.NoError(t, err) assert.Equal(t, `INSERT INTO foo (id, name) VALUES($1, $2),($3, $4),($5, $6)`, query) assert.Equal(t, []any{1, "Bob", 2, "Cathy", 3, "George"}, args) + + // try a select + sql = `SELECT * FROM foo WHERE (id, name) IN (VALUES(:id, :name))` + + query, args, err = dbutil.BulkSQL(db, sql, []any{contact{ID: 1, Name: "Bob"}, contact{ID: 2, Name: "Cathy"}}) + assert.NoError(t, err) + assert.Equal(t, `SELECT * FROM foo WHERE (id, name) IN (VALUES($1, $2),($3, $4))`, query) + assert.Equal(t, []any{1, "Bob", 2, "Cathy"}, args) } func TestBulkQuery(t *testing.T) { From b5adbb4721d7a5060e75aeaaa5395d89b4311804 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 28 Aug 2023 14:38:06 -0500 Subject: [PATCH 018/141] Merge dbutil/scan with dbutil/json and rework json functions to use sql instead of sqlx --- dbutil/json.go | 41 --------------------- dbutil/json_test.go | 87 ------------------------------------------- dbutil/scan.go | 48 +++++++++++++++++++++--- dbutil/scan_test.go | 90 ++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 127 insertions(+), 139 deletions(-) delete mode 100644 dbutil/json.go delete mode 100644 dbutil/json_test.go diff --git a/dbutil/json.go b/dbutil/json.go deleted file mode 100644 index b657368..0000000 --- a/dbutil/json.go +++ /dev/null @@ -1,41 +0,0 @@ -package dbutil - -import ( - "encoding/json" - - "github.com/go-playground/validator/v10" - "github.com/jmoiron/sqlx" - "github.com/pkg/errors" -) - -var validate = validator.New() - -// ScanJSON scans a row which is JSON into a destination struct -func ScanJSON(rows *sqlx.Rows, destination any) error { - var raw json.RawMessage - err := rows.Scan(&raw) - if err != nil { - return errors.Wrap(err, "error scanning row JSON") - } - - err = json.Unmarshal(raw, destination) - if err != nil { - return errors.Wrap(err, "error unmarshalling row JSON") - } - - return nil -} - -// ScanAndValidateJSON scans a row which is JSON into a destination struct and validates it -func ScanAndValidateJSON(rows *sqlx.Rows, destination any) error { - if err := ScanJSON(rows, destination); err != nil { - return err - } - - err := validate.Struct(destination) - if err != nil { - return errors.Wrapf(err, "error validating unmarsalled JSON") - } - - return nil -} diff --git a/dbutil/json_test.go b/dbutil/json_test.go deleted file mode 100644 index a9af471..0000000 --- a/dbutil/json_test.go +++ /dev/null @@ -1,87 +0,0 @@ -package dbutil_test - -import ( - "context" - "testing" - - "github.com/jmoiron/sqlx" - "github.com/nyaruka/gocommon/dbutil" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestScanJSON(t *testing.T) { - ctx := context.Background() - db := getTestDB() - - defer func() { - db.MustExec(`DROP TABLE foo`) - }() - - db.MustExec(`CREATE TABLE foo (id serial NOT NULL PRIMARY KEY, uuid UUID NOT NULL, name VARCHAR(10), age INT)`) - db.MustExec(`INSERT INTO foo (uuid, name, age) VALUES('11163af6-a2ee-486d-b6dc-984174f10eec', 'Bob', 40)`) - db.MustExec(`INSERT INTO foo (uuid, name, age) VALUES('57d3f887-9ae1-4292-8fa4-ffc11e31e2f7', 'Cathy', 30)`) - db.MustExec(`INSERT INTO foo (uuid, name, age) VALUES('a5850c89-dd29-46f6-9de1-d068b3c2db94', 'George', -1)`) - - type foo struct { - UUID string `json:"uuid" validate:"required"` - Name string `json:"name"` - Age int `json:"age" validate:"min=0"` - } - - queryRows := func(sql string, args ...any) *sqlx.Rows { - rows, err := db.QueryxContext(ctx, sql, args...) - require.NoError(t, err) - require.True(t, rows.Next()) - return rows - } - - // if query returns valid JSON which can be unmarshaled into our struct, all good - rows := queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid, f.name, f.age FROM foo f WHERE id = 1) r`) - - f := &foo{} - err := dbutil.ScanAndValidateJSON(rows, f) - assert.NoError(t, err) - assert.Equal(t, "11163af6-a2ee-486d-b6dc-984174f10eec", f.UUID) - assert.Equal(t, "Bob", f.Name) - assert.Equal(t, 40, f.Age) - - rows = queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid, f.name, f.age FROM foo f WHERE id = 2) r`) - - err = dbutil.ScanAndValidateJSON(rows, f) - assert.NoError(t, err) - assert.Equal(t, "57d3f887-9ae1-4292-8fa4-ffc11e31e2f7", f.UUID) - assert.Equal(t, "Cathy", f.Name) - assert.Equal(t, 30, f.Age) - - // error if row value is not JSON - rows = queryRows(`SELECT id FROM foo f WHERE id = 1`) - err = dbutil.ScanAndValidateJSON(rows, f) - assert.EqualError(t, err, `error scanning row JSON: sql: Scan error on column index 0, name "id": unsupported Scan, storing driver.Value type int64 into type *json.RawMessage`) - - // error if we can't marshal into the struct - rows = queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid as uuid, f.name AS age FROM foo f WHERE id = 1) r`) - err = dbutil.ScanAndValidateJSON(rows, f) - assert.EqualError(t, err, "error unmarshalling row JSON: json: cannot unmarshal string into Go struct field foo.age of type int") - - // error if rows aren't ready to be scanned - e.g. next hasn't been called - rows, err = db.QueryxContext(ctx, `SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid as uuid, f.name AS name FROM foo f WHERE id = 1) r`) - require.NoError(t, err) - err = dbutil.ScanAndValidateJSON(rows, f) - assert.EqualError(t, err, "error scanning row JSON: sql: Scan called without calling Next") - - // error if we request validation and returned JSON is invalid - rows = queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid, f.name, f.age FROM foo f WHERE id = 3) r`) - - err = dbutil.ScanAndValidateJSON(rows, f) - assert.EqualError(t, err, "error validating unmarsalled JSON: Key: 'foo.Age' Error:Field validation for 'Age' failed on the 'min' tag") - - // no error if we don't do validation - rows = queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid, f.name, f.age FROM foo f WHERE id = 3) r`) - - err = dbutil.ScanJSON(rows, f) - assert.NoError(t, err) - assert.Equal(t, "a5850c89-dd29-46f6-9de1-d068b3c2db94", f.UUID) - assert.Equal(t, "George", f.Name) - assert.Equal(t, -1, f.Age) -} diff --git a/dbutil/scan.go b/dbutil/scan.go index f33884a..a66fcfb 100644 --- a/dbutil/scan.go +++ b/dbutil/scan.go @@ -1,9 +1,47 @@ package dbutil -import "database/sql" +import ( + "database/sql" + "encoding/json" -// SliceScan scans a single value from each row into the given slice -func SliceScan[V any](rows *sql.Rows, s []V) ([]V, error) { + "github.com/go-playground/validator/v10" + "github.com/pkg/errors" +) + +var validate = validator.New() + +// ScanJSON scans a row which is JSON into a destination struct +func ScanJSON(rows *sql.Rows, destination any) error { + var raw json.RawMessage + err := rows.Scan(&raw) + if err != nil { + return errors.Wrap(err, "error scanning row JSON") + } + + err = json.Unmarshal(raw, destination) + if err != nil { + return errors.Wrap(err, "error unmarshalling row JSON") + } + + return nil +} + +// ScanAndValidateJSON scans a row which is JSON into a destination struct and validates it +func ScanAndValidateJSON(rows *sql.Rows, destination any) error { + if err := ScanJSON(rows, destination); err != nil { + return err + } + + err := validate.Struct(destination) + if err != nil { + return errors.Wrapf(err, "error validating unmarsalled JSON") + } + + return nil +} + +// ScanAllSlice scans a single value from each single column row into the given slice +func ScanAllSlice[V any](rows *sql.Rows, s []V) ([]V, error) { defer rows.Close() var v V @@ -17,8 +55,8 @@ func SliceScan[V any](rows *sql.Rows, s []V) ([]V, error) { return s, rows.Err() } -// MapScan scans a key and value from each row into the given map -func MapScan[K comparable, V any](rows *sql.Rows, m map[K]V) error { +// ScanAllMap scans a key and value from each two column row into the given map +func ScanAllMap[K comparable, V any](rows *sql.Rows, m map[K]V) error { defer rows.Close() var k K diff --git a/dbutil/scan_test.go b/dbutil/scan_test.go index c778767..f35c6c5 100644 --- a/dbutil/scan_test.go +++ b/dbutil/scan_test.go @@ -1,6 +1,8 @@ package dbutil_test import ( + "context" + "database/sql" "testing" "github.com/nyaruka/gocommon/dbutil" @@ -8,7 +10,83 @@ import ( "github.com/stretchr/testify/require" ) -func TestSliceScan(t *testing.T) { +func TestScanJSON(t *testing.T) { + ctx := context.Background() + db := getTestDB() + + defer func() { + db.MustExec(`DROP TABLE foo`) + }() + + db.MustExec(`CREATE TABLE foo (id serial NOT NULL PRIMARY KEY, uuid UUID NOT NULL, name VARCHAR(10), age INT)`) + db.MustExec(`INSERT INTO foo (uuid, name, age) VALUES('11163af6-a2ee-486d-b6dc-984174f10eec', 'Bob', 40)`) + db.MustExec(`INSERT INTO foo (uuid, name, age) VALUES('57d3f887-9ae1-4292-8fa4-ffc11e31e2f7', 'Cathy', 30)`) + db.MustExec(`INSERT INTO foo (uuid, name, age) VALUES('a5850c89-dd29-46f6-9de1-d068b3c2db94', 'George', -1)`) + + type foo struct { + UUID string `json:"uuid" validate:"required"` + Name string `json:"name"` + Age int `json:"age" validate:"min=0"` + } + + queryRows := func(sql string, args ...any) *sql.Rows { + rows, err := db.QueryContext(ctx, sql, args...) + require.NoError(t, err) + require.True(t, rows.Next()) + return rows + } + + // if query returns valid JSON which can be unmarshaled into our struct, all good + rows := queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid, f.name, f.age FROM foo f WHERE id = 1) r`) + + f := &foo{} + err := dbutil.ScanAndValidateJSON(rows, f) + assert.NoError(t, err) + assert.Equal(t, "11163af6-a2ee-486d-b6dc-984174f10eec", f.UUID) + assert.Equal(t, "Bob", f.Name) + assert.Equal(t, 40, f.Age) + + rows = queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid, f.name, f.age FROM foo f WHERE id = 2) r`) + + err = dbutil.ScanAndValidateJSON(rows, f) + assert.NoError(t, err) + assert.Equal(t, "57d3f887-9ae1-4292-8fa4-ffc11e31e2f7", f.UUID) + assert.Equal(t, "Cathy", f.Name) + assert.Equal(t, 30, f.Age) + + // error if row value is not JSON + rows = queryRows(`SELECT id FROM foo f WHERE id = 1`) + err = dbutil.ScanAndValidateJSON(rows, f) + assert.EqualError(t, err, `error scanning row JSON: sql: Scan error on column index 0, name "id": unsupported Scan, storing driver.Value type int64 into type *json.RawMessage`) + + // error if we can't marshal into the struct + rows = queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid as uuid, f.name AS age FROM foo f WHERE id = 1) r`) + err = dbutil.ScanAndValidateJSON(rows, f) + assert.EqualError(t, err, "error unmarshalling row JSON: json: cannot unmarshal string into Go struct field foo.age of type int") + + // error if rows aren't ready to be scanned - e.g. next hasn't been called + rows, err = db.QueryContext(ctx, `SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid as uuid, f.name AS name FROM foo f WHERE id = 1) r`) + require.NoError(t, err) + err = dbutil.ScanAndValidateJSON(rows, f) + assert.EqualError(t, err, "error scanning row JSON: sql: Scan called without calling Next") + + // error if we request validation and returned JSON is invalid + rows = queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid, f.name, f.age FROM foo f WHERE id = 3) r`) + + err = dbutil.ScanAndValidateJSON(rows, f) + assert.EqualError(t, err, "error validating unmarsalled JSON: Key: 'foo.Age' Error:Field validation for 'Age' failed on the 'min' tag") + + // no error if we don't do validation + rows = queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid, f.name, f.age FROM foo f WHERE id = 3) r`) + + err = dbutil.ScanJSON(rows, f) + assert.NoError(t, err) + assert.Equal(t, "a5850c89-dd29-46f6-9de1-d068b3c2db94", f.UUID) + assert.Equal(t, "George", f.Name) + assert.Equal(t, -1, f.Age) +} + +func TestScanAllSlice(t *testing.T) { db := getTestDB() defer func() { db.MustExec(`DROP TABLE foo`) }() @@ -22,7 +100,7 @@ func TestSliceScan(t *testing.T) { require.NoError(t, err) ids := make([]int, 0, 2) - ids, err = dbutil.SliceScan(rows, ids) + ids, err = dbutil.ScanAllSlice(rows, ids) require.NoError(t, err) assert.Equal(t, []int{1, 2, 3}, ids) @@ -30,12 +108,12 @@ func TestSliceScan(t *testing.T) { require.NoError(t, err) names := make([]string, 0, 2) - names, err = dbutil.SliceScan(rows, names) + names, err = dbutil.ScanAllSlice(rows, names) require.NoError(t, err) assert.Equal(t, []string{"Cat", "Bob", "Ann"}, names) } -func TestMapScan(t *testing.T) { +func TestScanAllMap(t *testing.T) { db := getTestDB() defer func() { db.MustExec(`DROP TABLE foo`) }() @@ -49,7 +127,7 @@ func TestMapScan(t *testing.T) { require.NoError(t, err) nameByID := make(map[int]string, 2) - err = dbutil.MapScan(rows, nameByID) + err = dbutil.ScanAllMap(rows, nameByID) require.NoError(t, err) assert.Equal(t, map[int]string{1: "Ann", 2: "Bob", 3: "Cat"}, nameByID) @@ -57,7 +135,7 @@ func TestMapScan(t *testing.T) { require.NoError(t, err) idByName := make(map[string]int, 2) - err = dbutil.MapScan(rows, idByName) + err = dbutil.ScanAllMap(rows, idByName) require.NoError(t, err) assert.Equal(t, map[string]int{"Ann": 1, "Bob": 2, "Cat": 3}, idByName) } From 1a24947ba23f43cb240ea0ee8b0a1cab34e6918b Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 28 Aug 2023 14:43:12 -0500 Subject: [PATCH 019/141] Update CHANGELOG.md for v1.39.0 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e41aa3..a5efff7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +v1.39.0 (2023-08-28) +------------------------- + * Use any instead of interface{} + * Add dbutil.ScanAllSlice and ScanAllMap + * Test on go 1.21 + v1.38.2 (2023-08-09) ------------------------- * Revert validator dep upgrade From 5fc63b3aa79b8cf4daab70fede805277182d6653 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 28 Aug 2023 16:43:45 -0500 Subject: [PATCH 020/141] Rename dbutil.Queryer to BulkQueryer for clarity --- dbutil/{query.go => bulk.go} | 94 +++++++++++++------------- dbutil/{query_test.go => bulk_test.go} | 0 2 files changed, 47 insertions(+), 47 deletions(-) rename dbutil/{query.go => bulk.go} (87%) rename dbutil/{query_test.go => bulk_test.go} (100%) diff --git a/dbutil/query.go b/dbutil/bulk.go similarity index 87% rename from dbutil/query.go rename to dbutil/bulk.go index 1774c2e..1b0e448 100644 --- a/dbutil/query.go +++ b/dbutil/bulk.go @@ -8,26 +8,68 @@ import ( "github.com/pkg/errors" ) -// Queryer is the DB/TX functionality needed for operations in this package -type Queryer interface { +// BulkQueryer is the DB/TX functionality needed for these bulk operations +type BulkQueryer interface { Rebind(query string) string QueryxContext(ctx context.Context, query string, args ...any) (*sqlx.Rows, error) } +// BulkSQL takes a query which uses VALUES with struct bindings and rewrites it as a bulk operation. +// It returns the new SQL query and the args to pass to it. +func BulkSQL[T any](db BulkQueryer, sql string, structs []T) (string, []any, error) { + if len(structs) == 0 { + return "", nil, errors.New("can't generate bulk sql with zero structs") + } + + // this will be our SQL placeholders for values in our final query, built dynamically + values := strings.Builder{} + values.Grow(7 * len(structs)) + + // this will be each of the arguments to match the positional values above + args := make([]any, 0, len(structs)*5) + + // for each value we build a bound SQL statement, then extract the values clause + for i, value := range structs { + valueSQL, valueArgs, err := sqlx.Named(sql, value) + if err != nil { + return "", nil, errors.Wrapf(err, "error converting bulk insert args") + } + + args = append(args, valueArgs...) + argValues := extractValues(valueSQL) + if argValues == "" { + return "", nil, errors.Errorf("error extracting VALUES from sql: %s", valueSQL) + } + + // append to our global values, adding comma if necessary + values.WriteString(argValues) + if i+1 < len(structs) { + values.WriteString(",") + } + } + + valuesSQL := extractValues(sql) + if valuesSQL == "" { + return "", nil, errors.Errorf("error extracting VALUES from sql: %s", sql) + } + + return db.Rebind(strings.Replace(sql, valuesSQL, values.String(), -1)), args, nil +} + // BulkQuery runs the query as a bulk operation with the given structs -func BulkQuery[T any](ctx context.Context, tx Queryer, query string, structs []T) error { +func BulkQuery[T any](ctx context.Context, db BulkQueryer, query string, structs []T) error { // no structs, nothing to do if len(structs) == 0 { return nil } // rewrite query as a bulk operation - bulkQuery, args, err := BulkSQL(tx, query, structs) + bulkQuery, args, err := BulkSQL(db, query, structs) if err != nil { return err } - rows, err := tx.QueryxContext(ctx, bulkQuery, args...) + rows, err := db.QueryxContext(ctx, bulkQuery, args...) if err != nil { return NewQueryErrorf(err, bulkQuery, args, "error making bulk query") } @@ -59,48 +101,6 @@ func BulkQuery[T any](ctx context.Context, tx Queryer, query string, structs []T return nil } -// BulkSQL takes a query which uses VALUES with struct bindings and rewrites it as a bulk operation. -// It returns the new SQL query and the args to pass to it. -func BulkSQL[T any](tx Queryer, sql string, structs []T) (string, []any, error) { - if len(structs) == 0 { - return "", nil, errors.New("can't generate bulk sql with zero structs") - } - - // this will be our SQL placeholders for values in our final query, built dynamically - values := strings.Builder{} - values.Grow(7 * len(structs)) - - // this will be each of the arguments to match the positional values above - args := make([]any, 0, len(structs)*5) - - // for each value we build a bound SQL statement, then extract the values clause - for i, value := range structs { - valueSQL, valueArgs, err := sqlx.Named(sql, value) - if err != nil { - return "", nil, errors.Wrapf(err, "error converting bulk insert args") - } - - args = append(args, valueArgs...) - argValues := extractValues(valueSQL) - if argValues == "" { - return "", nil, errors.Errorf("error extracting VALUES from sql: %s", valueSQL) - } - - // append to our global values, adding comma if necessary - values.WriteString(argValues) - if i+1 < len(structs) { - values.WriteString(",") - } - } - - valuesSQL := extractValues(sql) - if valuesSQL == "" { - return "", nil, errors.Errorf("error extracting VALUES from sql: %s", sql) - } - - return tx.Rebind(strings.Replace(sql, valuesSQL, values.String(), -1)), args, nil -} - // extractValues is just a simple utility method that extracts the portion between `VALUE(` // and `)` in the passed in string. (leaving VALUE but not the parentheses) func extractValues(sql string) string { diff --git a/dbutil/query_test.go b/dbutil/bulk_test.go similarity index 100% rename from dbutil/query_test.go rename to dbutil/bulk_test.go From 738a18cb99f86e320014c1c5c0b7d1b0f858d4eb Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 28 Aug 2023 16:44:28 -0500 Subject: [PATCH 021/141] Update CHANGELOG.md for v1.39.1 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5efff7..671ebc9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.39.1 (2023-08-28) +------------------------- + * Rename dbutil.Queryer to BulkQueryer for clarity + v1.39.0 (2023-08-28) ------------------------- * Use any instead of interface{} From 64a5ea38bc53940feedbe451c63fa89534cdcffb Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 29 Aug 2023 11:33:11 -0500 Subject: [PATCH 022/141] Tweak BulkSQL test to include a CAST --- dbutil/bulk_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dbutil/bulk_test.go b/dbutil/bulk_test.go index 251375c..5dcaec2 100644 --- a/dbutil/bulk_test.go +++ b/dbutil/bulk_test.go @@ -59,11 +59,11 @@ func TestBulkSQL(t *testing.T) { assert.Equal(t, []any{1, "Bob", 2, "Cathy", 3, "George"}, args) // try a select - sql = `SELECT * FROM foo WHERE (id, name) IN (VALUES(:id, :name))` + sql = `SELECT * FROM foo WHERE (id, name) IN (VALUES(CAST(:id AS int), :name))` query, args, err = dbutil.BulkSQL(db, sql, []any{contact{ID: 1, Name: "Bob"}, contact{ID: 2, Name: "Cathy"}}) assert.NoError(t, err) - assert.Equal(t, `SELECT * FROM foo WHERE (id, name) IN (VALUES($1, $2),($3, $4))`, query) + assert.Equal(t, `SELECT * FROM foo WHERE (id, name) IN (VALUES(CAST($1 AS int), $2),(CAST($3 AS int), $4))`, query) assert.Equal(t, []any{1, "Bob", 2, "Cathy"}, args) } From 96c5b090d4f253bdfde9529ad4f6f6c19c53a059 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 29 Aug 2023 16:47:18 -0500 Subject: [PATCH 023/141] Rework syncx.Batcher so that it flushes a batch without waiting if it has enough items --- go.mod | 1 + go.sum | 5 ++-- syncx/batcher.go | 69 +++++++++++++++++++++++++++---------------- syncx/batcher_test.go | 41 ++++++++++++++++++++----- 4 files changed, 81 insertions(+), 35 deletions(-) diff --git a/go.mod b/go.mod index df5d8e4..1b44d85 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.3.1 github.com/stretchr/testify v1.8.4 + golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 golang.org/x/net v0.14.0 golang.org/x/text v0.12.0 ) diff --git a/go.sum b/go.sum index 8865099..2659528 100644 --- a/go.sum +++ b/go.sum @@ -21,8 +21,8 @@ github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -67,6 +67,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= +golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -99,7 +101,6 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= diff --git a/syncx/batcher.go b/syncx/batcher.go index 698a1b3..57cb5c5 100644 --- a/syncx/batcher.go +++ b/syncx/batcher.go @@ -3,25 +3,30 @@ package syncx import ( "sync" "time" + + "golang.org/x/exp/constraints" ) // Batcher allows values to be queued and processed in a background thread. type Batcher[T any] struct { - process func(batch []T) - timeout time.Duration - wg *sync.WaitGroup - buffer chan T - stop chan bool + process func(batch []T) + maxItems int + maxAge time.Duration + wg *sync.WaitGroup + buffer chan T + stop chan bool + batch []T } // NewBatcher creates a new batcher. -func NewBatcher[T any](process func(batch []T), timeout time.Duration, capacity int, wg *sync.WaitGroup) *Batcher[T] { +func NewBatcher[T any](process func(batch []T), maxItems int, maxAge time.Duration, capacity int, wg *sync.WaitGroup) *Batcher[T] { return &Batcher[T]{ - process: process, - timeout: timeout, - wg: wg, - buffer: make(chan T, capacity), - stop: make(chan bool), + process: process, + maxItems: maxItems, + maxAge: maxAge, + wg: wg, + buffer: make(chan T, capacity), + stop: make(chan bool), } } @@ -34,14 +39,28 @@ func (b *Batcher[T]) Start() { for { select { - case <-b.stop: - for len(b.buffer) > 0 { + case v := <-b.buffer: + b.batch = append(b.batch, v) + if len(b.batch) == b.maxItems { b.flush() } - return - case <-time.After(b.timeout): + case <-time.After(b.maxAge): b.flush() + + case <-b.stop: + for len(b.buffer) > 0 || len(b.batch) > 0 { + buffSize := len(b.buffer) + canRead := min(b.maxItems-len(b.batch), buffSize) + + for i := 0; i < canRead; i++ { + v := <-b.buffer + b.batch = append(b.batch, v) + } + + b.flush() + } + return } } }() @@ -59,18 +78,18 @@ func (b *Batcher[T]) Stop() { close(b.stop) } -// processes all values currently in the buffer +// flushes whatever has been batched func (b *Batcher[T]) flush() { - count := len(b.buffer) - if count <= 0 { - return + if len(b.batch) > 0 { + b.process(b.batch) + b.batch = make([]T, 0, b.maxItems) } +} - batch := make([]T, count) - for i := 0; i < count; i++ { - v := <-b.buffer - batch[i] = v +// TODO delete when on go 1.21 and this is builtin +func min[T constraints.Ordered](x T, y T) T { + if x < y { + return x } - - b.process(batch) + return y } diff --git a/syncx/batcher_test.go b/syncx/batcher_test.go index 6533b23..c47f5e2 100644 --- a/syncx/batcher_test.go +++ b/syncx/batcher_test.go @@ -10,23 +10,48 @@ import ( ) func TestBatcher(t *testing.T) { - batches := make([][]int, 0, 5) + batches := make([][]int, 0) wg := &sync.WaitGroup{} b := syncx.NewBatcher(func(batch []int) { batches = append(batches, batch) - }, time.Second, 3, wg) + }, 2, time.Second, 3, wg) b.Start() - assert.Equal(t, 2, b.Queue(1)) - assert.Equal(t, 1, b.Queue(2)) - assert.Equal(t, 0, b.Queue(3)) - assert.Equal(t, 2, b.Queue(4)) // blocks until 1,2,3 processed - assert.Equal(t, 1, b.Queue(5)) + b.Queue(1) // won't trigger a batch + + time.Sleep(time.Millisecond * 100) + assert.Equal(t, [][]int{}, batches) + + b.Queue(2) // 2 items triggers a batch + + time.Sleep(time.Millisecond * 100) + assert.Equal(t, [][]int{{1, 2}}, batches) + + b.Queue(3) + b.Queue(4) + + time.Sleep(time.Millisecond * 100) + assert.Equal(t, [][]int{{1, 2}, {3, 4}}, batches) + + b.Queue(5) + + time.Sleep(time.Millisecond * 100) // won't trigger a batch + assert.Equal(t, [][]int{{1, 2}, {3, 4}}, batches) + + time.Sleep(time.Millisecond * 1100) // batch forced because of age + assert.Equal(t, [][]int{{1, 2}, {3, 4}, {5}}, batches) + + time.Sleep(time.Millisecond * 1100) // empty batches never triggered + assert.Equal(t, [][]int{{1, 2}, {3, 4}, {5}}, batches) + + b.Queue(6) + b.Queue(7) + b.Queue(8) b.Stop() wg.Wait() - assert.Equal(t, [][]int{{1, 2, 3}, {4, 5}}, batches) + assert.Equal(t, [][]int{{1, 2}, {3, 4}, {5}, {6, 7}, {8}}, batches) } From 6f51a5deb3bf42c4a9fa1088409255eef0d46f45 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 29 Aug 2023 19:40:04 -0500 Subject: [PATCH 024/141] Fix batcher timeout behavior --- syncx/batcher.go | 42 ++++++++++++++++++++++++++---------------- syncx/batcher_test.go | 5 +++++ 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/syncx/batcher.go b/syncx/batcher.go index 57cb5c5..93eb8c5 100644 --- a/syncx/batcher.go +++ b/syncx/batcher.go @@ -12,10 +12,12 @@ type Batcher[T any] struct { process func(batch []T) maxItems int maxAge time.Duration - wg *sync.WaitGroup - buffer chan T - stop chan bool - batch []T + + wg *sync.WaitGroup + buffer chan T + stop chan bool + batch []T + timeout <-chan time.Time } // NewBatcher creates a new batcher. @@ -27,6 +29,8 @@ func NewBatcher[T any](process func(batch []T), maxItems int, maxAge time.Durati wg: wg, buffer: make(chan T, capacity), stop: make(chan bool), + batch: make([]T, 0, maxItems), + timeout: time.After(maxAge), } } @@ -45,21 +49,12 @@ func (b *Batcher[T]) Start() { b.flush() } - case <-time.After(b.maxAge): + case <-b.timeout: b.flush() case <-b.stop: - for len(b.buffer) > 0 || len(b.batch) > 0 { - buffSize := len(b.buffer) - canRead := min(b.maxItems-len(b.batch), buffSize) - - for i := 0; i < canRead; i++ { - v := <-b.buffer - b.batch = append(b.batch, v) - } - - b.flush() - } + b.drain() + close(b.buffer) return } } @@ -83,6 +78,21 @@ func (b *Batcher[T]) flush() { if len(b.batch) > 0 { b.process(b.batch) b.batch = make([]T, 0, b.maxItems) + b.timeout = time.After(b.maxAge) + } +} + +func (b *Batcher[T]) drain() { + for len(b.buffer) > 0 || len(b.batch) > 0 { + buffSize := len(b.buffer) + canRead := min(b.maxItems-len(b.batch), buffSize) + + for i := 0; i < canRead; i++ { + v := <-b.buffer + b.batch = append(b.batch, v) + } + + b.flush() } } diff --git a/syncx/batcher_test.go b/syncx/batcher_test.go index c47f5e2..8933a56 100644 --- a/syncx/batcher_test.go +++ b/syncx/batcher_test.go @@ -54,4 +54,9 @@ func TestBatcher(t *testing.T) { wg.Wait() assert.Equal(t, [][]int{{1, 2}, {3, 4}, {5}, {6, 7}, {8}}, batches) + + // panic if you try to queue to a stopped batcher + assert.Panics(t, func() { + b.Queue(9) + }) } From f34ace1308905defaf48f0779ae4c105a654c27a Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 30 Aug 2023 16:30:49 -0500 Subject: [PATCH 025/141] Tweak batcher timeout so it starts from when something has been queued --- syncx/batcher.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/syncx/batcher.go b/syncx/batcher.go index 93eb8c5..ef276dd 100644 --- a/syncx/batcher.go +++ b/syncx/batcher.go @@ -30,7 +30,7 @@ func NewBatcher[T any](process func(batch []T), maxItems int, maxAge time.Durati buffer: make(chan T, capacity), stop: make(chan bool), batch: make([]T, 0, maxItems), - timeout: time.After(maxAge), + timeout: nil, } } @@ -45,11 +45,19 @@ func (b *Batcher[T]) Start() { select { case v := <-b.buffer: b.batch = append(b.batch, v) + + // if this is the first item in the batch we need to restart the age timeout + if b.timeout == nil { + b.timeout = time.After(b.maxAge) + } + + // if we have a full batch, flush it if len(b.batch) == b.maxItems { b.flush() } case <-b.timeout: + // flush whatever we have b.flush() case <-b.stop: @@ -78,7 +86,7 @@ func (b *Batcher[T]) flush() { if len(b.batch) > 0 { b.process(b.batch) b.batch = make([]T, 0, b.maxItems) - b.timeout = time.After(b.maxAge) + b.timeout = nil } } From b946c1e13c6be16b3fe7194e28df2a861c1897ca Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 30 Aug 2023 17:49:37 -0500 Subject: [PATCH 026/141] Improve comments on Batcher --- syncx/batcher.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/syncx/batcher.go b/syncx/batcher.go index ef276dd..38208e6 100644 --- a/syncx/batcher.go +++ b/syncx/batcher.go @@ -20,14 +20,15 @@ type Batcher[T any] struct { timeout <-chan time.Time } -// NewBatcher creates a new batcher. -func NewBatcher[T any](process func(batch []T), maxItems int, maxAge time.Duration, capacity int, wg *sync.WaitGroup) *Batcher[T] { +// NewBatcher creates a new batcher. Queued items are passed to the `process` callback in batches of `maxItems` maximum +// size. Processing of a batch is triggered by reaching `maxItems` or `maxAge` since the oldest unprocessed item was queued. +func NewBatcher[T any](process func(batch []T), maxItems int, maxAge time.Duration, bufferSize int, wg *sync.WaitGroup) *Batcher[T] { return &Batcher[T]{ process: process, maxItems: maxItems, maxAge: maxAge, wg: wg, - buffer: make(chan T, capacity), + buffer: make(chan T, bufferSize), stop: make(chan bool), batch: make([]T, 0, maxItems), timeout: nil, From cb488fd284990ba59ad6c76ef1d02eb75810e77b Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 31 Aug 2023 11:08:21 -0500 Subject: [PATCH 027/141] Fix return value from Batcher.Queue --- syncx/batcher.go | 5 +++-- syncx/batcher_test.go | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/syncx/batcher.go b/syncx/batcher.go index 38208e6..b0b3882 100644 --- a/syncx/batcher.go +++ b/syncx/batcher.go @@ -70,11 +70,11 @@ func (b *Batcher[T]) Start() { }() } -// Queue queues the given value, potentially blocking. Returns the new free capacity. +// Queue queues the given value, potentially blocking. Returns the new free capacity (batch + buffer). func (b *Batcher[T]) Queue(value T) int { b.buffer <- value - return cap(b.buffer) - len(b.buffer) + return (cap(b.batch) + cap(b.buffer)) - (len(b.batch) + len(b.buffer)) } // Stop stops this batcher. @@ -91,6 +91,7 @@ func (b *Batcher[T]) flush() { } } +// processes everything in the batch and buffer until they're both empty func (b *Batcher[T]) drain() { for len(b.buffer) > 0 || len(b.batch) > 0 { buffSize := len(b.buffer) diff --git a/syncx/batcher_test.go b/syncx/batcher_test.go index 8933a56..5103679 100644 --- a/syncx/batcher_test.go +++ b/syncx/batcher_test.go @@ -19,7 +19,7 @@ func TestBatcher(t *testing.T) { b.Start() - b.Queue(1) // won't trigger a batch + assert.Equal(t, 4, b.Queue(1)) // won't trigger a batch time.Sleep(time.Millisecond * 100) assert.Equal(t, [][]int{}, batches) From a98a47136b9f5cea833a0970396e61fe76d1a5e5 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 31 Aug 2023 11:16:05 -0500 Subject: [PATCH 028/141] Update CHANGELOG.md for v1.40.0 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 671ebc9..1e76a26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.40.0 (2023-08-31) +------------------------- + * Rework syncx.Batcher so that it flushes a batch without waiting if it has enough items + v1.39.1 (2023-08-28) ------------------------- * Rename dbutil.Queryer to BulkQueryer for clarity From ae0c46d6f1b1cd56a519042516a575fb7d35212f Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 4 Sep 2023 11:44:59 -0500 Subject: [PATCH 029/141] Move some locales code from goflow/envs --- go.mod | 1 + go.sum | 2 ++ i18n/country.go | 29 ++++++++++++++++ i18n/country_test.go | 29 ++++++++++++++++ i18n/language._test.go | 36 +++++++++++++++++++ i18n/language.go | 50 ++++++++++++++++++++++++++ i18n/locale.go | 79 ++++++++++++++++++++++++++++++++++++++++++ i18n/locale_test.go | 62 +++++++++++++++++++++++++++++++++ 8 files changed, 288 insertions(+) create mode 100644 i18n/country.go create mode 100644 i18n/country_test.go create mode 100644 i18n/language._test.go create mode 100644 i18n/language.go create mode 100644 i18n/locale.go create mode 100644 i18n/locale_test.go diff --git a/go.mod b/go.mod index 1b44d85..4edaaab 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/jmoiron/sqlx v1.3.5 github.com/lib/pq v1.10.9 github.com/nyaruka/librato v1.0.0 + github.com/nyaruka/null/v2 v2.0.3 github.com/nyaruka/phonenumbers v1.1.8 github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.3.1 diff --git a/go.sum b/go.sum index 2659528..1024d8c 100644 --- a/go.sum +++ b/go.sum @@ -39,6 +39,8 @@ github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRU github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/nyaruka/librato v1.0.0 h1:Vznj9WCeC1yZXbBYyYp40KnbmXLbEkjKmHesV/v2SR0= github.com/nyaruka/librato v1.0.0/go.mod h1:pkRNLFhFurOz0QqBz6/DuTFhHHxAubWxs4Jx+J7yUgg= +github.com/nyaruka/null/v2 v2.0.3 h1:rdmMRQyVzrOF3Jff/gpU/7BDR9mQX0lcLl4yImsA3kw= +github.com/nyaruka/null/v2 v2.0.3/go.mod h1:OCVeCkCXwrg5/qE6RU0c1oUVZBy+ZDrT+xYg1XSaIWA= github.com/nyaruka/phonenumbers v1.1.8 h1:mjFu85FeoH2Wy18aOMUvxqi1GgAqiQSJsa/cCC5yu2s= github.com/nyaruka/phonenumbers v1.1.8/go.mod h1:DC7jZd321FqUe+qWSNcHi10tyIyGNXGcNbfkPvdp1Vs= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= diff --git a/i18n/country.go b/i18n/country.go new file mode 100644 index 0000000..5fef6ed --- /dev/null +++ b/i18n/country.go @@ -0,0 +1,29 @@ +package i18n + +import ( + "database/sql/driver" + + "github.com/nyaruka/null/v2" + "github.com/nyaruka/phonenumbers" +) + +// Country is a ISO 3166-1 alpha-2 country code +type Country string + +// NilCountry represents our nil, or unknown country +var NilCountry = Country("") + +// DeriveCountryFromTel attempts to derive a country code (e.g. RW) from a phone number +func DeriveCountryFromTel(number string) Country { + parsed, err := phonenumbers.Parse(number, "") + if err != nil { + return "" + } + return Country(phonenumbers.GetRegionCodeForNumber(parsed)) +} + +// Place nicely with NULLs if persisting to a database or JSON +func (c *Country) Scan(value any) error { return null.ScanString(value, c) } +func (c Country) Value() (driver.Value, error) { return null.StringValue(c) } +func (c Country) MarshalJSON() ([]byte, error) { return null.MarshalString(c) } +func (c *Country) UnmarshalJSON(b []byte) error { return null.UnmarshalString(b, c) } diff --git a/i18n/country_test.go b/i18n/country_test.go new file mode 100644 index 0000000..609dc4f --- /dev/null +++ b/i18n/country_test.go @@ -0,0 +1,29 @@ +package i18n_test + +import ( + "testing" + + "github.com/nyaruka/gocommon/i18n" + "github.com/stretchr/testify/assert" +) + +func TestDeriveCountryFromTel(t *testing.T) { + assert.Equal(t, i18n.Country("RW"), i18n.DeriveCountryFromTel("+250788383383")) + assert.Equal(t, i18n.Country("EC"), i18n.DeriveCountryFromTel("+593979000000")) + assert.Equal(t, i18n.NilCountry, i18n.DeriveCountryFromTel("1234")) + + v, err := i18n.Country("RW").Value() + assert.NoError(t, err) + assert.Equal(t, "RW", v) + + v, err = i18n.NilCountry.Value() + assert.NoError(t, err) + assert.Nil(t, v) + + var c i18n.Country + assert.NoError(t, c.Scan("RW")) + assert.Equal(t, i18n.Country("RW"), c) + + assert.NoError(t, c.Scan(nil)) + assert.Equal(t, i18n.NilCountry, c) +} diff --git a/i18n/language._test.go b/i18n/language._test.go new file mode 100644 index 0000000..190a8c4 --- /dev/null +++ b/i18n/language._test.go @@ -0,0 +1,36 @@ +package i18n_test + +import ( + "testing" + + "github.com/nyaruka/gocommon/i18n" + + "github.com/stretchr/testify/assert" +) + +func TestLanguage(t *testing.T) { + lang, err := i18n.ParseLanguage("ENG") + assert.NoError(t, err) + assert.Equal(t, i18n.Language("eng"), lang) + + _, err = i18n.ParseLanguage("base") + assert.EqualError(t, err, "iso-639-3 codes must be 3 characters, got: base") + + _, err = i18n.ParseLanguage("xzx") + assert.EqualError(t, err, "unrecognized language code: xzx") + + v, err := i18n.Language("eng").Value() + assert.NoError(t, err) + assert.Equal(t, "eng", v) + + v, err = i18n.NilLanguage.Value() + assert.NoError(t, err) + assert.Nil(t, v) + + var l i18n.Language + assert.NoError(t, l.Scan("eng")) + assert.Equal(t, i18n.Language("eng"), l) + + assert.NoError(t, l.Scan(nil)) + assert.Equal(t, i18n.NilLanguage, l) +} diff --git a/i18n/language.go b/i18n/language.go new file mode 100644 index 0000000..2572296 --- /dev/null +++ b/i18n/language.go @@ -0,0 +1,50 @@ +package i18n + +import ( + "database/sql/driver" + + "github.com/nyaruka/null/v2" + "github.com/pkg/errors" + "golang.org/x/text/language" +) + +// Language is holds a an ISO-639-3 language code. +type Language string + +// ISO639_1 returns the ISO-639-1 2-letter code for this language if it has one +func (l Language) ISO639_1() string { + base, err := language.ParseBase(string(l)) + if err != nil { + return "" + } + code := base.String() + + // not all languages have a 2-letter code + if len(code) != 2 { + return "" + } + return code +} + +// NilLanguage represents our nil, or unknown language +var NilLanguage = Language("") + +// ParseLanguage returns a new Language for the passed in language string, or an error if not found +func ParseLanguage(lang string) (Language, error) { + if len(lang) != 3 { + return NilLanguage, errors.Errorf("iso-639-3 codes must be 3 characters, got: %s", lang) + } + + base, err := language.ParseBase(lang) + if err != nil { + return NilLanguage, errors.Errorf("unrecognized language code: %s", lang) + } + + return Language(base.ISO3()), nil +} + +// Place nicely with NULLs if persisting to a database or JSON +func (l *Language) Scan(value any) error { return null.ScanString(value, l) } +func (l Language) Value() (driver.Value, error) { return null.StringValue(l) } +func (l Language) MarshalJSON() ([]byte, error) { return null.MarshalString(l) } +func (l *Language) UnmarshalJSON(b []byte) error { return null.UnmarshalString(b, l) } diff --git a/i18n/locale.go b/i18n/locale.go new file mode 100644 index 0000000..b40c85f --- /dev/null +++ b/i18n/locale.go @@ -0,0 +1,79 @@ +package i18n + +import ( + "database/sql/driver" + "fmt" + "strings" + + "github.com/nyaruka/null/v2" + "golang.org/x/text/language" +) + +// Locale is the combination of a language and optional country, e.g. US English, Brazilian Portuguese, encoded as the +// language code followed by the country code, e.g. eng-US, por-BR. Every locale is valid BCP47 language tag, tho not +// every BCP47 language tag is a valid goflow locale because we only use ISO-639-3 3 letter codes to represent language. +type Locale string + +// NewLocale creates a new locale +func NewLocale(l Language, c Country) Locale { + if l == NilLanguage { + return NilLocale + } + if c == NilCountry { + return Locale(l) // e.g. "eng", "por" + } + return Locale(fmt.Sprintf("%s-%s", l, c)) // e.g. "eng-US", "por-BR" +} + +func (l Locale) Split() (Language, Country) { + if l == NilLocale || len(l) < 3 { + return NilLanguage, NilCountry + } + + parts := strings.SplitN(string(l), "-", 2) + lang := Language(parts[0]) + country := NilCountry + if len(parts) > 1 { + country = Country(parts[1]) + } + + return lang, country +} + +func (l Locale) tag() language.Tag { + return language.MustParse(string(l)) +} + +var NilLocale = Locale("") + +// Place nicely with NULLs if persisting to a database or JSON +func (l *Locale) Scan(value any) error { return null.ScanString(value, l) } +func (l Locale) Value() (driver.Value, error) { return null.StringValue(l) } +func (l Locale) MarshalJSON() ([]byte, error) { return null.MarshalString(l) } +func (l *Locale) UnmarshalJSON(b []byte) error { return null.UnmarshalString(b, l) } + +// BCP47Matcher helps find best matching locale from a set of available locales +type BCP47Matcher struct { + codes []string + matcher language.Matcher +} + +// NewBCP47Matcher creates a new BCP47 matcher from the set of available locales which must be valid BCP47 tags. +func NewBCP47Matcher(codes ...string) *BCP47Matcher { + tags := make([]language.Tag, len(codes)) + for i := range codes { + tags[i] = language.MustParse(codes[i]) + } + return &BCP47Matcher{codes: codes, matcher: language.NewMatcher(tags)} +} + +func (m *BCP47Matcher) ForLocales(preferred ...Locale) string { + prefTags := make([]language.Tag, len(preferred)) + for i := range preferred { + prefTags[i] = preferred[i].tag() + } + + // see https://github.com/golang/go/issues/24211 + _, idx, _ := m.matcher.Match(prefTags...) + return m.codes[idx] +} diff --git a/i18n/locale_test.go b/i18n/locale_test.go new file mode 100644 index 0000000..8b02fde --- /dev/null +++ b/i18n/locale_test.go @@ -0,0 +1,62 @@ +package i18n_test + +import ( + "testing" + + "github.com/nyaruka/gocommon/i18n" + "github.com/stretchr/testify/assert" +) + +func TestLocale(t *testing.T) { + assert.Equal(t, i18n.Locale(""), i18n.NewLocale("", "")) + assert.Equal(t, i18n.Locale(""), i18n.NewLocale("", "US")) // invalid without language + assert.Equal(t, i18n.Locale("eng"), i18n.NewLocale("eng", "")) // valid without country + assert.Equal(t, i18n.Locale("eng-US"), i18n.NewLocale("eng", "US")) + + l, c := i18n.Locale("eng-US").Split() + assert.Equal(t, i18n.Language("eng"), l) + assert.Equal(t, i18n.Country("US"), c) + + l, c = i18n.NilLocale.Split() + assert.Equal(t, i18n.NilLanguage, l) + assert.Equal(t, i18n.NilCountry, c) + + v, err := i18n.NewLocale("eng", "US").Value() + assert.NoError(t, err) + assert.Equal(t, "eng-US", v) + + v, err = i18n.NilLanguage.Value() + assert.NoError(t, err) + assert.Nil(t, v) + + var lc i18n.Locale + assert.NoError(t, lc.Scan("eng-US")) + assert.Equal(t, i18n.Locale("eng-US"), lc) + + assert.NoError(t, lc.Scan(nil)) + assert.Equal(t, i18n.NilLocale, lc) +} + +func TesBCP47Matcher(t *testing.T) { + tests := []struct { + preferred []i18n.Locale + available []string + best string + }{ + {preferred: []i18n.Locale{"eng-US"}, available: []string{"es_EC", "en-US"}, best: "en-US"}, + {preferred: []i18n.Locale{"eng-US"}, available: []string{"es", "en"}, best: "en"}, + {preferred: []i18n.Locale{"eng"}, available: []string{"es-US", "en-UK"}, best: "en-UK"}, + {preferred: []i18n.Locale{"eng", "fra"}, available: []string{"fr-CA", "en-RW"}, best: "en-RW"}, + {preferred: []i18n.Locale{"eng", "fra"}, available: []string{"fra-CA", "eng-RW"}, best: "eng-RW"}, + {preferred: []i18n.Locale{"fra", "eng"}, available: []string{"fra-CA", "eng-RW"}, best: "fra-CA"}, + {preferred: []i18n.Locale{"spa"}, available: []string{"es-EC", "es-MX", "es-ES"}, best: "es-ES"}, + {preferred: []i18n.Locale{}, available: []string{"es_EC", "en-US"}, best: "es_EC"}, + } + + for _, tc := range tests { + m := i18n.NewBCP47Matcher(tc.available...) + best := m.ForLocales(tc.preferred...) + + assert.Equal(t, tc.best, best, "locale mismatch for preferred=%v available=%s", tc.preferred, tc.available) + } +} From 6260ba05f771713293c21e040bc28284314fc52b Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 4 Sep 2023 11:49:17 -0500 Subject: [PATCH 030/141] Update CHANGELOG.md for v1.41.0 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e76a26..7072d57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.41.0 (2023-09-04) +------------------------- + * Move some locales code from goflow/envs + v1.40.0 (2023-08-31) ------------------------- * Rework syncx.Batcher so that it flushes a batch without waiting if it has enough items From 3cb6cd0b2090f0c4790569ecb5a2244657203f3b Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 4 Sep 2023 17:01:56 -0500 Subject: [PATCH 031/141] Use i18n.Locale for date formatting --- dates/date.go | 6 ++- dates/format.go | 54 ++++++++++++------------- dates/format_test.go | 92 +++++++++++++++++++++---------------------- dates/i18n.go | 65 ++++++++---------------------- dates/i18n/dates.json | 1 + dates/i18n/i18n.json | 1 - dates/i18n_test.go | 36 +++++++++-------- dates/timeofday.go | 6 ++- 8 files changed, 117 insertions(+), 144 deletions(-) create mode 100644 dates/i18n/dates.json delete mode 100644 dates/i18n/i18n.json diff --git a/dates/date.go b/dates/date.go index 98fa406..cf24055 100644 --- a/dates/date.go +++ b/dates/date.go @@ -3,6 +3,8 @@ package dates import ( "database/sql/driver" "time" + + "github.com/nyaruka/gocommon/i18n" ) const ( @@ -48,9 +50,9 @@ func (d Date) Combine(tod TimeOfDay, tz *time.Location) time.Time { } // Format formats this date as a string using the given layout -func (d Date) Format(layout, locale string) (string, error) { +func (d Date) Format(layout string, loc i18n.Locale) (string, error) { // upgrade us to a date time so we can use standard time.Time formatting - return Format(d.Combine(ZeroTimeOfDay, time.UTC), layout, locale, DateOnlyLayouts) + return Format(d.Combine(ZeroTimeOfDay, time.UTC), layout, loc, DateOnlyLayouts) } // Weekday returns the day of the week diff --git a/dates/format.go b/dates/format.go index 6c01105..2299d11 100644 --- a/dates/format.go +++ b/dates/format.go @@ -5,6 +5,7 @@ import ( "strings" "time" + "github.com/nyaruka/gocommon/i18n" "github.com/pkg/errors" ) @@ -105,41 +106,40 @@ func ValidateFormat(layout string, type_ LayoutType, mode LayoutMode) error { // // If type is DateOnlyLayouts or DateTimeLayouts, the following sequences are accepted: // -// `YY` - last two digits of year 0-99 -// `YYYY` - four digits of your 0000-9999 -// `M` - month 1-12 -// `MM` - month 01-12 -// `MMM` - month Jan-Dec (localized using given locale) -// `MMMM` - month January-December (localized using given locale) -// `D` - day of month 1-31 -// `DD` - day of month, zero padded 0-31 -// `EEE` - day of week Mon-Sun (localized using given locale) -// `EEEE` - day of week Monday-Sunday (localized using given locale) +// `YY` - last two digits of year 0-99 +// `YYYY` - four digits of your 0000-9999 +// `M` - month 1-12 +// `MM` - month 01-12 +// `MMM` - month Jan-Dec (localized using given locale) +// `MMMM` - month January-December (localized using given locale) +// `D` - day of month 1-31 +// `DD` - day of month, zero padded 0-31 +// `EEE` - day of week Mon-Sun (localized using given locale) +// `EEEE` - day of week Monday-Sunday (localized using given locale) // // If type is TimeOnlyLayouts or DateTimeLayouts, the following sequences are accepted: // -// `h` - hour of the day 1-12 -// `hh` - hour of the day 01-12 -// `t` - twenty four hour of the day 0-23 -// `tt` - twenty four hour of the day 00-23 -// `m` - minute 0-59 -// `mm` - minute 00-59 -// `s` - second 0-59 -// `ss` - second 00-59 -// `fff` - milliseconds -// `ffffff` - microseconds -// `fffffffff` - nanoseconds -// `aa` - am or pm (localized using given locale) -// `AA` - AM or PM (localized using given locale) +// `h` - hour of the day 1-12 +// `hh` - hour of the day 01-12 +// `t` - twenty four hour of the day 0-23 +// `tt` - twenty four hour of the day 00-23 +// `m` - minute 0-59 +// `mm` - minute 00-59 +// `s` - second 0-59 +// `ss` - second 00-59 +// `fff` - milliseconds +// `ffffff` - microseconds +// `fffffffff` - nanoseconds +// `aa` - am or pm (localized using given locale) +// `AA` - AM or PM (localized using given locale) // // If type is DateTimeLayouts, the following sequences are accepted: // -// `Z` - hour and minute offset from UTC, or Z for UTC -// `ZZZ` - hour and minute offset from UTC +// `Z` - hour and minute offset from UTC, or Z for UTC +// `ZZZ` - hour and minute offset from UTC // // The following chars are allowed and ignored: ' ', ':', ',', 'T', '-', '_', '/' -// -func Format(t time.Time, layout string, locale string, type_ LayoutType) (string, error) { +func Format(t time.Time, layout string, locale i18n.Locale, type_ LayoutType) (string, error) { output := bytes.Buffer{} translation := GetTranslation(locale) diff --git a/dates/format_test.go b/dates/format_test.go index 917a732..8c8c650 100644 --- a/dates/format_test.go +++ b/dates/format_test.go @@ -6,7 +6,7 @@ import ( "time" "github.com/nyaruka/gocommon/dates" - + "github.com/nyaruka/gocommon/i18n" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -22,61 +22,61 @@ func TestFormat(t *testing.T) { tests := []struct { value time.Time layout string - locale string + locale i18n.Locale expected string err string }{ {d1, "MM-DD-YYYY", "en-US", "01-02-2006", ""}, - {d1, "M-D-YY", "en-US", "1-2-06", ""}, - {d1, "h:m", "en-US", "3:4", ""}, - {d1, "h:m:s aa", "en-US", "3:4:5 pm", ""}, - {d1, "h:m:s AA", "en-US", "3:4:5 PM", ""}, - {d1, "tt:mm:ss", "en-US", "15:04:05", ""}, - {d2, "tt:mm:ss", "en-US", "09:45:30", ""}, - {d2, "t:mm:ss", "en-US", "9:45:30", ""}, - {d1, "YYYY-MM-DDTtt:mm:ssZZZ", "en-US", "2006-01-02T15:04:05-07:00", ""}, - {d1, "YYYY-MM-DDTtt:mm:ssZZZ", "en-US", "2006-01-02T15:04:05-07:00", ""}, - {d1, "YYYY-MM-DDThh:mm:ss.fffZZZ", "en-US", "2006-01-02T03:04:05.123-07:00", ""}, - {d1, "YYYY-MM-DDThh:mm:ss.fffZ", "en-US", "2006-01-02T03:04:05.123-07:00", ""}, - {d1, "YY-M-D", "en-US", "06-1-2", ""}, - {d1, "YYYY-MM-DD", "en-US", "2006-01-02", ""}, - {d1, "YYYY-MMM-DD", "en-US", "2006-Jan-02", ""}, - {d1, "YYYY-MMMM-DD", "en-US", "2006-January-02", ""}, - {d1, "//YY--MM::DD..", "en-US", "//06--01::02..", ""}, + {d1, "M-D-YY", "eng-US", "1-2-06", ""}, + {d1, "h:m", "eng-US", "3:4", ""}, + {d1, "h:m:s aa", "eng-US", "3:4:5 pm", ""}, + {d1, "h:m:s AA", "eng-US", "3:4:5 PM", ""}, + {d1, "tt:mm:ss", "eng-US", "15:04:05", ""}, + {d2, "tt:mm:ss", "eng-US", "09:45:30", ""}, + {d2, "t:mm:ss", "eng-US", "9:45:30", ""}, + {d1, "YYYY-MM-DDTtt:mm:ssZZZ", "eng-US", "2006-01-02T15:04:05-07:00", ""}, + {d1, "YYYY-MM-DDTtt:mm:ssZZZ", "eng-US", "2006-01-02T15:04:05-07:00", ""}, + {d1, "YYYY-MM-DDThh:mm:ss.fffZZZ", "eng-US", "2006-01-02T03:04:05.123-07:00", ""}, + {d1, "YYYY-MM-DDThh:mm:ss.fffZ", "eng-US", "2006-01-02T03:04:05.123-07:00", ""}, + {d1, "YY-M-D", "eng-US", "06-1-2", ""}, + {d1, "YYYY-MM-DD", "eng-US", "2006-01-02", ""}, + {d1, "YYYY-MMM-DD", "eng-US", "2006-Jan-02", ""}, + {d1, "YYYY-MMMM-DD", "eng-US", "2006-January-02", ""}, + {d1, "//YY--MM::DD..", "eng-US", "//06--01::02..", ""}, // localization - {d1, "EEE EEEE MMM MMMM AA aa", "en-US", "Mon Monday Jan January PM pm", ""}, - {d1, "EEE EEEE MMM MMMM AA aa", "es-EC", "lun lunes ene enero PM pm", ""}, - {d1, "EEE EEEE MMM MMMM AA aa", "ar-QA", "ن الاثنين ينا يناير م م", ""}, - {d1, "EEE EEEE MMM MMMM AA aa", "ru", "Пн Понедельник янв января PM pm", ""}, - {d1, "EEE EEEE MMM MMMM AA aa", "ti", "ሰኑይ ሰኑይ ጥሪ ጥሪ ድሕር ሰዓት ድሕር ሰዓት", ""}, - {d2, "EEE EEEE MMM MMMM AA aa", "en-US", "Sat Saturday Apr April AM am", ""}, - {d2, "EEE EEEE MMM MMMM AA aa", "es-EC", "sáb sábado abr abril AM am", ""}, - {d2, "EEE EEEE MMM MMMM AA aa", "ar-QA", "س السبت أبر أبريل ص ص", ""}, - {d2, "EEE EEEE MMM MMMM AA aa", "ru", "Сб Суббота апр апреля AM am", ""}, - {d2, "EEE EEEE MMM MMMM AA aa", "ti", "ቀዳም ቀዳም ሚያዝ ሚያዝያ ንጉሆ ሰዓተ ንጉሆ ሰዓተ", ""}, - {d3, "EEE EEEE MMM MMMM AA aa", "en-US", "Tue Tuesday Dec December PM pm", ""}, - {d3, "EEE EEEE MMM MMMM AA aa", "es-EC", "mar martes dic diciembre PM pm", ""}, - {d3, "EEE EEEE MMM MMMM AA aa", "ar-QA", "ث الثلاثاء ديس ديسمبر م م", ""}, - {d3, "EEE EEEE MMM MMMM AA aa", "ru", "Вт Вторник дек декабря PM pm", ""}, - {d3, "EEE EEEE MMM MMMM AA aa", "ti", "ሰሉስ ሰሉስ ታሕሳ ታሕሳስ ድሕር ሰዓት ድሕር ሰዓት", ""}, + {d1, "EEE EEEE MMM MMMM AA aa", "eng-US", "Mon Monday Jan January PM pm", ""}, + {d1, "EEE EEEE MMM MMMM AA aa", "spa-EC", "lun lunes ene enero PM pm", ""}, + {d1, "EEE EEEE MMM MMMM AA aa", "ara-QA", "ن الاثنين ينا يناير م م", ""}, + {d1, "EEE EEEE MMM MMMM AA aa", "rus", "Пн Понедельник янв января PM pm", ""}, + {d1, "EEE EEEE MMM MMMM AA aa", "tir", "ሰኑይ ሰኑይ ጃንዩ ጃንዩወሪ ድሕር ሰዓት ድሕር ሰዓት", ""}, + {d2, "EEE EEEE MMM MMMM AA aa", "eng-US", "Sat Saturday Apr April AM am", ""}, + {d2, "EEE EEEE MMM MMMM AA aa", "spa-EC", "sáb sábado abr abril AM am", ""}, + {d2, "EEE EEEE MMM MMMM AA aa", "ara-QA", "س السبت أبر أبريل ص ص", ""}, + {d2, "EEE EEEE MMM MMMM AA aa", "rus", "Сб Суббота апр апреля AM am", ""}, + {d2, "EEE EEEE MMM MMMM AA aa", "tir", "ቀዳም ቀዳም ኤፕረ ኤፕረል ንጉሆ ሰዓተ ንጉሆ ሰዓተ", ""}, + {d3, "EEE EEEE MMM MMMM AA aa", "eng-US", "Tue Tuesday Dec December PM pm", ""}, + {d3, "EEE EEEE MMM MMMM AA aa", "spa-EC", "mar martes dic diciembre PM pm", ""}, + {d3, "EEE EEEE MMM MMMM AA aa", "ara-QA", "ث الثلاثاء ديس ديسمبر م م", ""}, + {d3, "EEE EEEE MMM MMMM AA aa", "rus", "Вт Вторник дек декабря PM pm", ""}, + {d3, "EEE EEEE MMM MMMM AA aa", "tir", "ሰሉስ ሰሉስ ዲሴም ዲሴምበር ድሕር ሰዓት ድሕር ሰዓት", ""}, // fractional seconds - {d1, "tt:mm:ss.fff", "en-US", "15:04:05.123", ""}, - {d1, "tt:mm:ss.ffffff", "en-US", "15:04:05.123456", ""}, - {d1, "tt:mm:ss.fffffffff", "en-US", "15:04:05.123456789", ""}, + {d1, "tt:mm:ss.fff", "eng-US", "15:04:05.123", ""}, + {d1, "tt:mm:ss.ffffff", "eng-US", "15:04:05.123456", ""}, + {d1, "tt:mm:ss.fffffffff", "eng-US", "15:04:05.123456789", ""}, // errors - {d1, "YYY-MM-DD", "en-US", "", "'YYY' is not valid in a datetime formatting layout"}, - {d1, "YYYY-MMMMM-DD", "en-US", "", "'MMMMM' is not valid in a datetime formatting layout"}, - {d1, "EE", "en-US", "", "'EE' is not valid in a datetime formatting layout"}, - {d1, "tt:mm:ss.ffff", "en-US", "", "'ffff' is not valid in a datetime formatting layout"}, - {d1, "tt:mmm:ss.ffff", "en-US", "", "'mmm' is not valid in a datetime formatting layout"}, - {d1, "tt:mm:sss", "en-US", "", "'sss' is not valid in a datetime formatting layout"}, - {d1, "tt:mm:ss a", "en-US", "", "'a' is not valid in a datetime formatting layout"}, - {d1, "tt:mm:ss A", "en-US", "", "'A' is not valid in a datetime formatting layout"}, - {d1, "tt:mm:ssZZZZ", "en-US", "", "'ZZZZ' is not valid in a datetime formatting layout"}, - {d1, "2006-01-02", "en-US", "", "'2' is not valid in a datetime formatting layout"}, + {d1, "YYY-MM-DD", "eng-US", "", "'YYY' is not valid in a datetime formatting layout"}, + {d1, "YYYY-MMMMM-DD", "eng-US", "", "'MMMMM' is not valid in a datetime formatting layout"}, + {d1, "EE", "eng-US", "", "'EE' is not valid in a datetime formatting layout"}, + {d1, "tt:mm:ss.ffff", "eng-US", "", "'ffff' is not valid in a datetime formatting layout"}, + {d1, "tt:mmm:ss.ffff", "eng-US", "", "'mmm' is not valid in a datetime formatting layout"}, + {d1, "tt:mm:sss", "eng-US", "", "'sss' is not valid in a datetime formatting layout"}, + {d1, "tt:mm:ss a", "eng-US", "", "'a' is not valid in a datetime formatting layout"}, + {d1, "tt:mm:ss A", "eng-US", "", "'A' is not valid in a datetime formatting layout"}, + {d1, "tt:mm:ssZZZZ", "eng-US", "", "'ZZZZ' is not valid in a datetime formatting layout"}, + {d1, "2006-01-02", "eng-US", "", "'2' is not valid in a datetime formatting layout"}, } for _, tc := range tests { diff --git a/dates/i18n.go b/dates/i18n.go index df4dea9..4007d84 100644 --- a/dates/i18n.go +++ b/dates/i18n.go @@ -2,15 +2,17 @@ package dates import ( _ "embed" - "encoding/json" - "sort" + + "github.com/nyaruka/gocommon/i18n" + "github.com/nyaruka/gocommon/jsonx" + "golang.org/x/exp/maps" ) -// file containing day and month translations, generated using https://github.com/nyaruka/go-locales +// File containing day and month translations, generated using https://github.com/nyaruka/go-locales // -// ./localesdump --bcp47 --merge days=LC_TIME.day short_days=LC_TIME.abday months=LC_TIME.mon short_months=LC_TIME.abmon am_pm=LC_TIME.am_pm > dates.json +// ./localesdump --merge days=LC_TIME.day short_days=LC_TIME.abday months=LC_TIME.mon short_months=LC_TIME.abmon am_pm=LC_TIME.am_pm > dates.json // -//go:embed i18n/i18n.json +//go:embed i18n/dates.json var i18nJSON []byte type Translation struct { @@ -21,15 +23,14 @@ type Translation struct { AmPm []string `json:"am_pm"` } +var bcp47Matcher *i18n.BCP47Matcher var translations map[string]*Translation -var backdowns = map[string]*Translation{} // language only backdowns for locales that have countries -var defaultLocale = "en-US" +var defaultLocale = "en_US" func init() { - err := json.Unmarshal(i18nJSON, &translations) - if err != nil { - panic(err) - } + jsonx.MustUnmarshal(i18nJSON, &translations) + + bcp47Matcher = i18n.NewBCP47Matcher(maps.Keys(translations)...) // not all locales have AM/PM values.. but it's simpler if we just given them a default for _, trans := range translations { @@ -37,49 +38,15 @@ func init() { trans.AmPm = []string{"AM", "PM"} } } - - // so that we can iterate translations deterministically (code a-z) - codes := make([]string, len(translations)) - for c := range translations { - codes = append(codes, c) - } - sort.Strings(codes) - - for _, code := range codes { - if len(code) == 5 { - lang := code[:2] - if backdowns[lang] == nil { - backdowns[lang] = translations[code] // using first is arbitary but best we can do - } - } - } } // GetTranslation gets the best match translation for the given locale -func GetTranslation(locale string) *Translation { - if locale == "" { +func GetTranslation(loc i18n.Locale) *Translation { + if loc == "" { return translations[defaultLocale] } - // try extract xx_YY match - t := translations[locale] - if t != nil { - return t - } - - // try match by language xx only - lang := locale[:2] - t = translations[lang] - if t != nil { - return t - } - - // use backdown for this language - t = backdowns[lang] - if t != nil { - return t - } + code := bcp47Matcher.ForLocales(loc) - // use default - return translations[defaultLocale] + return translations[code] } diff --git a/dates/i18n/dates.json b/dates/i18n/dates.json new file mode 100644 index 0000000..6a3ce60 --- /dev/null +++ b/dates/i18n/dates.json @@ -0,0 +1 @@ +{"aa_DJ":{"am_pm":["saaku","carra"],"days":["Acaada","Etleeni","Talaata","Arbaqa","Kamiisi","Gumqata","Sabti"],"months":["Qunxa Garablu","Naharsi Kudo","Ciggilta Kudo","Agda Baxis","Caxah Alsa","Qasa Dirri","Qado Dirri","Leqeeni","Waysu","Diteli","Ximoli","Kaxxa Garablu"],"short_days":["Aca","Etl","Tal","Arb","Kam","Gum","Sab"],"short_months":["Qun","Nah","Cig","Agd","Cax","Qas","Qad","Leq","Way","Dit","Xim","Kax"]},"aa_ER":{"am_pm":["saaku","carra"],"days":["Acaada","Etleeni","Talaata","Arbaqa","Kamiisi","Gumqata","Sabti"],"months":["Qunxa Garablu","Naharsi Kudo","Ciggilta Kudo","Agda Baxis","Caxah Alsa","Qasa Dirri","Qado Dirri","Liiqen","Waysu","Diteli","Ximoli","Kaxxa Garablu"],"short_days":["Aca","Etl","Tal","Arb","Kam","Gum","Sab"],"short_months":["Qun","Nah","Cig","Agd","Cax","Qas","Qad","Leq","Way","Dit","Xim","Kax"]},"aa_ET":{"am_pm":["saaku","carra"],"days":["Acaada","Etleeni","Talaata","Arbaqa","Kamiisi","Gumqata","Sabti"],"months":["Qunxa Garablu","Naharsi Kudo","Ciggilta Kudo","Agda Baxis","Caxah Alsa","Qasa Dirri","Qado Dirri","Liiqen","Waysu","Diteli","Ximoli","Kaxxa Garablu"],"short_days":["Aca","Etl","Tal","Arb","Kam","Gum","Sab"],"short_months":["Qun","Nah","Cig","Agd","Cax","Qas","Qad","Leq","Way","Dit","Xim","Kax"]},"ab":{"am_pm":["",""],"days":["Амҽыша","Ашәахьа","Аҩаша","Ахаша","Аԥшьаша","Ахәаша","Асабша"],"months":["Ажьырныҳәа","Жәабран","Хәажәкыра","Мшаԥы","Лаҵара","Рашәара","Ԥхынгәы","Нанҳәа","Цәыббра","Жьҭаара","Абҵара","Ԥхынҷкәын"],"short_days":["Ам","Ашә","Аҩ","Ах","Аԥ","Ахә","Ас"],"short_months":["Ажь","Жәаб","Хәажә","Мш","Лаҵ","Рашә","Ԥхынгә","Нанҳә","Цәыб","Жьҭ","Абҵ","Ԥхынҷ"]},"af":{"am_pm":["VM","NM"],"days":["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],"months":["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],"short_days":["So","Ma","Di","Wo","Do","Vr","Sa"],"short_months":["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"]},"agr":{"am_pm":["VM","NM"],"days":["Tuntuamtin","Achutin","Kugkuktin","Saketin","Shimpitin","Imaptin","Bataetin"],"months":["Petsatin","Kupitin","Uyaitin","Tayutin","Kegketin","Tegmatin","Kuntutin","Yagkujutin","Daiktatin","Ipamtatin","Shinutin","Sakamtin"],"short_days":["Tun","Ach","Kug","Sak","Shim","Im","Bat"],"short_months":["Pet","Kup","Uya","Tay","Keg","Teg","Kun","Yag","Dait","Ipam","Shin","Sak"]},"ak":{"am_pm":["AN","EW"],"days":["Kwesida","Dwowda","Benada","Wukuda","Yawda","Fida","Memeneda"],"months":["Sanda-Ɔpɛpɔn","Kwakwar-Ɔgyefuo","Ebɔw-Ɔbenem","Ebɔbira-Oforisuo","Esusow Aketseaba-Kɔtɔnimba","Obirade-Ayɛwohomumu","Ayɛwoho-Kitawonsa","Difuu-Ɔsandaa","Fankwa-Ɛbɔ","Ɔbɛsɛ-Ahinime","Ɔberɛfɛw-Obubuo","Mumu-Ɔpɛnimba"],"short_days":["Kwe","Dwo","Ben","Wuk","Yaw","Fia","Mem"],"short_months":["S-Ɔ","K-Ɔ","E-Ɔ","E-O","E-K","O-A","A-K","D-Ɔ","F-Ɛ","Ɔ-A","Ɔ-O","M-Ɔ"]},"am":{"am_pm":["ጡዋት","ከሰዓት"],"days":["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"months":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕሪል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክቶበር","ኖቬምበር","ዲሴምበር"],"short_days":["እሑድ","ሰኞ ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"short_months":["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ ","ጁን ","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም"]},"an":{"am_pm":["",""],"days":["domingo","luns","martes","mierques","chueves","viernes","sabado"],"months":["chinero","febrero","marzo","abril","mayo","chunyo","chuliol","agosto","setiembre","octubre","noviembre","aviento"],"short_days":["dom","lun","mar","mie","chu","vie","sab"],"short_months":["chi","feb","mar","abr","may","chn","chl","ago","set","oct","nov","avi"]},"anp":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवार","सोमवार","मंगलवार","बुधवार","बृहस्पतिवार","शुक्रवार","शनिवार"],"months":["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्टूबर","नवंबर","दिसंबर"],"short_days":["रवि","सोम","मंगल","बुध","बृहस्पति","शुक्र","शनि"],"short_months":["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्टूबर","नवंबर","दिसंबर"]},"ar_AE":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت "],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_BH":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_DZ":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"]},"ar_EG":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_IN":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_IQ":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar_JO":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar_KW":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_LB":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar_LY":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_MA":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر"]},"ar_OM":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_QA":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_SA":{"am_pm":["",""],"days":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعـة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"]},"ar_SD":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_SS":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_SY":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar_TN":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"]},"ar_YE":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"as":{"am_pm":["পূৰ্ব্বাহ্ন","অপৰাহ্ন"],"days":["দেওবাৰ","সোমবাৰ","মঙ্গলবাৰ","বুধবাৰ","বৃহষ্পতিবাৰ","শুক্ৰবাৰ","শনিবাৰ"],"months":["জানুৱাৰী","ফেব্ৰুৱাৰী","মাৰ্চ","এপ্ৰিল","মে","জুন","জুলাই","আগষ্ট","ছেপ্তেম্বৰ","অক্টোবৰ","নৱেম্বৰ","ডিচেম্বৰ"],"short_days":["দেও","সোম","মঙ্গল","বুধ","বৃহষ্পতি","শুক্ৰ","শনি"],"short_months":["জানু","ফেব্ৰু","মাৰ্চ","এপ্ৰিল","মে","জুন","জুলাই","আগ","সেপ্ট","অক্টো","নভে","ডিসে"]},"ast":{"am_pm":["",""],"days":["domingu","llunes","martes","miércoles","xueves","vienres","sábadu"],"months":["de xineru","de febreru","de marzu","d’abril","de mayu","de xunu","de xunetu","d’agostu","de setiembre","d’ochobre","de payares","d’avientu"],"short_days":["dom","llu","mar","mié","xue","vie","sáb"],"short_months":["xin","feb","mar","abr","may","xun","xnt","ago","set","och","pay","avi"]},"ayc":{"am_pm":["VM","NM"],"days":["tuminku","lunisa","martisa","mirkulisa","juywisa","wirnisa","sawäru"],"months":["inïru","phiwriru","marsu","awrila","mayu","junyu","julyu","awustu","sitimri","uktuwri","nuwimri","risimri"],"short_days":["tum","lun","mar","mir","juy","wir","saw"],"short_months":["ini","phi","mar","awr","may","jun","jul","awu","sit","ukt","nuw","ris"]},"az_AZ":{"am_pm":["",""],"days":["bazar günü","bazar ertəsi","çərşənbə axşamı","çərşənbə","cümə axşamı","cümə","şənbə"],"months":["yanvar","fevral","mart","aprel","may","iyun","iyul","avqust","sentyabr","oktyabr","noyabr","dekabr"],"short_days":["baz","ber","çax","çər","cax","cüm","şnb"],"short_months":["Yan","Fev","Mar","Apr","May","İyn","İyl","Avq","Sen","Okt","Noy","Dek"]},"az_IR":{"am_pm":["",""],"days":["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","جۆمعه آخشامی","جۆمعه","شنبه"],"months":["ژانویه","فوریه","مارس","آوریل","مئی","ژوئن","جولای","آقۇست","سپتامبر","اوْکتوْبر","نوْوامبر","دسامبر"],"short_days":["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","جۆمعه آخشامی","جۆمعه","شنبه"],"short_months":["ژانویه","فوریه","مارس","آوریل","مئی","ژوئن","جولای","آقۇست","سپتامبر","اوْکتوْبر","نوْوامبر","دسامبر"]},"be":{"am_pm":["",""],"days":["Нядзеля","Панядзелак","Аўторак","Серада","Чацвер","Пятніца","Субота"],"months":["студзеня","лютага","сакавіка","красавіка","мая","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня"],"short_days":["Няд","Пан","Аўт","Срд","Чцв","Пят","Суб"],"short_months":["сту","лют","сак","кра","мая","чэр","ліп","жні","вер","кас","ліс","сне"]},"bem":{"am_pm":["uluchelo","akasuba"],"days":["Pa Mulungu","Palichimo","Palichibuli","Palichitatu","Palichine","Palichisano","Pachibelushi"],"months":["Januari","Februari","Machi","Epreo","Mei","Juni","Julai","Ogasti","Septemba","Oktoba","Novemba","Disemba"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mac","Epr","Mei","Jun","Jul","Oga","Sep","Okt","Nov","Dis"]},"ber":{"am_pm":["",""],"days":["bazar günü","birinci gün","ikinci gün","üçüncü gün","dördüncü gün","beşinci gün","altıncı gün"],"months":["yanvar","fevral","mart","aprel","may","iyun","iyul","avqust","sentyabr","oktyabr","noyabr","dekabr"],"short_days":["baz","bir","iki","üçü","dör","beş","alt"],"short_months":["Yan","Fev","Mar","Apr","May","İyn","İyl","Avq","Sen","Okt","Noy","Dek"]},"bg":{"am_pm":["",""],"days":["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],"months":["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември"],"short_days":["нд","пн","вт","ср","чт","пт","сб"],"short_months":["яну","фев","мар","апр","май","юни","юли","авг","сеп","окт","ное","дек"]},"bhb":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"bho":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"months":["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],"short_days":["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],"short_months":["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"]},"bi":{"am_pm":["AM","PM"],"days":["Sande","Mande","Tusde","Wenesde","Tosde","Fraede","Sarere"],"months":["Jenuware","Febwari","Maj","Epril","Mei","Jun","Julae","Ogis","Septemba","Oktoba","Novemba","Disemba"],"short_days":["San","Man","Tus","Wen","Tas","Fra","Sar"],"short_months":["Jan","Feb","Maj","Epr","Mei","Jun","Jul","Ogs","Sep","Okt","Nov","Dis"]},"bn_BD":{"am_pm":["পূর্বাহ্ণ","অপরাহ্ণ"],"days":["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],"months":["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"short_days":["রবি","সোম","মঙ্গল","বুধ","বৃহঃ","শুক্র","শনি"],"short_months":["জানু","ফেব","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"]},"bn_IN":{"am_pm":["পূর্বাহ্ণ","অপরাহ্ণ"],"days":["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],"months":["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"short_days":["রবি","সোম","মঙ্গল","বুধ","বৃহস্পতি","শুক্র","শনি"],"short_months":["জানু","ফেব","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"]},"bo":{"am_pm":["ངས་ཆ","ཕྱི་ཆ"],"days":["གཟའ་ཉི་མ་","གཟའ་ཟླ་བ་","གཟའ་མིག་དམར་","གཟའ་ལྷག་ཕ་","གཟའ་པུར་བུ་","གཟའ་པ་སངས་","གཟའ་སྤེན་ཕ་"],"months":["ཟླ་བ་དང་པ་","ཟླ་བ་གཉིས་པ་","ཟླ་བ་གསུམ་པ་","ཟླ་བ་བཞི་པ་","ཟླ་བ་ལྔ་ཕ་","ཟླ་བ་དྲུག་པ་","ཟླ་བ་བདུནཔ་","ཟླ་བ་བརྒྱད་པ་","ཟླ་བ་དགུ་པ་","ཟླ་བ་བཅུ་པ་","ཟླ་བ་བཅུ་གཅིག་པ་","ཟླ་བ་བཅུ་གཉིས་པ་"],"short_days":["ཉི་","ཟླ་","མིར་","ལྷག་","པུར་","སངས་","སྤེན་"],"short_months":["ཟླ་༡","ཟླ་༢","ཟླ་༣","ཟླ་༤","ཟླ་༥","ཟླ་༦","ཟླ་༧","ཟླ་༨","ཟླ་༩","ཟླ་༡༠","ཟླ་༡༡","ཟླ་༡༢"]},"br":{"am_pm":[" "," "],"days":["sul","lun","meurzh","mercʼher","yaou","gwener","sadorn"],"months":["Genver","Cʼhwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu"],"short_days":["sul","lun","meu","mer","yao","gwe","sad"],"short_months":["Gen ","Cʼhw","Meu ","Ebr ","Mae ","Mezh","Gou ","Eos ","Gwe ","Her ","Du ","Ker "]},"brx":{"am_pm":["फुं.","बेलासे."],"days":["रबिबार","सोबार","मंगलबार","बुदबार","बिसथिबार","सुखुरबार","सुनिबार"],"months":["जानुवारी","फेब्रुवारी","मार्स","एफ्रिल","मे","जुन","जुलाइ","आगस्थ","सेबथेज्ब़र","अखथबर","नबेज्ब़र","दिसेज्ब़र"],"short_days":["रबि","सम","मंगल","बुद","बिसथि","सुखुर","सुनि"],"short_months":["जानुवारी","फेब्रुवारी","मार्स","एप्रिल","मे","जुन","जुलाइ","आगस्थ","सेबथेज्ब़र","अखथबर","नबेज्ब़र","दिसेज्ब़र"]},"bs":{"am_pm":["",""],"days":["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],"months":["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novembar","Decembar"],"short_days":["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],"short_months":["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"]},"byn":{"am_pm":["ፋዱስ ጃብ","ፋዱስ ደምቢ"],"days":["ሰንበር ቅዳዅ","ሰኑ","ሰሊጝ","ለጓ ወሪ ለብዋ","ኣምድ","ኣርብ","ሰንበር ሽጓዅ"],"months":["ልደትሪ","ካብኽብቲ","ክብላ","ፋጅኺሪ","ክቢቅሪ","ምኪኤል ትጓ̅ኒሪ","ኰርኩ","ማርያም ትሪ","ያኸኒ መሳቅለሪ","መተሉ","ምኪኤል መሽወሪ","ተሕሳስሪ"],"short_days":["ሰ/ቅ","ሰኑ","ሰሊጝ","ለጓ","ኣምድ","ኣርብ","ሰ/ሽ"],"short_months":["ልደት","ካብኽ","ክብላ","ፋጅኺ","ክቢቅ","ም/ት","ኰር","ማርያ","ያኸኒ","መተሉ","ም/ም","ተሕሳ"]},"ca":{"am_pm":["a. m.","p. m."],"days":["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],"months":["de gener","de febrer","de març","d’abril","de maig","de juny","de juliol","d’agost","de setembre","d’octubre","de novembre","de desembre"],"short_days":["dg.","dl.","dt.","dc.","dj.","dv.","ds."],"short_months":["de gen.","de febr.","de març","d’abr.","de maig","de juny","de jul.","d’ag.","de set.","d’oct.","de nov.","de des."]},"ce":{"am_pm":["",""],"days":["КӀиранан де","Оршотан де","Шинарин де","Кхаарин де","Еарин де","ПӀераскан де","Шот де"],"months":["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],"short_days":["КӀ","Ор","Ши","Кх","Еа","ПӀ","Шо"],"short_months":["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек"]},"chr":{"am_pm":["ᏌᎾᎴ","ᏒᎯᏱᎢᏗᏢ"],"days":["ᎤᎾᏙᏓᏆᏍᎬ","ᎤᎾᏙᏓᏉᏅᎯ","ᏔᎵᏁᎢᎦ","ᏦᎢᏁᎢᎦ","ᏅᎩᏁᎢᎦ","ᏧᎾᎩᎶᏍᏗ","ᎤᎾᏙᏓᏈᏕᎾ"],"months":["ᎤᏃᎸᏔᏅ","ᎧᎦᎵ","ᎠᏅᏱ","ᎧᏬᏂ","ᎠᏂᏍᎬᏘ","ᏕᎭᎷᏱ","ᎫᏰᏉᏂ","ᎦᎶᏂ","ᏚᎵᏍᏗ","ᏚᏂᏅᏗ","ᏅᏓᏕᏆ","ᎥᏍᎩᏱ"],"short_days":["ᏆᏍᎬ","ᏉᏅᎯ","ᏔᎵᏁ","ᏦᎢᏁ","ᏅᎩᏁ","ᏧᎾᎩ","ᏈᏕᎾ"],"short_months":["ᎤᏃ","ᎧᎦ","ᎠᏅ","ᎧᏬ","ᎠᏂ","ᏕᎭ","ᎫᏰ","ᎦᎶ","ᏚᎵ","ᏚᏂ","ᏅᏓ","ᎥᏍ"]},"ckb":{"am_pm":["پن","دن"],"days":["یەكشەممە","دووشەممە","سێشەممە","چوارشەممە","پێنجشەممە","هەینی","شەممە"],"months":["کانونی دووەم","شوبات","ئازار","نیسان","ئایار","حوزەیران","تەموز","ئاب","ئەیلوول","تشرینی یەکەم","تشرینی دووەم","کانونی یەکەم"],"short_days":["شەم","یەکش","دووش","سێش","چواش","پێنش","هەین"],"short_months":["کا٢","شوب","ئاز","نیس","ئای","حوز","تەم","ئاب","ئەی","تش١","تش٢","کا١"]},"cmn":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"crh":{"am_pm":["ÜE","ÜS"],"days":["Bazar","Bazarertesi","Salı","Çarşembe","Cumaaqşamı","Cuma","Cumaertesi"],"months":["Yanvar","Fevral","Mart","Aprel","Mayıs","İyun","İyul","Avgust","Sentâbr","Oktâbr","Noyabr","Dekabr"],"short_days":["Baz","Ber","Sal","Çar","Caq","Cum","Cer"],"short_months":["Yan","Fev","Mar","Apr","May","İyn","İyl","Avg","Sen","Okt","Noy","Dek"]},"cs":{"am_pm":["",""],"days":["Neděle","Pondělí","Úterý","Středa","Čtvrtek","Pátek","Sobota"],"months":["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"],"short_days":["Ne","Po","Út","St","Čt","Pá","So"],"short_months":["led","úno","bře","dub","kvě","čen","čec","srp","zář","říj","lis","pro"]},"csb":{"am_pm":["",""],"days":["niedzela","pòniedzôłk","wtórk","strzoda","czwiôrtk","piątk","sobòta"],"months":["stëcznika","gromicznika","strëmiannika","łżëkwiata","maja","czerwińca","lëpińca","zélnika","séwnika","rujana","lëstopadnika","gòdnika"],"short_days":["nie","pòn","wtó","str","czw","pią","sob"],"short_months":["stë","gro","str","łżë","maj","cze","lëp","zél","séw","ruj","lës","gòd"]},"cv":{"am_pm":["",""],"days":["vyrsarnikun","tuntikun","ytlarikun","junkun","kĕşnernikun","ernekun","šămatkun"],"months":["kărlac","narăs","puš","aka","şu","şĕrtme","ută","şurla","avăn","jupa","cük","raštav"],"short_days":["vr","tn","yt","jn","kş","er","šm"],"short_months":["KĂR","NAR","PUŠ","AKA","ŞU","ŞĔR","UTĂ","ŞUR","AVĂ","JUP","CÜK","RAŠ"]},"cy":{"am_pm":["am","pm"],"days":["Sul","Llun","Mawrth","Mercher","Iau","Gwener","Sadwrn"],"months":["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],"short_days":["Sul","Llu","Maw","Mer","Iau","Gwe","Sad"],"short_months":["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rha"]},"da":{"am_pm":["",""],"days":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"months":["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],"short_days":["søn","man","tir","ons","tor","fre","lør"],"short_months":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"]},"de_AT":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_BE":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_CH":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_DE":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_IT":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_LI":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_LU":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"doi":{"am_pm":["सञं","सबेर"],"days":["ऐतबार","सोमबार","मंगलबर","बुधबार","बीरबार","शुक्करबार","श्नीचरबार"],"months":["जनवरी","फरवरी","मार्च","एप्रैल","मेई","जून","जूलै","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर"],"short_days":["ऐत","सोम","मंगल","बुध","बीर","शुक्कर","श्नीचर"],"short_months":["जनवरी","फरवरी","मार्च","एप्रैल","मेई","जून","जूलै","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर"]},"dsb":{"am_pm":["",""],"days":["Njeźela","Pónjeźele","Wałtora","Srjoda","Stwórtk","Pětk","Sobota"],"months":["januara","februara","měrca","apryla","maja","junija","julija","awgusta","septembra","oktobra","nowembra","decembra"],"short_days":["Nj","Pó","Wa","Sr","St","Pě","So"],"short_months":["Jan","Feb","Měr","Apr","Maj","Jun","Jul","Awg","Sep","Okt","Now","Dec"]},"dv":{"am_pm":["މކ","މފ"],"days":["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],"months":["ޖެނުއަރީ","ފެބްރުއަރީ","މާރޗް","އެޕްރީލް","މެއި","ޖޫން","ޖުލައި","އޮގަސްޓް","ސެޕްޓެންބަރ","އޮކްޓޫބަރ","ނޮވެންބަރ","ޑިސެންބަރ"],"short_days":["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],"short_months":["ޖެނުއަރީ","ފެބްރުއަރީ","މާރޗް","އެޕްރީލް","މެއި","ޖޫން","ޖުލައި","އޮގަސްޓް","ސެޕްޓެންބަރ","އޮކްޓޫބަރ","ނޮވެންބަރ","ޑިސެންބަރ"]},"dz":{"am_pm":["ངས་ཆ","ཕྱི་ཆ"],"days":["གཟའ་ཟླ་བ་","གཟའ་མིག་དམར་","གཟའ་ལྷག་ཕ་","གཟའ་པུར་བུ་","གཟའ་པ་སངས་","གཟའ་སྤེན་ཕ་","གཟའ་ཉི་མ་"],"months":["ཟླ་བ་དང་པ་","ཟླ་བ་གཉིས་པ་","ཟླ་བ་གསུམ་པ་","ཟླ་བ་བཞི་པ་","ཟླ་བ་ལྔ་ཕ་","ཟླ་བ་དྲུག་པ་","ཟླ་བ་བདུནཔ་","ཟླ་བ་བརྒྱད་པ་","ཟླ་བ་དགུ་པ་","ཟླ་བ་བཅུ་པ་","ཟླ་བ་བཅུ་གཅིག་པ་","ཟླ་བ་བཅུ་གཉིས་པ་"],"short_days":["ཟླ་","མིར་","ལྷག་","པུར་","སངས་","སྤེན་","ཉི་"],"short_months":["ཟླ་༡","ཟླ་༢","ཟླ་༣","ཟླ་༤","ཟླ་༥","ཟླ་༦","ཟླ་༧","ཟླ་༨","ཟླ་༩","ཟླ་༡༠","ཟླ་༡༡","ཟླ་༡༢"]},"el":{"am_pm":["πμ","μμ"],"days":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"months":["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου"],"short_days":["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],"short_months":["Ιαν","Φεβ","Μαρ","Απρ","Μαΐ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"]},"en_AG":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_AU":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_BW":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_CA":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_DK":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_GB":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_HK":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_IE":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_IL":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_IN":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_NG":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_NZ":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_PH":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_SC":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_SG":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_US":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_ZA":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_ZM":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_ZW":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"es_AR":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_BO":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_CL":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_CO":{"am_pm":["AM","PM"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_CR":{"am_pm":["a.m.","p.m."],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_CU":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_DO":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_EC":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_ES":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_GT":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_HN":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_MX":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_NI":{"am_pm":["AM","PM"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_PA":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_PE":{"am_pm":["AM","PM"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","setiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","set","oct","nov","dic"]},"es_PR":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_PY":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_SV":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_US":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_UY":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","setiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","set","oct","nov","dic"]},"es_VE":{"am_pm":["am","pm"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"et":{"am_pm":["",""],"days":["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],"months":["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember"],"short_days":["P","E","T","K","N","R","L"],"short_months":["jaan ","veebr","märts","apr ","mai ","juuni","juuli","aug ","sept ","okt ","nov ","dets "]},"eu":{"am_pm":["",""],"days":["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],"months":["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],"short_days":["ig.","al.","ar.","az.","og.","or.","lr."],"short_months":["urt","ots","mar","api","mai","eka","uzt","abu","ira","urr","aza","abe"]},"fa":{"am_pm":["",""],"days":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"months":["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اكتبر","نوامبر","دسامبر"],"short_days":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"short_months":["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اكتبر","نوامبر","دسامبر"]},"ff":{"am_pm":["subaka","kikiiɗe"],"days":["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],"months":["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"],"short_days":["dew","aaɓ","maw","nje","naa","mwd","hbi"],"short_months":["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"]},"fi":{"am_pm":["",""],"days":["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],"months":["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],"short_days":["su","ma","ti","ke","to","pe","la"],"short_months":["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu"]},"fil":{"am_pm":["N.U.","N.H."],"days":["Linggo","Lunes","Martes","Miyerkoles","Huwebes","Biyernes","Sabado"],"months":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre"],"short_days":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"short_months":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"]},"fo":{"am_pm":["",""],"days":["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],"months":["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember"],"short_days":["sun","mán","týs","mik","hós","frí","ley"],"short_months":["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"]},"fr_BE":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fr_CA":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fr_CH":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fr_FR":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"short_months":["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."]},"fr_LU":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fur":{"am_pm":["",""],"days":["Domenie","Lunis","Martars","Miercus","Joibe","Vinars","Sabide"],"months":["Zenâr","Fevrâr","Març","Avrîl","Mai","Jugn","Lui","Avost","Setembar","Otubar","Novembar","Dicembar"],"short_days":["Dom","Lun","Mar","Mie","Joi","Vin","Sab"],"short_months":["Zen","Fev","Mar","Avr","Mai","Jug","Lui","Avo","Set","Otu","Nov","Dic"]},"fy_DE":{"am_pm":["",""],"days":["Sinndag","Mondag","Dingsdag","Meddwäakj","Donnadag","Friedag","Sinnowend"],"months":["Jaunuwoa","Februwoa","Moaz","Aprell","Mai","Juni","Juli","August","Septamba","Oktoba","Nowamba","Dezamba"],"short_days":["Sdg","Mdg","Dsg","Mwk","Ddg","Fdg","Swd"],"short_months":["Jan","Feb","Moz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Now","Dez"]},"fy_NL":{"am_pm":["",""],"days":["Snein","Moandei","Tiisdei","Woansdei","Tongersdei","Freed","Sneon"],"months":["Jannewaris","Febrewaris","Maart","April","Maaie","Juny","July","Augustus","Septimber","Oktober","Novimber","Desimber"],"short_days":["Sn","Mo","Ti","Wo","To","Fr","Sn"],"short_months":["Jan","Feb","Mrt","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Des"]},"ga":{"am_pm":["",""],"days":["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],"months":["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig"],"short_days":["Domh","Luan","Máirt","Céad","Déar","Aoine","Sath"],"short_months":["Ean","Feabh","Márta","Aib","Beal","Meith","Iúil","Lún","MFómh","DFómh","Samh","Noll"]},"gd":{"am_pm":["m","f"],"days":["DiDòmhnaich","DiLuain","DiMàirt","DiCiadain","DiarDaoin","DihAoine","DiSathairne"],"months":["dhen Fhaoilleach","dhen Ghearran","dhen Mhàrt","dhen Ghiblean","dhen Chèitean","dhen Ògmhios","dhen Iuchar","dhen Lùnastal","dhen t-Sultain","dhen Dàmhair","dhen t-Samhain","dhen Dùbhlachd"],"short_days":["DiD","DiL","DiM","DiC","Dia","Dih","DiS"],"short_months":["Faoi","Gearr","Màrt","Gibl","Cèit","Ògmh","Iuch","Lùna","Sult","Dàmh","Samh","Dùbh"]},"gez_ER":{"am_pm":["ጽባሕ","ምሴት"],"days":["እኁድ","ሰኑይ","ሠሉስ","ራብዕ","ሐሙስ","ዓርበ","ቀዳሚት"],"months":["ጠሐረ","ከተተ","መገበ","አኀዘ","ግንባት","ሠንየ","ሐመለ","ነሐሰ","ከረመ","ጠቀመ","ኀደረ","ኀሠሠ"],"short_days":["እኁድ","ሰኑይ","ሠሉስ","ራብዕ","ሐሙስ","ዓርበ","ቀዳሚ"],"short_months":["ጠሐረ","ከተተ","መገበ","አኀዘ","ግንባ","ሠንየ","ሐመለ","ነሐሰ","ከረመ","ጠቀመ","ኀደረ","ኀሠሠ"]},"gez_ET":{"am_pm":["ጽባሕ","ምሴት"],"days":["እኁድ","ሰኑይ","ሠሉስ","ራብዕ","ሐሙስ","ዓርበ","ቀዳሚት"],"months":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር"],"short_days":["እኁድ","ሰኑይ","ሠሉስ","ራብዕ","ሐሙስ","ዓርበ","ቀዳሚ"],"short_months":["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ ","ጁን ","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም"]},"gl":{"am_pm":["",""],"days":["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],"months":["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],"short_days":["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],"short_months":["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"]},"gu":{"am_pm":["સવારે","સાંજે"],"days":["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],"months":["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટોબર","નવેમ્બર","ડિસેમ્બર"],"short_days":["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],"short_months":["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે"]},"gv":{"am_pm":["",""],"days":["Jedoonee","Jelhein","Jemayrt","Jercean","Jerdein","Jeheiney","Jesarn"],"months":["Jerrey-geuree","Toshiaght-arree","Mayrnt","Averil","Boaldyn","Mean-souree","Jerrey-souree","Luanistyn","Mean-fouyir","Jerrey-fouyir","Mee Houney","Mee ny Nollick"],"short_days":["Jed","Jel","Jem","Jerc","Jerd","Jeh","Jes"],"short_months":["J-guer","T-arree","Mayrnt","Avrril","Boaldyn","M-souree","J-souree","Luanistyn","M-fouyir","J-fouyir","M.Houney","M.Nollick"]},"ha":{"am_pm":["AM","PM"],"days":["Lahadi","Litini","Talata","Laraba","Alhamis","Juma'a","Asabar"],"months":["Janairu","Faburairu","Maris","Afirilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktoba","Nuwamba","Disamba"],"short_days":["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],"short_months":["Jan","Fab","Mar","Afi","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis"]},"hak":{"am_pm":["上晝","下晝"],"days":["禮拜日","禮拜一","禮拜二","禮拜三","禮拜四","禮拜五","禮拜六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"he":{"am_pm":["AM","PM"],"days":["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],"months":["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"short_days":["א'","ב'","ג'","ד'","ה'","ו'","ש'"],"short_months":["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ"]},"hi":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"months":["जनवरी","फ़रवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर"],"short_days":["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],"short_months":["जन॰","फ़र॰","मार्च","अप्रैल","मई","जून","जुल॰","अग॰","सित॰","अक्तू॰","नव॰","दिस॰"]},"hif":{"am_pm":["Purvahan","Aparaahna"],"days":["Ravivar","Somvar","Mangalvar","Budhvar","Guruvar","Shukravar","Shanivar"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Ravi","Som","Mangal","Budh","Guru","Shukra","Shani"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"hne":{"am_pm":["बिहिनियाँ","मंझनियाँ"],"days":["इतवार","सोमवार","मंगलवार","बुधवार","बिरसपत","सुकरवार","सनिवार"],"months":["जनवरी","फरवरी","मार्च","अपरेल","मई","जून","जुलाई","अगस्त","सितमबर","अकटूबर","नवमबर","दिसमबर"],"short_days":["इत","सोम","मंग","बुध","बिर","सुक","सनि"],"short_months":["जन","फर","मार्च","अप","मई","जून","जुला","अग","सित","अकटू","नव","दिस"]},"hr":{"am_pm":["",""],"days":["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],"months":["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenoga","prosinca"],"short_days":["ned","pon","uto","sri","čet","pet","sub"],"short_months":["sij","velj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro"]},"hsb":{"am_pm":["",""],"days":["Njedźela","Póndźela","Wutora","Srjeda","Štvórtk","Pjatk","Sobota"],"months":["januara","februara","měrca","apryla","meje","junija","julija","awgusta","septembra","oktobra","nowembra","decembra"],"short_days":["Nj","Pó","Wu","Sr","Št","Pj","So"],"short_months":["Jan","Feb","Měr","Apr","Mej","Jun","Jul","Awg","Sep","Okt","Now","Dec"]},"ht":{"am_pm":["",""],"days":["dimanch","lendi","madi","mèkredi","jedi","vandredi","samdi"],"months":["janvye","fevriye","mas","avril","me","jen","jiyè","out","septanm","oktòb","novanm","desanm"],"short_days":["dim","len","mad","mèk","jed","van","sam"],"short_months":["jan","fev","mas","avr","me","jen","jiy","out","sep","okt","nov","des"]},"hu":{"am_pm":["",""],"days":["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],"months":["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december"],"short_days":["v","h","k","sze","cs","p","szo"],"short_months":["jan","febr","márc","ápr","máj","jún","júl","aug","szept","okt","nov","dec"]},"hy":{"am_pm":["",""],"days":["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","Ուրբաթ","Շաբաթ"],"months":["հունվարի","փետրվարի","մարտի","ապրիլի","մայիսի","հունիսի","հուլիսի","օգոստոսի","սեպտեմբերի","հոկտեմբերի","նոյեմբերի","դեկտեմբերի"],"short_days":["Կրկ","Երկ","Երք","Չրք","Հնգ","Ուր","Շբթ"],"short_months":["Հնվ","Փտր","Մար","Ապր","Մայ","Հնս","Հլս","Օգս","Սեպ","Հոկ","Նմբ","Դեկ"]},"ia":{"am_pm":["AM","PM"],"days":["dominica","lunedi","martedi","mercuridi","jovedi","venerdi","sabbato"],"months":["januario","februario","martio","april","maio","junio","julio","augusto","septembre","octobre","novembre","decembre"],"short_days":["dom","lun","mar","mer","jov","ven","sab"],"short_months":["jan","feb","mar","apr","mai","jun","jul","aug","sep","oct","nov","dec"]},"id":{"am_pm":["",""],"days":["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],"months":["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],"short_days":["Min","Sen","Sel","Rab","Kam","Jum","Sab"],"short_months":["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agu","Sep","Okt","Nov","Des"]},"ig":{"am_pm":["AM","PM"],"days":["sọnde","mọnde","tuzde","wenzde","tọsde","fraịde","satọde"],"months":["Jenụwarị","Febrụwarị","Maachị","Eprel","Mee","Juun","Julaị","Ọgọọst","Septemba","Ọktoba","Novemba","Disemba"],"short_days":["sọn","mọn","tuz","wen","tọs","fra","sat"],"short_months":["Jen","Feb","Maa","Epr","Mee","Juu","Jul","Ọgọ","Sep","Ọkt","Nov","Dis"]},"ik":{"am_pm":["AM","PM"],"days":["Minġuiqsioiq","Savałłiq","Ilaqtchiioiq","Qitchiioiq","Sisamiioiq","Tallimmiioiq","Maqinġuoiq"],"months":["Siqiññaatchiaq","Siqiññaasrugruk","Paniqsiqsiivik","Qilġich Tatqiat","Suppivik","Iġñivik","Itchavik","Tiññivik","Amiġaiqsivik","Sikkuvik","Nippivik","Siqiñġiḷaq"],"short_days":["Min","Sav","Ila","Qit","Sis","Tal","Maq"],"short_months":["Sñt","Sñs","Pan","Qil","Sup","Iġñ","Itc","Tiñ","Ami","Sik","Nip","Siq"]},"is":{"am_pm":["fh","eh"],"days":["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],"months":["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember"],"short_days":["sun","mán","þri","mið","fim","fös","lau"],"short_months":["jan","feb","mar","apr","maí","jún","júl","ágú","sep","okt","nóv","des"]},"it":{"am_pm":["",""],"days":["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],"months":["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"],"short_days":["dom","lun","mar","mer","gio","ven","sab"],"short_months":["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"]},"iu":{"am_pm":["AM","PM"],"days":["ᓈᑦᑎᖑᔭᕐᕕᒃ","ᓇᒡᒐᔾᔭᐅ","ᓇᒡᒐᔾᔭᐅᓕᖅᑭᑦ","ᐱᖓᓲᓕᖅᓯᐅᑦ","ᕿᑎᖅᑰᑦ","ᐅᓪᓗᕈᓘᑐᐃᓇᖅ","ᓯᕙᑖᕕᒃ"],"months":["ᔮᓄᐊᓕ","ᕕᕗᐊᓕ","ᒪᔅᓯ","ᐃᐳᓗ","ᒪᐃ","ᔪᓂ","ᔪᓚᐃ","ᐊᒋᓯ","ᓯᑎᕙ","ᐊᑦᑐᕙ","ᓄᕕᕙ","ᑎᓯᕝᕙ"],"short_days":["ᓈ","ᓇ","ᓕ","ᐱ","ᕿ","ᐅ","ᓯ"],"short_months":["ᔮᓄ","ᕕᕗ","ᒪᔅ","ᐃᐳ","ᒪᐃ","ᔪᓂ","ᔪᓚ","ᐊᒋ","ᓯᑎ","ᐊᑦ","ᓄᕕ","ᑎᓯ"]},"ja":{"am_pm":["午前","午後"],"days":["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],"months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"short_days":["日","月","火","水","木","金","土"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"ka":{"am_pm":["",""],"days":["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],"months":["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],"short_days":["კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],"short_months":["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"]},"kab":{"am_pm":["FT","MD"],"days":["Acer","Arim","Aram","Ahad","Amhad","Sem","Sed"],"months":["Yennayer","Fuṛar","Meɣres","Yebrir","Mayyu","Yunyu","Yulyu","ɣuct","Ctembeṛ","Tubeṛ","Wambeṛ","Dujembeṛ"],"short_days":["Ace","Ari","Ara","Aha","Amh","Sem","Sed"],"short_months":["Yen","Fur","Meɣ","Yeb","May","Yun","Yul","ɣuc","Cte","Tub","Wam","Duj"]},"kk":{"am_pm":["",""],"days":["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],"months":["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"],"short_days":["Жк","Дс","Сс","Ср","Бс","Жм","Сб"],"short_months":["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"]},"kl":{"am_pm":["",""],"days":["sapaat","ataasinngorneq","marlunngorneq","pingasunngorneq","sisamanngorneq","tallimanngorneq","arfininngorneq"],"months":["januaarip","februaarip","marsip","apriilip","maajip","juunip","juulip","aggustip","septembarip","oktobarip","novembarip","decembarip"],"short_days":["sap","ata","mar","pin","sis","tal","arf"],"short_months":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"]},"km":{"am_pm":["ព្រឹក","ល្ងាច"],"days":["ថ្ងៃ​អាទិត្យ","ថ្ងៃ​ច័ន្ទ","ថ្ងៃ​អង្គារ","ថ្ងៃ​ពុធ","ថ្ងៃ​ព្រហស្បតិ៍","ថ្ងៃ​សុក្រ","ថ្ងៃ​សៅរ៍"],"months":["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],"short_days":["អា","ច","អ","ពុ","ព្រ","សុ","ស"],"short_months":["១","២","៣","៤","៥","៦","៧","៨","៩","១០","១១","១២"]},"kn":{"am_pm":["ಪೂರ್ವಾಹ್ನ","ಅಪರಾಹ್ನ"],"days":["ರವಿವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],"months":["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಏಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟೆಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್"],"short_days":["ರ","ಸೋ","ಮಂ","ಬು","ಗು","ಶು","ಶ"],"short_months":["ಜನ","ಫೆಬ್ರ","ಮಾರ್ಚ್","ಏಪ್ರಿ","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆ","ಸೆಪ್ಟೆಂ","ಅಕ್ಟೋ","ನವೆಂ","ಡಿಸೆಂ"]},"ko":{"am_pm":["오전","오후"],"days":["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],"months":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"short_days":["일","월","화","수","목","금","토"],"short_months":[" 1월"," 2월"," 3월"," 4월"," 5월"," 6월"," 7월"," 8월"," 9월","10월","11월","12월"]},"kok":{"am_pm":["म.पू.","म.नं."],"days":["आयतार","सोमार","मंगळवार","बुधवार","बेरेसतार","शुकरार","शेनवार"],"months":["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ओगस्ट","सेप्टेंबर","ओक्टोबर","नोव्हेंबर","डिसेंबर"],"short_days":["आयतार","सोमार","मंगळवार","बुधवार","बेरेसतार","शुकरार","शेनवार"],"short_months":["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ओगस्ट","सेप्टेंबर","ओक्टोबर","नोव्हेंबर","डिसेंबर"]},"ks":{"am_pm":["دوپھربرونھ","دوپھرپتھ"],"days":["آتهوار","ژءندروار","بوءںوار","بودهوار","برىسوار","جمع","بٹوار"],"months":["جنؤری","فرؤری","مارٕچ","اپریل","میٔ","جوٗن","جوٗلایی","اگست","ستمبر","اکتوٗبر","نومبر","دسمبر"],"short_days":["آتهوار","ژءنتروار","بوءںوار","بودهوار","برىسوار","جمع","بٹوار"],"short_months":["جنؤری","فرؤری","مارٕچ","اپریل","میٔ","جوٗن","جوٗلایی","اگست","ستمبر","اکتوٗبر","نومبر","دسمبر"]},"ku":{"am_pm":["",""],"days":["yêksêm","dusêm","sêsêm","çarsêm","pêncsêm","înî","sept"],"months":["Çile","Sibat","Adar","Nîsan","Gulan","Hezîran","Tîrmeh","Tebax","Îlon","Cotmeh","Mijdar","Kanûn"],"short_days":["yêk","dus","sês","çar","pên","înî","sep"],"short_months":["Çil","Sib","Ada","Nîs","Gul","Hez","Tîr","Teb","Îlo","Cot","Mij","Kan"]},"kw":{"am_pm":["",""],"days":["De Sul","De Lun","De Merth","De Merher","De Yow","De Gwener","De Sadorn"],"months":["mis Genver","mis Hwevrer","mis Meurth","mis Ebrel","mis Me","mis Metheven","mis Gortheren","mis Est","mis Gwynngala","mis Hedra","mis Du","mis Kevardhu"],"short_days":["Sul","Lun","Mth","Mhr","Yow","Gwe","Sad"],"short_months":["Gen","Hwe","Meu","Ebr","Me","Met","Gor","Est","Gwn","Hed","Du","Kev"]},"ky":{"am_pm":["",""],"days":["жекшемби","дүйшөмбү","шейшемби","шаршемби","бейшемби","жума","ишемби"],"months":["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"],"short_days":["жк","дш","ше","ша","бш","жм","иш"],"short_months":["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек"]},"lb":{"am_pm":["",""],"days":["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],"months":["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mé","Dë","Më","Do","Fr","Sa"],"short_months":["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"lg":{"am_pm":["",""],"days":["Sabiiti","Balaza","Lwakubiri","Lwakusatu","Lwakuna","Lwakutaano","Lwamukaaga"],"months":["Janwaliyo","Febwaliyo","Marisi","Apuli","Maayi","Juuni","Julaayi","Agusito","Sebuttemba","Okitobba","Novemba","Desemba"],"short_days":["Sab","Bal","Lw2","Lw3","Lw4","Lw5","Lw6"],"short_months":["Jan","Feb","Mar","Apu","Maa","Juu","Jul","Agu","Seb","Oki","Nov","Des"]},"li":{"am_pm":["",""],"days":["zóndig","maondig","daensdig","goonsdig","dónderdig","vriedig","zaoterdig"],"months":["jannewarie","fibberwarie","miert","eprèl","meij","junie","julie","augustus","september","oktober","november","desember"],"short_days":["zón","mao","dae","goo","dón","vri","zao"],"short_months":["jan","fib","mie","epr","mei","jun","jul","aug","sep","okt","nov","des"]},"lij":{"am_pm":["",""],"days":["domenega","lûnedì","martedì","mercUrdì","zêggia","venardì","sabbo"],"months":["zenâ","fevrâ","marzo","avrî","mazzo","zûgno","lûggio","agosto","settembre","ottobre","novembre","dixembre"],"short_days":["dom","lûn","mar","mer","zêu","ven","sab"],"short_months":["zen","fev","mar","arv","maz","zûg","lûg","ago","set","ött","nov","dix"]},"ln":{"am_pm":["",""],"days":["Lomíngo","Mosálá mɔ̌kɔ́","Misálá míbalé","Misálá mísáto","Misálá mínei","Misálá mítáno","Mpɔ́sɔ"],"months":["sánzá ya yambo","sánzá ya míbalé","sánzá ya mísáto","sánzá ya mínei","sánzá ya mítáno","sánzá ya motóbá","sánzá ya nsambo","sánzá ya mwambe","sánzá ya libwa","sánzá ya zómi","sánzá ya zómi na mɔ̌kɔ́","sánzá ya zómi na míbalé"],"short_days":["m1.","m2.","m3.","m4.","m5.","m6.","m7."],"short_months":["yan","fbl","msi","apl","mai","yun","yul","agt","stb","ɔtb","nvb","dsb"]},"lo":{"am_pm":["AM","PM"],"days":["ອາທິດ","ຈັນ","ອັງຄານ","ພຸດ","ພະຫັດ","ສຸກ","ເສົາ"],"months":["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ"],"short_days":["ອາ.","ຈ.","ຄ.","ພ.","ພຫ.","ສ.","ສ."],"short_months":["ມ.ກ.","ກ.ພ.","ມ.ນ.","ມ.ສ.","ພ.ພ.","ມິ.ຖ.","ກ.ລ.","ສ.ຫ.","ກ.ຍ.","ຕ.ລ.","ພ.ຈ.","ທ.ວ."]},"lt":{"am_pm":["",""],"days":["Sekmadienis","Pirmadienis","Antradienis","Trečiadienis","Ketvirtadienis","Penktadienis","Šeštadienis"],"months":["sausio","vasario","kovo","balandžio","gegužės","birželio","liepos","rugpjūčio","rugsėjo","spalio","lapkričio","gruodžio"],"short_days":["Sk","Pr","An","Tr","Kt","Pn","Št"],"short_months":["saus.","vas.","kov.","bal.","geg.","birž.","liep.","rugp.","rugs.","spal.","lapkr.","gruod."]},"lv":{"am_pm":["",""],"days":["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],"months":["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris"],"short_days":["Sv","P ","O ","T ","C ","Pk","S "],"short_months":["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec"]},"lzh":{"am_pm":["朝","暮"],"days":["週日","週一","週二","週三","週四","週五","週六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 一 "," 二 "," 三 "," 四 "," 五 "," 六 "," 七 "," 八 "," 九 "," 十 ","十一","十二"]},"mag":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["एतवार","सोमार","मंगर","बुध","बिफे","सूक","सनिचर"],"months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],"short_days":["एतवार","सोमार","मंगर","बुध","बिफे","सूक","सनिचर"],"short_months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"]},"mai":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविदिन","सोमदिन","मंगलदिन","बुधदिन","बृहस्पतीदिन","शुक्रदिन","शनीदिन"],"months":["बैसाख","जेठ","अषाढ़","सावोन","भादो","आसिन","कातिक","अगहन","पूस","माघ","फागुन","चैति"],"short_days":["रवि","सोम","मंगल","बुध","बृहस्पती","शुक्र","शनी"],"short_months":["बैसाख","जेठ","अषाढ़","सावोन","भादो","आसिन","कातिक","अगहन","पूस","माघ","फागुन","चैति"]},"mfe":{"am_pm":["AM","PM"],"days":["dimans","lindi","mardi","merkredi","zedi","vandredi","samdi"],"months":["zanvie","fevriye","mars","avril","me","zin","zilye","out","septam","oktob","novam","desam"],"short_days":["dim","lin","mar","mer","ze","van","sam"],"short_months":["zan","fev","mar","avr","me","zin","zil","out","sep","okt","nov","des"]},"mg":{"am_pm":["",""],"days":["alahady","alatsinainy","talata","alarobia","alakamisy","zoma","sabotsy"],"months":["Janoary","Febroary","Martsa","Aprily","Mey","Jona","Jolay","Aogositra","Septambra","Oktobra","Novambra","Desambra"],"short_days":["lhd","lts","tlt","lrb","lkm","zom","sab"],"short_months":["Jan","Feb","Mar","Apr","Mey","Jon","Jol","Aog","Sep","Okt","Nov","Des"]},"mhr":{"am_pm":["",""],"days":["Рушарня","Шочмо","Кушкыжмо","Вӱргече","Изарня","Кугарня","Шуматкече"],"months":["Шорыкйол","Пургыж","Ӱярня","Вӱдшор","Ага","Пеледыш","Сӱрем","Сорла","Идым","Шыжа","Кылме","Теле"],"short_days":["Ршр","Шчм","Кжм","Вгч","Изр","Кгр","Шмт"],"short_months":["Шрк","Пгж","Ӱрн","Вшр","Ага","Пдш","Срм","Срл","Идм","Шыж","Клм","Тел"]},"mi":{"am_pm":["",""],"days":["Rātapu","Mane","Tūrei","Wenerei","Tāite","Paraire","Hātarei"],"months":["Kohi-tātea","Hui-tanguru","Poutū-te-rangi","Paenga-whāwhā","Haratua","Pipiri","Hōngoingoi","Here-turi-kōkā","Mahuru","Whiringa-ā-nuku","Whiringa-ā-rangi","Hakihea"],"short_days":["Ta","Ma","Tū","We","Tāi","Pa","Hā"],"short_months":["Kohi","Hui","Pou","Pae","Hara","Pipi","Hōngoi","Here","Mahu","Whi-nu","Whi-ra","Haki"]},"miq":{"am_pm":["VM","NM"],"days":["sandi","mundi","tiusdi","wensde","tausde","praidi","satadi"],"months":["siakwa kati","kuswa kati","kakamuk kati","lî wainhka kati","lih mairin kati","lî kati","pastara kati","sikla kati","wîs kati","waupasa kati","yahbra kati","trisu kati"],"short_days":["san","mun","tius","wens","taus","prai","sat"],"short_months":["siakwa kati","kuswa kati","kakamuk kati","lî wainhka kati","lih mairin kati","lî kati","pastara kati","sikla kati","wîs kati","waupasa kati","yahbra kati","trisu kati"]},"mjw":{"am_pm":["AM","PM"],"days":["Bhomkuru","Urmi","Durmi","Thelang","Theman","Bhomta","Bhomti"],"months":["Arkoi","Thangthang","There","Jangmi","Aru","Vosik","Jakhong","Paipai","Chiti","Phere","Phaikuni","Matijong"],"short_days":["Bhom","Ur","Dur","Tkel","Tkem","Bhta","Bhti"],"short_months":["Ark","Thang","The","Jang","Aru","Vos","Jak","Pai","Chi","Phe","Phai","Mati"]},"mk":{"am_pm":["",""],"days":["недела","понеделник","вторник","среда","четврток","петок","сабота"],"months":["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],"short_days":["нед","пон","вто","сре","чет","пет","саб"],"short_months":["јан","фев","мар","апр","мај","јун","јул","авг","сеп","окт","ное","дек"]},"ml":{"am_pm":["രാവിലെ","വൈകു"],"days":["ഞായര്‍","തിങ്കള്‍","ചൊവ്വ","ബുധന്‍","വ്യാഴം","വെള്ളി","ശനി"],"months":["ജനുവരി","ഫെബ്രുവരി","മാർച്ച്","ഏപ്രിൽ","മേയ്","ജൂൺ","ജൂലൈ","ഓഗസ്റ്റ്","സെപ്റ്റംബർ","ഒക്‌ടോബർ","നവംബർ","ഡിസംബർ"],"short_days":["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],"short_months":["ജനു","ഫെബ്രു","മാർ","ഏപ്രി","മേയ്","ജൂൺ","ജൂലൈ","ഓഗ","സെപ്റ്റം","ഒക്ടോ","നവം","ഡിസം"]},"mn":{"am_pm":["",""],"days":["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],"months":["Нэгдүгээр сар","Хоёрдугаар сар","Гуравдугаар сар","Дөрөвдүгээр сар","Тавдугаар сар","Зургадугаар сар","Долдугаар сар","Наймдугаар сар","Есдүгээр сар","Аравдугаар сар","Арван нэгдүгээр сар","Арван хоёрдугаар сар"],"short_days":["Ня","Да","Мя","Лх","Пү","Ба","Бя"],"short_months":["1-р сар","2-р сар","3-р сар","4-р сар","5-р сар","6-р сар","7-р сар","8-р сар","9-р сар","10-р сар","11-р сар","12-р сар"]},"mni":{"am_pm":["এ.ম.","প.ম."],"days":["নোংমাইজিং","নিংথৌকাবা","লৈবাকপোকপা","য়ুমশকৈশা","শগোলশেন","ইরাই","থাংজ"],"months":["জানুৱারি","ফেব্রুৱারি","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","সেপ্তেম্বর","ওক্তোবর","নবেম্বর","ডিসেম্বর"],"short_days":["নোং","নিং","লৈবাক","য়ুম","শগোল","ইরা","থাং"],"short_months":["জান","ফেব","মার","এপ্রি","মে","জুন","জুল","আগ","সেপ","ওক্ত","নবে","ডিস"]},"mnw":{"am_pm":["ဂယး","တ္ၚဲစေၚ်"],"days":["အဒိုတ်","စန်","အၚာ","ဗုဒ္ဓဝါ","ဗြဴဗ္တိ","သိုက်","သ္ၚိသဝ်"],"months":["ဂျာန်နျူအာရဳ","ဝှေဝ်ဗြူအာရဳ","မာတ်ချ်","အေပြေယ်လ်","မေ","ဂျုန်","ဂျူလာၚ်","အဝ်ဂါတ်","သိပ်တီဗာ","အံက်တဝ်ဗာ","နဝ်ဝါမ်ဗာ","ဒဳသီဗာ"],"short_days":["ဒိုတ်","စန်","ၚာ","ဝါ","တိ","သိုက်","သဝ်"],"short_months":["ဂျာန်","ဝှေဝ်","မာတ်","အေ","မေ","ဂျုန်","ဂျူ","အဝ်","သိပ်","အံက်","နဝ်","ဒဳ"]},"mr":{"am_pm":["म.पू.","म.नं."],"days":["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"months":["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर"],"short_days":["रवि","सोम","मंगळ","बुध","गुरु","शुक्र","शनि"],"short_months":["जाने","फेब्रु","मार्च","एप्रि","मे","जून","जुलै","ऑग","सप्टें","ऑक्टो","नोव्हें","डिसें"]},"ms":{"am_pm":["",""],"days":["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],"months":["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],"short_days":["Ahd","Isn","Sel","Rab","Kha","Jum","Sab"],"short_months":["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sep","Okt","Nov","Dis"]},"mt":{"am_pm":["",""],"days":["il-Ħadd","it-Tnejn","it-Tlieta","l-Erbgħa","il-Ħamis","il-Ġimgħa","is-Sibt"],"months":["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awwissu","Settembru","Ottubru","Novembru","Diċembru"],"short_days":["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],"short_months":["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Aww","Set","Ott","Nov","Diċ"]},"my":{"am_pm":["နံနက်","ညနေ"],"days":["တနင်္ဂနွေ","တနင်္လာ","အင်္ဂါ","ဗုဒ္ဓဟူး","ကြာသပတေး","သောကြာ","စနေ"],"months":["ဇန်နဝါရီ","ဖေဖော်ဝါရီ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူလိုင်","ဩဂုတ်","စက်တင်ဘာ","အောက်တိုဘာ","နိုဝင်ဘာ","ဒီဇင်ဘာ"],"short_days":["နွေ","လာ","ဂါ","ဟူး","တေး","သော","နေ"],"short_months":["ဇန်","ဖေ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူ","ဩ","စက်","အောက်","နို","ဒီ"]},"nan":{"am_pm":["頂晡","下晡"],"days":["禮拜日","禮拜一","禮拜二","禮拜三","禮拜四","禮拜五","禮拜六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"nb":{"am_pm":["",""],"days":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"months":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"short_days":["sø.","ma.","ti.","on.","to.","fr.","lø."],"short_months":["jan.","feb.","mars","april","mai","juni","juli","aug.","sep.","okt.","nov.","des."]},"nds_DE":{"am_pm":["",""],"days":["Sünndag","Maandag","Dingsdag","Middeweek","Dunnersdag","Freedag","Sünnavend"],"months":["Jannuaar","Feberwaar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["Sdag","Maan","Ding","Migg","Dunn","Free","Svd."],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"nds_NL":{"am_pm":["",""],"days":["Sinndag","Mondag","Dingsdag","Meddwäakj","Donnadag","Friedag","Sinnowend"],"months":["Jaunuwoa","Februwoa","Moaz","Aprell","Mai","Juni","Juli","August","Septamba","Oktoba","Nowamba","Dezamba"],"short_days":["Sdg","Mdg","Dsg","Mwk","Ddg","Fdg","Swd"],"short_months":["Jan","Feb","Moz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Now","Dez"]},"ne":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["आइतबार","सोमबार","मङ्गलबार","बुधबार","बिहीबार","शुक्रबार","शनिबार"],"months":["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],"short_days":["आइत","सोम","मङ्गल","बुध","बिही","शुक्र","शनि"],"short_months":["जन","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"]},"nhn":{"am_pm":["",""],"days":["teoilhuitl","ceilhuitl","omeilhuitl","yeilhuitl","nahuilhuitl","macuililhuitl","chicuaceilhuitl"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["teo","cei","ome","yei","nau","mac","chi"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"niu":{"am_pm":["AM","PM"],"days":["Aho Tapu","Aho Gofua","Aho Ua","Aho Lotu","Aho Tuloto","Aho Falaile","Aho Faiumu"],"months":["Ianuali","Fepuali","Masi","Apelila","Me","Iuni","Iulai","Aokuso","Sepetema","Oketopa","Novema","Tesemo"],"short_days":["Tapu","Gofua","Ua","Lotu","Tuloto","Falaile","Faiumu"],"short_months":["Ian","Fep","Mas","Ape","Me","Iun","Iul","Aok","Sep","Oke","Nov","Tes"]},"nl":{"am_pm":["",""],"days":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"months":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"short_days":["zo","ma","di","wo","do","vr","za"],"short_months":["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"]},"nn":{"am_pm":["",""],"days":["sundag ","måndag ","tysdag ","onsdag ","torsdag ","fredag ","laurdag "],"months":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"short_days":["su.","må.","ty.","on.","to.","fr.","la."],"short_months":["jan.","feb.","mars","april","mai","juni","juli","aug.","sep.","okt.","nov.","des."]},"nr":{"am_pm":["",""],"days":["uSonto","uMvulo","uLesibili","lesithathu","uLesine","ngoLesihlanu","umGqibelo"],"months":["Janabari","uFeberbari","uMatjhi","u-Apreli","Meyi","Juni","Julayi","Arhostosi","Septemba","Oktoba","Usinyikhaba","Disemba"],"short_days":["Son","Mvu","Bil","Tha","Ne","Hla","Gqi"],"short_months":["Jan","Feb","Mat","Apr","Mey","Jun","Jul","Arh","Sep","Okt","Usi","Dis"]},"nso":{"am_pm":["",""],"days":["LaMorena","Mošupologo","Labobedi","Laboraro","Labone","Labohlano","Mokibelo"],"months":["Janaware","Febereware","Matšhe","Aprele","Mei","June","Julae","Agostose","Setemere","Oktobere","Nofemere","Disemere"],"short_days":["Son","Moš","Bed","Rar","Ne","Hla","Mok"],"short_months":["Jan","Feb","Mat","Apr","Mei","Jun","Jul","Ago","Set","Okt","Nof","Dis"]},"oc":{"am_pm":["",""],"days":["dimenge","diluns","dimars","dimècres","dijòus","divendres","dissabte"],"months":["de genièr","de febrièr","de març","d’abril","de mai","de junh","de julhet","d’agost","de setembre","d’octòbre","de novembre","de decembre"],"short_days":["dg.","dl.","dm.","dc.","dj.","dv.","ds."],"short_months":["gen.","febr.","març","abr.","mai","junh","jul.","ago.","set.","oct.","nov.","dec."]},"om":{"am_pm":["WD","WB"],"days":["Dilbata","Wiixata","Qibxata","Roobii","Kamiisa","Jimaata","Sanbata"],"months":["Amajjii","Guraandhala","Bitooteessa","Elba","Caamsa","Waxabajjii","Adooleessa","Hagayya","Fuulbana","Onkololeessa","Sadaasa","Muddee"],"short_days":["Dil","Wix","Qib","Rob","Kam","Jim","San"],"short_months":["Ama","Gur","Bit","Elb","Cam","Wax","Ado","Hag","Ful","Onk","Sad","Mud"]},"or":{"am_pm":["AM","PM"],"days":["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],"months":["ଜାନୁଆରୀ","ଫେବୃଆରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମଇ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"],"short_days":["ରବି","ସୋମ","ମଙ୍ଗଳ","ବୁଧ","ଗୁରୁ","ଶୁକ୍ର","ଶନି"],"short_months":["ଜାନୁଆରୀ","ଫେବୃଆରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମଇ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"]},"os":{"am_pm":["",""],"days":["Хуыцаубон","Къуырисæр","Дыццæг","Æртыццæг","Цыппæрæм","Майрæмбон","Сабат"],"months":["январы","февралы","мартъийы","апрелы","майы","июны","июлы","августы","сентябры","октябры","ноябры","декабры"],"short_days":["Хцб","Крс","Дцг","Æрт","Цпр","Мрб","Сбт"],"short_months":["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"]},"pa_IN":{"am_pm":["ਸਵੇਰੇ","ਸ਼ਾਮ"],"days":["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],"months":["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ"],"short_days":["ਐਤ","ਸੋਮ","ਮੰਗਲ","ਬੁੱਧ","ਵੀਰ","ਸ਼ੁੱਕਰ","ਸ਼ਨਿੱਚਰ"],"short_months":["ਜਨ","ਫ਼ਰ","ਮਾਰਚ","ਅਪ੍ਰੈ","ਮਈ","ਜੂਨ","ਜੁਲਾ","ਅਗ","ਸਤੰ","ਅਕਤੂ","ਨਵੰ","ਦਸੰ"]},"pa_PK":{"am_pm":["ص","ش"],"days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"months":["جنوري","فروري","مارچ","اپريل","مٓی","جون","جولاي","اگست","ستمبر","اكتوبر","نومبر","دسمبر"],"short_days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"short_months":["جنوري","فروري","مارچ","اپريل","مٓی","جون","جولاي","اگست","ستمبر","اكتوبر","نومبر","دسمبر"]},"pap":{"am_pm":["",""],"days":["Djadomingo","Djaluna","Djamars","Djawebs","Djarason","Djabierne","Djasabra"],"months":["Yanüari","Febrüari","Mart","Aprel","Mei","Yüni","Yüli","Ougùstùs","Sèptèmber","Oktober","Novèmber","Desèmber"],"short_days":["do","lu","ma","we","ra","bi","sa"],"short_months":["Yan","Feb","Mar","Apr","Mei","Yün","Yül","Oug","Sèp","Okt","Nov","Des"]},"pl":{"am_pm":["",""],"days":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"months":["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia"],"short_days":["nie","pon","wto","śro","czw","pią","sob"],"short_months":["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"]},"ps":{"am_pm":["غ.م.","غ.و."],"days":["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],"months":["جنوري","فبروري","مارچ","اپریل","مۍ","جون","جولای","اګست","سپتمبر","اکتوبر","نومبر","دسمبر"],"short_days":["ی.","د.","س.","چ.","پ.","ج.","ش."],"short_months":["جنوري","فبروري","مارچ","اپریل","مۍ","جون","جولای","اګست","سپتمبر","اکتوبر","نومبر","دسمبر"]},"pt":{"am_pm":["",""],"days":["domingo","segunda","terça","quarta","quinta","sexta","sábado"],"months":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"short_days":["dom","seg","ter","qua","qui","sex","sáb"],"short_months":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"]},"quz":{"am_pm":["AM","PM"],"days":["tuminku","lunis","martis","miyirkulis","juywis","wiyirnis","sawatu"],"months":["iniru","phiwriru","marsu","awril","mayu","huniyu","huliyu","agustu","siptiyimri","uktuwri","nuwiyimri","tisiyimri"],"short_days":["tum","lun","mar","miy","juy","wiy","saw"],"short_months":["ini","phi","mar","awr","may","hun","hul","agu","sip","ukt","nuw","tis"]},"raj":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवार","सोमवार","मंगल्लवार","बुधवार","बृहस्पतिवार","शुक्रवार","शनिवार"],"months":["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्टूबर","नवंबर","दिसंबर"],"short_days":["रवि","सोम","मंगल","बुध","बृहस्पति","शुक्र","शनि"],"short_months":["जन","फर","मार्च","अप्रै","मई","जून","जुल","अग","सित","अक्टू","नव","दिस"]},"rif":{"am_pm":["sb","aɛ"],"days":["Lḥed","Letnayen","Ttlat","Larbeɛ","Lexmiss","Jjemɛa","Ssebt"],"months":["Yennayer","Febrayer","Mares","Yebril","Mayyu","Yunyu","Yulyuz","Ɣuct","Cutenber","Kṭuber","Nuvember","Dujember"],"short_days":["Lḥe","Let","Ttl","Lar","Lex","Jje","Sbt"],"short_months":["Yen","Feb","Mar","Yeb","May","Yun","Yul","Ɣuc","Cut","Kṭu","Nuv","Duj"]},"ro":{"am_pm":["",""],"days":["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],"months":["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"],"short_days":["Du","Lu","Ma","Mi","Jo","Vi","Sb"],"short_months":["ian","feb","mar","apr","mai","iun","iul","aug","sep","oct","nov","dec"]},"ru":{"am_pm":["",""],"days":["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],"months":["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"],"short_days":["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],"short_months":["янв","фев","мар","апр","мая","июн","июл","авг","сен","окт","ноя","дек"]},"rw":{"am_pm":["",""],"days":["Ku cyumweru","Kuwa mbere","Kuwa kabiri","Kuwa gatatu","Kuwa kane","Kuwa gatanu","Kuwa gatandatu"],"months":["Mutarama","Gashyantare","Werurwe","Mata","Gicuransi","Kamena","Nyakanga","Kanama","Nzeli","Ukwakira","Ugushyingo","Ukuboza"],"short_days":["Mwe","Mbe","Kab","Gtu","Kan","Gnu","Gnd"],"short_months":["Mut","Gas","Wer","Mat","Gic","Kam","Nya","Kan","Nze","Ukw","Ugu","Uku"]},"sa":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवासर:","सोमवासर:","मंगलवासर:","बुधवासर:","बृहस्पतिवासरः","शुक्रवासर","शनिवासर:"],"months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],"short_days":["रविः","सोम:","मंगल:","बुध:","बृहस्पतिः","शुक्र","शनि:"],"short_months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"]},"sah":{"am_pm":["",""],"days":["баскыһыанньа","бэнидиэнньик","оптуорунньук","сэрэдэ","чэппиэр","бээтинсэ","субуота"],"months":["тохсунньу","олунньу","кулун тутар","муус устар","ыам ыйын","бэс ыйын","от ыйын","атырдьах ыйын","балаҕан ыйын","алтынньы","сэтинньи","ахсынньы"],"short_days":["бс","бн","оп","ср","чп","бт","сб"],"short_months":["тохс","олун","кул","муус","ыам","бэс","от","атыр","бал","алт","сэт","ахс"]},"sat":{"am_pm":["AM","PM"],"days":["सिंगेमाँहाँ","ओतेमाँहाँ","बालेमाँहाँ","सागुनमाँहाँ","सारदीमाँहाँ","जारुममाँहाँ","ञुहुममाँहाँ"],"months":["जनवरी","फरवरी","मार्च","अप्रेल","मई","जुन","जुलाई","अगस्त","सितम्बर","अखथबर","नवम्बर","दिसम्बर"],"short_days":["सिंगे","ओते","बाले","सागुन","सारदी","जारुम","ञुहुम"],"short_months":["जनवरी","फरवरी","मार्च","अप्रेल","मई","जुन","जुलाई","अगस्त","सितम्बर","अखथबर","नवम्बर","दिसम्बर"]},"sc":{"am_pm":["",""],"days":["Domìnigu","Lunis","Martis","Mèrcuris","Giòbia","Chenàbura","Sàbadu"],"months":["Ghennàrgiu","Freàrgiu","Martzu","Abrile","Maju","Làmpadas","Argiolas/Trìulas","Austu","Cabudanni","Santugaine/Ladàmine","Onniasantu/Santandria","Nadale/Idas"],"short_days":["Dom","Lun","Mar","Mèr","Giò","Che","Sàb"],"short_months":["Ghe","Fre","Mar","Abr","Maj","Làm","Arg","Aus","Cab","Lad","Onn","Nad"]},"sd":{"am_pm":["AM","PM"],"days":["آرتوارُ","سومرُ","منگلُ","ٻُڌرُ","وسپت","جُمو","ڇنڇر"],"months":["جنوري","فبروري","مارچ","اپريل","مي","جون","جولاءِ","آگسٽ","سيپٽيمبر","آڪٽوبر","نومبر","ڊسمبر"],"short_days":["آرتوارُ","سومرُ","منگلُ","ٻُڌرُ","وسپت","جُمو","ڇنڇر"],"short_months":["جنوري","فبروري","مارچ","اپريل","مي","جون","جولاءِ","آگسٽ","سيپٽيمبر","آڪٽوبر","نومبر","ڊسمبر"]},"se":{"am_pm":["",""],"days":["sotnabeaivi","vuossárga","maŋŋebarga","gaskavahkku","duorasdat","bearjadat","lávvardat"],"months":["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu"],"short_days":["sotn","vuos","maŋ","gask","duor","bear","láv"],"short_months":["ođđj","guov","njuk","cuoŋ","mies","geas","suoi","borg","čakč","golg","skáb","juov"]},"sgs":{"am_pm":["",""],"days":["nedielės dëna","panedielis","oterninks","sereda","četvergs","petnīčė","sobata"],"months":["sausė","vasarė","kuova","balondė","gegožės","bėrželė","lëpas","rogpjūtė","siejės","spalė","lapkrėstė","grůdė"],"short_days":["Nd","Pn","Ot","Sr","Čt","Pt","Sb"],"short_months":["Sau","Vas","Kuo","Bal","Geg","Bėr","Lëp","Rgp","Sie","Spa","Lap","Grd"]},"shn":{"am_pm":["ပွတ်းၼႂ်","ဝၢႆးဝၼ်း"],"days":["ဝၼ်းဢႃးတိတ်ႉ","ဝၼ်းၸၼ်","ဝၼ်းဢၢင်းၵၢၼ်း","ဝၼ်းပုတ်ႉ","ဝၼ်းၽတ်း","ဝၼ်းသုၵ်း","ဝၼ်းသဝ်"],"months":["လိူၼ်ၵမ်","လိူၼ်သၢမ်","လိူၼ်သီႇ","လိူၼ်ႁႃႈ","လိူၼ်ႁူၵ်း","လိူၼ်ၸဵတ်း","လိူၼ်ပႅတ်ႇ","လိူၼ်ၵဝ်ႈ","လိူၼ်သိပ်း","လိူၼ်သိပ်းဢဵတ်း","လိူၼ်သိပ်းသွင်","လိူၼ်ၸဵင်"],"short_days":["တိတ်ႉ","ၸၼ်","ၵၢၼ်း","ပုတ်ႉ","ၽတ်း","သုၵ်း","သဝ်"],"short_months":["လိူၼ်ၵမ်","လိူၼ်သၢမ်","လိူၼ်သီႇ","လိူၼ်ႁႃႈ","လိူၼ်ႁူၵ်း","လိူၼ်ၸဵတ်း","လိူၼ်ပႅတ်ႇ","လိူၼ်ၵဝ်ႈ","လိူၼ်သိပ်း","လိူၼ်သိပ်းဢဵတ်း","လိူၼ်သိပ်းသွင်","လိူၼ်ၸဵင်"]},"shs":{"am_pm":["AM","PM"],"days":["Sxetspesq̓t","Spetkesq̓t","Selesq̓t","Skellesq̓t","Smesesq̓t","Stselkstesq̓t","Stqmekstesq̓t"],"months":["Pellkwet̓min","Pelctsipwen̓ten","Pellsqépts","Peslléwten","Pell7ell7é7llqten","Pelltspéntsk","Pelltqwelq̓wél̓t","Pellct̓éxel̓cten","Pesqelqlélten","Pesllwélsten","Pellc7ell7é7llcwten̓","Pelltetétq̓em"],"short_days":["Sxe","Spe","Sel","Ske","Sme","Sts","Stq"],"short_months":["Kwe","Tsi","Sqe","Éwt","Ell","Tsp","Tqw","Ct̓é","Qel","Wél","U7l","Tet"]},"si":{"am_pm":["පෙ.ව.","ප.ව."],"days":["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],"months":["ජනවාරි","පෙබරවාරි","මාර්තු","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්"],"short_days":["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"],"short_months":["ජන","පෙබ","මාර්","අප්‍රි","මැයි","ජූනි","ජූලි","අගෝ","සැප්","ඔක්","නෙවැ","දෙසැ"]},"sid":{"am_pm":["soodo","hawwaro"],"days":["Sambata","Sanyo","Maakisanyo","Roowe","Hamuse","Arbe","Qidaame"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sam","San","Mak","Row","Ham","Arb","Qid"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"sk":{"am_pm":["",""],"days":["Nedeľa","Pondelok","Utorok","Streda","Štvrtok","Piatok","Sobota"],"months":["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],"short_days":["Ne","Po","Ut","St","Št","Pi","So"],"short_months":["jan","feb","mar","apr","máj","jún","júl","aug","sep","okt","nov","dec"]},"sl":{"am_pm":["",""],"days":["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],"months":["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],"short_days":["ned","pon","tor","sre","čet","pet","sob"],"short_months":["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"]},"sm":{"am_pm":["",""],"days":["Aso Sa","Aso Gafua","Aso Lua","Aso Lulu","Aso Tofi","Aso Farail","Aso To'ana'i"],"months":["Ianuari","Fepuari","Mati","Aperila","Me","Iuni","Iulai","Auguso","Setema","Oketopa","Novema","Tesema"],"short_days":["Aso Sa","Aso Gaf","Aso Lua","Aso Lul","Aso Tof","Aso Far","Aso To'"],"short_months":["Ian","Fep","Mat","Ape","Me","Iun","Iul","Aug","Set","Oke","Nov","Tes"]},"so_DJ":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Tal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"so_ET":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Sal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"so_KE":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Sal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"so_SO":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Sal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"sq":{"am_pm":["PD","MD"],"days":["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],"months":["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor"],"short_days":["Die","Hën","Mar","Mër","Enj","Pre","Sht"],"short_months":["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj"]},"sr_ME":{"am_pm":["",""],"days":["недјеља","понедељак","уторак","сриједа","четвртак","петак","субота"],"months":["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],"short_days":["нед","пон","уто","сри","чет","пет","суб"],"short_months":["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"]},"sr_RS":{"am_pm":["",""],"days":["недеља","понедељак","уторак","среда","четвртак","петак","субота"],"months":["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],"short_days":["нед","пон","уто","сре","чет","пет","суб"],"short_months":["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"]},"ss":{"am_pm":["",""],"days":["Lisontfo","uMsombuluko","Lesibili","Lesitsatfu","Lesine","Lesihlanu","uMgcibelo"],"months":["Bhimbidvwane","iNdlovane","iNdlovulenkhulu","Mabasa","Inkhwenkhweti","iNhlaba","Kholwane","iNgci","iNyoni","Impala","Lweti","iNgongoni"],"short_days":["Son","Mso","Bil","Tsa","Ne","Hla","Mgc"],"short_months":["Bhi","Van","Vul","Mab","Khk","Nhl","Kho","Ngc","Nyo","Imp","Lwe","Ngo"]},"st":{"am_pm":["",""],"days":["Sontaha","Mantaha","Labobedi","Laboraro","Labone","Labohlano","Moqebelo"],"months":["Pherekgong","Hlakola","Tlhakubele","Mmese","Motsheanong","Phupjane","Phupu","Phato","Leotse","Mphalane","Pudungwana","Tshitwe"],"short_days":["Son","Mma","Bed","Rar","Ne","Hla","Moq"],"short_months":["Phe","Hla","TlH","Mme","Mot","Jan","Upu","Pha","Leo","Mph","Pud","Tsh"]},"sv":{"am_pm":["",""],"days":["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],"months":["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],"short_days":["sön","mån","tis","ons","tor","fre","lör"],"short_months":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"]},"sw":{"am_pm":["asubuhi","alasiri"],"days":["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],"months":["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"],"short_days":["J2","J3","J4","J5","Alh","Ij","J1"],"short_months":["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"]},"szl":{"am_pm":["",""],"days":["niydziela","pyńdziałek","wtorek","strzoda","sztwortek","piōntek","sobota"],"months":["stycznia","lutego","marca","kwietnia","moja","czyrwca","lipca","sierpnia","września","października","listopada","grudnia"],"short_days":["niy","pyń","wto","str","szt","piō","sob"],"short_months":["sty","lut","mar","kwi","moj","czy","lip","sie","wrz","paź","lis","gru"]},"ta_IN":{"am_pm":["காலை","மாலை"],"days":["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],"months":["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"],"short_days":["ஞா","தி","செ","பு","வி","வெ","ச"],"short_months":["ஜன.","பிப்.","மார்.","ஏப்.","மே","ஜூன்","ஜூலை","ஆக.","செப்.","அக்.","நவ.","டிச."]},"ta_LK":{"am_pm":["காலை","மாலை"],"days":["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],"months":["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"],"short_days":["ஞா","தி","செ","பு","வி","வெ","ச"],"short_months":["ஜன","பிப்","மார்","ஏப்","மே","ஜூன்","ஜூலை","ஆக","செப்","அக்","நவ","டிச"]},"tcy":{"am_pm":["ಕಾಂಡೆ","ಬಯ್ಯ"],"days":["ಐಥಾರ","ಸೋಮಾರ","ಅಂಗರೆ","ಬುಧಾರ","ಗುರುವಾರ","ಶುಕ್ರರ","ಶನಿವಾರ"],"months":["ಜನವರಿ","ಫೆಬ್ರುವರಿ","ಮಾರ್ಚ್","ಏಪ್ರಿಲ್‌‌","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟೆಂಬರ್‌","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್"],"short_days":["ಐ","ಸೋ","ಅಂ","ಬು","ಗು","ಶು","ಶ"],"short_months":["ಜ","ಫೆ","ಮಾ","ಏ","ಮೇ","ಜೂ","ಜು","ಆ","ಸೆ","ಅ","ನ","ಡಿ"]},"te":{"am_pm":["ఉ.","సా."],"days":["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],"months":["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జులై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్"],"short_days":["ఆది","సోమ","మంగళ","బుధ","గురు","శుక్ర","శని"],"short_months":["జన","ఫిబ్ర","మార్చి","ఏప్రి","మే","జూన్","జులై","ఆగ","సెప్టెం","అక్టో","నవం","డిసెం"]},"tg":{"am_pm":["",""],"days":["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],"months":["Января","Февраля","Марта","Апреля","Мая","Июня","Июля","Августа","Сентября","Октября","Ноября","Декабря"],"short_days":["Вск","Пнд","Втр","Срд","Чтв","Птн","Сбт"],"short_months":["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"]},"th":{"am_pm":["AM","PM"],"days":["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],"months":["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],"short_days":["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],"short_months":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."]},"the":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["आइतबार","सोमबार","मंगलबार","बुधबार","बिहिबार","शुक्रबार","शनिबार"],"months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],"short_days":["आइत","सोम","मंगल","बुध","बिहि","शुक्र","शनि"],"short_months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"]},"ti_ER":{"am_pm":["ንጉሆ ሰዓተ","ድሕር ሰዓት"],"days":["ሰንበት","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"months":["ጥሪ","ለካቲት","መጋቢት","ሚያዝያ","ግንቦት","ሰነ","ሓምለ","ነሓሰ","መስከረም","ጥቅምቲ","ሕዳር","ታሕሳስ"],"short_days":["ሰንበ","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"short_months":["ጥሪ ","ለካቲ","መጋቢ","ሚያዝ","ግንቦ","ሰነ ","ሓምለ","ነሓሰ","መስከ","ጥቅም","ሕዳር","ታሕሳ"]},"ti_ET":{"am_pm":["ንጉሆ ሰዓተ","ድሕር ሰዓት"],"days":["ሰንበት","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"months":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር"],"short_days":["ሰንበ","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"short_months":["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ ","ጁን ","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም"]},"tig":{"am_pm":["ቀደም ሰር ምዕል","ሓቆ ሰር ምዕል"],"days":["ሰንበት ዓባይ","ሰኖ","ታላሸኖ","ኣረርባዓ","ከሚሽ","ጅምዓት","ሰንበት ንኢሽ"],"months":["ጥሪ","ለካቲት","መጋቢት","ሚያዝያ","ግንቦት","ሰነ","ሓምለ","ነሓሰ","መስከረም","ጥቅምቲ","ሕዳር","ታሕሳስ"],"short_days":["ሰ/ዓ","ሰኖ ","ታላሸ","ኣረር","ከሚሽ","ጅምዓ","ሰ/ን"],"short_months":["ጥሪ ","ለካቲ","መጋቢ","ሚያዝ","ግንቦ","ሰነ ","ሓምለ","ነሓሰ","መስከ","ጥቅም","ሕዳር","ታሕሳ"]},"tk":{"am_pm":["",""],"days":["Duşenbe","Sişenbe","Çarşenbe","Penşenbe","Anna","Şenbe","Ýekşenbe"],"months":["Ýanwar","Fewral","Mart","Aprel","Maý","Iýun","Iýul","Awgust","Sentýabr","Oktýabr","Noýabr","Dekabr"],"short_days":["Duş","Siş","Çar","Pen","Ann","Şen","Ýek"],"short_months":["Ýan","Few","Mar","Apr","Maý","Iýn","Iýl","Awg","Sen","Okt","Noý","Dek"]},"tl":{"am_pm":["AM","PM"],"days":["Linggo","Lunes","Martes","Miyerkoles","Huwebes","Biyernes","Sabado"],"months":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Septiyembre","Oktubre","Nobiyembre","Disyembre"],"short_days":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"short_months":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Sep","Okt","Nob","Dis"]},"tn":{"am_pm":["",""],"days":["laTshipi","Mosupologo","Labobedi","Laboraro","Labone","Labotlhano","Lamatlhatso"],"months":["Ferikgong","Tlhakole","Mopitlwe","Moranang","Motsheganong","Seetebosigo","Phukwi","Phatwe","Lwetse","Diphalane","Ngwanatsele","Sedimonthole"],"short_days":["Tsh","Mos","Bed","Rar","Ne","Tlh","Mat"],"short_months":["Fer","Tlh","Mop","Mor","Mot","See","Phu","Pha","Lwe","Dip","Ngw","Sed"]},"to":{"am_pm":["hengihengi","efiafi"],"days":["Sāpate","Mōnite","Tūsite","Pulelulu","Tuʻapulelulu","Falaite","Tokonaki"],"months":["Sānuali","Fēpueli","Maʻasi","ʻEpeleli","Mē","Sune","Siulai","ʻAokosi","Sepitema","ʻOkatopa","Nōvema","Tīsema"],"short_days":["Sāp","Mōn","Tūs","Pul","Tuʻa","Fal","Tok"],"short_months":["Sān","Fēp","Maʻa","ʻEpe","Mē","Sun","Siu","ʻAok","Sep","ʻOka","Nōv","Tīs"]},"tpi":{"am_pm":["biknait","apinun"],"days":["Sande","Mande","Tunde","Trinde","Fonde","Fraide","Sarere"],"months":["Janueri","Februeri","Mas","Epril","Me","Jun","Julai","Ogas","Septemba","Oktoba","Novemba","Desemba"],"short_days":["San","Man","Tun","Tri","Fon","Fra","Sar"],"short_months":["Jan","Feb","Mas","Epr","Me","Jun","Jul","Oga","Sep","Okt","Nov","Des"]},"tr":{"am_pm":["ÖÖ","ÖS"],"days":["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],"months":["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],"short_days":["Paz","Pzt","Sal","Çrş","Prş","Cum","Cts"],"short_months":["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"]},"ts":{"am_pm":["",""],"days":["Sonto","Musumbhunuku","Ravumbirhi","Ravunharhu","Ravumune","Ravuntlhanu","Mugqivela"],"months":["Sunguti","Nyenyenyani","Nyenyankulu","Dzivamisoko","Mudyaxihi","Khotavuxika","Mawuwani","Mhawuri","Ndzhati","Nhlangula","Hukuri","N'wendzamhala"],"short_days":["Son","Mus","Bir","Har","Ne","Tlh","Mug"],"short_months":["Sun","Yan","Kul","Dzi","Mud","Kho","Maw","Mha","Ndz","Nhl","Huk","N'w"]},"tt":{"am_pm":["",""],"days":["якшәмбе","дүшәмбе","сишәмбе","чәршәмбе","пәнҗешәмбе","җомга","шимбә"],"months":["гыйнвар","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"],"short_days":["якш","дүш","сиш","чәр","пәнҗ","җом","шим"],"short_months":["гыйн","фев","мар","апр","май","июнь","июль","авг","сент","окт","нояб","дек"]},"ug":{"am_pm":["",""],"days":["يەكشەنبە","دۈشەنبە","سەيشەنبە","چارشەنبە","پەيشەنبە","جۈمە","شەنبە"],"months":["يانۋار","فېۋرال","مارت","ئاپرېل","ماي","ئىيۇن","ئىيۇل","ئاۋغۇست","سېنتەبىر","ئۆكتەبىر","نويابىر","دېكابىر"],"short_days":["ي","د","س","چ","پ","ج","ش"],"short_months":["يانۋار","فېۋرال","مارت","ئاپرېل","ماي","ئىيۇن","ئىيۇل","ئاۋغۇست","سېنتەبىر","ئۆكتەبىر","نويابىر","دېكابىر"]},"uk":{"am_pm":["",""],"days":["неділя","понеділок","вівторок","середа","четвер","п'ятниця","субота"],"months":["січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня"],"short_days":["нд","пн","вт","ср","чт","пт","сб"],"short_months":["січ","лют","бер","кві","тра","чер","лип","сер","вер","жов","лис","гру"]},"unm":{"am_pm":["",""],"days":["kentuwei","manteke","tusteke","lelai","tasteke","pelaiteke","sateteke"],"months":["enikwsi","chkwali","xamokhwite","kwetayoxe","tainipen","kichinipen","lainipen","winaminke","kichitahkok","puksit","wini","muxkotae"],"short_days":["ken","man","tus","lel","tas","pel","sat"],"short_months":["eni","chk","xam","kwe","tai","nip","lai","win","tah","puk","kun","mux"]},"ur_IN":{"am_pm":["AM","PM"],"days":["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","سنیچر"],"months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"short_days":["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","سنیچر"],"short_months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"]},"ur_PK":{"am_pm":["ص","ش"],"days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"short_days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"short_months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"]},"uz":{"am_pm":["",""],"days":["Yakshanba","Dushanba","Seshanba","Chorshanba","Payshanba","Juma","Shanba"],"months":["Yanvar","Fevral","Mart","Aprel","May","Iyun","Iyul","Avgust","Sentabr","Oktabr","Noyabr","Dekabr"],"short_days":["Yak","Du","Se","Cho","Pay","Ju","Sha"],"short_months":["Yan","Fev","Mar","Apr","May","Iyn","Iyl","Avg","Sen","Okt","Noy","Dek"]},"ve":{"am_pm":["",""],"days":["Swondaha","Musumbuluwo","Ḽavhuvhili","Ḽavhuraru","Ḽavhuṋa","Ḽavhuṱanu","Mugivhela"],"months":["Phando","Luhuhi","Ṱhafamuhwe","Lambamai","Shundunthule","Fulwi","Fulwana","Ṱhangule","Khubvumedzi","Tshimedzi","Ḽara","Nyendavhusiku"],"short_days":["Swo","Mus","Vhi","Rar","ṋa","Ṱan","Mug"],"short_months":["Pha","Luh","Fam","Lam","Shu","Lwi","Lwa","Ngu","Khu","Tsh","Ḽar","Nye"]},"vi":{"am_pm":["AM","PM"],"days":["Chủ nhật","Thứ hai","Thứ ba","Thứ tư","Thứ năm","Thứ sáu","Thứ bảy"],"months":["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],"short_days":["CN","T2","T3","T4","T5","T6","T7"],"short_months":["Thg 1","Thg 2","Thg 3","Thg 4","Thg 5","Thg 6","Thg 7","Thg 8","Thg 9","Thg 10","Thg 11","Thg 12"]},"wa":{"am_pm":["AM","PM"],"days":["dimegne","londi","mårdi","mierkidi","djudi","vénrdi","semdi"],"months":["di djanvî","di fevrî","di måss","d’ avri","di may","di djun","di djulete","d’ awousse","di setimbe","d’ octôbe","di nôvimbe","di decimbe"],"short_days":["dim","lon","mår","mie","dju","vén","sem"],"short_months":["dja","fev","mås","avr","may","djn","djl","awo","set","oct","nôv","dec"]},"wae":{"am_pm":["",""],"days":["Suntag","Mäntag","Zischtag","Mittwuch","Frontag","Fritag","Samschtag"],"months":["Jenner","Hornig","Märze","Abrille","Meije","Bráčet","Heiwet","Öigšte","Herbštmánet","Wímánet","Wintermánet","Chrištmánet"],"short_days":["Sun","Män","Zis","Mit","Fro","Fri","Sam"],"short_months":["Jen","Hor","Mär","Abr","Mei","Brá","Hei","Öig","Her","Wím","Win","Chr"]},"wal":{"am_pm":["ማለዶ","ቃማ"],"days":["ወጋ","ሳይኖ","ማቆሳኛ","አሩዋ","ሃሙሳ","አርባ","ቄራ"],"months":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር"],"short_days":["ወጋ ","ሳይኖ","ማቆሳ","አሩዋ","ሃሙሳ","አርባ","ቄራ "],"short_months":["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ ","ጁን ","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም"]},"wo":{"am_pm":["",""],"days":["dib'eer","altine","talaata","allarba","alxames","ajjuma","gaawu"],"months":["sanwiy'e","feebriy'e","mars","awril","me","suwen","sulet","uut","septaambar","oktoobar","nowaambar","desaambar"],"short_days":["dib","alt","tal","all","alx","ajj","gaa"],"short_months":["san","fee","mar","awr","me ","suw","sul","uut","sep","okt","now","des"]},"xh":{"am_pm":["",""],"days":["iCawa","uMvulo","lwesiBini","lwesiThathu","ulweSine","lwesiHlanu","uMgqibelo"],"months":["eyoMqungu","eyoMdumba","eyoKwindla","uTshazimpuzi","uCanzibe","eyeSilimela","eyeKhala","eyeThupa","eyoMsintsi","eyeDwarha","eyeNkanga","eyoMnga"],"short_days":["Caw","Mvu","Bin","Tha","Sin","Hla","Mgq"],"short_months":["Mqu","Mdu","Kwi","Tsh","Can","Sil","Kha","Thu","Msi","Dwa","Nka","Mng"]},"yi":{"am_pm":["AM","PM"],"days":["זונטיק","מאָנטיק","דינסטיק","מיטװאָך","דאָנערשטיק","פֿרײַטיק","שבת"],"months":["יאַנואַר","פֿעברואַר","מערץ","אַפּריל","מיי","יוני","יולי","אויגוסט","סעפּטעמבער","אקטאבער","נאוועמבער","דעצעמבער"],"short_days":["זונ'","מאָנ'","דינ'","מיט'","דאָנ'","פֿרײַ'","שבת"],"short_months":["יאַנ","פֿעב","מאַר","אַפּר","מײַ ","יונ","יול","אױג","סעפּ","אָקט","נאָװ","דעצ"]},"yo":{"am_pm":["AM","PM"],"days":["Ọjọ́ Àìkú","Ọjọ́ Ajé","Ọjọ́ Ìsẹ́gun","Ọjọ́rú","Ọjọ́bọ","Ọjọ́ Ẹtì","Ọjọ́ Àbámẹ́ta"],"months":["Oṣù Ṣẹ́rẹ́","Oṣù Èrèlè","Oṣù Ẹrẹ̀nà","Oṣù Ìgbé","Oṣù Ẹ̀bibi","Oṣù Òkúdu","Oṣù Agẹmọ","Oṣù Ògún","Oṣù Owewe","Oṣù Ọ̀wàrà","Oṣù Bélú","Oṣù Ọ̀pẹ̀"],"short_days":["Àìkú","Ajé","Ìsẹ́gun","Ọjọ́rú","Ọjọ́bọ","Ẹtì","Àbámẹ́ta"],"short_months":["Ṣẹ́rẹ́","Èrèlè","Ẹrẹ̀nà","Ìgbé","Ẹ̀bibi","Òkúdu","Agẹmọ","Ògún","Owewe","Ọ̀wàrà","Bélú","Ọ̀pẹ̀"]},"yue":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"short_days":["日","一","二","三","四","五","六"],"short_months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]},"yuw":{"am_pm":["AM","PM"],"days":["sönda","mönda","sinda","mitiwö","sogipbono","nenggo","söndanggie"],"months":["jenuari","febuari","mas","epril","mei","jun","julai","ögus","septemba","öktoba","nöwemba","diksemba"],"short_days":["sön","mön","sin","mit","soi","nen","sab"],"short_months":["jen","feb","mas","epr","mei","jun","jul","ögu","sep","ökt","nöw","dis"]},"zh_CN":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]},"zh_HK":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]},"zh_SG":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},"zh_TW":{"am_pm":["上午","下午"],"days":["週日","週一","週二","週三","週四","週五","週六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"zu":{"am_pm":["",""],"days":["iSonto","uMsombuluko","uLwesibili","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],"months":["Januwari","Februwari","Mashi","Ephreli","Meyi","Juni","Julayi","Agasti","Septhemba","Okthoba","Novemba","Disemba"],"short_days":["Son","Mso","Bil","Tha","Sin","Hla","Mgq"],"short_months":["Jan","Feb","Mas","Eph","Mey","Jun","Jul","Aga","Sep","Okt","Nov","Dis"]}} diff --git a/dates/i18n/i18n.json b/dates/i18n/i18n.json deleted file mode 100644 index c7c169b..0000000 --- a/dates/i18n/i18n.json +++ /dev/null @@ -1 +0,0 @@ -{"aa-DJ":{"am_pm":["saaku","carra"],"days":["Acaada","Etleeni","Talaata","Arbaqa","Kamiisi","Gumqata","Sabti"],"months":["Qunxa Garablu","Naharsi Kudo","Ciggilta Kudo","Agda Baxis","Caxah Alsa","Qasa Dirri","Qado Dirri","Leqeeni","Waysu","Diteli","Ximoli","Kaxxa Garablu"],"short_days":["Aca","Etl","Tal","Arb","Kam","Gum","Sab"],"short_months":["Qun","Nah","Cig","Agd","Cax","Qas","Qad","Leq","Way","Dit","Xim","Kax"]},"aa-ER":{"am_pm":["saaku","carra"],"days":["Acaada","Etleeni","Talaata","Arbaqa","Kamiisi","Gumqata","Sabti"],"months":["Qunxa Garablu","Naharsi Kudo","Ciggilta Kudo","Agda Baxis","Caxah Alsa","Qasa Dirri","Qado Dirri","Liiqen","Waysu","Diteli","Ximoli","Kaxxa Garablu"],"short_days":["Aca","Etl","Tal","Arb","Kam","Gum","Sab"],"short_months":["Qun","Nah","Cig","Agd","Cax","Qas","Qad","Leq","Way","Dit","Xim","Kax"]},"aa-ET":{"am_pm":["saaku","carra"],"days":["Acaada","Etleeni","Talaata","Arbaqa","Kamiisi","Gumqata","Sabti"],"months":["Qunxa Garablu","Naharsi Kudo","Ciggilta Kudo","Agda Baxis","Caxah Alsa","Qasa Dirri","Qado Dirri","Liiqen","Waysu","Diteli","Ximoli","Kaxxa Garablu"],"short_days":["Aca","Etl","Tal","Arb","Kam","Gum","Sab"],"short_months":["Qun","Nah","Cig","Agd","Cax","Qas","Qad","Leq","Way","Dit","Xim","Kax"]},"af":{"am_pm":["VM","NM"],"days":["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],"months":["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],"short_days":["So","Ma","Di","Wo","Do","Vr","Sa"],"short_months":["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"]},"ak":{"am_pm":["AN","EW"],"days":["Kwesida","Dwowda","Benada","Wukuda","Yawda","Fida","Memeneda"],"months":["Sanda-Ɔpɛpɔn","Kwakwar-Ɔgyefuo","Ebɔw-Ɔbenem","Ebɔbira-Oforisuo","Esusow Aketseaba-Kɔtɔnimba","Obirade-Ayɛwohomumu","Ayɛwoho-Kitawonsa","Difuu-Ɔsandaa","Fankwa-Ɛbɔ","Ɔbɛsɛ-Ahinime","Ɔberɛfɛw-Obubuo","Mumu-Ɔpɛnimba"],"short_days":["Kwe","Dwo","Ben","Wuk","Yaw","Fia","Mem"],"short_months":["S-Ɔ","K-Ɔ","E-Ɔ","E-O","E-K","O-A","A-K","D-Ɔ","F-Ɛ","Ɔ-A","Ɔ-O","M-Ɔ"]},"am":{"am_pm":["ጡዋት","ከሰዓት"],"days":["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"months":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕሪል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክቶበር","ኖቬምበር","ዲሴምበር"],"short_days":["እሑድ","ሰኞ ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"short_months":["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ ","ጁን ","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም"]},"an":{"am_pm":["",""],"days":["domingo","luns","martes","mierques","chueves","viernes","sabado"],"months":["chinero","febrero","marzo","abril","mayo","chunyo","chuliol","agosto","setiembre","octubre","noviembre","aviento"],"short_days":["dom","lun","mar","mie","chu","vie","sab"],"short_months":["chi","feb","mar","abr","may","chn","chl","ago","set","oct","nov","avi"]},"ar-AE":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت "],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar-BH":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar-DZ":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"]},"ar-EG":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar-IN":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar-IQ":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar-JO":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar-KW":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar-LB":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar-LY":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar-MA":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر"]},"ar-OM":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar-QA":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar-SA":{"am_pm":["",""],"days":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعـة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"]},"ar-SD":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar-SS":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar-SY":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar-TN":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"]},"ar-YE":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"as":{"am_pm":["পূৰ্ব্বাহ্ন","অপৰাহ্ন"],"days":["দেওবাৰ","সোমবাৰ","মঙ্গলবাৰ","বুধবাৰ","বৃহষ্পতিবাৰ","শুক্ৰবাৰ","শনিবাৰ"],"months":["জানুৱাৰী","ফেব্ৰুৱাৰী","মাৰ্চ","এপ্ৰিল","মে","জুন","জুলাই","আগষ্ট","ছেপ্তেম্বৰ","অক্টোবৰ","নৱেম্বৰ","ডিচেম্বৰ"],"short_days":["দেও","সোম","মঙ্গল","বুধ","বৃহষ্পতি","শুক্ৰ","শনি"],"short_months":["জানু","ফেব্ৰু","মাৰ্চ","এপ্ৰিল","মে","জুন","জুলাই","আগ","সেপ্ট","অক্টো","নভে","ডিসে"]},"az-AZ":{"am_pm":["",""],"days":["bazar günü","bazar ertəsi","çərşənbə axşamı","çərşənbə","cümə axşamı","cümə","şənbə"],"months":["yanvar","fevral","mart","aprel","may","iyun","iyul","avqust","sentyabr","oktyabr","noyabr","dekabr"],"short_days":["baz","ber","çax","çər","cax","cüm","şnb"],"short_months":["Yan","Fev","Mar","Apr","May","İyn","İyl","Avq","Sen","Okt","Noy","Dek"]},"az-IR":{"am_pm":["",""],"days":["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","جۆمعه آخشامی","جۆمعه","شنبه"],"months":["ژانویه","فوریه","مارس","آوریل","مئی","ژوئن","جولای","آقۇست","سپتامبر","اوْکتوْبر","نوْوامبر","دسامبر"],"short_days":["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","جۆمعه آخشامی","جۆمعه","شنبه"],"short_months":["ژانویه","فوریه","مارس","آوریل","مئی","ژوئن","جولای","آقۇست","سپتامبر","اوْکتوْبر","نوْوامبر","دسامبر"]},"be":{"am_pm":["",""],"days":["Нядзеля","Панядзелак","Аўторак","Серада","Чацвер","Пятніца","Субота"],"months":["студзеня","лютага","сакавіка","красавіка","мая","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня"],"short_days":["Няд","Пан","Аўт","Срд","Чцв","Пят","Суб"],"short_months":["сту","лют","сак","кра","мая","чэр","ліп","жні","вер","кас","ліс","сне"]},"bg":{"am_pm":["",""],"days":["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],"months":["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември"],"short_days":["нд","пн","вт","ср","чт","пт","сб"],"short_months":["яну","фев","мар","апр","май","юни","юли","авг","сеп","окт","ное","дек"]},"bi":{"am_pm":["AM","PM"],"days":["Sande","Mande","Tusde","Wenesde","Tosde","Fraede","Sarere"],"months":["Jenuware","Febwari","Maj","Epril","Mei","Jun","Julae","Ogis","Septemba","Oktoba","Novemba","Disemba"],"short_days":["San","Man","Tus","Wen","Tas","Fra","Sar"],"short_months":["Jan","Feb","Maj","Epr","Mei","Jun","Jul","Ogs","Sep","Okt","Nov","Dis"]},"bn-BD":{"am_pm":["পূর্বাহ্ণ","অপরাহ্ণ"],"days":["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],"months":["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"short_days":["রবি","সোম","মঙ্গল","বুধ","বৃহঃ","শুক্র","শনি"],"short_months":["জানু","ফেব","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"]},"bn-IN":{"am_pm":["পূর্বাহ্ণ","অপরাহ্ণ"],"days":["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],"months":["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"short_days":["রবি","সোম","মঙ্গল","বুধ","বৃহস্পতি","শুক্র","শনি"],"short_months":["জানু","ফেব","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"]},"bo":{"am_pm":["ངས་ཆ","ཕྱི་ཆ"],"days":["གཟའ་ཉི་མ་","གཟའ་ཟླ་བ་","གཟའ་མིག་དམར་","གཟའ་ལྷག་ཕ་","གཟའ་པུར་བུ་","གཟའ་པ་སངས་","གཟའ་སྤེན་ཕ་"],"months":["ཟླ་བ་དང་པ་","ཟླ་བ་གཉིས་པ་","ཟླ་བ་གསུམ་པ་","ཟླ་བ་བཞི་པ་","ཟླ་བ་ལྔ་ཕ་","ཟླ་བ་དྲུག་པ་","ཟླ་བ་བདུནཔ་","ཟླ་བ་བརྒྱད་པ་","ཟླ་བ་དགུ་པ་","ཟླ་བ་བཅུ་པ་","ཟླ་བ་བཅུ་གཅིག་པ་","ཟླ་བ་བཅུ་གཉིས་པ་"],"short_days":["ཉི་","ཟླ་","མིར་","ལྷག་","པུར་","སངས་","སྤེན་"],"short_months":["ཟླ་༡","ཟླ་༢","ཟླ་༣","ཟླ་༤","ཟླ་༥","ཟླ་༦","ཟླ་༧","ཟླ་༨","ཟླ་༩","ཟླ་༡༠","ཟླ་༡༡","ཟླ་༡༢"]},"br":{"am_pm":[" "," "],"days":["sul","lun","meurzh","mercʼher","yaou","gwener","sadorn"],"months":["Genver","Cʼhwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu"],"short_days":["sul","lun","meu","mer","yao","gwe","sad"],"short_months":["Gen ","Cʼhw","Meu ","Ebr ","Mae ","Mezh","Gou ","Eos ","Gwe ","Her ","Du ","Ker "]},"bs":{"am_pm":["",""],"days":["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],"months":["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novembar","Decembar"],"short_days":["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],"short_months":["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"]},"ca":{"am_pm":["a. m.","p. m."],"days":["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],"months":["de gener","de febrer","de març","d’abril","de maig","de juny","de juliol","d’agost","de setembre","d’octubre","de novembre","de desembre"],"short_days":["dg.","dl.","dt.","dc.","dj.","dv.","ds."],"short_months":["de gen.","de febr.","de març","d’abr.","de maig","de juny","de jul.","d’ag.","de set.","d’oct.","de nov.","de des."]},"ce":{"am_pm":["",""],"days":["КӀиранан де","Оршотан де","Шинарин де","Кхаарин де","Еарин де","ПӀераскан де","Шот де"],"months":["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],"short_days":["КӀ","Ор","Ши","Кх","Еа","ПӀ","Шо"],"short_months":["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек"]},"cs":{"am_pm":["",""],"days":["Neděle","Pondělí","Úterý","Středa","Čtvrtek","Pátek","Sobota"],"months":["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"],"short_days":["Ne","Po","Út","St","Čt","Pá","So"],"short_months":["led","úno","bře","dub","kvě","čen","čec","srp","zář","říj","lis","pro"]},"cv":{"am_pm":["",""],"days":["vyrsarnikun","tuntikun","ytlarikun","junkun","kĕşnernikun","ernekun","šămatkun"],"months":["kărlac","narăs","puš","aka","şu","şĕrtme","ută","şurla","avăn","jupa","cük","raštav"],"short_days":["vr","tn","yt","jn","kş","er","šm"],"short_months":["KĂR","NAR","PUŠ","AKA","ŞU","ŞĔR","UTĂ","ŞUR","AVĂ","JUP","CÜK","RAŠ"]},"cy":{"am_pm":["am","pm"],"days":["Sul","Llun","Mawrth","Mercher","Iau","Gwener","Sadwrn"],"months":["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],"short_days":["Sul","Llu","Maw","Mer","Iau","Gwe","Sad"],"short_months":["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rha"]},"da":{"am_pm":["",""],"days":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"months":["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],"short_days":["søn","man","tir","ons","tor","fre","lør"],"short_months":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"]},"de-AT":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de-BE":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de-CH":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de-DE":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de-IT":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de-LI":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de-LU":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"dv":{"am_pm":["މކ","މފ"],"days":["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],"months":["ޖެނުއަރީ","ފެބްރުއަރީ","މާރޗް","އެޕްރީލް","މެއި","ޖޫން","ޖުލައި","އޮގަސްޓް","ސެޕްޓެންބަރ","އޮކްޓޫބަރ","ނޮވެންބަރ","ޑިސެންބަރ"],"short_days":["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],"short_months":["ޖެނުއަރީ","ފެބްރުއަރީ","މާރޗް","އެޕްރީލް","މެއި","ޖޫން","ޖުލައި","އޮގަސްޓް","ސެޕްޓެންބަރ","އޮކްޓޫބަރ","ނޮވެންބަރ","ޑިސެންބަރ"]},"dz":{"am_pm":["ངས་ཆ","ཕྱི་ཆ"],"days":["གཟའ་ཟླ་བ་","གཟའ་མིག་དམར་","གཟའ་ལྷག་ཕ་","གཟའ་པུར་བུ་","གཟའ་པ་སངས་","གཟའ་སྤེན་ཕ་","གཟའ་ཉི་མ་"],"months":["ཟླ་བ་དང་པ་","ཟླ་བ་གཉིས་པ་","ཟླ་བ་གསུམ་པ་","ཟླ་བ་བཞི་པ་","ཟླ་བ་ལྔ་ཕ་","ཟླ་བ་དྲུག་པ་","ཟླ་བ་བདུནཔ་","ཟླ་བ་བརྒྱད་པ་","ཟླ་བ་དགུ་པ་","ཟླ་བ་བཅུ་པ་","ཟླ་བ་བཅུ་གཅིག་པ་","ཟླ་བ་བཅུ་གཉིས་པ་"],"short_days":["ཟླ་","མིར་","ལྷག་","པུར་","སངས་","སྤེན་","ཉི་"],"short_months":["ཟླ་༡","ཟླ་༢","ཟླ་༣","ཟླ་༤","ཟླ་༥","ཟླ་༦","ཟླ་༧","ཟླ་༨","ཟླ་༩","ཟླ་༡༠","ཟླ་༡༡","ཟླ་༡༢"]},"el":{"am_pm":["πμ","μμ"],"days":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"months":["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου"],"short_days":["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],"short_months":["Ιαν","Φεβ","Μαρ","Απρ","Μαΐ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"]},"en-AG":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-AU":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-BW":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-CA":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-DK":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-GB":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-HK":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-IE":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-IL":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-IN":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-NG":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-NZ":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-PH":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-SC":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-SG":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-US":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-ZA":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-ZM":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-ZW":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"es-AR":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-BO":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-CL":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-CO":{"am_pm":["AM","PM"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-CR":{"am_pm":["a.m.","p.m."],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-CU":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-DO":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-EC":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-ES":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-GT":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-HN":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-MX":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-NI":{"am_pm":["AM","PM"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-PA":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-PE":{"am_pm":["AM","PM"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","setiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","set","oct","nov","dic"]},"es-PR":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-PY":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-SV":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-US":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-UY":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","setiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","set","oct","nov","dic"]},"es-VE":{"am_pm":["am","pm"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"et":{"am_pm":["",""],"days":["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],"months":["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember"],"short_days":["P","E","T","K","N","R","L"],"short_months":["jaan ","veebr","märts","apr ","mai ","juuni","juuli","aug ","sept ","okt ","nov ","dets "]},"eu":{"am_pm":["",""],"days":["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],"months":["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],"short_days":["ig.","al.","ar.","az.","og.","or.","lr."],"short_months":["urt","ots","mar","api","mai","eka","uzt","abu","ira","urr","aza","abe"]},"fa":{"am_pm":["",""],"days":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"months":["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اكتبر","نوامبر","دسامبر"],"short_days":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"short_months":["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اكتبر","نوامبر","دسامبر"]},"ff":{"am_pm":["subaka","kikiiɗe"],"days":["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],"months":["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"],"short_days":["dew","aaɓ","maw","nje","naa","mwd","hbi"],"short_months":["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"]},"fi":{"am_pm":["",""],"days":["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],"months":["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],"short_days":["su","ma","ti","ke","to","pe","la"],"short_months":["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu"]},"fo":{"am_pm":["",""],"days":["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],"months":["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember"],"short_days":["sun","mán","týs","mik","hós","frí","ley"],"short_months":["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"]},"fr-BE":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fr-CA":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fr-CH":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fr-FR":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"short_months":["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."]},"fr-LU":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fy-DE":{"am_pm":["",""],"days":["Sinndag","Mondag","Dingsdag","Meddwäakj","Donnadag","Friedag","Sinnowend"],"months":["Jaunuwoa","Februwoa","Moaz","Aprell","Mai","Juni","Juli","August","Septamba","Oktoba","Nowamba","Dezamba"],"short_days":["Sdg","Mdg","Dsg","Mwk","Ddg","Fdg","Swd"],"short_months":["Jan","Feb","Moz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Now","Dez"]},"fy-NL":{"am_pm":["",""],"days":["Snein","Moandei","Tiisdei","Woansdei","Tongersdei","Freed","Sneon"],"months":["Jannewaris","Febrewaris","Maart","April","Maaie","Juny","July","Augustus","Septimber","Oktober","Novimber","Desimber"],"short_days":["Sn","Mo","Ti","Wo","To","Fr","Sn"],"short_months":["Jan","Feb","Mrt","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Des"]},"ga":{"am_pm":["",""],"days":["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],"months":["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig"],"short_days":["Domh","Luan","Máirt","Céad","Déar","Aoine","Sath"],"short_months":["Ean","Feabh","Márta","Aib","Beal","Meith","Iúil","Lún","MFómh","DFómh","Samh","Noll"]},"gd":{"am_pm":["m","f"],"days":["DiDòmhnaich","DiLuain","DiMàirt","DiCiadain","DiarDaoin","DihAoine","DiSathairne"],"months":["dhen Fhaoilleach","dhen Ghearran","dhen Mhàrt","dhen Ghiblean","dhen Chèitean","dhen Ògmhios","dhen Iuchar","dhen Lùnastal","dhen t-Sultain","dhen Dàmhair","dhen t-Samhain","dhen Dùbhlachd"],"short_days":["DiD","DiL","DiM","DiC","Dia","Dih","DiS"],"short_months":["Faoi","Gearr","Màrt","Gibl","Cèit","Ògmh","Iuch","Lùna","Sult","Dàmh","Samh","Dùbh"]},"gl":{"am_pm":["",""],"days":["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],"months":["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],"short_days":["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],"short_months":["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"]},"gu":{"am_pm":["સવારે","સાંજે"],"days":["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],"months":["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટોબર","નવેમ્બર","ડિસેમ્બર"],"short_days":["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],"short_months":["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે"]},"gv":{"am_pm":["",""],"days":["Jedoonee","Jelhein","Jemayrt","Jercean","Jerdein","Jeheiney","Jesarn"],"months":["Jerrey-geuree","Toshiaght-arree","Mayrnt","Averil","Boaldyn","Mean-souree","Jerrey-souree","Luanistyn","Mean-fouyir","Jerrey-fouyir","Mee Houney","Mee ny Nollick"],"short_days":["Jed","Jel","Jem","Jerc","Jerd","Jeh","Jes"],"short_months":["J-guer","T-arree","Mayrnt","Avrril","Boaldyn","M-souree","J-souree","Luanistyn","M-fouyir","J-fouyir","M.Houney","M.Nollick"]},"ha":{"am_pm":["AM","PM"],"days":["Lahadi","Litini","Talata","Laraba","Alhamis","Juma'a","Asabar"],"months":["Janairu","Faburairu","Maris","Afirilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktoba","Nuwamba","Disamba"],"short_days":["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],"short_months":["Jan","Fab","Mar","Afi","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis"]},"he":{"am_pm":["AM","PM"],"days":["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],"months":["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"short_days":["א'","ב'","ג'","ד'","ה'","ו'","ש'"],"short_months":["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ"]},"hi":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"months":["जनवरी","फ़रवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर"],"short_days":["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],"short_months":["जन॰","फ़र॰","मार्च","अप्रैल","मई","जून","जुल॰","अग॰","सित॰","अक्तू॰","नव॰","दिस॰"]},"hr":{"am_pm":["",""],"days":["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],"months":["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenoga","prosinca"],"short_days":["ned","pon","uto","sri","čet","pet","sub"],"short_months":["sij","velj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro"]},"ht":{"am_pm":["",""],"days":["dimanch","lendi","madi","mèkredi","jedi","vandredi","samdi"],"months":["janvye","fevriye","mas","avril","me","jen","jiyè","out","septanm","oktòb","novanm","desanm"],"short_days":["dim","len","mad","mèk","jed","van","sam"],"short_months":["jan","fev","mas","avr","me","jen","jiy","out","sep","okt","nov","des"]},"hu":{"am_pm":["",""],"days":["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],"months":["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december"],"short_days":["v","h","k","sze","cs","p","szo"],"short_months":["jan","febr","márc","ápr","máj","jún","júl","aug","szept","okt","nov","dec"]},"hy":{"am_pm":["",""],"days":["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","Ուրբաթ","Շաբաթ"],"months":["հունվարի","փետրվարի","մարտի","ապրիլի","մայիսի","հունիսի","հուլիսի","օգոստոսի","սեպտեմբերի","հոկտեմբերի","նոյեմբերի","դեկտեմբերի"],"short_days":["Կրկ","Երկ","Երք","Չրք","Հնգ","Ուր","Շբթ"],"short_months":["Հնվ","Փտր","Մար","Ապր","Մայ","Հնս","Հլս","Օգս","Սեպ","Հոկ","Նմբ","Դեկ"]},"ia":{"am_pm":["AM","PM"],"days":["dominica","lunedi","martedi","mercuridi","jovedi","venerdi","sabbato"],"months":["januario","februario","martio","april","maio","junio","julio","augusto","septembre","octobre","novembre","decembre"],"short_days":["dom","lun","mar","mer","jov","ven","sab"],"short_months":["jan","feb","mar","apr","mai","jun","jul","aug","sep","oct","nov","dec"]},"id":{"am_pm":["",""],"days":["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],"months":["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],"short_days":["Min","Sen","Sel","Rab","Kam","Jum","Sab"],"short_months":["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agu","Sep","Okt","Nov","Des"]},"ig":{"am_pm":["AM","PM"],"days":["sọnde","mọnde","tuzde","wenzde","tọsde","fraịde","satọde"],"months":["Jenụwarị","Febrụwarị","Maachị","Eprel","Mee","Juun","Julaị","Ọgọọst","Septemba","Ọktoba","Novemba","Disemba"],"short_days":["sọn","mọn","tuz","wen","tọs","fra","sat"],"short_months":["Jen","Feb","Maa","Epr","Mee","Juu","Jul","Ọgọ","Sep","Ọkt","Nov","Dis"]},"ik":{"am_pm":["AM","PM"],"days":["Minġuiqsioiq","Savałłiq","Ilaqtchiioiq","Qitchiioiq","Sisamiioiq","Tallimmiioiq","Maqinġuoiq"],"months":["Siqiññaatchiaq","Siqiññaasrugruk","Paniqsiqsiivik","Qilġich Tatqiat","Suppivik","Iġñivik","Itchavik","Tiññivik","Amiġaiqsivik","Sikkuvik","Nippivik","Siqiñġiḷaq"],"short_days":["Min","Sav","Ila","Qit","Sis","Tal","Maq"],"short_months":["Sñt","Sñs","Pan","Qil","Sup","Iġñ","Itc","Tiñ","Ami","Sik","Nip","Siq"]},"is":{"am_pm":["fh","eh"],"days":["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],"months":["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember"],"short_days":["sun","mán","þri","mið","fim","fös","lau"],"short_months":["jan","feb","mar","apr","maí","jún","júl","ágú","sep","okt","nóv","des"]},"it":{"am_pm":["",""],"days":["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],"months":["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"],"short_days":["dom","lun","mar","mer","gio","ven","sab"],"short_months":["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"]},"iu":{"am_pm":["AM","PM"],"days":["ᓈᑦᑎᖑᔭᕐᕕᒃ","ᓇᒡᒐᔾᔭᐅ","ᓇᒡᒐᔾᔭᐅᓕᖅᑭᑦ","ᐱᖓᓲᓕᖅᓯᐅᑦ","ᕿᑎᖅᑰᑦ","ᐅᓪᓗᕈᓘᑐᐃᓇᖅ","ᓯᕙᑖᕕᒃ"],"months":["ᔮᓄᐊᓕ","ᕕᕗᐊᓕ","ᒪᔅᓯ","ᐃᐳᓗ","ᒪᐃ","ᔪᓂ","ᔪᓚᐃ","ᐊᒋᓯ","ᓯᑎᕙ","ᐊᑦᑐᕙ","ᓄᕕᕙ","ᑎᓯᕝᕙ"],"short_days":["ᓈ","ᓇ","ᓕ","ᐱ","ᕿ","ᐅ","ᓯ"],"short_months":["ᔮᓄ","ᕕᕗ","ᒪᔅ","ᐃᐳ","ᒪᐃ","ᔪᓂ","ᔪᓚ","ᐊᒋ","ᓯᑎ","ᐊᑦ","ᓄᕕ","ᑎᓯ"]},"ja":{"am_pm":["午前","午後"],"days":["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],"months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"short_days":["日","月","火","水","木","金","土"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"ka":{"am_pm":["",""],"days":["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],"months":["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],"short_days":["კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],"short_months":["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"]},"kk":{"am_pm":["",""],"days":["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],"months":["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"],"short_days":["Жк","Дс","Сс","Ср","Бс","Жм","Сб"],"short_months":["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"]},"kl":{"am_pm":["",""],"days":["sapaat","ataasinngorneq","marlunngorneq","pingasunngorneq","sisamanngorneq","tallimanngorneq","arfininngorneq"],"months":["januaarip","februaarip","marsip","apriilip","maajip","juunip","juulip","aggustip","septembarip","oktobarip","novembarip","decembarip"],"short_days":["sap","ata","mar","pin","sis","tal","arf"],"short_months":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"]},"km":{"am_pm":["ព្រឹក","ល្ងាច"],"days":["ថ្ងៃ​អាទិត្យ","ថ្ងៃ​ច័ន្ទ","ថ្ងៃ​អង្គារ","ថ្ងៃ​ពុធ","ថ្ងៃ​ព្រហស្បតិ៍","ថ្ងៃ​សុក្រ","ថ្ងៃ​សៅរ៍"],"months":["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],"short_days":["អា","ច","អ","ពុ","ព្រ","សុ","ស"],"short_months":["១","២","៣","៤","៥","៦","៧","៨","៩","១០","១១","១២"]},"kn":{"am_pm":["ಪೂರ್ವಾಹ್ನ","ಅಪರಾಹ್ನ"],"days":["ರವಿವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],"months":["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಏಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟೆಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್"],"short_days":["ರ","ಸೋ","ಮಂ","ಬು","ಗು","ಶು","ಶ"],"short_months":["ಜನ","ಫೆಬ್ರ","ಮಾರ್ಚ್","ಏಪ್ರಿ","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆ","ಸೆಪ್ಟೆಂ","ಅಕ್ಟೋ","ನವೆಂ","ಡಿಸೆಂ"]},"ko":{"am_pm":["오전","오후"],"days":["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],"months":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"short_days":["일","월","화","수","목","금","토"],"short_months":[" 1월"," 2월"," 3월"," 4월"," 5월"," 6월"," 7월"," 8월"," 9월","10월","11월","12월"]},"ks":{"am_pm":["دوپھربرونھ","دوپھرپتھ"],"days":["آتهوار","ژءندروار","بوءںوار","بودهوار","برىسوار","جمع","بٹوار"],"months":["جنؤری","فرؤری","مارٕچ","اپریل","میٔ","جوٗن","جوٗلایی","اگست","ستمبر","اکتوٗبر","نومبر","دسمبر"],"short_days":["آتهوار","ژءنتروار","بوءںوار","بودهوار","برىسوار","جمع","بٹوار"],"short_months":["جنؤری","فرؤری","مارٕچ","اپریل","میٔ","جوٗن","جوٗلایی","اگست","ستمبر","اکتوٗبر","نومبر","دسمبر"]},"ku":{"am_pm":["",""],"days":["yêksêm","dusêm","sêsêm","çarsêm","pêncsêm","înî","sept"],"months":["Çile","Sibat","Adar","Nîsan","Gulan","Hezîran","Tîrmeh","Tebax","Îlon","Cotmeh","Mijdar","Kanûn"],"short_days":["yêk","dus","sês","çar","pên","înî","sep"],"short_months":["Çil","Sib","Ada","Nîs","Gul","Hez","Tîr","Teb","Îlo","Cot","Mij","Kan"]},"kw":{"am_pm":["",""],"days":["De Sul","De Lun","De Merth","De Merher","De Yow","De Gwener","De Sadorn"],"months":["mis Genver","mis Hwevrer","mis Meurth","mis Ebrel","mis Me","mis Metheven","mis Gortheren","mis Est","mis Gwynngala","mis Hedra","mis Du","mis Kevardhu"],"short_days":["Sul","Lun","Mth","Mhr","Yow","Gwe","Sad"],"short_months":["Gen","Hwe","Meu","Ebr","Me","Met","Gor","Est","Gwn","Hed","Du","Kev"]},"ky":{"am_pm":["",""],"days":["жекшемби","дүйшөмбү","шейшемби","шаршемби","бейшемби","жума","ишемби"],"months":["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"],"short_days":["жк","дш","ше","ша","бш","жм","иш"],"short_months":["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек"]},"lb":{"am_pm":["",""],"days":["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],"months":["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mé","Dë","Më","Do","Fr","Sa"],"short_months":["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"lg":{"am_pm":["",""],"days":["Sabiiti","Balaza","Lwakubiri","Lwakusatu","Lwakuna","Lwakutaano","Lwamukaaga"],"months":["Janwaliyo","Febwaliyo","Marisi","Apuli","Maayi","Juuni","Julaayi","Agusito","Sebuttemba","Okitobba","Novemba","Desemba"],"short_days":["Sab","Bal","Lw2","Lw3","Lw4","Lw5","Lw6"],"short_months":["Jan","Feb","Mar","Apu","Maa","Juu","Jul","Agu","Seb","Oki","Nov","Des"]},"li":{"am_pm":["",""],"days":["zóndig","maondig","daensdig","goonsdig","dónderdig","vriedig","zaoterdig"],"months":["jannewarie","fibberwarie","miert","eprèl","meij","junie","julie","augustus","september","oktober","november","desember"],"short_days":["zón","mao","dae","goo","dón","vri","zao"],"short_months":["jan","fib","mie","epr","mei","jun","jul","aug","sep","okt","nov","des"]},"ln":{"am_pm":["",""],"days":["Lomíngo","Mosálá mɔ̌kɔ́","Misálá míbalé","Misálá mísáto","Misálá mínei","Misálá mítáno","Mpɔ́sɔ"],"months":["sánzá ya yambo","sánzá ya míbalé","sánzá ya mísáto","sánzá ya mínei","sánzá ya mítáno","sánzá ya motóbá","sánzá ya nsambo","sánzá ya mwambe","sánzá ya libwa","sánzá ya zómi","sánzá ya zómi na mɔ̌kɔ́","sánzá ya zómi na míbalé"],"short_days":["m1.","m2.","m3.","m4.","m5.","m6.","m7."],"short_months":["yan","fbl","msi","apl","mai","yun","yul","agt","stb","ɔtb","nvb","dsb"]},"lo":{"am_pm":["AM","PM"],"days":["ອາທິດ","ຈັນ","ອັງຄານ","ພຸດ","ພະຫັດ","ສຸກ","ເສົາ"],"months":["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ"],"short_days":["ອາ.","ຈ.","ຄ.","ພ.","ພຫ.","ສ.","ສ."],"short_months":["ມ.ກ.","ກ.ພ.","ມ.ນ.","ມ.ສ.","ພ.ພ.","ມິ.ຖ.","ກ.ລ.","ສ.ຫ.","ກ.ຍ.","ຕ.ລ.","ພ.ຈ.","ທ.ວ."]},"lt":{"am_pm":["",""],"days":["Sekmadienis","Pirmadienis","Antradienis","Trečiadienis","Ketvirtadienis","Penktadienis","Šeštadienis"],"months":["sausio","vasario","kovo","balandžio","gegužės","birželio","liepos","rugpjūčio","rugsėjo","spalio","lapkričio","gruodžio"],"short_days":["Sk","Pr","An","Tr","Kt","Pn","Št"],"short_months":["saus.","vas.","kov.","bal.","geg.","birž.","liep.","rugp.","rugs.","spal.","lapkr.","gruod."]},"lv":{"am_pm":["",""],"days":["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],"months":["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris"],"short_days":["Sv","P ","O ","T ","C ","Pk","S "],"short_months":["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec"]},"mg":{"am_pm":["",""],"days":["alahady","alatsinainy","talata","alarobia","alakamisy","zoma","sabotsy"],"months":["Janoary","Febroary","Martsa","Aprily","Mey","Jona","Jolay","Aogositra","Septambra","Oktobra","Novambra","Desambra"],"short_days":["lhd","lts","tlt","lrb","lkm","zom","sab"],"short_months":["Jan","Feb","Mar","Apr","Mey","Jon","Jol","Aog","Sep","Okt","Nov","Des"]},"mi":{"am_pm":["",""],"days":["Rātapu","Mane","Tūrei","Wenerei","Tāite","Paraire","Hātarei"],"months":["Kohi-tātea","Hui-tanguru","Poutū-te-rangi","Paenga-whāwhā","Haratua","Pipiri","Hōngoingoi","Here-turi-kōkā","Mahuru","Whiringa-ā-nuku","Whiringa-ā-rangi","Hakihea"],"short_days":["Ta","Ma","Tū","We","Tāi","Pa","Hā"],"short_months":["Kohi","Hui","Pou","Pae","Hara","Pipi","Hōngoi","Here","Mahu","Whi-nu","Whi-ra","Haki"]},"mk":{"am_pm":["",""],"days":["недела","понеделник","вторник","среда","четврток","петок","сабота"],"months":["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],"short_days":["нед","пон","вто","сре","чет","пет","саб"],"short_months":["јан","фев","мар","апр","мај","јун","јул","авг","сеп","окт","ное","дек"]},"ml":{"am_pm":["രാവിലെ","വൈകു"],"days":["ഞായര്‍","തിങ്കള്‍","ചൊവ്വ","ബുധന്‍","വ്യാഴം","വെള്ളി","ശനി"],"months":["ജനുവരി","ഫെബ്രുവരി","മാർച്ച്","ഏപ്രിൽ","മേയ്","ജൂൺ","ജൂലൈ","ഓഗസ്റ്റ്","സെപ്റ്റംബർ","ഒക്‌ടോബർ","നവംബർ","ഡിസംബർ"],"short_days":["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],"short_months":["ജനു","ഫെബ്രു","മാർ","ഏപ്രി","മേയ്","ജൂൺ","ജൂലൈ","ഓഗ","സെപ്റ്റം","ഒക്ടോ","നവം","ഡിസം"]},"mn":{"am_pm":["",""],"days":["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],"months":["Нэгдүгээр сар","Хоёрдугаар сар","Гуравдугаар сар","Дөрөвдүгээр сар","Тавдугаар сар","Зургадугаар сар","Долдугаар сар","Наймдугаар сар","Есдүгээр сар","Аравдугаар сар","Арван нэгдүгээр сар","Арван хоёрдугаар сар"],"short_days":["Ня","Да","Мя","Лх","Пү","Ба","Бя"],"short_months":["1-р сар","2-р сар","3-р сар","4-р сар","5-р сар","6-р сар","7-р сар","8-р сар","9-р сар","10-р сар","11-р сар","12-р сар"]},"mr":{"am_pm":["म.पू.","म.नं."],"days":["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"months":["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर"],"short_days":["रवि","सोम","मंगळ","बुध","गुरु","शुक्र","शनि"],"short_months":["जाने","फेब्रु","मार्च","एप्रि","मे","जून","जुलै","ऑग","सप्टें","ऑक्टो","नोव्हें","डिसें"]},"ms":{"am_pm":["",""],"days":["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],"months":["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],"short_days":["Ahd","Isn","Sel","Rab","Kha","Jum","Sab"],"short_months":["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sep","Okt","Nov","Dis"]},"mt":{"am_pm":["",""],"days":["il-Ħadd","it-Tnejn","it-Tlieta","l-Erbgħa","il-Ħamis","il-Ġimgħa","is-Sibt"],"months":["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awwissu","Settembru","Ottubru","Novembru","Diċembru"],"short_days":["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],"short_months":["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Aww","Set","Ott","Nov","Diċ"]},"my":{"am_pm":["နံနက်","ညနေ"],"days":["တနင်္ဂနွေ","တနင်္လာ","အင်္ဂါ","ဗုဒ္ဓဟူး","ကြာသပတေး","သောကြာ","စနေ"],"months":["ဇန်နဝါရီ","ဖေဖော်ဝါရီ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူလိုင်","ဩဂုတ်","စက်တင်ဘာ","အောက်တိုဘာ","နိုဝင်ဘာ","ဒီဇင်ဘာ"],"short_days":["နွေ","လာ","ဂါ","ဟူး","တေး","သော","နေ"],"short_months":["ဇန်","ဖေ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူ","ဩ","စက်","အောက်","နို","ဒီ"]},"nb":{"am_pm":["",""],"days":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"months":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"short_days":["sø.","ma.","ti.","on.","to.","fr.","lø."],"short_months":["jan.","feb.","mars","april","mai","juni","juli","aug.","sep.","okt.","nov.","des."]},"ne":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["आइतबार","सोमबार","मङ्गलबार","बुधबार","बिहीबार","शुक्रबार","शनिबार"],"months":["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],"short_days":["आइत","सोम","मङ्गल","बुध","बिही","शुक्र","शनि"],"short_months":["जन","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"]},"nl":{"am_pm":["",""],"days":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"months":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"short_days":["zo","ma","di","wo","do","vr","za"],"short_months":["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"]},"nn":{"am_pm":["",""],"days":["sundag ","måndag ","tysdag ","onsdag ","torsdag ","fredag ","laurdag "],"months":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"short_days":["su.","må.","ty.","on.","to.","fr.","la."],"short_months":["jan.","feb.","mars","april","mai","juni","juli","aug.","sep.","okt.","nov.","des."]},"nr":{"am_pm":["",""],"days":["uSonto","uMvulo","uLesibili","lesithathu","uLesine","ngoLesihlanu","umGqibelo"],"months":["Janabari","uFeberbari","uMatjhi","u-Apreli","Meyi","Juni","Julayi","Arhostosi","Septemba","Oktoba","Usinyikhaba","Disemba"],"short_days":["Son","Mvu","Bil","Tha","Ne","Hla","Gqi"],"short_months":["Jan","Feb","Mat","Apr","Mey","Jun","Jul","Arh","Sep","Okt","Usi","Dis"]},"oc":{"am_pm":["",""],"days":["dimenge","diluns","dimars","dimècres","dijòus","divendres","dissabte"],"months":["de genièr","de febrièr","de març","d’abril","de mai","de junh","de julhet","d’agost","de setembre","d’octòbre","de novembre","de decembre"],"short_days":["dg.","dl.","dm.","dc.","dj.","dv.","ds."],"short_months":["gen.","febr.","març","abr.","mai","junh","jul.","ago.","set.","oct.","nov.","dec."]},"om":{"am_pm":["WD","WB"],"days":["Dilbata","Wiixata","Qibxata","Roobii","Kamiisa","Jimaata","Sanbata"],"months":["Amajjii","Guraandhala","Bitooteessa","Elba","Caamsa","Waxabajjii","Adooleessa","Hagayya","Fuulbana","Onkololeessa","Sadaasa","Muddee"],"short_days":["Dil","Wix","Qib","Rob","Kam","Jim","San"],"short_months":["Ama","Gur","Bit","Elb","Cam","Wax","Ado","Hag","Ful","Onk","Sad","Mud"]},"or":{"am_pm":["AM","PM"],"days":["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],"months":["ଜାନୁଆରୀ","ଫେବୃଆରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମଇ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"],"short_days":["ରବି","ସୋମ","ମଙ୍ଗଳ","ବୁଧ","ଗୁରୁ","ଶୁକ୍ର","ଶନି"],"short_months":["ଜାନୁଆରୀ","ଫେବୃଆରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମଇ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"]},"os":{"am_pm":["",""],"days":["Хуыцаубон","Къуырисæр","Дыццæг","Æртыццæг","Цыппæрæм","Майрæмбон","Сабат"],"months":["январы","февралы","мартъийы","апрелы","майы","июны","июлы","августы","сентябры","октябры","ноябры","декабры"],"short_days":["Хцб","Крс","Дцг","Æрт","Цпр","Мрб","Сбт"],"short_months":["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"]},"pa-IN":{"am_pm":["ਸਵੇਰੇ","ਸ਼ਾਮ"],"days":["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],"months":["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ"],"short_days":["ਐਤ","ਸੋਮ","ਮੰਗਲ","ਬੁੱਧ","ਵੀਰ","ਸ਼ੁੱਕਰ","ਸ਼ਨਿੱਚਰ"],"short_months":["ਜਨ","ਫ਼ਰ","ਮਾਰਚ","ਅਪ੍ਰੈ","ਮਈ","ਜੂਨ","ਜੁਲਾ","ਅਗ","ਸਤੰ","ਅਕਤੂ","ਨਵੰ","ਦਸੰ"]},"pa-PK":{"am_pm":["ص","ش"],"days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"months":["جنوري","فروري","مارچ","اپريل","مٓی","جون","جولاي","اگست","ستمبر","اكتوبر","نومبر","دسمبر"],"short_days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"short_months":["جنوري","فروري","مارچ","اپريل","مٓی","جون","جولاي","اگست","ستمبر","اكتوبر","نومبر","دسمبر"]},"pl":{"am_pm":["",""],"days":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"months":["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia"],"short_days":["nie","pon","wto","śro","czw","pią","sob"],"short_months":["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"]},"ps":{"am_pm":["غ.م.","غ.و."],"days":["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],"months":["جنوري","فبروري","مارچ","اپریل","مۍ","جون","جولای","اګست","سپتمبر","اکتوبر","نومبر","دسمبر"],"short_days":["ی.","د.","س.","چ.","پ.","ج.","ش."],"short_months":["جنوري","فبروري","مارچ","اپریل","مۍ","جون","جولای","اګست","سپتمبر","اکتوبر","نومبر","دسمبر"]},"pt":{"am_pm":["",""],"days":["domingo","segunda","terça","quarta","quinta","sexta","sábado"],"months":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"short_days":["dom","seg","ter","qua","qui","sex","sáb"],"short_months":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"]},"ro":{"am_pm":["",""],"days":["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],"months":["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"],"short_days":["Du","Lu","Ma","Mi","Jo","Vi","Sb"],"short_months":["ian","feb","mar","apr","mai","iun","iul","aug","sep","oct","nov","dec"]},"ru":{"am_pm":["",""],"days":["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],"months":["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"],"short_days":["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],"short_months":["янв","фев","мар","апр","мая","июн","июл","авг","сен","окт","ноя","дек"]},"rw":{"am_pm":["",""],"days":["Ku cyumweru","Kuwa mbere","Kuwa kabiri","Kuwa gatatu","Kuwa kane","Kuwa gatanu","Kuwa gatandatu"],"months":["Mutarama","Gashyantare","Werurwe","Mata","Gicuransi","Kamena","Nyakanga","Kanama","Nzeli","Ukwakira","Ugushyingo","Ukuboza"],"short_days":["Mwe","Mbe","Kab","Gtu","Kan","Gnu","Gnd"],"short_months":["Mut","Gas","Wer","Mat","Gic","Kam","Nya","Kan","Nze","Ukw","Ugu","Uku"]},"sa":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवासर:","सोमवासर:","मंगलवासर:","बुधवासर:","बृहस्पतिवासरः","शुक्रवासर","शनिवासर:"],"months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],"short_days":["रविः","सोम:","मंगल:","बुध:","बृहस्पतिः","शुक्र","शनि:"],"short_months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"]},"sc":{"am_pm":["",""],"days":["Domìnigu","Lunis","Martis","Mèrcuris","Giòbia","Chenàbura","Sàbadu"],"months":["Ghennàrgiu","Freàrgiu","Martzu","Abrile","Maju","Làmpadas","Argiolas/Trìulas","Austu","Cabudanni","Santugaine/Ladàmine","Onniasantu/Santandria","Nadale/Idas"],"short_days":["Dom","Lun","Mar","Mèr","Giò","Che","Sàb"],"short_months":["Ghe","Fre","Mar","Abr","Maj","Làm","Arg","Aus","Cab","Lad","Onn","Nad"]},"sd":{"am_pm":["AM","PM"],"days":["آرتوارُ","سومرُ","منگلُ","ٻُڌرُ","وسپت","جُمو","ڇنڇر"],"months":["جنوري","فبروري","مارچ","اپريل","مي","جون","جولاءِ","آگسٽ","سيپٽيمبر","آڪٽوبر","نومبر","ڊسمبر"],"short_days":["آرتوارُ","سومرُ","منگلُ","ٻُڌرُ","وسپت","جُمو","ڇنڇر"],"short_months":["جنوري","فبروري","مارچ","اپريل","مي","جون","جولاءِ","آگسٽ","سيپٽيمبر","آڪٽوبر","نومبر","ڊسمبر"]},"se":{"am_pm":["",""],"days":["sotnabeaivi","vuossárga","maŋŋebarga","gaskavahkku","duorasdat","bearjadat","lávvardat"],"months":["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu"],"short_days":["sotn","vuos","maŋ","gask","duor","bear","láv"],"short_months":["ođđj","guov","njuk","cuoŋ","mies","geas","suoi","borg","čakč","golg","skáb","juov"]},"si":{"am_pm":["පෙ.ව.","ප.ව."],"days":["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],"months":["ජනවාරි","පෙබරවාරි","මාර්තු","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්"],"short_days":["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"],"short_months":["ජන","පෙබ","මාර්","අප්‍රි","මැයි","ජූනි","ජූලි","අගෝ","සැප්","ඔක්","නෙවැ","දෙසැ"]},"sk":{"am_pm":["",""],"days":["Nedeľa","Pondelok","Utorok","Streda","Štvrtok","Piatok","Sobota"],"months":["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],"short_days":["Ne","Po","Ut","St","Št","Pi","So"],"short_months":["jan","feb","mar","apr","máj","jún","júl","aug","sep","okt","nov","dec"]},"sl":{"am_pm":["",""],"days":["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],"months":["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],"short_days":["ned","pon","tor","sre","čet","pet","sob"],"short_months":["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"]},"sm":{"am_pm":["",""],"days":["Aso Sa","Aso Gafua","Aso Lua","Aso Lulu","Aso Tofi","Aso Farail","Aso To'ana'i"],"months":["Ianuari","Fepuari","Mati","Aperila","Me","Iuni","Iulai","Auguso","Setema","Oketopa","Novema","Tesema"],"short_days":["Aso Sa","Aso Gaf","Aso Lua","Aso Lul","Aso Tof","Aso Far","Aso To'"],"short_months":["Ian","Fep","Mat","Ape","Me","Iun","Iul","Aug","Set","Oke","Nov","Tes"]},"so-DJ":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Tal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"so-ET":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Sal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"so-KE":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Sal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"so-SO":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Sal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"sq":{"am_pm":["PD","MD"],"days":["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],"months":["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor"],"short_days":["Die","Hën","Mar","Mër","Enj","Pre","Sht"],"short_months":["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj"]},"sr-ME":{"am_pm":["",""],"days":["недјеља","понедељак","уторак","сриједа","четвртак","петак","субота"],"months":["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],"short_days":["нед","пон","уто","сри","чет","пет","суб"],"short_months":["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"]},"sr-RS":{"am_pm":["",""],"days":["недеља","понедељак","уторак","среда","четвртак","петак","субота"],"months":["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],"short_days":["нед","пон","уто","сре","чет","пет","суб"],"short_months":["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"]},"ss":{"am_pm":["",""],"days":["Lisontfo","uMsombuluko","Lesibili","Lesitsatfu","Lesine","Lesihlanu","uMgcibelo"],"months":["Bhimbidvwane","iNdlovane","iNdlovulenkhulu","Mabasa","Inkhwenkhweti","iNhlaba","Kholwane","iNgci","iNyoni","Impala","Lweti","iNgongoni"],"short_days":["Son","Mso","Bil","Tsa","Ne","Hla","Mgc"],"short_months":["Bhi","Van","Vul","Mab","Khk","Nhl","Kho","Ngc","Nyo","Imp","Lwe","Ngo"]},"st":{"am_pm":["",""],"days":["Sontaha","Mantaha","Labobedi","Laboraro","Labone","Labohlano","Moqebelo"],"months":["Pherekgong","Hlakola","Tlhakubele","Mmese","Motsheanong","Phupjane","Phupu","Phato","Leotse","Mphalane","Pudungwana","Tshitwe"],"short_days":["Son","Mma","Bed","Rar","Ne","Hla","Moq"],"short_months":["Phe","Hla","TlH","Mme","Mot","Jan","Upu","Pha","Leo","Mph","Pud","Tsh"]},"sv":{"am_pm":["",""],"days":["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],"months":["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],"short_days":["sön","mån","tis","ons","tor","fre","lör"],"short_months":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"]},"sw":{"am_pm":["asubuhi","alasiri"],"days":["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],"months":["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"],"short_days":["J2","J3","J4","J5","Alh","Ij","J1"],"short_months":["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"]},"ta-IN":{"am_pm":["காலை","மாலை"],"days":["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],"months":["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"],"short_days":["ஞா","தி","செ","பு","வி","வெ","ச"],"short_months":["ஜன.","பிப்.","மார்.","ஏப்.","மே","ஜூன்","ஜூலை","ஆக.","செப்.","அக்.","நவ.","டிச."]},"ta-LK":{"am_pm":["காலை","மாலை"],"days":["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],"months":["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"],"short_days":["ஞா","தி","செ","பு","வி","வெ","ச"],"short_months":["ஜன","பிப்","மார்","ஏப்","மே","ஜூன்","ஜூலை","ஆக","செப்","அக்","நவ","டிச"]},"te":{"am_pm":["ఉ.","సా."],"days":["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],"months":["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జులై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్"],"short_days":["ఆది","సోమ","మంగళ","బుధ","గురు","శుక్ర","శని"],"short_months":["జన","ఫిబ్ర","మార్చి","ఏప్రి","మే","జూన్","జులై","ఆగ","సెప్టెం","అక్టో","నవం","డిసెం"]},"tg":{"am_pm":["",""],"days":["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],"months":["Января","Февраля","Марта","Апреля","Мая","Июня","Июля","Августа","Сентября","Октября","Ноября","Декабря"],"short_days":["Вск","Пнд","Втр","Срд","Чтв","Птн","Сбт"],"short_months":["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"]},"th":{"am_pm":["AM","PM"],"days":["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],"months":["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],"short_days":["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],"short_months":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."]},"ti-ER":{"am_pm":["ንጉሆ ሰዓተ","ድሕር ሰዓት"],"days":["ሰንበት","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"months":["ጥሪ","ለካቲት","መጋቢት","ሚያዝያ","ግንቦት","ሰነ","ሓምለ","ነሓሰ","መስከረም","ጥቅምቲ","ሕዳር","ታሕሳስ"],"short_days":["ሰንበ","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"short_months":["ጥሪ ","ለካቲ","መጋቢ","ሚያዝ","ግንቦ","ሰነ ","ሓምለ","ነሓሰ","መስከ","ጥቅም","ሕዳር","ታሕሳ"]},"ti-ET":{"am_pm":["ንጉሆ ሰዓተ","ድሕር ሰዓት"],"days":["ሰንበት","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"months":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር"],"short_days":["ሰንበ","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"short_months":["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ ","ጁን ","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም"]},"tk":{"am_pm":["",""],"days":["Duşenbe","Sişenbe","Çarşenbe","Penşenbe","Anna","Şenbe","Ýekşenbe"],"months":["Ýanwar","Fewral","Mart","Aprel","Maý","Iýun","Iýul","Awgust","Sentýabr","Oktýabr","Noýabr","Dekabr"],"short_days":["Duş","Siş","Çar","Pen","Ann","Şen","Ýek"],"short_months":["Ýan","Few","Mar","Apr","Maý","Iýn","Iýl","Awg","Sen","Okt","Noý","Dek"]},"tl":{"am_pm":["AM","PM"],"days":["Linggo","Lunes","Martes","Miyerkoles","Huwebes","Biyernes","Sabado"],"months":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Septiyembre","Oktubre","Nobiyembre","Disyembre"],"short_days":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"short_months":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Sep","Okt","Nob","Dis"]},"tn":{"am_pm":["",""],"days":["laTshipi","Mosupologo","Labobedi","Laboraro","Labone","Labotlhano","Lamatlhatso"],"months":["Ferikgong","Tlhakole","Mopitlwe","Moranang","Motsheganong","Seetebosigo","Phukwi","Phatwe","Lwetse","Diphalane","Ngwanatsele","Sedimonthole"],"short_days":["Tsh","Mos","Bed","Rar","Ne","Tlh","Mat"],"short_months":["Fer","Tlh","Mop","Mor","Mot","See","Phu","Pha","Lwe","Dip","Ngw","Sed"]},"to":{"am_pm":["hengihengi","efiafi"],"days":["Sāpate","Mōnite","Tūsite","Pulelulu","Tuʻapulelulu","Falaite","Tokonaki"],"months":["Sānuali","Fēpueli","Maʻasi","ʻEpeleli","Mē","Sune","Siulai","ʻAokosi","Sepitema","ʻOkatopa","Nōvema","Tīsema"],"short_days":["Sāp","Mōn","Tūs","Pul","Tuʻa","Fal","Tok"],"short_months":["Sān","Fēp","Maʻa","ʻEpe","Mē","Sun","Siu","ʻAok","Sep","ʻOka","Nōv","Tīs"]},"tr":{"am_pm":["ÖÖ","ÖS"],"days":["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],"months":["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],"short_days":["Paz","Pzt","Sal","Çrş","Prş","Cum","Cts"],"short_months":["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"]},"ts":{"am_pm":["",""],"days":["Sonto","Musumbhunuku","Ravumbirhi","Ravunharhu","Ravumune","Ravuntlhanu","Mugqivela"],"months":["Sunguti","Nyenyenyani","Nyenyankulu","Dzivamisoko","Mudyaxihi","Khotavuxika","Mawuwani","Mhawuri","Ndzhati","Nhlangula","Hukuri","N'wendzamhala"],"short_days":["Son","Mus","Bir","Har","Ne","Tlh","Mug"],"short_months":["Sun","Yan","Kul","Dzi","Mud","Kho","Maw","Mha","Ndz","Nhl","Huk","N'w"]},"tt":{"am_pm":["",""],"days":["якшәмбе","дүшәмбе","сишәмбе","чәршәмбе","пәнҗешәмбе","җомга","шимбә"],"months":["гыйнвар","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"],"short_days":["якш","дүш","сиш","чәр","пәнҗ","җом","шим"],"short_months":["гыйн","фев","мар","апр","май","июнь","июль","авг","сент","окт","нояб","дек"]},"ug":{"am_pm":["",""],"days":["يەكشەنبە","دۈشەنبە","سەيشەنبە","چارشەنبە","پەيشەنبە","جۈمە","شەنبە"],"months":["يانۋار","فېۋرال","مارت","ئاپرېل","ماي","ئىيۇن","ئىيۇل","ئاۋغۇست","سېنتەبىر","ئۆكتەبىر","نويابىر","دېكابىر"],"short_days":["ي","د","س","چ","پ","ج","ش"],"short_months":["يانۋار","فېۋرال","مارت","ئاپرېل","ماي","ئىيۇن","ئىيۇل","ئاۋغۇست","سېنتەبىر","ئۆكتەبىر","نويابىر","دېكابىر"]},"uk":{"am_pm":["",""],"days":["неділя","понеділок","вівторок","середа","четвер","п'ятниця","субота"],"months":["січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня"],"short_days":["нд","пн","вт","ср","чт","пт","сб"],"short_months":["січ","лют","бер","кві","тра","чер","лип","сер","вер","жов","лис","гру"]},"ur-IN":{"am_pm":["AM","PM"],"days":["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","سنیچر"],"months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"short_days":["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","سنیچر"],"short_months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"]},"ur-PK":{"am_pm":["ص","ش"],"days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"short_days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"short_months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"]},"uz":{"am_pm":["",""],"days":["Yakshanba","Dushanba","Seshanba","Chorshanba","Payshanba","Juma","Shanba"],"months":["Yanvar","Fevral","Mart","Aprel","May","Iyun","Iyul","Avgust","Sentabr","Oktabr","Noyabr","Dekabr"],"short_days":["Yak","Du","Se","Cho","Pay","Ju","Sha"],"short_months":["Yan","Fev","Mar","Apr","May","Iyn","Iyl","Avg","Sen","Okt","Noy","Dek"]},"ve":{"am_pm":["",""],"days":["Swondaha","Musumbuluwo","Ḽavhuvhili","Ḽavhuraru","Ḽavhuṋa","Ḽavhuṱanu","Mugivhela"],"months":["Phando","Luhuhi","Ṱhafamuhwe","Lambamai","Shundunthule","Fulwi","Fulwana","Ṱhangule","Khubvumedzi","Tshimedzi","Ḽara","Nyendavhusiku"],"short_days":["Swo","Mus","Vhi","Rar","ṋa","Ṱan","Mug"],"short_months":["Pha","Luh","Fam","Lam","Shu","Lwi","Lwa","Ngu","Khu","Tsh","Ḽar","Nye"]},"vi":{"am_pm":["AM","PM"],"days":["Chủ nhật","Thứ hai","Thứ ba","Thứ tư","Thứ năm","Thứ sáu","Thứ bảy"],"months":["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],"short_days":["CN","T2","T3","T4","T5","T6","T7"],"short_months":["Thg 1","Thg 2","Thg 3","Thg 4","Thg 5","Thg 6","Thg 7","Thg 8","Thg 9","Thg 10","Thg 11","Thg 12"]},"wa":{"am_pm":["AM","PM"],"days":["dimegne","londi","mårdi","mierkidi","djudi","vénrdi","semdi"],"months":["di djanvî","di fevrî","di måss","d’ avri","di may","di djun","di djulete","d’ awousse","di setimbe","d’ octôbe","di nôvimbe","di decimbe"],"short_days":["dim","lon","mår","mie","dju","vén","sem"],"short_months":["dja","fev","mås","avr","may","djn","djl","awo","set","oct","nôv","dec"]},"wo":{"am_pm":["",""],"days":["dib'eer","altine","talaata","allarba","alxames","ajjuma","gaawu"],"months":["sanwiy'e","feebriy'e","mars","awril","me","suwen","sulet","uut","septaambar","oktoobar","nowaambar","desaambar"],"short_days":["dib","alt","tal","all","alx","ajj","gaa"],"short_months":["san","fee","mar","awr","me ","suw","sul","uut","sep","okt","now","des"]},"xh":{"am_pm":["",""],"days":["iCawa","uMvulo","lwesiBini","lwesiThathu","ulweSine","lwesiHlanu","uMgqibelo"],"months":["eyoMqungu","eyoMdumba","eyoKwindla","uTshazimpuzi","uCanzibe","eyeSilimela","eyeKhala","eyeThupa","eyoMsintsi","eyeDwarha","eyeNkanga","eyoMnga"],"short_days":["Caw","Mvu","Bin","Tha","Sin","Hla","Mgq"],"short_months":["Mqu","Mdu","Kwi","Tsh","Can","Sil","Kha","Thu","Msi","Dwa","Nka","Mng"]},"yi":{"am_pm":["AM","PM"],"days":["זונטיק","מאָנטיק","דינסטיק","מיטװאָך","דאָנערשטיק","פֿרײַטיק","שבת"],"months":["יאַנואַר","פֿעברואַר","מערץ","אַפּריל","מיי","יוני","יולי","אויגוסט","סעפּטעמבער","אקטאבער","נאוועמבער","דעצעמבער"],"short_days":["זונ'","מאָנ'","דינ'","מיט'","דאָנ'","פֿרײַ'","שבת"],"short_months":["יאַנ","פֿעב","מאַר","אַפּר","מײַ ","יונ","יול","אױג","סעפּ","אָקט","נאָװ","דעצ"]},"yo":{"am_pm":["AM","PM"],"days":["Ọjọ́ Àìkú","Ọjọ́ Ajé","Ọjọ́ Ìsẹ́gun","Ọjọ́rú","Ọjọ́bọ","Ọjọ́ Ẹtì","Ọjọ́ Àbámẹ́ta"],"months":["Oṣù Ṣẹ́rẹ́","Oṣù Èrèlè","Oṣù Ẹrẹ̀nà","Oṣù Ìgbé","Oṣù Ẹ̀bibi","Oṣù Òkúdu","Oṣù Agẹmọ","Oṣù Ògún","Oṣù Owewe","Oṣù Ọ̀wàrà","Oṣù Bélú","Oṣù Ọ̀pẹ̀"],"short_days":["Àìkú","Ajé","Ìsẹ́gun","Ọjọ́rú","Ọjọ́bọ","Ẹtì","Àbámẹ́ta"],"short_months":["Ṣẹ́rẹ́","Èrèlè","Ẹrẹ̀nà","Ìgbé","Ẹ̀bibi","Òkúdu","Agẹmọ","Ògún","Owewe","Ọ̀wàrà","Bélú","Ọ̀pẹ̀"]},"zh-CN":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]},"zh-HK":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]},"zh-SG":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},"zh-TW":{"am_pm":["上午","下午"],"days":["週日","週一","週二","週三","週四","週五","週六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"zu":{"am_pm":["",""],"days":["iSonto","uMsombuluko","uLwesibili","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],"months":["Januwari","Februwari","Mashi","Ephreli","Meyi","Juni","Julayi","Agasti","Septhemba","Okthoba","Novemba","Disemba"],"short_days":["Son","Mso","Bil","Tha","Sin","Hla","Mgq"],"short_months":["Jan","Feb","Mas","Eph","Mey","Jun","Jul","Aga","Sep","Okt","Nov","Dis"]}} diff --git a/dates/i18n_test.go b/dates/i18n_test.go index cfa8ede..be4233d 100644 --- a/dates/i18n_test.go +++ b/dates/i18n_test.go @@ -4,13 +4,14 @@ import ( "testing" "github.com/nyaruka/gocommon/dates" - + "github.com/nyaruka/gocommon/i18n" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestGetTranslation(t *testing.T) { tests := []struct { - locale string + locale i18n.Locale sun string sunday string jan string @@ -18,25 +19,26 @@ func TestGetTranslation(t *testing.T) { am string }{ {"", "Sun", "Sunday", "Jan", "January", "AM"}, - {"en-US", "Sun", "Sunday", "Jan", "January", "AM"}, - {"en-GB", "Sun", "Sunday", "Jan", "January", "am"}, - {"en", "Sun", "Sunday", "Jan", "January", "am"}, - {"es-EC", "dom", "domingo", "ene", "enero", "AM"}, - {"es", "dom", "domingo", "ene", "enero", "AM"}, - {"pt-BR", "dom", "domingo", "jan", "janeiro", "AM"}, - {"pt-PT", "dom", "domingo", "jan", "janeiro", "AM"}, - {"pt", "dom", "domingo", "jan", "janeiro", "AM"}, - {"rw-RW", "Mwe", "Ku cyumweru", "Mut", "Mutarama", "AM"}, - {"rw", "Mwe", "Ku cyumweru", "Mut", "Mutarama", "AM"}, - {"zh-CN", "日", "星期日", "1月", "一月", "上午"}, - {"zh-HK", "日", "星期日", "1月", "一月", "上午"}, - {"zh-SG", "日", "星期日", "一月", "一月", "上午"}, - {"zh-TW", "日", "週日", " 1月", "一月", "上午"}, - {"zh", "日", "星期日", "1月", "一月", "上午"}, // backs down to first zh translation + {"eng-US", "Sun", "Sunday", "Jan", "January", "AM"}, + {"eng-GB", "Sun", "Sunday", "Jan", "January", "am"}, + {"eng", "Sun", "Sunday", "Jan", "January", "AM"}, + {"spa-EC", "dom", "domingo", "ene", "enero", "AM"}, + {"spa", "dom", "domingo", "ene", "enero", "AM"}, + {"por-BR", "dom", "domingo", "jan", "janeiro", "AM"}, + {"por-PT", "dom", "domingo", "jan", "janeiro", "AM"}, + {"por", "dom", "domingo", "jan", "janeiro", "AM"}, + {"kin-RW", "Mwe", "Ku cyumweru", "Mut", "Mutarama", "AM"}, + {"kin", "Mwe", "Ku cyumweru", "Mut", "Mutarama", "AM"}, + {"zho-CN", "日", "星期日", "1月", "一月", "上午"}, + {"zho-HK", "日", "星期日", "1月", "一月", "上午"}, + {"zho-SG", "日", "星期日", "一月", "一月", "上午"}, + {"zho-TW", "日", "週日", " 1月", "一月", "上午"}, + {"zho", "日", "星期日", "1月", "一月", "上午"}, // backs down to first zh translation } for _, tc := range tests { trans := dates.GetTranslation(tc.locale) + require.NotNil(t, trans, "trans unexpectedly nil for local '%s'", tc.locale) assert.Equal(t, tc.sun, trans.ShortDays[0], "short day mismatch for locale %s", tc.locale) assert.Equal(t, tc.sunday, trans.Days[0], "full day mismatch for locale %s", tc.locale) assert.Equal(t, tc.jan, trans.ShortMonths[0], "short month mismatch for locale %s", tc.locale) diff --git a/dates/timeofday.go b/dates/timeofday.go index a7ba564..3cc233a 100644 --- a/dates/timeofday.go +++ b/dates/timeofday.go @@ -2,6 +2,8 @@ package dates import ( "time" + + "github.com/nyaruka/gocommon/i18n" ) const ( @@ -51,9 +53,9 @@ func (t TimeOfDay) Combine(date Date, tz *time.Location) time.Time { } // Format formats this time of day as a string -func (t TimeOfDay) Format(layout, locale string) (string, error) { +func (t TimeOfDay) Format(layout string, loc i18n.Locale) (string, error) { // upgrade us to a date time so we can use standard time.Time formatting - return Format(t.Combine(ZeroDate, time.UTC), layout, locale, TimeOnlyLayouts) + return Format(t.Combine(ZeroDate, time.UTC), layout, loc, TimeOnlyLayouts) } // String returns the ISO8601 representation From 4b34c7369659eaca31d7cae85afc31336d731e1d Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 4 Sep 2023 18:17:39 -0500 Subject: [PATCH 032/141] Update CHANGELOG.md for v1.41.1 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7072d57..31b9c5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.41.1 (2023-09-04) +------------------------- + * Use i18n.Locale for date formatting + v1.41.0 (2023-09-04) ------------------------- * Move some locales code from goflow/envs From 4167a6b3cbc2b7e645219cfb612071ff0f2d5ac7 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 5 Sep 2023 09:47:10 -0500 Subject: [PATCH 033/141] Fix BCP47MAtcher test --- i18n/locale_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/i18n/locale_test.go b/i18n/locale_test.go index 8b02fde..1e8dca4 100644 --- a/i18n/locale_test.go +++ b/i18n/locale_test.go @@ -37,13 +37,14 @@ func TestLocale(t *testing.T) { assert.Equal(t, i18n.NilLocale, lc) } -func TesBCP47Matcher(t *testing.T) { +func TestBCP47Matcher(t *testing.T) { tests := []struct { preferred []i18n.Locale available []string best string }{ {preferred: []i18n.Locale{"eng-US"}, available: []string{"es_EC", "en-US"}, best: "en-US"}, + {preferred: []i18n.Locale{"spa-US", "eng-US"}, available: []string{"en-GB", "en-US", "es-US"}, best: "es-US"}, {preferred: []i18n.Locale{"eng-US"}, available: []string{"es", "en"}, best: "en"}, {preferred: []i18n.Locale{"eng"}, available: []string{"es-US", "en-UK"}, best: "en-UK"}, {preferred: []i18n.Locale{"eng", "fra"}, available: []string{"fr-CA", "en-RW"}, best: "en-RW"}, From 171258428f162dd2024735a1cd55a031a8c5caca Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 11 Sep 2023 13:51:42 -0500 Subject: [PATCH 034/141] Allow creating query errors without an error to wrap --- dbutil/bulk.go | 17 ++++++++--------- dbutil/errors.go | 18 ++++++++++++++++-- dbutil/errors_test.go | 13 ++++++++++++- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/dbutil/bulk.go b/dbutil/bulk.go index 1b0e448..52e0c9c 100644 --- a/dbutil/bulk.go +++ b/dbutil/bulk.go @@ -71,20 +71,23 @@ func BulkQuery[T any](ctx context.Context, db BulkQueryer, query string, structs rows, err := db.QueryxContext(ctx, bulkQuery, args...) if err != nil { - return NewQueryErrorf(err, bulkQuery, args, "error making bulk query") + return QueryErrorWrapf(err, bulkQuery, args, "error making bulk query") } defer rows.Close() // if have a returning clause, read them back and try to map them if strings.Contains(strings.ToUpper(query), "RETURNING") { - for _, s := range structs { + for i, s := range structs { if !rows.Next() { - return errors.Errorf("did not receive expected number of rows on insert") + if rows.Err() != nil { + return QueryErrorWrapf(rows.Err(), bulkQuery, args, "missing returned row for struct %d", i) + } + return QueryErrorf(bulkQuery, args, "missing returned row for struct %d", i) } err = rows.StructScan(s) if err != nil { - return errors.Wrap(err, "error scanning for returned values") + return QueryErrorWrapf(err, bulkQuery, args, "error scanning returned row %d", i) } } } @@ -94,11 +97,7 @@ func BulkQuery[T any](ctx context.Context, db BulkQueryer, query string, structs } // check for any error - if rows.Err() != nil { - return NewQueryErrorf(rows.Err(), bulkQuery, args, "error during row iteration") - } - - return nil + return QueryErrorWrapf(rows.Err(), bulkQuery, args, "error during row iteration") } // extractValues is just a simple utility method that extracts the portion between `VALUE(` diff --git a/dbutil/errors.go b/dbutil/errors.go index cb56c66..5524ce7 100644 --- a/dbutil/errors.go +++ b/dbutil/errors.go @@ -25,7 +25,10 @@ type QueryError struct { } func (e *QueryError) Error() string { - return e.message + ": " + e.cause.Error() + if e.cause != nil { + return e.message + ": " + e.cause.Error() + } + return e.message } func (e *QueryError) Unwrap() error { @@ -36,7 +39,18 @@ func (e *QueryError) Query() (string, []any) { return e.sql, e.sqlArgs } -func NewQueryErrorf(cause error, sql string, sqlArgs []any, message string, msgArgs ...any) error { +func QueryErrorWrapf(cause error, sql string, sqlArgs []any, message string, msgArgs ...any) error { + if cause == nil { + return nil + } + return newQueryErrorf(cause, sql, sqlArgs, message, msgArgs...) +} + +func QueryErrorf(sql string, sqlArgs []any, message string, msgArgs ...any) error { + return newQueryErrorf(nil, sql, sqlArgs, message, msgArgs...) +} + +func newQueryErrorf(cause error, sql string, sqlArgs []any, message string, msgArgs ...any) error { return &QueryError{ cause: cause, message: fmt.Sprintf(message, msgArgs...), diff --git a/dbutil/errors_test.go b/dbutil/errors_test.go index 505bdb0..f96d3ab 100644 --- a/dbutil/errors_test.go +++ b/dbutil/errors_test.go @@ -1,6 +1,7 @@ package dbutil_test import ( + "fmt" "testing" "github.com/lib/pq" @@ -19,11 +20,18 @@ func TestIsUniqueViolation(t *testing.T) { } func TestQueryError(t *testing.T) { + qerr := dbutil.QueryErrorf("SELECT * FROM foo WHERE id = $1", []any{234}, "error selecting foo %d", 234) + assert.Error(t, qerr) + assert.Equal(t, `error selecting foo 234`, qerr.Error()) + assert.Equal(t, `error selecting foo 234`, fmt.Sprintf("%s", qerr)) + + // can also wrap an existing error var err error = &pq.Error{Code: pq.ErrorCode("22025"), Message: "unsupported Unicode escape sequence"} - qerr := dbutil.NewQueryErrorf(err, "SELECT * FROM foo WHERE id = $1", []any{234}, "error selecting foo %d", 234) + qerr = dbutil.QueryErrorWrapf(err, "SELECT * FROM foo WHERE id = $1", []any{234}, "error selecting foo %d", 234) assert.Error(t, qerr) assert.Equal(t, `error selecting foo 234: pq: unsupported Unicode escape sequence`, qerr.Error()) + assert.Equal(t, `error selecting foo 234: pq: unsupported Unicode escape sequence`, fmt.Sprintf("%s", qerr)) // can unwrap to the original error var pqerr *pq.Error @@ -42,4 +50,7 @@ func TestQueryError(t *testing.T) { query, params := unwrapped.Query() assert.Equal(t, "SELECT * FROM foo WHERE id = $1", query) assert.Equal(t, []any{234}, params) + + // wrapping a nil error returns nil + assert.Nil(t, dbutil.QueryErrorWrapf(nil, "SELECT", nil, "ooh")) } From 25e0a10ad9cf05737320becc2d2422de3b68fc68 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 11 Sep 2023 13:56:26 -0500 Subject: [PATCH 035/141] Update CHANGELOG.md for v1.41.2 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31b9c5a..045a059 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.41.2 (2023-09-11) +------------------------- + * Allow creating query errors without an error to wrap + v1.41.1 (2023-09-04) ------------------------- * Use i18n.Locale for date formatting From f0f224c9afb082cdb82da9fb1851f732b748d6a4 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 19 Sep 2023 13:35:53 -0500 Subject: [PATCH 036/141] Add dbutil.ScanAllJSON --- dbutil/scan.go | 17 ++++++++++++++++- dbutil/scan_test.go | 25 ++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/dbutil/scan.go b/dbutil/scan.go index a66fcfb..e83b326 100644 --- a/dbutil/scan.go +++ b/dbutil/scan.go @@ -40,7 +40,22 @@ func ScanAndValidateJSON(rows *sql.Rows, destination any) error { return nil } -// ScanAllSlice scans a single value from each single column row into the given slice +// ScanAllJSON scans all rows as a single column containing JSON that be unmarshalled into instances of V. +func ScanAllJSON[V any](rows *sql.Rows, s []V) ([]V, error) { + defer rows.Close() + + var v V + + for rows.Next() { + if err := ScanJSON(rows, &v); err != nil { + return nil, err + } + s = append(s, v) + } + return s, rows.Err() +} + +// ScanAllSlice scans all rows as a single value and returns them in the given slice. func ScanAllSlice[V any](rows *sql.Rows, s []V) ([]V, error) { defer rows.Close() diff --git a/dbutil/scan_test.go b/dbutil/scan_test.go index f35c6c5..7907a31 100644 --- a/dbutil/scan_test.go +++ b/dbutil/scan_test.go @@ -32,12 +32,12 @@ func TestScanJSON(t *testing.T) { queryRows := func(sql string, args ...any) *sql.Rows { rows, err := db.QueryContext(ctx, sql, args...) require.NoError(t, err) - require.True(t, rows.Next()) return rows } // if query returns valid JSON which can be unmarshaled into our struct, all good rows := queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid, f.name, f.age FROM foo f WHERE id = 1) r`) + require.True(t, rows.Next()) f := &foo{} err := dbutil.ScanAndValidateJSON(rows, f) @@ -47,6 +47,7 @@ func TestScanJSON(t *testing.T) { assert.Equal(t, 40, f.Age) rows = queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid, f.name, f.age FROM foo f WHERE id = 2) r`) + require.True(t, rows.Next()) err = dbutil.ScanAndValidateJSON(rows, f) assert.NoError(t, err) @@ -56,34 +57,52 @@ func TestScanJSON(t *testing.T) { // error if row value is not JSON rows = queryRows(`SELECT id FROM foo f WHERE id = 1`) + require.True(t, rows.Next()) + err = dbutil.ScanAndValidateJSON(rows, f) assert.EqualError(t, err, `error scanning row JSON: sql: Scan error on column index 0, name "id": unsupported Scan, storing driver.Value type int64 into type *json.RawMessage`) // error if we can't marshal into the struct rows = queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid as uuid, f.name AS age FROM foo f WHERE id = 1) r`) + require.True(t, rows.Next()) + err = dbutil.ScanAndValidateJSON(rows, f) assert.EqualError(t, err, "error unmarshalling row JSON: json: cannot unmarshal string into Go struct field foo.age of type int") // error if rows aren't ready to be scanned - e.g. next hasn't been called - rows, err = db.QueryContext(ctx, `SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid as uuid, f.name AS name FROM foo f WHERE id = 1) r`) - require.NoError(t, err) + rows = queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid as uuid, f.name AS name FROM foo f WHERE id = 1) r`) + err = dbutil.ScanAndValidateJSON(rows, f) assert.EqualError(t, err, "error scanning row JSON: sql: Scan called without calling Next") // error if we request validation and returned JSON is invalid rows = queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid, f.name, f.age FROM foo f WHERE id = 3) r`) + require.True(t, rows.Next()) err = dbutil.ScanAndValidateJSON(rows, f) assert.EqualError(t, err, "error validating unmarsalled JSON: Key: 'foo.Age' Error:Field validation for 'Age' failed on the 'min' tag") + rows.Close() + // no error if we don't do validation rows = queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid, f.name, f.age FROM foo f WHERE id = 3) r`) + require.True(t, rows.Next()) err = dbutil.ScanJSON(rows, f) assert.NoError(t, err) assert.Equal(t, "a5850c89-dd29-46f6-9de1-d068b3c2db94", f.UUID) assert.Equal(t, "George", f.Name) assert.Equal(t, -1, f.Age) + + rows.Close() + + // can all scan all rows with ScanAllJSON + rows = queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid, f.name, f.age FROM foo f) r`) + + var foos []*foo + foos, err = dbutil.ScanAllJSON(rows, foos) + assert.NoError(t, err) + assert.Len(t, foos, 3) } func TestScanAllSlice(t *testing.T) { From a63a75d1dcb83e2063df6934d19a4232567d20c8 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 19 Sep 2023 13:42:10 -0500 Subject: [PATCH 037/141] Update CHANGELOG.md for v1.41.3 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 045a059..7cc6171 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.41.3 (2023-09-19) +------------------------- + * Add dbutil.ScanAllJSON + v1.41.2 (2023-09-11) ------------------------- * Allow creating query errors without an error to wrap From e50f754f54c1039ef7d6ab7e7ff7afae713eb8cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 23:02:56 +0000 Subject: [PATCH 038/141] Bump golang.org/x/net from 0.14.0 to 0.17.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.14.0 to 0.17.0. - [Commits](https://github.com/golang/net/compare/v0.14.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 4edaaab..5944079 100644 --- a/go.mod +++ b/go.mod @@ -17,8 +17,8 @@ require ( github.com/shopspring/decimal v1.3.1 github.com/stretchr/testify v1.8.4 golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 - golang.org/x/net v0.14.0 - golang.org/x/text v0.12.0 + golang.org/x/net v0.17.0 + golang.org/x/text v0.13.0 ) require ( @@ -30,8 +30,8 @@ require ( github.com/leodido/go-urn v1.2.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/sys v0.11.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/sys v0.13.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 1024d8c..d3664f5 100644 --- a/go.sum +++ b/go.sum @@ -67,8 +67,8 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -76,8 +76,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -88,8 +88,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -97,8 +97,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= From 3d84e6d9bbc5fd52901ad0a838d28ede9e219053 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 12 Oct 2023 10:27:26 -0500 Subject: [PATCH 039/141] Update to go 1.21 and update deps --- .github/workflows/ci.yml | 2 +- go.mod | 11 +++++------ go.sum | 29 ++++++++++------------------- syncx/batcher.go | 10 ---------- 4 files changed, 16 insertions(+), 36 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fafc904..2599e44 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - go-version: [1.19.x, 1.20.x, 1.21.x] + go-version: [1.21.x] services: redis: diff --git a/go.mod b/go.mod index 5944079..e5c3478 100644 --- a/go.mod +++ b/go.mod @@ -1,22 +1,22 @@ module github.com/nyaruka/gocommon -go 1.19 +go 1.21 require ( - github.com/aws/aws-sdk-go v1.44.319 - github.com/gabriel-vasile/mimetype v1.4.2 + github.com/aws/aws-sdk-go v1.45.24 + github.com/gabriel-vasile/mimetype v1.4.3 github.com/go-chi/chi v4.1.2+incompatible github.com/go-playground/validator/v10 v10.14.1 github.com/gofrs/uuid v4.4.0+incompatible github.com/jmoiron/sqlx v1.3.5 github.com/lib/pq v1.10.9 - github.com/nyaruka/librato v1.0.0 + github.com/nyaruka/librato v1.1.1 github.com/nyaruka/null/v2 v2.0.3 github.com/nyaruka/phonenumbers v1.1.8 github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.3.1 github.com/stretchr/testify v1.8.4 - golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 + golang.org/x/exp v0.0.0-20231006140011-7918f672742d golang.org/x/net v0.17.0 golang.org/x/text v0.13.0 ) @@ -29,7 +29,6 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect golang.org/x/crypto v0.14.0 // indirect golang.org/x/sys v0.13.0 // indirect google.golang.org/protobuf v1.31.0 // indirect diff --git a/go.sum b/go.sum index d3664f5..a0ed5b1 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,14 @@ -github.com/aws/aws-sdk-go v1.44.319 h1:cwynvM8DBwWGzlINTZ6XLkGy5O99wZIS0197j3B61Fs= -github.com/aws/aws-sdk-go v1.44.319/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.45.24 h1:TZx/CizkmCQn8Rtsb11iLYutEQVGK5PK9wAhwouELBo= +github.com/aws/aws-sdk-go v1.45.24/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= @@ -23,13 +24,13 @@ github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -37,8 +38,8 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/nyaruka/librato v1.0.0 h1:Vznj9WCeC1yZXbBYyYp40KnbmXLbEkjKmHesV/v2SR0= -github.com/nyaruka/librato v1.0.0/go.mod h1:pkRNLFhFurOz0QqBz6/DuTFhHHxAubWxs4Jx+J7yUgg= +github.com/nyaruka/librato v1.1.1 h1:0nTYtJLl3Sn7lX3CuHsLf+nXy1k/tGV0OjVxLy3Et4s= +github.com/nyaruka/librato v1.1.1/go.mod h1:fme1Fu1PT2qvkaBZyw8WW+SrnFe2qeeCWpvqmAaKAKE= github.com/nyaruka/null/v2 v2.0.3 h1:rdmMRQyVzrOF3Jff/gpU/7BDR9mQX0lcLl4yImsA3kw= github.com/nyaruka/null/v2 v2.0.3/go.mod h1:OCVeCkCXwrg5/qE6RU0c1oUVZBy+ZDrT+xYg1XSaIWA= github.com/nyaruka/phonenumbers v1.1.8 h1:mjFu85FeoH2Wy18aOMUvxqi1GgAqiQSJsa/cCC5yu2s= @@ -49,16 +50,9 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= @@ -69,8 +63,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -81,11 +75,9 @@ golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= @@ -110,7 +102,6 @@ google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/syncx/batcher.go b/syncx/batcher.go index b0b3882..2fbe997 100644 --- a/syncx/batcher.go +++ b/syncx/batcher.go @@ -3,8 +3,6 @@ package syncx import ( "sync" "time" - - "golang.org/x/exp/constraints" ) // Batcher allows values to be queued and processed in a background thread. @@ -105,11 +103,3 @@ func (b *Batcher[T]) drain() { b.flush() } } - -// TODO delete when on go 1.21 and this is builtin -func min[T constraints.Ordered](x T, y T) T { - if x < y { - return x - } - return y -} From a1425b73c74311ab21237d0ae1359b0a2d2a9722 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 12 Oct 2023 10:30:51 -0500 Subject: [PATCH 040/141] Update CHANGELOG.md for v1.45.0 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cc6171..100b307 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.45.0 (2023-10-12) +------------------------- + * Update to go 1.21 and update deps + v1.41.3 (2023-09-19) ------------------------- * Add dbutil.ScanAllJSON From 2a3f79d596fa9a4ae028c9216bf94094bb48b13e Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 12 Oct 2023 10:33:56 -0500 Subject: [PATCH 041/141] Revert "Update CHANGELOG.md for v1.45.0" This reverts commit a1425b73c74311ab21237d0ae1359b0a2d2a9722. --- CHANGELOG.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 100b307..7cc6171 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,3 @@ -v1.45.0 (2023-10-12) -------------------------- - * Update to go 1.21 and update deps - v1.41.3 (2023-09-19) ------------------------- * Add dbutil.ScanAllJSON From 0a9d1f73f5e85d4ea1630fd143382c71c989d0fd Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 12 Oct 2023 10:34:28 -0500 Subject: [PATCH 042/141] Update CHANGELOG.md for v1.42.0 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cc6171..8b91814 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.42.0 (2023-10-12) +------------------------- + * Update to go 1.21 and update deps + v1.41.3 (2023-09-19) ------------------------- * Add dbutil.ScanAllJSON From f28c7dde466c8e7b9773d71e0cc1a516e1f7968e Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Sat, 28 Oct 2023 09:20:05 -0500 Subject: [PATCH 043/141] Use error constants for some httpx error cases --- httpx/access_test.go | 41 ++++++++++++++++++----------------------- httpx/http.go | 10 ++++++++-- httpx/http_test.go | 3 ++- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/httpx/access_test.go b/httpx/access_test.go index 850d838..5ef996b 100644 --- a/httpx/access_test.go +++ b/httpx/access_test.go @@ -35,41 +35,36 @@ func TestAccessConfig(t *testing.T) { })) tests := []struct { - url string - err string + url string + allowed bool }{ // allowed - {"https://nyaruka.com", ""}, - {"https://11.0.0.0", ""}, + {"https://nyaruka.com", true}, + {"https://11.0.0.0", true}, // denied by IP match - {"https://localhost/path", "request to localhost denied"}, - {"https://LOCALHOST:80", "request to LOCALHOST denied"}, - {"http://foo.localtest.me", "request to foo.localtest.me denied"}, - {"https://127.0.0.1", "request to 127.0.0.1 denied"}, - {"https://127.0.00.1", "?"}, // Go 1.19: "request to 127.0.00.1 denied", Go 1.20: "lookup 127.0.00.1: no such host" - {"https://[::1]:80", "request to ::1 denied"}, - {"https://[0:0:0:0:0:0:0:1]:80", "request to 0:0:0:0:0:0:0:1 denied"}, - {"https://[0000:0000:0000:0000:0000:0000:0000:0001]:80", "request to 0000:0000:0000:0000:0000:0000:0000:0001 denied"}, + {"https://localhost/path", false}, + {"https://LOCALHOST:80", false}, + {"http://foo.localtest.me", false}, + {"https://127.0.0.1", false}, + {"https://[::1]:80", false}, + {"https://[0:0:0:0:0:0:0:1]:80", false}, + {"https://[0000:0000:0000:0000:0000:0000:0000:0001]:80", false}, // denied by network match - {"https://10.1.0.0", "request to 10.1.0.0 denied"}, - {"https://10.0.1.0", "request to 10.0.1.0 denied"}, - {"https://10.0.0.1", "request to 10.0.0.1 denied"}, - {"https://[0:0:0:0:0:ffff:0a01:0000]:80", "request to 0:0:0:0:0:ffff:0a01:0000 denied"}, // 10.1.0.0 mapped to IPv6 + {"https://10.1.0.0", false}, + {"https://10.0.1.0", false}, + {"https://10.0.0.1", false}, + {"https://[0:0:0:0:0:ffff:0a01:0000]:80", false}, // 10.1.0.0 mapped to IPv6 } for _, tc := range tests { request, _ := http.NewRequest("GET", tc.url, nil) _, err := httpx.DoTrace(http.DefaultClient, request, nil, access, -1) - if tc.err != "" { - if tc.err == "?" { - assert.Error(t, err) - } else { - assert.EqualError(t, err, tc.err, "error message mismatch for url %s", tc.url) - } - } else { + if tc.allowed { assert.NoError(t, err) + } else { + assert.Equal(t, err, httpx.ErrAccessConfig, "error message mismatch for url %s", tc.url) } } } diff --git a/httpx/http.go b/httpx/http.go index 442db8f..d2d9512 100644 --- a/httpx/http.go +++ b/httpx/http.go @@ -16,6 +16,12 @@ import ( "github.com/pkg/errors" ) +// ErrResponseSize is returned when response size exceeds provided limit +var ErrResponseSize = errors.New("response body exceeds size limit") + +// ErrAccessConfig is returned when provided access config prevents request +var ErrAccessConfig = errors.New("request not permitted by access config") + // Do makes the given HTTP request using the current requestor and retry config func Do(client *http.Client, request *http.Request, retries *RetryConfig, access *AccessConfig) (*http.Response, error) { r, _, err := do(client, request, retries, access) @@ -29,7 +35,7 @@ func do(client *http.Client, request *http.Request, retries *RetryConfig, access return nil, 0, err } if !allowed { - return nil, 0, errors.Errorf("request to %s denied", request.URL.Hostname()) + return nil, 0, ErrAccessConfig } } @@ -198,7 +204,7 @@ func readBody(response *http.Response, maxBodyBytes int) ([]byte, error) { // if we have no remaining bytes, error because the body was too big if bodyReader.(*io.LimitedReader).N <= 0 { - return nil, errors.Errorf("webhook response body exceeds %d bytes limit", maxBodyBytes) + return nil, ErrResponseSize } return bodyBytes, nil diff --git a/httpx/http_test.go b/httpx/http_test.go index 8f357b5..3ee1e87 100644 --- a/httpx/http_test.go +++ b/httpx/http_test.go @@ -157,7 +157,8 @@ func TestMaxBodyBytes(t *testing.T) { assert.Equal(t, string(testBody), string(trace.ResponseBody)) trace, err = call(10) // limit smaller than body - assert.EqualError(t, err, `webhook response body exceeds 10 bytes limit`) + assert.Equal(t, err, httpx.ErrResponseSize) + assert.EqualError(t, err, `response body exceeds size limit`) assert.Equal(t, "HTTP/1.0 200 OK\r\nContent-Length: 26\r\n\r\n", string(trace.ResponseTrace)) assert.Equal(t, ``, string(trace.ResponseBody)) } From df62c23801c6cf6adb11b04a4ee94fe978c5aaca Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Sat, 28 Oct 2023 15:51:33 -0500 Subject: [PATCH 044/141] Update CHANGELOG.md for v1.42.1 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b91814..dfd072c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.42.1 (2023-10-28) +------------------------- + * Use error constants for some httpx error cases + v1.42.0 (2023-10-12) ------------------------- * Update to go 1.21 and update deps From 82e461631b99cc5ee4c5b2263a478ea403b5f4e0 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 30 Oct 2023 11:17:45 -0500 Subject: [PATCH 045/141] Add httpx.ParseNetworks util function --- httpx/access.go | 25 +++++++++++++++++++++++++ httpx/access_test.go | 30 +++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/httpx/access.go b/httpx/access.go index b80b702..ec62e12 100644 --- a/httpx/access.go +++ b/httpx/access.go @@ -6,6 +6,7 @@ import ( "strings" "time" + "github.com/pkg/errors" "golang.org/x/net/context" ) @@ -52,3 +53,27 @@ func (c *AccessConfig) Allow(request *http.Request) (bool, error) { } return true, nil } + +// ParseNetworks parses a list of IPs and IP networks (written in CIDR notation) +func ParseNetworks(addrs ...string) ([]net.IP, []*net.IPNet, error) { + ips := make([]net.IP, 0, len(addrs)) + ipNets := make([]*net.IPNet, 0, len(addrs)) + + for _, addr := range addrs { + if strings.Contains(addr, "/") { + _, ipNet, err := net.ParseCIDR(addr) + if err != nil { + return nil, nil, errors.Errorf("couldn't parse '%s' as an IP network", addr) + } + ipNets = append(ipNets, ipNet) + } else { + ip := net.ParseIP(addr) + if ip == nil { + return nil, nil, errors.Errorf("couldn't parse '%s' as an IP address", addr) + } + ips = append(ips, ip) + } + } + + return ips, ipNets, nil +} diff --git a/httpx/access_test.go b/httpx/access_test.go index 5ef996b..73592af 100644 --- a/httpx/access_test.go +++ b/httpx/access_test.go @@ -7,7 +7,6 @@ import ( "time" "github.com/nyaruka/gocommon/httpx" - "github.com/stretchr/testify/assert" ) @@ -68,3 +67,32 @@ func TestAccessConfig(t *testing.T) { } } } + +func TestParseNetworkList(t *testing.T) { + privateNetwork1 := &net.IPNet{IP: net.IPv4(10, 0, 0, 0).To4(), Mask: net.CIDRMask(8, 32)} + privateNetwork2 := &net.IPNet{IP: net.IPv4(172, 16, 0, 0).To4(), Mask: net.CIDRMask(12, 32)} + privateNetwork3 := &net.IPNet{IP: net.IPv4(192, 168, 0, 0).To4(), Mask: net.CIDRMask(16, 32)} + + linkLocalIPv4 := &net.IPNet{IP: net.IPv4(169, 254, 0, 0).To4(), Mask: net.CIDRMask(16, 32)} + _, linkLocalIPv6, _ := net.ParseCIDR("fe80::/10") + + // test with mailroom defaults + ips, ipNets, err := httpx.ParseNetworks(`127.0.0.1`, `::1`, `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `169.254.0.0/16`, `fe80::/10`) + assert.NoError(t, err) + assert.Equal(t, []net.IP{net.IPv4(127, 0, 0, 1), net.ParseIP(`::1`)}, ips) + assert.Equal(t, []*net.IPNet{privateNetwork1, privateNetwork2, privateNetwork3, linkLocalIPv4, linkLocalIPv6}, ipNets) + + // test with empty + ips, ipNets, err = httpx.ParseNetworks() + assert.NoError(t, err) + assert.Equal(t, []net.IP{}, ips) + assert.Equal(t, []*net.IPNet{}, ipNets) + + // test with invalid IP + _, _, err = httpx.ParseNetworks(`127.0.1`) + assert.EqualError(t, err, `couldn't parse '127.0.1' as an IP address`) + + // test with invalid network + _, _, err = httpx.ParseNetworks(`127.0.0.1/x`) + assert.EqualError(t, err, `couldn't parse '127.0.0.1/x' as an IP network`) +} From bfc01f07f4c96d381830e05172b85b493c68a9ec Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 30 Oct 2023 11:21:59 -0500 Subject: [PATCH 046/141] Update CHANGELOG.md for v1.42.2 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dfd072c..299b3bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.42.2 (2023-10-30) +------------------------- + * Add httpx.ParseNetworks util function + v1.42.1 (2023-10-28) ------------------------- * Use error constants for some httpx error cases From 427f430536aae30e42f8e93590df03b72a0ec747 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 8 Nov 2023 13:29:50 -0500 Subject: [PATCH 047/141] Update phonenumbers --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e5c3478..65c9643 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/lib/pq v1.10.9 github.com/nyaruka/librato v1.1.1 github.com/nyaruka/null/v2 v2.0.3 - github.com/nyaruka/phonenumbers v1.1.8 + github.com/nyaruka/phonenumbers v1.1.9 github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.3.1 github.com/stretchr/testify v1.8.4 diff --git a/go.sum b/go.sum index a0ed5b1..30e5bb2 100644 --- a/go.sum +++ b/go.sum @@ -42,8 +42,8 @@ github.com/nyaruka/librato v1.1.1 h1:0nTYtJLl3Sn7lX3CuHsLf+nXy1k/tGV0OjVxLy3Et4s github.com/nyaruka/librato v1.1.1/go.mod h1:fme1Fu1PT2qvkaBZyw8WW+SrnFe2qeeCWpvqmAaKAKE= github.com/nyaruka/null/v2 v2.0.3 h1:rdmMRQyVzrOF3Jff/gpU/7BDR9mQX0lcLl4yImsA3kw= github.com/nyaruka/null/v2 v2.0.3/go.mod h1:OCVeCkCXwrg5/qE6RU0c1oUVZBy+ZDrT+xYg1XSaIWA= -github.com/nyaruka/phonenumbers v1.1.8 h1:mjFu85FeoH2Wy18aOMUvxqi1GgAqiQSJsa/cCC5yu2s= -github.com/nyaruka/phonenumbers v1.1.8/go.mod h1:DC7jZd321FqUe+qWSNcHi10tyIyGNXGcNbfkPvdp1Vs= +github.com/nyaruka/phonenumbers v1.1.9 h1:/7bJVqIWLb+5erm10aMlojaKhXoMM6JKmlWLNg5laYc= +github.com/nyaruka/phonenumbers v1.1.9/go.mod h1:DC7jZd321FqUe+qWSNcHi10tyIyGNXGcNbfkPvdp1Vs= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= From b758ae6559492b810f382688b434ca61d4f935f5 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 8 Nov 2023 13:31:09 -0500 Subject: [PATCH 048/141] Update CHANGELOG.md for v1.42.3 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 299b3bb..9c33d70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.42.3 (2023-11-08) +------------------------- + * Update phonenumbers + v1.42.2 (2023-10-30) ------------------------- * Add httpx.ParseNetworks util function From 994e239276873da1267d3b6ff8c9c2778a8e31b9 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 13 Nov 2023 13:09:10 -0500 Subject: [PATCH 049/141] Tweak stringsx.Skeleton --- stringsx/confusables.go | 8 +++++++- stringsx/confusables_test.go | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/stringsx/confusables.go b/stringsx/confusables.go index d724a03..68d1baf 100644 --- a/stringsx/confusables.go +++ b/stringsx/confusables.go @@ -7,6 +7,7 @@ import ( "regexp" "strconv" "strings" + "unicode" "golang.org/x/text/unicode/norm" ) @@ -54,6 +55,11 @@ func Skeleton(s string) string { var sb strings.Builder for _, r := range norm.NFD.String(s) { + // TODO this is not the complete set of Default_Ignorable_Code_Point + if unicode.In(r, unicode.Other_Default_Ignorable_Code_Point) { + continue + } + if c, ok := confusables[r]; ok { sb.WriteString(c) } else { @@ -61,7 +67,7 @@ func Skeleton(s string) string { } } - return sb.String() + return norm.NFD.String(sb.String()) } // Implements https://www.unicode.org/reports/tr39/#def-confusable diff --git a/stringsx/confusables_test.go b/stringsx/confusables_test.go index c9a4d6a..2e071fe 100644 --- a/stringsx/confusables_test.go +++ b/stringsx/confusables_test.go @@ -16,6 +16,7 @@ func TestSkeleton(t *testing.T) { func TestConfusable(t *testing.T) { assert.True(t, stringsx.Confusable("", "")) assert.True(t, stringsx.Confusable("foo", "foo")) + assert.True(t, stringsx.Confusable("\uFFF1foo", "foo")) assert.True(t, stringsx.Confusable("١", "۱")) // 0x661 vs 0x6f1 assert.True(t, stringsx.Confusable("بلی", "بلى")) // 0x6cc vs 0x649 assert.True(t, stringsx.Confusable("nyaruka", "𝕟𝔂𝛼𝐫ᴜ𝞳𝕒")) From 1639984d9d2a4e05354d89ffe0cbc502ec7b91dd Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 13 Nov 2023 13:13:09 -0500 Subject: [PATCH 050/141] Update CHANGELOG.md for v1.42.4 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c33d70..91b33ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.42.4 (2023-11-13) +------------------------- + * Tweak stringsx.Skeleton + v1.42.3 (2023-11-08) ------------------------- * Update phonenumbers From 47bd17b503c04f7714c3ebe109337464ff28679d Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 20 Nov 2023 09:44:18 -0500 Subject: [PATCH 051/141] Update deps --- go.mod | 15 +++++++-------- go.sum | 29 ++++++++++++++--------------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/go.mod b/go.mod index 65c9643..05ebe8d 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/nyaruka/gocommon go 1.21 require ( - github.com/aws/aws-sdk-go v1.45.24 + github.com/aws/aws-sdk-go v1.48.0 github.com/gabriel-vasile/mimetype v1.4.3 github.com/go-chi/chi v4.1.2+incompatible github.com/go-playground/validator/v10 v10.14.1 @@ -12,25 +12,24 @@ require ( github.com/lib/pq v1.10.9 github.com/nyaruka/librato v1.1.1 github.com/nyaruka/null/v2 v2.0.3 - github.com/nyaruka/phonenumbers v1.1.9 + github.com/nyaruka/phonenumbers v1.2.1 github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.3.1 github.com/stretchr/testify v1.8.4 - golang.org/x/exp v0.0.0-20231006140011-7918f672742d - golang.org/x/net v0.17.0 - golang.org/x/text v0.13.0 + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa + golang.org/x/net v0.18.0 + golang.org/x/text v0.14.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/golang/protobuf v1.5.3 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/crypto v0.15.0 // indirect + golang.org/x/sys v0.14.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 30e5bb2..78f9b79 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/aws/aws-sdk-go v1.45.24 h1:TZx/CizkmCQn8Rtsb11iLYutEQVGK5PK9wAhwouELBo= github.com/aws/aws-sdk-go v1.45.24/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.48.0 h1:1SeJ8agckRDQvnSCt1dGZYAwUaoD2Ixj6IaXB4LCv8Q= +github.com/aws/aws-sdk-go v1.48.0/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -20,8 +22,6 @@ github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -42,8 +42,8 @@ github.com/nyaruka/librato v1.1.1 h1:0nTYtJLl3Sn7lX3CuHsLf+nXy1k/tGV0OjVxLy3Et4s github.com/nyaruka/librato v1.1.1/go.mod h1:fme1Fu1PT2qvkaBZyw8WW+SrnFe2qeeCWpvqmAaKAKE= github.com/nyaruka/null/v2 v2.0.3 h1:rdmMRQyVzrOF3Jff/gpU/7BDR9mQX0lcLl4yImsA3kw= github.com/nyaruka/null/v2 v2.0.3/go.mod h1:OCVeCkCXwrg5/qE6RU0c1oUVZBy+ZDrT+xYg1XSaIWA= -github.com/nyaruka/phonenumbers v1.1.9 h1:/7bJVqIWLb+5erm10aMlojaKhXoMM6JKmlWLNg5laYc= -github.com/nyaruka/phonenumbers v1.1.9/go.mod h1:DC7jZd321FqUe+qWSNcHi10tyIyGNXGcNbfkPvdp1Vs= +github.com/nyaruka/phonenumbers v1.2.1 h1:88YAhE7g5qrjR2nhUOU/KkrfpbV2HKkjFRLjzVwCGyA= +github.com/nyaruka/phonenumbers v1.2.1/go.mod h1:wzk2qq7qwsaBKrfbkWKdgHYOOH+QFTesSpIq53ELw8M= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -61,17 +61,17 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -80,8 +80,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -89,15 +89,14 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= From 0fb22793c52c59901ff2a37525f74c01637468ce Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 20 Nov 2023 09:44:39 -0500 Subject: [PATCH 052/141] Update CHANGELOG.md for v1.42.5 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91b33ee..4fbcbfd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.42.5 (2023-11-20) +------------------------- + * Update deps + v1.42.4 (2023-11-13) ------------------------- * Tweak stringsx.Skeleton From 843d06f63021c0c83b27563dd9383be77e14995a Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 24 Nov 2023 15:58:13 -0500 Subject: [PATCH 053/141] Update to latest phonenumbers --- go.mod | 2 +- go.sum | 33 ++------------------------------- 2 files changed, 3 insertions(+), 32 deletions(-) diff --git a/go.mod b/go.mod index 05ebe8d..2f50122 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/lib/pq v1.10.9 github.com/nyaruka/librato v1.1.1 github.com/nyaruka/null/v2 v2.0.3 - github.com/nyaruka/phonenumbers v1.2.1 + github.com/nyaruka/phonenumbers v1.2.2 github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.3.1 github.com/stretchr/testify v1.8.4 diff --git a/go.sum b/go.sum index 78f9b79..8e4145a 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -github.com/aws/aws-sdk-go v1.45.24 h1:TZx/CizkmCQn8Rtsb11iLYutEQVGK5PK9wAhwouELBo= -github.com/aws/aws-sdk-go v1.45.24/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go v1.48.0 h1:1SeJ8agckRDQvnSCt1dGZYAwUaoD2Ixj6IaXB4LCv8Q= github.com/aws/aws-sdk-go v1.48.0/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -42,8 +40,8 @@ github.com/nyaruka/librato v1.1.1 h1:0nTYtJLl3Sn7lX3CuHsLf+nXy1k/tGV0OjVxLy3Et4s github.com/nyaruka/librato v1.1.1/go.mod h1:fme1Fu1PT2qvkaBZyw8WW+SrnFe2qeeCWpvqmAaKAKE= github.com/nyaruka/null/v2 v2.0.3 h1:rdmMRQyVzrOF3Jff/gpU/7BDR9mQX0lcLl4yImsA3kw= github.com/nyaruka/null/v2 v2.0.3/go.mod h1:OCVeCkCXwrg5/qE6RU0c1oUVZBy+ZDrT+xYg1XSaIWA= -github.com/nyaruka/phonenumbers v1.2.1 h1:88YAhE7g5qrjR2nhUOU/KkrfpbV2HKkjFRLjzVwCGyA= -github.com/nyaruka/phonenumbers v1.2.1/go.mod h1:wzk2qq7qwsaBKrfbkWKdgHYOOH+QFTesSpIq53ELw8M= +github.com/nyaruka/phonenumbers v1.2.2 h1:OwVjf7Y4uHoK9VJUrA8ebR0ha2yc6sEYbfrwkq0asCY= +github.com/nyaruka/phonenumbers v1.2.2/go.mod h1:wzk2qq7qwsaBKrfbkWKdgHYOOH+QFTesSpIq53ELw8M= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -58,43 +56,16 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= From 595db265a942b8974c204738449a709d98f3d55f Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 24 Nov 2023 15:58:40 -0500 Subject: [PATCH 054/141] Update CHANGELOG.md for v1.42.6 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fbcbfd..f86a5c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.42.6 (2023-11-24) +------------------------- + * Update to latest phonenumbers + v1.42.5 (2023-11-20) ------------------------- * Update deps From b6f13a7ec90c66dfea6d330011e8242fa81d2e8e Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 12 Dec 2023 10:11:25 -0500 Subject: [PATCH 055/141] Update deps --- go.mod | 14 +++++++------- go.sum | 28 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 2f50122..a1a1447 100644 --- a/go.mod +++ b/go.mod @@ -3,21 +3,21 @@ module github.com/nyaruka/gocommon go 1.21 require ( - github.com/aws/aws-sdk-go v1.48.0 + github.com/aws/aws-sdk-go v1.49.0 github.com/gabriel-vasile/mimetype v1.4.3 github.com/go-chi/chi v4.1.2+incompatible - github.com/go-playground/validator/v10 v10.14.1 + github.com/go-playground/validator/v10 v10.16.0 github.com/gofrs/uuid v4.4.0+incompatible github.com/jmoiron/sqlx v1.3.5 github.com/lib/pq v1.10.9 github.com/nyaruka/librato v1.1.1 github.com/nyaruka/null/v2 v2.0.3 - github.com/nyaruka/phonenumbers v1.2.2 + github.com/nyaruka/phonenumbers v1.2.3 github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.3.1 github.com/stretchr/testify v1.8.4 - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa - golang.org/x/net v0.18.0 + golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb + golang.org/x/net v0.19.0 golang.org/x/text v0.14.0 ) @@ -28,8 +28,8 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/crypto v0.15.0 // indirect - golang.org/x/sys v0.14.0 // indirect + golang.org/x/crypto v0.16.0 // indirect + golang.org/x/sys v0.15.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 8e4145a..45b5f36 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.48.0 h1:1SeJ8agckRDQvnSCt1dGZYAwUaoD2Ixj6IaXB4LCv8Q= -github.com/aws/aws-sdk-go v1.48.0/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.49.0 h1:g9BkW1fo9GqKfwg2+zCD+TW/D36Ux+vtfJ8guF4AYmY= +github.com/aws/aws-sdk-go v1.49.0/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -13,8 +13,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k= -github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE= +github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= @@ -40,8 +40,8 @@ github.com/nyaruka/librato v1.1.1 h1:0nTYtJLl3Sn7lX3CuHsLf+nXy1k/tGV0OjVxLy3Et4s github.com/nyaruka/librato v1.1.1/go.mod h1:fme1Fu1PT2qvkaBZyw8WW+SrnFe2qeeCWpvqmAaKAKE= github.com/nyaruka/null/v2 v2.0.3 h1:rdmMRQyVzrOF3Jff/gpU/7BDR9mQX0lcLl4yImsA3kw= github.com/nyaruka/null/v2 v2.0.3/go.mod h1:OCVeCkCXwrg5/qE6RU0c1oUVZBy+ZDrT+xYg1XSaIWA= -github.com/nyaruka/phonenumbers v1.2.2 h1:OwVjf7Y4uHoK9VJUrA8ebR0ha2yc6sEYbfrwkq0asCY= -github.com/nyaruka/phonenumbers v1.2.2/go.mod h1:wzk2qq7qwsaBKrfbkWKdgHYOOH+QFTesSpIq53ELw8M= +github.com/nyaruka/phonenumbers v1.2.3 h1:xjbKWbTk+tTKU+FsHPBhRNZY0Kszk+1+K+fpvdPDLcg= +github.com/nyaruka/phonenumbers v1.2.3/go.mod h1:Jv2/XnmnjYDo3rW3/CSkH0zZB6Gl4RsDmlUKZV0JMW8= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -56,14 +56,14 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb h1:c0vyKkb6yr3KR7jEfJaOSv4lG7xPkbN6r52aJz1d8a8= +golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From b7f544a53b469dcbf39221805f4562ccd48cae67 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 12 Dec 2023 10:12:09 -0500 Subject: [PATCH 056/141] Update CHANGELOG.md for v1.42.7 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f86a5c2..08f2f31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.42.7 (2023-12-12) +------------------------- + * Update deps + v1.42.6 (2023-11-24) ------------------------- * Update to latest phonenumbers From e39b528e34ac243934d8fa7753071fb274176df8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 00:06:37 +0000 Subject: [PATCH 057/141] Bump golang.org/x/crypto from 0.16.0 to 0.17.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.16.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.16.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a1a1447..741e606 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/crypto v0.16.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/sys v0.15.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 45b5f36..d05d53d 100644 --- a/go.sum +++ b/go.sum @@ -56,8 +56,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb h1:c0vyKkb6yr3KR7jEfJaOSv4lG7xPkbN6r52aJz1d8a8= golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= From 33bd5cd84012d165ddc76950868111e03946f392 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 9 Jan 2024 17:58:31 -0500 Subject: [PATCH 058/141] Support for webchat --- random/rand.go | 9 +++++++ random/rand_test.go | 3 +++ urns/urns.go | 12 +--------- urns/urns_test.go | 57 +++++---------------------------------------- 4 files changed, 19 insertions(+), 62 deletions(-) diff --git a/random/rand.go b/random/rand.go index db61206..3387194 100644 --- a/random/rand.go +++ b/random/rand.go @@ -41,3 +41,12 @@ func Float64() float64 { func Decimal() decimal.Decimal { return decimal.NewFromFloat(Float64()) } + +// String returns a string of length n composed of random characters from chars. +func String(n int, chars []rune) string { + r := make([]rune, n) + for i := range r { + r[i] = chars[IntN(len(chars))] + } + return string(r) +} diff --git a/random/rand_test.go b/random/rand_test.go index 80337b8..9308e72 100644 --- a/random/rand_test.go +++ b/random/rand_test.go @@ -20,6 +20,9 @@ func TestRand(t *testing.T) { assert.Equal(t, decimal.RequireFromString("0.8989115230327291"), random.Decimal()) assert.Equal(t, decimal.RequireFromString("0.6087185537746531"), random.Decimal()) assert.Equal(t, decimal.RequireFromString("0.3023554328904116"), random.Decimal()) + + assert.Equal(t, "Ej22bFMALM", random.String(10, []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"))) + assert.Equal(t, "a!!aa!!a!a", random.String(10, []rune("a!z"))) } func TestRandConcurrency(t *testing.T) { diff --git a/urns/urns.go b/urns/urns.go index 8e4284d..b1bbeae 100644 --- a/urns/urns.go +++ b/urns/urns.go @@ -76,8 +76,7 @@ var viberRegex = regexp.MustCompile(`^[a-zA-Z0-9_=/+]{1,24}$`) var lineRegex = regexp.MustCompile(`^[a-zA-Z0-9_]{1,36}$`) var allDigitsRegex = regexp.MustCompile(`^[0-9]+$`) var freshchatRegex = regexp.MustCompile(`^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}/[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$`) -var webchatRegex = regexp.MustCompile(`^[^\s@]+@[^\s@]+$`) -var teamsRegex = regexp.MustCompile(`^\w[a-zA-Z0-9\w-]+:((www\.)?(.*)?\/?(.)*(/[a-zA-Z]+)?)`) +var webchatRegex = regexp.MustCompile(`^[a-zA-Z0-9]{24}$`) // URN represents a Universal Resource Name, we use this for contact identifiers like phone numbers etc.. type URN string @@ -121,11 +120,6 @@ func NewInstagramURN(identifier string) (URN, error) { return NewURNFromParts(InstagramScheme, identifier, "", "") } -// NewTeamsURN returns a URN for the passed in teams identifier -func NewTeamsURN(identifier string) (URN, error) { - return NewURNFromParts(TeamsScheme, identifier, "", "") -} - // returns a new URN for the given scheme, path, query and display func newURNFromParts(scheme string, path string, query string, display string) URN { u := &parsedURN{ @@ -290,10 +284,6 @@ func (u URN) Validate() error { if !webchatRegex.MatchString(path) { return fmt.Errorf("invalid webchat id: %s", path) } - case TeamsScheme: - if !teamsRegex.MatchString(path) { - return fmt.Errorf("invalid teams id: %s", path) - } } return nil // anything goes for external schemes diff --git a/urns/urns_test.go b/urns/urns_test.go index 3f4be61..035ce88 100644 --- a/urns/urns_test.go +++ b/urns/urns_test.go @@ -26,8 +26,7 @@ func TestURNProperties(t *testing.T) { {"tel:+250788383383", "0788 383 383", "", "", map[string][]string{}}, {"twitter:85114?foo=bar#foobar", "foobar", "foobar", "foo=bar", map[string][]string{"foo": {"bar"}}}, {"discord:732326982863421591", "732326982863421591", "", "", map[string][]string{}}, - {"webchat:123456@foo", "123456@foo", "", "", map[string][]string{}}, - {"teams:a1b2n4:test.example", "a1b2n4:test.example", "", "", map[string][]string{}}, + {"webchat:123456789012345678901234", "123456789012345678901234", "", "", map[string][]string{}}, } for _, tc := range testCases { assert.Equal(t, string(tc.urn), tc.urn.String()) @@ -87,7 +86,7 @@ func TestFromParts(t *testing.T) { {"whatsapp", "12345", "", URN("whatsapp:12345"), URN("whatsapp:12345"), false}, {"viber", "", "", NilURN, ":", true}, {"discord", "732326982863421591", "", URN("discord:732326982863421591"), URN("discord:732326982863421591"), false}, - {"webchat", "12345@foo", "", URN("webchat:12345@foo"), URN("webchat:12345@foo"), false}, + {"webchat", "123456789012345678901234", "", URN("webchat:123456789012345678901234"), URN("webchat:123456789012345678901234"), false}, {"teams", "a1b2n4:test.example", "", URN("teams:a1b2n4:test.example"), URN("teams:a1b2n4:test.example"), false}, } @@ -288,10 +287,9 @@ func TestValidate(t *testing.T) { {"slack:U0123ABCDEF", ""}, - // teams has the conversation id and after ':' comes the serviceURL - {"teams:a1b2n4:test.example", ""}, - {"teams:123456", "invalid teams id"}, - {"teams:a1b2n4:www.test.example", ""}, + {"webchat:aA3456789012345678901234", ""}, + {"webchat:1234567890123456789", "invalid webchat id"}, + {"webchat:12345678901234567890123$", "invalid webchat id"}, } for _, tc := range testCases { @@ -303,7 +301,7 @@ func TestValidate(t *testing.T) { t.Errorf("Failed wrong error, '%s' not found in '%s' for '%s'", tc.expectedError, err.Error(), string(tc.urn)) } } else { - assert.NoError(t, err, "unspected error validating %s", tc.urn) + assert.NoError(t, err, "unexpected error validating %s", tc.urn) } } } @@ -480,49 +478,6 @@ func TestDiscordURNs(t *testing.T) { } } -func TestWebChatURNs(t *testing.T) { - testCases := []struct { - identifier string - expected URN - hasError bool - }{ - {"123456@foo", URN("webchat:123456@foo"), false}, - {"matricula:123456@foo", URN("webchat:matricula:123456@foo"), false}, - {"123456", URN("webchat:123456@foo"), true}, - } - - for _, tc := range testCases { - urn, err := NewWebChatURN(tc.identifier) - if tc.hasError { - assert.Error(t, err, "expected error for %s", tc.identifier) - } else { - assert.NoError(t, err, "expected error for %s", tc.identifier) - assert.Equal(t, tc.expected, urn, "created URN mismatch for %s", tc.identifier) - } - } -} - -func TestTeamsURNs(t *testing.T) { - testCases := []struct { - identifier string - expected URN - hasError bool - }{ - {"1a2b3c4d5e6f:test.example", URN("teams:1a2b3c4d5e6f:test.example"), false}, - {"123456", URN("teams:123456"), true}, - } - - for _, tc := range testCases { - urn, err := NewTeamsURN(tc.identifier) - if tc.hasError { - assert.Error(t, err, "expected error for %s", tc.identifier) - } else { - assert.NoError(t, err, "expected error for %s", tc.identifier) - assert.Equal(t, tc.expected, urn, "created URN mismatch for %s", tc.identifier) - } - } -} - func BenchmarkValidTel(b *testing.B) { for n := 0; n < b.N; n++ { NewTelURNForCountry("2065551212", "US") From ac4221cf10ed87e938195772cd6c87e552212c9e Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 10 Jan 2024 15:09:02 -0500 Subject: [PATCH 059/141] Update CHANGELOG.md for v1.50.0 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 08f2f31..7fca9e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +v1.50.0 (2024-01-10) +------------------------- + * Rework support for webchat URNs, drop unused teams URNs + * Bump golang.org/x/crypto from 0.16.0 to 0.17.0 + v1.42.7 (2023-12-12) ------------------------- * Update deps From f7a36fbd9ee970bf2cf1295069edfbcffe314648 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 11 Jan 2024 16:06:03 -0500 Subject: [PATCH 060/141] Add websocket struct to httpx --- go.mod | 1 + go.sum | 2 + httpx/websocket.go | 174 ++++++++++++++++++++++++++++++++++++++++ httpx/websocket_test.go | 69 ++++++++++++++++ 4 files changed, 246 insertions(+) create mode 100644 httpx/websocket.go create mode 100644 httpx/websocket_test.go diff --git a/go.mod b/go.mod index 741e606..2ab20a8 100644 --- a/go.mod +++ b/go.mod @@ -25,6 +25,7 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/gorilla/websocket v1.5.1 github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect diff --git a/go.sum b/go.sum index d05d53d..556029a 100644 --- a/go.sum +++ b/go.sum @@ -23,6 +23,8 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= diff --git a/httpx/websocket.go b/httpx/websocket.go new file mode 100644 index 0000000..147a75a --- /dev/null +++ b/httpx/websocket.go @@ -0,0 +1,174 @@ +package httpx + +import ( + "net/http" + "sync" + "time" + + "github.com/gorilla/websocket" +) + +const ( + // max time for between reading a message before socket is considered closed + maxReadWait = 60 * time.Second + + // maximum time to wait for message to be written + maxWriteWait = 15 * time.Second + + // how often to send a ping message + pingPeriod = 30 * time.Second +) + +var upgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, +} + +type WebSocket interface { + Start() + Send(msg []byte) + Close() + + OnMessage(fn func([]byte)) + OnClose(fn func(int)) +} + +// Socket implemention using gorilla library +type socket struct { + conn *websocket.Conn + onMessage func([]byte) + onClose func(int) + outbox chan []byte + readError chan error + writeError chan error + stopWriter chan bool + stopMonitor chan bool + rwWaitGroup sync.WaitGroup + monitorWaitGroup sync.WaitGroup +} + +func NewWebSocket(w http.ResponseWriter, r *http.Request, maxReadBytes int64, sendBuffer int) (WebSocket, error) { + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + return nil, err + } + + conn.SetReadLimit(maxReadBytes) + + return &socket{ + conn: conn, + onMessage: func([]byte) {}, + onClose: func(int) {}, + outbox: make(chan []byte, sendBuffer), + readError: make(chan error, 1), + writeError: make(chan error, 1), + stopWriter: make(chan bool, 1), + stopMonitor: make(chan bool, 1), + }, nil +} + +func (s *socket) OnMessage(fn func([]byte)) { s.onMessage = fn } +func (s *socket) OnClose(fn func(int)) { s.onClose = fn } + +func (s *socket) Start() { + s.conn.SetReadDeadline(time.Now().Add(maxReadWait)) + s.conn.SetPongHandler(s.pong) + + go s.monitor() + go s.reader() + go s.writer() +} + +func (s *socket) Send(msg []byte) { + s.outbox <- msg +} + +func (s *socket) Close() { + s.conn.Close() // causes reader to stop + s.stopWriter <- true + s.stopMonitor <- true + + s.monitorWaitGroup.Wait() +} + +func (s *socket) pong(m string) error { + s.conn.SetReadDeadline(time.Now().Add(maxReadWait)) + + return nil +} + +func (s *socket) monitor() { + s.monitorWaitGroup.Add(1) + defer s.monitorWaitGroup.Done() + + closeCode := websocket.CloseNormalClosure + +out: + for { + select { + case err := <-s.readError: + if e, ok := err.(*websocket.CloseError); ok { + closeCode = e.Code + } + s.stopWriter <- true // ensure writer is stopped + break out + case err := <-s.writeError: + if e, ok := err.(*websocket.CloseError); ok { + closeCode = e.Code + } + s.conn.Close() // ensure reader is stopped + break out + case <-s.stopMonitor: + break out + } + } + + s.rwWaitGroup.Wait() + + s.onClose(closeCode) +} + +func (s *socket) reader() { + s.rwWaitGroup.Add(1) + defer s.rwWaitGroup.Done() + + for { + _, message, err := s.conn.ReadMessage() + if err != nil { + s.readError <- err + return + } + + s.onMessage(message) + } +} + +func (s *socket) writer() { + s.rwWaitGroup.Add(1) + defer s.rwWaitGroup.Done() + + ticker := time.NewTicker(pingPeriod) + defer ticker.Stop() + + for { + select { + case msg := <-s.outbox: + s.conn.SetWriteDeadline(time.Now().Add(maxWriteWait)) + + err := s.conn.WriteMessage(websocket.TextMessage, msg) + if err != nil { + s.writeError <- err + return + } + case <-ticker.C: + s.conn.SetWriteDeadline(time.Now().Add(maxWriteWait)) + + if err := s.conn.WriteMessage(websocket.PingMessage, nil); err != nil { + s.writeError <- err + return + } + case <-s.stopWriter: + return + } + } +} diff --git a/httpx/websocket_test.go b/httpx/websocket_test.go new file mode 100644 index 0000000..714ccda --- /dev/null +++ b/httpx/websocket_test.go @@ -0,0 +1,69 @@ +package httpx_test + +import ( + "net/http" + "net/http/httptest" + "strings" + "testing" + "time" + + "github.com/gorilla/websocket" + "github.com/nyaruka/gocommon/httpx" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestSocket(t *testing.T) { + var sock httpx.WebSocket + var err error + + var serverReceived [][]byte + var serverCloseCode int + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + sock, err = httpx.NewWebSocket(w, r, 4096, 5) + + sock.OnMessage(func(b []byte) { + serverReceived = append(serverReceived, b) + }) + sock.OnClose(func(code int) { + serverCloseCode = code + }) + + sock.Start() + + require.NoError(t, err) + })) + + wsURL := "ws:" + strings.TrimPrefix(server.URL, "http:") + + d := websocket.Dialer{ + Subprotocols: []string{"p1", "p2"}, + ReadBufferSize: 1024, + WriteBufferSize: 1024, + HandshakeTimeout: 30 * time.Second, + } + conn, _, err := d.Dial(wsURL, nil) + assert.NoError(t, err) + assert.NotNil(t, conn) + + // send a message from the server... + sock.Send([]byte("from server")) + + // and read it from the client + msgType, msg, err := conn.ReadMessage() + assert.NoError(t, err) + assert.Equal(t, 1, msgType) + assert.Equal(t, "from server", string(msg)) + + // send a message from the client... + conn.WriteMessage(websocket.TextMessage, []byte("to server")) + + // and check server received it + time.Sleep(time.Second) + assert.Equal(t, [][]byte{[]byte("to server")}, serverReceived) + + sock.Close() + + assert.Equal(t, 1000, serverCloseCode) +} From fdb6d17f557f5ee06e04e373b7c74e2db107e89f Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 12 Jan 2024 10:29:39 -0500 Subject: [PATCH 061/141] Tests and fixes --- httpx/websocket.go | 44 ++++++++--------- httpx/websocket_test.go | 101 ++++++++++++++++++++++++++++++---------- 2 files changed, 96 insertions(+), 49 deletions(-) diff --git a/httpx/websocket.go b/httpx/websocket.go index 147a75a..e0ece26 100644 --- a/httpx/websocket.go +++ b/httpx/websocket.go @@ -19,15 +19,12 @@ const ( pingPeriod = 30 * time.Second ) -var upgrader = websocket.Upgrader{ - ReadBufferSize: 1024, - WriteBufferSize: 1024, -} +var upgrader = websocket.Upgrader{ReadBufferSize: 1024, WriteBufferSize: 1024} type WebSocket interface { Start() - Send(msg []byte) - Close() + Send([]byte) + Close(int) OnMessage(fn func([]byte)) OnClose(fn func(int)) @@ -42,11 +39,12 @@ type socket struct { readError chan error writeError chan error stopWriter chan bool - stopMonitor chan bool + closingWithCode int rwWaitGroup sync.WaitGroup monitorWaitGroup sync.WaitGroup } +// NewWebSocket creates a new web socket from a regular HTTP request func NewWebSocket(w http.ResponseWriter, r *http.Request, maxReadBytes int64, sendBuffer int) (WebSocket, error) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { @@ -56,14 +54,13 @@ func NewWebSocket(w http.ResponseWriter, r *http.Request, maxReadBytes int64, se conn.SetReadLimit(maxReadBytes) return &socket{ - conn: conn, - onMessage: func([]byte) {}, - onClose: func(int) {}, - outbox: make(chan []byte, sendBuffer), - readError: make(chan error, 1), - writeError: make(chan error, 1), - stopWriter: make(chan bool, 1), - stopMonitor: make(chan bool, 1), + conn: conn, + onMessage: func([]byte) {}, + onClose: func(int) {}, + outbox: make(chan []byte, sendBuffer), + readError: make(chan error, 1), + writeError: make(chan error, 1), + stopWriter: make(chan bool, 1), }, nil } @@ -83,10 +80,11 @@ func (s *socket) Send(msg []byte) { s.outbox <- msg } -func (s *socket) Close() { +func (s *socket) Close(code int) { + s.closingWithCode = code + s.conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(code, "")) s.conn.Close() // causes reader to stop s.stopWriter <- true - s.stopMonitor <- true s.monitorWaitGroup.Wait() } @@ -101,31 +99,27 @@ func (s *socket) monitor() { s.monitorWaitGroup.Add(1) defer s.monitorWaitGroup.Done() - closeCode := websocket.CloseNormalClosure - out: for { select { case err := <-s.readError: - if e, ok := err.(*websocket.CloseError); ok { - closeCode = e.Code + if e, ok := err.(*websocket.CloseError); ok && s.closingWithCode == 0 { + s.closingWithCode = e.Code } s.stopWriter <- true // ensure writer is stopped break out case err := <-s.writeError: if e, ok := err.(*websocket.CloseError); ok { - closeCode = e.Code + s.closingWithCode = e.Code } s.conn.Close() // ensure reader is stopped break out - case <-s.stopMonitor: - break out } } s.rwWaitGroup.Wait() - s.onClose(closeCode) + s.onClose(s.closingWithCode) } func (s *socket) reader() { diff --git a/httpx/websocket_test.go b/httpx/websocket_test.go index 714ccda..a78c119 100644 --- a/httpx/websocket_test.go +++ b/httpx/websocket_test.go @@ -13,39 +13,46 @@ import ( "github.com/stretchr/testify/require" ) -func TestSocket(t *testing.T) { - var sock httpx.WebSocket - var err error +func newSocketServer(t *testing.T, fn func(httpx.WebSocket)) string { + s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + sock, err := httpx.NewWebSocket(w, r, 4096, 5) + require.NoError(t, err) + + fn(sock) + })) + return "ws:" + strings.TrimPrefix(s.URL, "http:") +} + +func newSocketConnection(t *testing.T, url string) *websocket.Conn { + d := websocket.Dialer{ + Subprotocols: []string{"p1", "p2"}, + ReadBufferSize: 1024, + WriteBufferSize: 1024, + HandshakeTimeout: 30 * time.Second, + } + c, _, err := d.Dial(url, nil) + assert.NoError(t, err) + return c +} + +func TestSocketMessages(t *testing.T) { + var sock httpx.WebSocket var serverReceived [][]byte var serverCloseCode int - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - sock, err = httpx.NewWebSocket(w, r, 4096, 5) - + serverURL := newSocketServer(t, func(ws httpx.WebSocket) { + sock = ws sock.OnMessage(func(b []byte) { serverReceived = append(serverReceived, b) }) sock.OnClose(func(code int) { serverCloseCode = code }) - sock.Start() + }) - require.NoError(t, err) - })) - - wsURL := "ws:" + strings.TrimPrefix(server.URL, "http:") - - d := websocket.Dialer{ - Subprotocols: []string{"p1", "p2"}, - ReadBufferSize: 1024, - WriteBufferSize: 1024, - HandshakeTimeout: 30 * time.Second, - } - conn, _, err := d.Dial(wsURL, nil) - assert.NoError(t, err) - assert.NotNil(t, conn) + conn := newSocketConnection(t, serverURL) // send a message from the server... sock.Send([]byte("from server")) @@ -60,10 +67,56 @@ func TestSocket(t *testing.T) { conn.WriteMessage(websocket.TextMessage, []byte("to server")) // and check server received it - time.Sleep(time.Second) + time.Sleep(500 * time.Millisecond) assert.Equal(t, [][]byte{[]byte("to server")}, serverReceived) - sock.Close() + var connCloseCode int + conn.SetCloseHandler(func(code int, text string) error { + connCloseCode = code + return nil + }) + + sock.Close(1001) + + conn.ReadMessage() // read the close message + + assert.Equal(t, 1001, serverCloseCode) + assert.Equal(t, 1001, connCloseCode) +} + +func TestSocketClientCloseWithMessage(t *testing.T) { + var sock httpx.WebSocket + var serverCloseCode int + + serverURL := newSocketServer(t, func(ws httpx.WebSocket) { + sock = ws + sock.OnClose(func(code int) { serverCloseCode = code }) + sock.Start() + }) + + conn := newSocketConnection(t, serverURL) + conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.ClosePolicyViolation, "")) + conn.Close() + + time.Sleep(250 * time.Millisecond) + + assert.Equal(t, websocket.ClosePolicyViolation, serverCloseCode) +} + +func TestSocketClientCloseWithoutMessage(t *testing.T) { + var sock httpx.WebSocket + var serverCloseCode int + + serverURL := newSocketServer(t, func(ws httpx.WebSocket) { + sock = ws + sock.OnClose(func(code int) { serverCloseCode = code }) + sock.Start() + }) + + conn := newSocketConnection(t, serverURL) + conn.Close() + + time.Sleep(250 * time.Millisecond) - assert.Equal(t, 1000, serverCloseCode) + assert.Equal(t, websocket.CloseAbnormalClosure, serverCloseCode) } From 366930ebd935e892286cf1f47239392518b03a1e Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 12 Jan 2024 10:34:57 -0500 Subject: [PATCH 062/141] More comments in code --- httpx/websocket.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/httpx/websocket.go b/httpx/websocket.go index e0ece26..9af3521 100644 --- a/httpx/websocket.go +++ b/httpx/websocket.go @@ -21,16 +21,25 @@ const ( var upgrader = websocket.Upgrader{ReadBufferSize: 1024, WriteBufferSize: 1024} +// WebSocket provides a websocket interface similar to that of Javascript. type WebSocket interface { + // Start begins reading and writing of messages on this socket Start() + + // Send sends the given message over the socket Send([]byte) + + // Close closes the socket connection Close(int) - OnMessage(fn func([]byte)) - OnClose(fn func(int)) + // OnMessage is called when the socket receives a message + OnMessage(func([]byte)) + + // OnClose is called when the socket is closed (even if we initiate the close) + OnClose(func(int)) } -// Socket implemention using gorilla library +// WebSocket implemention using gorilla library type socket struct { conn *websocket.Conn onMessage func([]byte) From 35142c6c6615673bf2f29d9ec336df576756f680 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 12 Jan 2024 10:56:29 -0500 Subject: [PATCH 063/141] Add test for ping handling --- httpx/websocket_test.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/httpx/websocket_test.go b/httpx/websocket_test.go index a78c119..80ec40a 100644 --- a/httpx/websocket_test.go +++ b/httpx/websocket_test.go @@ -70,6 +70,24 @@ func TestSocketMessages(t *testing.T) { time.Sleep(500 * time.Millisecond) assert.Equal(t, [][]byte{[]byte("to server")}, serverReceived) + pongReceived := false + conn.SetPongHandler(func(appData string) error { + pongReceived = true + return nil + }) + + // send a ping message from the client... + conn.WriteMessage(websocket.PingMessage, []byte{}) + + // and give server time to receive it and respond + time.Sleep(500 * time.Millisecond) + + // give the connection something to read because ReadMessage will block until it gets a non-ping-pong message + sock.Send([]byte("dummy")) + conn.ReadMessage() + + assert.True(t, pongReceived) + var connCloseCode int conn.SetCloseHandler(func(code int, text string) error { connCloseCode = code From fbca2b9cbb4be4b96e93081fd57f283108b736cf Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 12 Jan 2024 10:59:38 -0500 Subject: [PATCH 064/141] Update CHANGELOG.md for v1.51.0 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fca9e2..1fc90e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.51.0 (2024-01-12) +------------------------- + * Add websocket functionality to httpx + v1.50.0 (2024-01-10) ------------------------- * Rework support for webchat URNs, drop unused teams URNs From 634f920bdfa354b33a151c74beaa066b35b5e152 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 12 Jan 2024 11:02:56 -0500 Subject: [PATCH 065/141] Add sleep to test to give server time to start socket --- httpx/websocket_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/httpx/websocket_test.go b/httpx/websocket_test.go index 80ec40a..17a23eb 100644 --- a/httpx/websocket_test.go +++ b/httpx/websocket_test.go @@ -33,6 +33,9 @@ func newSocketConnection(t *testing.T, url string) *websocket.Conn { } c, _, err := d.Dial(url, nil) assert.NoError(t, err) + + time.Sleep(100 * time.Millisecond) + return c } From 63321e6a3e499aa30beda14374192ab7c6415483 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 12 Jan 2024 11:41:22 -0500 Subject: [PATCH 066/141] Allow cross site requests to websockets --- httpx/websocket.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/httpx/websocket.go b/httpx/websocket.go index 9af3521..7fe9a74 100644 --- a/httpx/websocket.go +++ b/httpx/websocket.go @@ -19,7 +19,13 @@ const ( pingPeriod = 30 * time.Second ) -var upgrader = websocket.Upgrader{ReadBufferSize: 1024, WriteBufferSize: 1024} +var upgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, + + // responsibility of caller to enforce origin rules + CheckOrigin: func(r *http.Request) bool { return true }, +} // WebSocket provides a websocket interface similar to that of Javascript. type WebSocket interface { From 6fc71814be1f98a8ce8489b18dd33125dda07a15 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 12 Jan 2024 11:43:45 -0500 Subject: [PATCH 067/141] Update CHANGELOG.md for v1.51.1 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fc90e5..03a7858 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.51.1 (2024-01-12) +------------------------- + * Allow cross site requests to websockets + v1.51.0 (2024-01-12) ------------------------- * Add websocket functionality to httpx From 77c21ac03d7134ccb1470c9aa70389cfa7885c99 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 15 Jan 2024 16:01:03 -0500 Subject: [PATCH 068/141] Fix controlled closing of websockets --- httpx/websocket.go | 108 ++++++++++++++++++++++++++++------------ httpx/websocket_test.go | 2 + 2 files changed, 79 insertions(+), 31 deletions(-) diff --git a/httpx/websocket.go b/httpx/websocket.go index 7fe9a74..8b9d439 100644 --- a/httpx/websocket.go +++ b/httpx/websocket.go @@ -17,6 +17,9 @@ const ( // how often to send a ping message pingPeriod = 30 * time.Second + + // maximum time to wait for writer to drain when closing + drainPeriod = 3 * time.Second ) var upgrader = websocket.Upgrader{ @@ -45,18 +48,28 @@ type WebSocket interface { OnClose(func(int)) } +type message struct { + type_ int + data []byte +} + // WebSocket implemention using gorilla library type socket struct { - conn *websocket.Conn - onMessage func([]byte) - onClose func(int) - outbox chan []byte - readError chan error - writeError chan error - stopWriter chan bool - closingWithCode int - rwWaitGroup sync.WaitGroup + conn *websocket.Conn + outbox chan message + + readError chan error + writeError chan error + shutdown chan bool + stopWriter chan bool + closingWithCode int + + readerWaitGroup sync.WaitGroup + writerWaitGroup sync.WaitGroup monitorWaitGroup sync.WaitGroup + + onMessage func([]byte) + onClose func(int) } // NewWebSocket creates a new web socket from a regular HTTP request @@ -69,13 +82,16 @@ func NewWebSocket(w http.ResponseWriter, r *http.Request, maxReadBytes int64, se conn.SetReadLimit(maxReadBytes) return &socket{ - conn: conn, - onMessage: func([]byte) {}, - onClose: func(int) {}, - outbox: make(chan []byte, sendBuffer), + conn: conn, + outbox: make(chan message, sendBuffer), + readError: make(chan error, 1), writeError: make(chan error, 1), - stopWriter: make(chan bool, 1), + shutdown: make(chan bool, 1), + stopWriter: make(chan bool), + + onMessage: defaultOnMessage, + onClose: defaultOnClose, }, nil } @@ -92,14 +108,19 @@ func (s *socket) Start() { } func (s *socket) Send(msg []byte) { - s.outbox <- msg + if s.closingWithCode != 0 { + panic("can't send to socket which is closed or closing") + } + + s.outbox <- message{type_: websocket.TextMessage, data: msg} } func (s *socket) Close(code int) { s.closingWithCode = code - s.conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(code, "")) - s.conn.Close() // causes reader to stop - s.stopWriter <- true + + s.outbox <- message{type_: websocket.CloseMessage, data: websocket.FormatCloseMessage(code, "")} + + s.shutdown <- true s.monitorWaitGroup.Wait() } @@ -114,6 +135,7 @@ func (s *socket) monitor() { s.monitorWaitGroup.Add(1) defer s.monitorWaitGroup.Done() + // shutdown starts via read error, write error, or Close() out: for { select { @@ -121,25 +143,31 @@ out: if e, ok := err.(*websocket.CloseError); ok && s.closingWithCode == 0 { s.closingWithCode = e.Code } - s.stopWriter <- true // ensure writer is stopped break out case err := <-s.writeError: - if e, ok := err.(*websocket.CloseError); ok { + if e, ok := err.(*websocket.CloseError); ok && s.closingWithCode == 0 { s.closingWithCode = e.Code } - s.conn.Close() // ensure reader is stopped + break out + case <-s.shutdown: break out } } - s.rwWaitGroup.Wait() + // stop writer if not already finished... + s.stopWriter <- true + s.writerWaitGroup.Wait() + + // stop reader if not already finished... + s.conn.Close() + s.readerWaitGroup.Wait() s.onClose(s.closingWithCode) } func (s *socket) reader() { - s.rwWaitGroup.Add(1) - defer s.rwWaitGroup.Done() + s.readerWaitGroup.Add(1) + defer s.readerWaitGroup.Done() for { _, message, err := s.conn.ReadMessage() @@ -153,31 +181,49 @@ func (s *socket) reader() { } func (s *socket) writer() { - s.rwWaitGroup.Add(1) - defer s.rwWaitGroup.Done() + s.writerWaitGroup.Add(1) + defer s.writerWaitGroup.Done() ticker := time.NewTicker(pingPeriod) defer ticker.Stop() +out: for { select { case msg := <-s.outbox: s.conn.SetWriteDeadline(time.Now().Add(maxWriteWait)) - err := s.conn.WriteMessage(websocket.TextMessage, msg) - if err != nil { + if err := s.conn.WriteMessage(msg.type_, msg.data); err != nil { s.writeError <- err - return } case <-ticker.C: s.conn.SetWriteDeadline(time.Now().Add(maxWriteWait)) if err := s.conn.WriteMessage(websocket.PingMessage, nil); err != nil { s.writeError <- err - return } case <-s.stopWriter: - return + break out + } + } + + // try to drain the outbox with a time limit + if len(s.outbox) > 0 { + s.conn.SetWriteDeadline(time.Now().Add(drainPeriod)) + for { + select { + case msg := <-s.outbox: + err := s.conn.WriteMessage(msg.type_, msg.data) + if err != nil || len(s.outbox) == 0 { + return + } + case <-time.After(drainPeriod): + return + } } } } + +func defaultOnMessage([]byte) {} + +func defaultOnClose(int) {} diff --git a/httpx/websocket_test.go b/httpx/websocket_test.go index 17a23eb..696fbf7 100644 --- a/httpx/websocket_test.go +++ b/httpx/websocket_test.go @@ -97,8 +97,10 @@ func TestSocketMessages(t *testing.T) { return nil }) + sock.Send([]byte("closing time")) sock.Close(1001) + conn.ReadMessage() // read the final message conn.ReadMessage() // read the close message assert.Equal(t, 1001, serverCloseCode) From 6daeb9a59c2f05ca70e694ffe36c55e8423bd9a2 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 15 Jan 2024 16:05:47 -0500 Subject: [PATCH 069/141] Panic if trying to close or start and already closed socket --- httpx/websocket.go | 8 ++++++++ httpx/websocket_test.go | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/httpx/websocket.go b/httpx/websocket.go index 8b9d439..8fd5022 100644 --- a/httpx/websocket.go +++ b/httpx/websocket.go @@ -99,6 +99,10 @@ func (s *socket) OnMessage(fn func([]byte)) { s.onMessage = fn } func (s *socket) OnClose(fn func(int)) { s.onClose = fn } func (s *socket) Start() { + if s.closingWithCode != 0 { + panic("can't start socket which is closed or closing") + } + s.conn.SetReadDeadline(time.Now().Add(maxReadWait)) s.conn.SetPongHandler(s.pong) @@ -116,6 +120,10 @@ func (s *socket) Send(msg []byte) { } func (s *socket) Close(code int) { + if s.closingWithCode != 0 { + panic("can't close socket which is already closed or closing") + } + s.closingWithCode = code s.outbox <- message{type_: websocket.CloseMessage, data: websocket.FormatCloseMessage(code, "")} diff --git a/httpx/websocket_test.go b/httpx/websocket_test.go index 696fbf7..c9a3f1f 100644 --- a/httpx/websocket_test.go +++ b/httpx/websocket_test.go @@ -105,6 +105,17 @@ func TestSocketMessages(t *testing.T) { assert.Equal(t, 1001, serverCloseCode) assert.Equal(t, 1001, connCloseCode) + + // check we can no longer send to the socket or close it again, or restart it + assert.Panics(t, func() { + sock.Send([]byte("x")) + }) + assert.Panics(t, func() { + sock.Close(1000) + }) + assert.Panics(t, func() { + sock.Start() + }) } func TestSocketClientCloseWithMessage(t *testing.T) { From 91826726df07cd35f20b349ac029ff4f21f1c822 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 15 Jan 2024 16:27:15 -0500 Subject: [PATCH 070/141] Update CHANGELOG.md for v1.51.2 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03a7858..3c6784f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +v1.51.2 (2024-01-15) +------------------------- + * Panic if trying to close or start and already closed socket + * Fix controlled closing of websockets + v1.51.1 (2024-01-12) ------------------------- * Allow cross site requests to websockets From 1387ca2660cdf7cc93441c767618c301edc8dbae Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 23 Jan 2024 17:56:08 -0500 Subject: [PATCH 071/141] Add email component to webchat URNs --- urns/urns.go | 2 +- urns/urns_test.go | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/urns/urns.go b/urns/urns.go index b1bbeae..2b68560 100644 --- a/urns/urns.go +++ b/urns/urns.go @@ -76,7 +76,7 @@ var viberRegex = regexp.MustCompile(`^[a-zA-Z0-9_=/+]{1,24}$`) var lineRegex = regexp.MustCompile(`^[a-zA-Z0-9_]{1,36}$`) var allDigitsRegex = regexp.MustCompile(`^[0-9]+$`) var freshchatRegex = regexp.MustCompile(`^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}/[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$`) -var webchatRegex = regexp.MustCompile(`^[a-zA-Z0-9]{24}$`) +var webchatRegex = regexp.MustCompile(`^[a-zA-Z0-9]{24}(:[^\s@]+@[^\s@]+)?$`) // URN represents a Universal Resource Name, we use this for contact identifiers like phone numbers etc.. type URN string diff --git a/urns/urns_test.go b/urns/urns_test.go index 035ce88..3f02b31 100644 --- a/urns/urns_test.go +++ b/urns/urns_test.go @@ -288,8 +288,10 @@ func TestValidate(t *testing.T) { {"slack:U0123ABCDEF", ""}, {"webchat:aA3456789012345678901234", ""}, + {"webchat:aA3456789012345678901234:bob@nyaruka.com", ""}, {"webchat:1234567890123456789", "invalid webchat id"}, {"webchat:12345678901234567890123$", "invalid webchat id"}, + {"webchat:aA3456789012345678901234:@@$", "invalid webchat id"}, } for _, tc := range testCases { From e5af9efae39284f7309519584654991e94a84f08 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 24 Jan 2024 10:43:06 -0500 Subject: [PATCH 072/141] Add generic cache based on ttlcache and synced fetching logic used by mailroom asset loading --- cache/generic.go | 97 ++++++++++++++++++++++++++++++++++++++ cache/generic_test.go | 105 ++++++++++++++++++++++++++++++++++++++++++ go.mod | 4 +- go.sum | 6 +++ 4 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 cache/generic.go create mode 100644 cache/generic_test.go diff --git a/cache/generic.go b/cache/generic.go new file mode 100644 index 0000000..25afc10 --- /dev/null +++ b/cache/generic.go @@ -0,0 +1,97 @@ +package cache + +import ( + "context" + "sync" + "time" + + "github.com/jellydator/ttlcache/v3" +) + +// Cache is a generic in-memory cache. +type Cache[K comparable, V any] struct { + cache *ttlcache.Cache[K, V] + fetch FetchFunc[K, V] + fetchers sync.Map +} + +// FetchFunc is a function which can fetch an item which doesn't yet exist in the cache. +type FetchFunc[K comparable, V any] func(context.Context, K) (V, error) + +// NewCache creates a new cache. +func NewCache[K comparable, V any](fetch FetchFunc[K, V], ttl time.Duration) *Cache[K, V] { + return &Cache[K, V]{ + cache: ttlcache.New[K, V]( + ttlcache.WithTTL[K, V](ttl), + ttlcache.WithDisableTouchOnHit[K, V](), + ), + fetch: fetch, + } +} + +// Start starts the routine to eliminate expired items from the cache. +func (c *Cache[K, V]) Start() { + go c.cache.Start() +} + +// Stop stops that routine. +func (c *Cache[K, V]) Stop() { + c.cache.Stop() +} + +// Len returns the number of items in the cache. +func (c *Cache[K, V]) Len() int { + return c.cache.Len() +} + +func (c *Cache[K, V]) Get(ctx context.Context, key K) (V, error) { + item := c.cache.Get(key) + + if item == nil { + var err error + + item, err = c.fetchAndSet(ctx, key) + if err != nil { + var zero V + return zero, err + } + } + + return item.Value(), nil +} + +type fetcher[K comparable, V any] struct { + item *ttlcache.Item[K, V] + err error + done chan struct{} +} + +func (c *Cache[K, V]) fetchAndSet(ctx context.Context, key K) (*ttlcache.Item[K, V], error) { + // try to set the fetcher for this key + actual, alreadyExists := c.fetchers.LoadOrStore(key, &fetcher[K, V]{done: make(chan struct{})}) + fetcher := actual.(*fetcher[K, V]) + + if alreadyExists { + // wait for other fetcher routine to do the fetch + <-fetcher.done + } else { + defer func() { + c.fetchers.Delete(key) + close(fetcher.done) + }() + + // there's always a chance a different thread completed a fetch before we got here + // so check again now that we have a lock for the key + if item := c.cache.Get(key); item != nil { + fetcher.item, fetcher.err = item, nil + } else { + val, err := c.fetch(ctx, key) + if err != nil { + fetcher.err = err + } else { + fetcher.item = c.cache.Set(key, val, ttlcache.DefaultTTL) + } + } + } + return fetcher.item, fetcher.err +} diff --git a/cache/generic_test.go b/cache/generic_test.go new file mode 100644 index 0000000..d704c1f --- /dev/null +++ b/cache/generic_test.go @@ -0,0 +1,105 @@ +package cache_test + +import ( + "context" + "errors" + "strings" + "sync" + "sync/atomic" + "testing" + "time" + + "github.com/nyaruka/gocommon/cache" + "github.com/stretchr/testify/assert" +) + +func TestCache(t *testing.T) { + ctx := context.Background() + + var fetches atomic.Int32 + fetch := func(ctx context.Context, k string) (string, error) { + fetches.Add(1) + if k == "error" { + return "", errors.New("boom") + } else if k == "slow" { + time.Sleep(250 * time.Millisecond) + } + return strings.ToUpper(k), nil + } + cache := cache.NewCache[string, string](fetch, time.Second) + cache.Start() + + v, err := cache.Get(ctx, "x") + assert.NoError(t, err) + assert.Equal(t, "X", v) + assert.Equal(t, int32(1), fetches.Load()) + assert.Equal(t, 1, cache.Len()) + + v, err = cache.Get(ctx, "x") + assert.NoError(t, err) + assert.Equal(t, "X", v) + assert.Equal(t, int32(1), fetches.Load()) + assert.Equal(t, 1, cache.Len()) + + v, err = cache.Get(ctx, "y") + assert.NoError(t, err) + assert.Equal(t, "Y", v) + assert.Equal(t, int32(2), fetches.Load()) + assert.Equal(t, 2, cache.Len()) + + // test 100 threads trying to get the same value simultaneously + wg := sync.WaitGroup{} + getZ := func() { + v, err = cache.Get(ctx, "z") + assert.NoError(t, err) + assert.Equal(t, "Z", v) + wg.Done() + } + + wg.Add(100) + for i := 0; i < 100; i++ { + go getZ() + } + + wg.Wait() + assert.Equal(t, int32(3), fetches.Load()) // should still only have made one fetch + assert.Equal(t, 3, cache.Len()) + + // test that fetching one key isn't affected by a delay fetching a different key + wg.Add(2) + t0 := time.Now() + var tFast, tSlow time.Duration + + go func() { + v, err = cache.Get(ctx, "slow") + tSlow = time.Since(t0) + assert.NoError(t, err) + assert.Equal(t, "SLOW", v) + wg.Done() + }() + go func() { + v, err = cache.Get(ctx, "fast") + tFast = time.Since(t0) + assert.NoError(t, err) + assert.Equal(t, "FAST", v) + wg.Done() + }() + + wg.Wait() + + assert.Less(t, tFast, 100*time.Millisecond) + assert.GreaterOrEqual(t, tSlow, 250*time.Millisecond) + assert.Equal(t, 5, cache.Len()) + + v, err = cache.Get(ctx, "error") + assert.EqualError(t, err, "boom") + assert.Equal(t, "", v) + + assert.Equal(t, 5, cache.Len()) + + time.Sleep(2 * time.Second) + + assert.Equal(t, 0, cache.Len()) + + cache.Stop() +} diff --git a/go.mod b/go.mod index 2ab20a8..1135b10 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,8 @@ require ( github.com/go-chi/chi v4.1.2+incompatible github.com/go-playground/validator/v10 v10.16.0 github.com/gofrs/uuid v4.4.0+incompatible + github.com/gorilla/websocket v1.5.1 + github.com/jellydator/ttlcache/v3 v3.1.1 github.com/jmoiron/sqlx v1.3.5 github.com/lib/pq v1.10.9 github.com/nyaruka/librato v1.1.1 @@ -25,11 +27,11 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/gorilla/websocket v1.5.1 github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/crypto v0.17.0 // indirect + golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.15.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 556029a..a74e9df 100644 --- a/go.sum +++ b/go.sum @@ -25,6 +25,8 @@ github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/jellydator/ttlcache/v3 v3.1.1 h1:RCgYJqo3jgvhl+fEWvjNW8thxGWsgxi+TPhRir1Y9y8= +github.com/jellydator/ttlcache/v3 v3.1.1/go.mod h1:hi7MGFdMAwZna5n2tuvh63DvFLzVKySzCVW6+0gA2n4= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -58,12 +60,16 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb h1:c0vyKkb6yr3KR7jEfJaOSv4lG7xPkbN6r52aJz1d8a8= golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= From c83e76b76f6c9d759cdd268af615f465421c7613 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 24 Jan 2024 12:09:56 -0500 Subject: [PATCH 073/141] Rework cache.Cache to use x/sync/singleflight --- cache/generic.go | 67 +++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 38 deletions(-) diff --git a/cache/generic.go b/cache/generic.go index 25afc10..ed6ba00 100644 --- a/cache/generic.go +++ b/cache/generic.go @@ -2,24 +2,24 @@ package cache import ( "context" - "sync" "time" "github.com/jellydator/ttlcache/v3" + "golang.org/x/sync/singleflight" ) // Cache is a generic in-memory cache. -type Cache[K comparable, V any] struct { - cache *ttlcache.Cache[K, V] - fetch FetchFunc[K, V] - fetchers sync.Map +type Cache[K ~string, V any] struct { + cache *ttlcache.Cache[K, V] + fetch FetchFunc[K, V] + fetchSync singleflight.Group } // FetchFunc is a function which can fetch an item which doesn't yet exist in the cache. -type FetchFunc[K comparable, V any] func(context.Context, K) (V, error) +type FetchFunc[K ~string, V any] func(context.Context, K) (V, error) // NewCache creates a new cache. -func NewCache[K comparable, V any](fetch FetchFunc[K, V], ttl time.Duration) *Cache[K, V] { +func NewCache[K ~string, V any](fetch FetchFunc[K, V], ttl time.Duration) *Cache[K, V] { return &Cache[K, V]{ cache: ttlcache.New[K, V]( ttlcache.WithTTL[K, V](ttl), @@ -50,7 +50,7 @@ func (c *Cache[K, V]) Get(ctx context.Context, key K) (V, error) { if item == nil { var err error - item, err = c.fetchAndSet(ctx, key) + item, err = c.fetchAndSetSynced(ctx, key) if err != nil { var zero V return zero, err @@ -60,38 +60,29 @@ func (c *Cache[K, V]) Get(ctx context.Context, key K) (V, error) { return item.Value(), nil } -type fetcher[K comparable, V any] struct { - item *ttlcache.Item[K, V] - err error - done chan struct{} +func (c *Cache[K, V]) fetchAndSetSynced(ctx context.Context, key K) (*ttlcache.Item[K, V], error) { + ii, err, _ := c.fetchSync.Do(string(key), func() (any, error) { + // there's always a chance a different thread completed a fetch before we got here + // so check again now that we have a lock for the key + /*item := c.cache.Get(key) + if item != nil { + return item, nil + }*/ + + return c.fetchAndSet(ctx, key) + }) + + if err != nil { + return nil, err + } + return ii.(*ttlcache.Item[K, V]), nil } func (c *Cache[K, V]) fetchAndSet(ctx context.Context, key K) (*ttlcache.Item[K, V], error) { - // try to set the fetcher for this key - actual, alreadyExists := c.fetchers.LoadOrStore(key, &fetcher[K, V]{done: make(chan struct{})}) - fetcher := actual.(*fetcher[K, V]) - - if alreadyExists { - // wait for other fetcher routine to do the fetch - <-fetcher.done - } else { - defer func() { - c.fetchers.Delete(key) - close(fetcher.done) - }() - - // there's always a chance a different thread completed a fetch before we got here - // so check again now that we have a lock for the key - if item := c.cache.Get(key); item != nil { - fetcher.item, fetcher.err = item, nil - } else { - val, err := c.fetch(ctx, key) - if err != nil { - fetcher.err = err - } else { - fetcher.item = c.cache.Set(key, val, ttlcache.DefaultTTL) - } - } + val, err := c.fetch(ctx, key) + if err != nil { + return nil, err } - return fetcher.item, fetcher.err + + return c.cache.Set(key, val, ttlcache.DefaultTTL), nil } From 877c58725db59725906933e04b431c7dc09441b7 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 24 Jan 2024 12:23:09 -0500 Subject: [PATCH 074/141] More testing of cache.Cache --- cache/generic_test.go | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/cache/generic_test.go b/cache/generic_test.go index d704c1f..6d25849 100644 --- a/cache/generic_test.go +++ b/cache/generic_test.go @@ -3,9 +3,9 @@ package cache_test import ( "context" "errors" + "fmt" "strings" "sync" - "sync/atomic" "testing" "time" @@ -16,35 +16,42 @@ import ( func TestCache(t *testing.T) { ctx := context.Background() - var fetches atomic.Int32 + fetchCounts := make(map[string]int) + fetchCountsMutex := &sync.Mutex{} + fetch := func(ctx context.Context, k string) (string, error) { - fetches.Add(1) + fetchCountsMutex.Lock() + fc := fetchCounts[k] + fc++ + fetchCounts[k] = fc + fetchCountsMutex.Unlock() + if k == "error" { return "", errors.New("boom") } else if k == "slow" { time.Sleep(250 * time.Millisecond) } - return strings.ToUpper(k), nil + return fmt.Sprintf("%s/%d", strings.ToUpper(k), fc), nil } cache := cache.NewCache[string, string](fetch, time.Second) cache.Start() v, err := cache.Get(ctx, "x") assert.NoError(t, err) - assert.Equal(t, "X", v) - assert.Equal(t, int32(1), fetches.Load()) + assert.Equal(t, "X/1", v) + assert.Equal(t, map[string]int{"x": 1}, fetchCounts) assert.Equal(t, 1, cache.Len()) v, err = cache.Get(ctx, "x") assert.NoError(t, err) - assert.Equal(t, "X", v) - assert.Equal(t, int32(1), fetches.Load()) + assert.Equal(t, "X/1", v) + assert.Equal(t, map[string]int{"x": 1}, fetchCounts) assert.Equal(t, 1, cache.Len()) v, err = cache.Get(ctx, "y") assert.NoError(t, err) - assert.Equal(t, "Y", v) - assert.Equal(t, int32(2), fetches.Load()) + assert.Equal(t, "Y/1", v) + assert.Equal(t, map[string]int{"x": 1, "y": 1}, fetchCounts) assert.Equal(t, 2, cache.Len()) // test 100 threads trying to get the same value simultaneously @@ -52,7 +59,7 @@ func TestCache(t *testing.T) { getZ := func() { v, err = cache.Get(ctx, "z") assert.NoError(t, err) - assert.Equal(t, "Z", v) + assert.Equal(t, "Z/1", v) wg.Done() } @@ -62,7 +69,7 @@ func TestCache(t *testing.T) { } wg.Wait() - assert.Equal(t, int32(3), fetches.Load()) // should still only have made one fetch + assert.Equal(t, map[string]int{"x": 1, "y": 1, "z": 1}, fetchCounts) // should only have made one fetch for z assert.Equal(t, 3, cache.Len()) // test that fetching one key isn't affected by a delay fetching a different key @@ -74,14 +81,14 @@ func TestCache(t *testing.T) { v, err = cache.Get(ctx, "slow") tSlow = time.Since(t0) assert.NoError(t, err) - assert.Equal(t, "SLOW", v) + assert.Equal(t, "SLOW/1", v) wg.Done() }() go func() { v, err = cache.Get(ctx, "fast") tFast = time.Since(t0) assert.NoError(t, err) - assert.Equal(t, "FAST", v) + assert.Equal(t, "FAST/1", v) wg.Done() }() @@ -97,9 +104,16 @@ func TestCache(t *testing.T) { assert.Equal(t, 5, cache.Len()) + // wait twice as long as the TTL so cache should be empty time.Sleep(2 * time.Second) assert.Equal(t, 0, cache.Len()) + v, err = cache.Get(ctx, "x") + assert.NoError(t, err) + assert.Equal(t, "X/2", v) + assert.Equal(t, map[string]int{"x": 2, "y": 1, "z": 1, "fast": 1, "slow": 1, "error": 1}, fetchCounts) + assert.Equal(t, 1, cache.Len()) + cache.Stop() } From 250193d1594531b2552551501a5b296fc35f371c Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 24 Jan 2024 13:02:27 -0500 Subject: [PATCH 075/141] Re-enable get before fetch in synced function --- cache/generic.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cache/generic.go b/cache/generic.go index ed6ba00..1ec3d00 100644 --- a/cache/generic.go +++ b/cache/generic.go @@ -64,10 +64,10 @@ func (c *Cache[K, V]) fetchAndSetSynced(ctx context.Context, key K) (*ttlcache.I ii, err, _ := c.fetchSync.Do(string(key), func() (any, error) { // there's always a chance a different thread completed a fetch before we got here // so check again now that we have a lock for the key - /*item := c.cache.Get(key) + item := c.cache.Get(key) if item != nil { return item, nil - }*/ + } return c.fetchAndSet(ctx, key) }) From e0dbff1d10b64c56be1eb4fbff884dd232604e33 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 24 Jan 2024 13:32:47 -0500 Subject: [PATCH 076/141] Update CHANGELOG.md for v1.52.0 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c6784f..c11b1f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +v1.52.0 (2024-01-24) +------------------------- + * Add generic cache based on ttlcache and x/sync/singleflight + * Add email component to webchat URNs + v1.51.2 (2024-01-15) ------------------------- * Panic if trying to close or start and already closed socket From 4d03ef77e2a60547cbf0672cd78bc7f5efa5fb0e Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 24 Jan 2024 15:21:06 -0500 Subject: [PATCH 077/141] Rename cache.Cache to cache.Local for clarity --- cache/{generic.go => local.go} | 28 ++++++++++++------------ cache/{generic_test.go => local_test.go} | 4 ++-- go.mod | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) rename cache/{generic.go => local.go} (64%) rename cache/{generic_test.go => local_test.go} (96%) diff --git a/cache/generic.go b/cache/local.go similarity index 64% rename from cache/generic.go rename to cache/local.go index 1ec3d00..9f4d6b6 100644 --- a/cache/generic.go +++ b/cache/local.go @@ -8,19 +8,19 @@ import ( "golang.org/x/sync/singleflight" ) -// Cache is a generic in-memory cache. -type Cache[K ~string, V any] struct { +// Local is a generic in-memory cache with builtin in fetching of missing items. +type Local[K ~string, V any] struct { cache *ttlcache.Cache[K, V] - fetch FetchFunc[K, V] + fetch Fetcher[K, V] fetchSync singleflight.Group } -// FetchFunc is a function which can fetch an item which doesn't yet exist in the cache. -type FetchFunc[K ~string, V any] func(context.Context, K) (V, error) +// Fetcher is a function which can fetch an item which doesn't yet exist in the cache. +type Fetcher[K ~string, V any] func(context.Context, K) (V, error) -// NewCache creates a new cache. -func NewCache[K ~string, V any](fetch FetchFunc[K, V], ttl time.Duration) *Cache[K, V] { - return &Cache[K, V]{ +// NewLocal creates a new in-memory cache. +func NewLocal[K ~string, V any](fetch Fetcher[K, V], ttl time.Duration) *Local[K, V] { + return &Local[K, V]{ cache: ttlcache.New[K, V]( ttlcache.WithTTL[K, V](ttl), ttlcache.WithDisableTouchOnHit[K, V](), @@ -30,21 +30,21 @@ func NewCache[K ~string, V any](fetch FetchFunc[K, V], ttl time.Duration) *Cache } // Start starts the routine to eliminate expired items from the cache. -func (c *Cache[K, V]) Start() { +func (c *Local[K, V]) Start() { go c.cache.Start() } // Stop stops that routine. -func (c *Cache[K, V]) Stop() { +func (c *Local[K, V]) Stop() { c.cache.Stop() } // Len returns the number of items in the cache. -func (c *Cache[K, V]) Len() int { +func (c *Local[K, V]) Len() int { return c.cache.Len() } -func (c *Cache[K, V]) Get(ctx context.Context, key K) (V, error) { +func (c *Local[K, V]) Get(ctx context.Context, key K) (V, error) { item := c.cache.Get(key) if item == nil { @@ -60,7 +60,7 @@ func (c *Cache[K, V]) Get(ctx context.Context, key K) (V, error) { return item.Value(), nil } -func (c *Cache[K, V]) fetchAndSetSynced(ctx context.Context, key K) (*ttlcache.Item[K, V], error) { +func (c *Local[K, V]) fetchAndSetSynced(ctx context.Context, key K) (*ttlcache.Item[K, V], error) { ii, err, _ := c.fetchSync.Do(string(key), func() (any, error) { // there's always a chance a different thread completed a fetch before we got here // so check again now that we have a lock for the key @@ -78,7 +78,7 @@ func (c *Cache[K, V]) fetchAndSetSynced(ctx context.Context, key K) (*ttlcache.I return ii.(*ttlcache.Item[K, V]), nil } -func (c *Cache[K, V]) fetchAndSet(ctx context.Context, key K) (*ttlcache.Item[K, V], error) { +func (c *Local[K, V]) fetchAndSet(ctx context.Context, key K) (*ttlcache.Item[K, V], error) { val, err := c.fetch(ctx, key) if err != nil { return nil, err diff --git a/cache/generic_test.go b/cache/local_test.go similarity index 96% rename from cache/generic_test.go rename to cache/local_test.go index 6d25849..eefbb84 100644 --- a/cache/generic_test.go +++ b/cache/local_test.go @@ -13,7 +13,7 @@ import ( "github.com/stretchr/testify/assert" ) -func TestCache(t *testing.T) { +func TestLocal(t *testing.T) { ctx := context.Background() fetchCounts := make(map[string]int) @@ -33,7 +33,7 @@ func TestCache(t *testing.T) { } return fmt.Sprintf("%s/%d", strings.ToUpper(k), fc), nil } - cache := cache.NewCache[string, string](fetch, time.Second) + cache := cache.NewLocal[string, string](fetch, time.Second) cache.Start() v, err := cache.Get(ctx, "x") diff --git a/go.mod b/go.mod index 1135b10..a931b96 100644 --- a/go.mod +++ b/go.mod @@ -20,6 +20,7 @@ require ( github.com/stretchr/testify v1.8.4 golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb golang.org/x/net v0.19.0 + golang.org/x/sync v0.1.0 golang.org/x/text v0.14.0 ) @@ -31,7 +32,6 @@ require ( github.com/leodido/go-urn v1.2.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/crypto v0.17.0 // indirect - golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.15.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect From dc46b70b318b915ee612c3b409f970c3d701fd5f Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 24 Jan 2024 15:21:35 -0500 Subject: [PATCH 078/141] Update CHANGELOG.md for v1.52.1 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c11b1f6..0f3d1a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.52.1 (2024-01-24) +------------------------- + * Rename cache.Cache to cache.Local for clarity + v1.52.0 (2024-01-24) ------------------------- * Add generic cache based on ttlcache and x/sync/singleflight From ab20b9a4cc2faa73e225e901e7e1daaf7fe8ea96 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 24 Jan 2024 15:32:11 -0500 Subject: [PATCH 079/141] Add cache.Local.Clear() --- cache/local.go | 5 +++++ cache/local_test.go | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/cache/local.go b/cache/local.go index 9f4d6b6..03c6199 100644 --- a/cache/local.go +++ b/cache/local.go @@ -60,6 +60,11 @@ func (c *Local[K, V]) Get(ctx context.Context, key K) (V, error) { return item.Value(), nil } +// Clear removes all items from the cache. +func (c *Local[K, V]) Clear() { + c.cache.DeleteAll() +} + func (c *Local[K, V]) fetchAndSetSynced(ctx context.Context, key K) (*ttlcache.Item[K, V], error) { ii, err, _ := c.fetchSync.Do(string(key), func() (any, error) { // there's always a chance a different thread completed a fetch before we got here diff --git a/cache/local_test.go b/cache/local_test.go index eefbb84..26fadc9 100644 --- a/cache/local_test.go +++ b/cache/local_test.go @@ -115,5 +115,9 @@ func TestLocal(t *testing.T) { assert.Equal(t, map[string]int{"x": 2, "y": 1, "z": 1, "fast": 1, "slow": 1, "error": 1}, fetchCounts) assert.Equal(t, 1, cache.Len()) + cache.Clear() + + assert.Equal(t, 0, cache.Len()) + cache.Stop() } From 8951e2f9a3725e2fbb771eef841b9e52a9be3984 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 24 Jan 2024 15:49:43 -0500 Subject: [PATCH 080/141] Add a non-fetching Get and a Set method to cache.Local --- cache/local.go | 23 +++++++++++++++++++++-- cache/local_test.go | 27 +++++++++++++++++++-------- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/cache/local.go b/cache/local.go index 03c6199..a59e3f1 100644 --- a/cache/local.go +++ b/cache/local.go @@ -10,7 +10,8 @@ import ( // Local is a generic in-memory cache with builtin in fetching of missing items. type Local[K ~string, V any] struct { - cache *ttlcache.Cache[K, V] + cache *ttlcache.Cache[K, V] + fetch Fetcher[K, V] fetchSync singleflight.Group } @@ -44,7 +45,20 @@ func (c *Local[K, V]) Len() int { return c.cache.Len() } -func (c *Local[K, V]) Get(ctx context.Context, key K) (V, error) { +// Get returns the item with the given key from the cache or the type's zero value. +func (c *Local[K, V]) Get(key K) V { + item := c.cache.Get(key) + + if item != nil { + return item.Value() + } + + var zero V + return zero +} + +// GetOrFetch looks for the item in cache and if not found tries to fetch it. +func (c *Local[K, V]) GetOrFetch(ctx context.Context, key K) (V, error) { item := c.cache.Get(key) if item == nil { @@ -60,6 +74,11 @@ func (c *Local[K, V]) Get(ctx context.Context, key K) (V, error) { return item.Value(), nil } +// Set overwrites the value for the given key. +func (c *Local[K, V]) Set(key K, val V) { + c.cache.Set(key, val, ttlcache.DefaultTTL) +} + // Clear removes all items from the cache. func (c *Local[K, V]) Clear() { c.cache.DeleteAll() diff --git a/cache/local_test.go b/cache/local_test.go index 26fadc9..ab2b450 100644 --- a/cache/local_test.go +++ b/cache/local_test.go @@ -36,19 +36,25 @@ func TestLocal(t *testing.T) { cache := cache.NewLocal[string, string](fetch, time.Second) cache.Start() - v, err := cache.Get(ctx, "x") + assert.Equal(t, "", cache.Get("x")) + assert.Equal(t, map[string]int{}, fetchCounts) + + v, err := cache.GetOrFetch(ctx, "x") assert.NoError(t, err) assert.Equal(t, "X/1", v) assert.Equal(t, map[string]int{"x": 1}, fetchCounts) assert.Equal(t, 1, cache.Len()) - v, err = cache.Get(ctx, "x") + v, err = cache.GetOrFetch(ctx, "x") assert.NoError(t, err) assert.Equal(t, "X/1", v) assert.Equal(t, map[string]int{"x": 1}, fetchCounts) assert.Equal(t, 1, cache.Len()) - v, err = cache.Get(ctx, "y") + assert.Equal(t, "X/1", cache.Get("x")) + assert.Equal(t, map[string]int{"x": 1}, fetchCounts) + + v, err = cache.GetOrFetch(ctx, "y") assert.NoError(t, err) assert.Equal(t, "Y/1", v) assert.Equal(t, map[string]int{"x": 1, "y": 1}, fetchCounts) @@ -57,7 +63,7 @@ func TestLocal(t *testing.T) { // test 100 threads trying to get the same value simultaneously wg := sync.WaitGroup{} getZ := func() { - v, err = cache.Get(ctx, "z") + v, err = cache.GetOrFetch(ctx, "z") assert.NoError(t, err) assert.Equal(t, "Z/1", v) wg.Done() @@ -78,14 +84,14 @@ func TestLocal(t *testing.T) { var tFast, tSlow time.Duration go func() { - v, err = cache.Get(ctx, "slow") + v, err = cache.GetOrFetch(ctx, "slow") tSlow = time.Since(t0) assert.NoError(t, err) assert.Equal(t, "SLOW/1", v) wg.Done() }() go func() { - v, err = cache.Get(ctx, "fast") + v, err = cache.GetOrFetch(ctx, "fast") tFast = time.Since(t0) assert.NoError(t, err) assert.Equal(t, "FAST/1", v) @@ -98,7 +104,7 @@ func TestLocal(t *testing.T) { assert.GreaterOrEqual(t, tSlow, 250*time.Millisecond) assert.Equal(t, 5, cache.Len()) - v, err = cache.Get(ctx, "error") + v, err = cache.GetOrFetch(ctx, "error") assert.EqualError(t, err, "boom") assert.Equal(t, "", v) @@ -109,12 +115,17 @@ func TestLocal(t *testing.T) { assert.Equal(t, 0, cache.Len()) - v, err = cache.Get(ctx, "x") + v, err = cache.GetOrFetch(ctx, "x") assert.NoError(t, err) assert.Equal(t, "X/2", v) assert.Equal(t, map[string]int{"x": 2, "y": 1, "z": 1, "fast": 1, "slow": 1, "error": 1}, fetchCounts) assert.Equal(t, 1, cache.Len()) + // can also explicity set items + cache.Set("a", "123") + cache.Set("x", "234") + assert.Equal(t, 2, cache.Len()) + cache.Clear() assert.Equal(t, 0, cache.Len()) From 19fc9ce047a7eaa66236bdbc3d18887e40c95039 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 24 Jan 2024 15:51:32 -0500 Subject: [PATCH 081/141] Update CHANGELOG.md for v1.52.2 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f3d1a5..3b1c140 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.52.2 (2024-01-24) +------------------------- + * Add a non-fetching Get, a Set and a Clear method to cache.Local + v1.52.1 (2024-01-24) ------------------------- * Rename cache.Cache to cache.Local for clarity From 772f836b308701401a66ea4e9273470899451ddd Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 25 Jan 2024 09:54:09 -0500 Subject: [PATCH 082/141] Allow any comparable type for cache.Local keys --- cache/local.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/cache/local.go b/cache/local.go index a59e3f1..7c2ef17 100644 --- a/cache/local.go +++ b/cache/local.go @@ -2,6 +2,7 @@ package cache import ( "context" + "fmt" "time" "github.com/jellydator/ttlcache/v3" @@ -9,7 +10,7 @@ import ( ) // Local is a generic in-memory cache with builtin in fetching of missing items. -type Local[K ~string, V any] struct { +type Local[K comparable, V any] struct { cache *ttlcache.Cache[K, V] fetch Fetcher[K, V] @@ -17,10 +18,10 @@ type Local[K ~string, V any] struct { } // Fetcher is a function which can fetch an item which doesn't yet exist in the cache. -type Fetcher[K ~string, V any] func(context.Context, K) (V, error) +type Fetcher[K comparable, V any] func(context.Context, K) (V, error) // NewLocal creates a new in-memory cache. -func NewLocal[K ~string, V any](fetch Fetcher[K, V], ttl time.Duration) *Local[K, V] { +func NewLocal[K comparable, V any](fetch Fetcher[K, V], ttl time.Duration) *Local[K, V] { return &Local[K, V]{ cache: ttlcache.New[K, V]( ttlcache.WithTTL[K, V](ttl), @@ -85,7 +86,11 @@ func (c *Local[K, V]) Clear() { } func (c *Local[K, V]) fetchAndSetSynced(ctx context.Context, key K) (*ttlcache.Item[K, V], error) { - ii, err, _ := c.fetchSync.Do(string(key), func() (any, error) { + // singleflight isn't generic and requires string keys but probably not many comparable types + // that don't string stringify predictably + keyStr := fmt.Sprint(key) + + ii, err, _ := c.fetchSync.Do(keyStr, func() (any, error) { // there's always a chance a different thread completed a fetch before we got here // so check again now that we have a lock for the key item := c.cache.Get(key) From 1c2d4c6d86f91aa49308bb5d2fd5bc77638a7900 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 25 Jan 2024 09:57:20 -0500 Subject: [PATCH 083/141] Update CHANGELOG.md for v1.52.3 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b1c140..00e8e89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.52.3 (2024-01-25) +------------------------- + * Allow any comparable type for cache.Local keys + v1.52.2 (2024-01-24) ------------------------- * Add a non-fetching Get, a Set and a Clear method to cache.Local From b273595696a479f279d3dbc589e93684386817a7 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 12 Feb 2024 17:25:36 -0500 Subject: [PATCH 084/141] Allow mocked URL matching to be glob based --- httpx/mock.go | 16 +++++++++-- httpx/mock_test.go | 52 +++++++++++++++++++++++------------ stringsx/glob.go | 47 ++++++++++++++++++++++++++++++++ stringsx/glob_test.go | 63 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 159 insertions(+), 19 deletions(-) create mode 100644 stringsx/glob.go create mode 100644 stringsx/glob_test.go diff --git a/httpx/mock.go b/httpx/mock.go index 3dc8a00..8a5fe12 100644 --- a/httpx/mock.go +++ b/httpx/mock.go @@ -8,7 +8,9 @@ import ( "net/http" "github.com/nyaruka/gocommon/jsonx" + "github.com/nyaruka/gocommon/stringsx" "github.com/pkg/errors" + "golang.org/x/exp/maps" ) // MockRequestor is a requestor which can be mocked with responses for given URLs @@ -38,14 +40,24 @@ func (r *MockRequestor) Do(client *http.Client, request *http.Request) (*http.Re r.requests = append(r.requests, request) url := request.URL.String() - mockedResponses := r.mocks[url] + + // find the most specific match against this URL + match := stringsx.GlobSelect(url, maps.Keys(r.mocks)...) + mockedResponses := r.mocks[match] + if len(mockedResponses) == 0 { panic(fmt.Sprintf("missing mock for URL %s", url)) } // pop the next mocked response for this URL mocked := mockedResponses[0] - r.mocks[url] = mockedResponses[1:] + remaining := mockedResponses[1:] + + if len(remaining) > 0 { + r.mocks[match] = remaining + } else { + delete(r.mocks, match) + } if mocked.Status == 0 { return nil, errors.New("unable to connect to server") diff --git a/httpx/mock_test.go b/httpx/mock_test.go index 4a0c7be..4418993 100644 --- a/httpx/mock_test.go +++ b/httpx/mock_test.go @@ -33,19 +33,25 @@ func TestMockRequestor(t *testing.T) { httpx.NewMockResponse(202, nil, []byte("this is yahoo")), httpx.MockConnectionError, }, + "http://*": { + httpx.NewMockResponse(203, nil, []byte("this is partial")), + }, + "*": { + httpx.NewMockResponse(204, nil, []byte("this is wild")), + }, server.URL + "/thing": { - httpx.NewMockResponse(203, nil, []byte("this is local")), + httpx.NewMockResponse(205, nil, []byte("this is local")), }, }) httpx.SetRequestor(requestor1) req1, _ := http.NewRequest("GET", "http://google.com", nil) - response1, err := httpx.Do(http.DefaultClient, req1, nil, nil) + response, err := httpx.Do(http.DefaultClient, req1, nil, nil) assert.NoError(t, err) - assert.Equal(t, 200, response1.StatusCode) + assert.Equal(t, 200, response.StatusCode) - body, err := io.ReadAll(response1.Body) + body, err := io.ReadAll(response.Body) assert.NoError(t, err) assert.Equal(t, "this is google", string(body)) @@ -54,42 +60,54 @@ func TestMockRequestor(t *testing.T) { // request another mocked URL req2, _ := http.NewRequest("GET", "http://yahoo.com", nil) - response2, err := httpx.Do(http.DefaultClient, req2, nil, nil) + response, err = httpx.Do(http.DefaultClient, req2, nil, nil) assert.NoError(t, err) - assert.Equal(t, 202, response2.StatusCode) + assert.Equal(t, 202, response.StatusCode) assert.Equal(t, []*http.Request{req1, req2}, requestor1.Requests()) // request second mock for first URL req3, _ := http.NewRequest("GET", "http://google.com", nil) - response3, err := httpx.Do(http.DefaultClient, req3, nil, nil) + response, err = httpx.Do(http.DefaultClient, req3, nil, nil) assert.NoError(t, err) - assert.Equal(t, 201, response3.StatusCode) + assert.Equal(t, 201, response.StatusCode) // request mocked connection error req4, _ := http.NewRequest("GET", "http://yahoo.com", nil) - response4, err := httpx.Do(http.DefaultClient, req4, nil, nil) + response, err = httpx.Do(http.DefaultClient, req4, nil, nil) assert.EqualError(t, err, "unable to connect to server") - assert.Nil(t, response4) + assert.Nil(t, response) // request mocked localhost request req5, _ := http.NewRequest("GET", server.URL+"/thing", nil) - response5, err := httpx.Do(http.DefaultClient, req5, nil, nil) + response, err = httpx.Do(http.DefaultClient, req5, nil, nil) + assert.NoError(t, err) + assert.Equal(t, 205, response.StatusCode) + + // match against http://* + req6, _ := http.NewRequest("GET", "http://yahoo.com", nil) + response, err = httpx.Do(http.DefaultClient, req6, nil, nil) + assert.NoError(t, err) + assert.Equal(t, 203, response.StatusCode) + + // match against * + req7, _ := http.NewRequest("GET", "http://yahoo.com", nil) + response, err = httpx.Do(http.DefaultClient, req7, nil, nil) assert.NoError(t, err) - assert.Equal(t, 203, response5.StatusCode) + assert.Equal(t, 204, response.StatusCode) assert.False(t, requestor1.HasUnused()) // panic if we've run out of mocks for a URL - req6, _ := http.NewRequest("GET", "http://google.com", nil) - assert.Panics(t, func() { httpx.Do(http.DefaultClient, req6, nil, nil) }) + req8, _ := http.NewRequest("GET", "http://google.com", nil) + assert.Panics(t, func() { httpx.Do(http.DefaultClient, req8, nil, nil) }) requestor1.SetIgnoreLocal(true) // now a request to the local server should actually get there - req7, _ := http.NewRequest("GET", server.URL+"/thing", nil) - response7, err := httpx.Do(http.DefaultClient, req7, nil, nil) + req9, _ := http.NewRequest("GET", server.URL+"/thing", nil) + response, err = httpx.Do(http.DefaultClient, req9, nil, nil) assert.NoError(t, err) - assert.Equal(t, 200, response7.StatusCode) + assert.Equal(t, 200, response.StatusCode) } func TestMockRequestorMarshaling(t *testing.T) { diff --git a/stringsx/glob.go b/stringsx/glob.go new file mode 100644 index 0000000..a938489 --- /dev/null +++ b/stringsx/glob.go @@ -0,0 +1,47 @@ +package stringsx + +import ( + "sort" + "strings" +) + +// GlobMatch does very simple * based glob matching where * can be the entire pattern or start or the end or both. +func GlobMatch(s, pattern string) bool { + if pattern == "" { + return s == "" + } + if pattern == "*" { + return true + } + if strings.HasPrefix(pattern, "*") && strings.HasSuffix(pattern, "*") { + return strings.Contains(s, pattern[1:len(pattern)-1]) + } + if strings.HasPrefix(pattern, "*") { + return strings.HasSuffix(s, pattern[1:]) + } + if strings.HasSuffix(pattern, "*") { + return strings.HasPrefix(s, pattern[0:len(pattern)-1]) + } + + return s == pattern +} + +// GlobSelect returns the most specific matching pattern from the given set. +func GlobSelect(s string, patterns ...string) string { + matching := make([]string, 0, len(patterns)) + for _, p := range patterns { + if GlobMatch(s, p) { + matching = append(matching, p) + } + } + + if len(matching) == 0 { + return "" + } + + // return the longest pattern excluding * chars + sort.SliceStable(matching, func(i, j int) bool { + return len(strings.Trim(matching[i], "*")) > len(strings.Trim(matching[j], "*")) + }) + return matching[0] +} diff --git a/stringsx/glob_test.go b/stringsx/glob_test.go new file mode 100644 index 0000000..c5559c3 --- /dev/null +++ b/stringsx/glob_test.go @@ -0,0 +1,63 @@ +package stringsx_test + +import ( + "testing" + + "github.com/nyaruka/gocommon/stringsx" + "github.com/stretchr/testify/assert" +) + +func TestGlobMatch(t *testing.T) { + tcs := []struct { + input string + pattern string + matches bool + }{ + {"", "", true}, + {"hello", "", false}, + {"hello", "hello", true}, + {"HELLO", "hello", false}, + {"hellohello", "hello", false}, + {"hello", "*hello", true}, + {"hello", "*ello", true}, + {"hello", "*llo", true}, + {"hello", "*lo", true}, + {"hello", "*o", true}, + {"hello", "*", true}, + {"hello", "h*", true}, + {"hello", "he*", true}, + {"hello", "hel*", true}, + {"hello", "hello*", true}, + {"hello", "*hello*", true}, + {"hello", "*ell*", true}, + {"hello", "*e*", true}, + {"", "*", true}, + {"hello", "jam*", false}, + {"hello", "*jam", false}, + {"hello", "*j*", false}, + } + + for _, tc := range tcs { + if tc.matches { + assert.True(t, stringsx.GlobMatch(tc.input, tc.pattern), "expected match for %s / %s", tc.input, tc.pattern) + } else { + assert.False(t, stringsx.GlobMatch(tc.input, tc.pattern), "unexpected match for %s / %s", tc.input, tc.pattern) + } + } +} + +func TestGlobSelect(t *testing.T) { + tcs := []struct { + input string + patterns []string + selected string + }{ + {"hello", []string{"*", "*ello", "hello", "hel*"}, "hello"}, + {"hello", []string{"*ello", "hel*"}, "*ello"}, + {"hello", []string{"*", "abc"}, "*"}, + } + + for _, tc := range tcs { + assert.Equal(t, tc.selected, stringsx.GlobSelect(tc.input, tc.patterns...), "select mismatch for %s / %v", tc.input, tc.patterns) + } +} From 219c5e9199d9c0c134e634cc4d6cda285117bd66 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 12 Feb 2024 18:06:11 -0500 Subject: [PATCH 085/141] Update CHANGELOG.md for v1.52.4 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00e8e89..c6f85b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.52.4 (2024-02-12) +------------------------- + * Allow mocked URL matching to be glob based + v1.52.3 (2024-01-25) ------------------------- * Allow any comparable type for cache.Local keys From 7dcfbf02f79178b6d62c3583de7880e945e525f1 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 1 Mar 2024 08:51:54 -0500 Subject: [PATCH 086/141] Update to chi v5 --- go.mod | 24 ++++++++++---------- go.sum | 58 ++++++++++++++++++++--------------------------- httpx/recorder.go | 2 +- 3 files changed, 37 insertions(+), 47 deletions(-) diff --git a/go.mod b/go.mod index a931b96..d0e702d 100644 --- a/go.mod +++ b/go.mod @@ -3,24 +3,24 @@ module github.com/nyaruka/gocommon go 1.21 require ( - github.com/aws/aws-sdk-go v1.49.0 + github.com/aws/aws-sdk-go v1.50.29 github.com/gabriel-vasile/mimetype v1.4.3 - github.com/go-chi/chi v4.1.2+incompatible - github.com/go-playground/validator/v10 v10.16.0 + github.com/go-chi/chi/v5 v5.0.12 + github.com/go-playground/validator/v10 v10.18.0 github.com/gofrs/uuid v4.4.0+incompatible github.com/gorilla/websocket v1.5.1 - github.com/jellydator/ttlcache/v3 v3.1.1 + github.com/jellydator/ttlcache/v3 v3.2.0 github.com/jmoiron/sqlx v1.3.5 github.com/lib/pq v1.10.9 github.com/nyaruka/librato v1.1.1 github.com/nyaruka/null/v2 v2.0.3 - github.com/nyaruka/phonenumbers v1.2.3 + github.com/nyaruka/phonenumbers v1.3.2 github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.3.1 github.com/stretchr/testify v1.8.4 - golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb - golang.org/x/net v0.19.0 - golang.org/x/sync v0.1.0 + golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 + golang.org/x/net v0.21.0 + golang.org/x/sync v0.6.0 golang.org/x/text v0.14.0 ) @@ -29,10 +29,10 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/leodido/go-urn v1.2.4 // indirect + github.com/leodido/go-urn v1.4.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/sys v0.15.0 // indirect - google.golang.org/protobuf v1.31.0 // indirect + golang.org/x/crypto v0.20.0 // indirect + golang.org/x/sys v0.17.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index a74e9df..e90a66a 100644 --- a/go.sum +++ b/go.sum @@ -1,40 +1,38 @@ -github.com/aws/aws-sdk-go v1.49.0 h1:g9BkW1fo9GqKfwg2+zCD+TW/D36Ux+vtfJ8guF4AYmY= -github.com/aws/aws-sdk-go v1.49.0/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.50.29 h1:Ol2FYzesF2tsQrgVSnDWRFI60+FsSqKKdt7MLlZKubc= +github.com/aws/aws-sdk-go v1.50.29/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= -github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= -github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= +github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE= -github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.18.0 h1:BvolUXjp4zuvkZ5YN5t7ebzbhlUtPsPm2S9NAZ5nl9U= +github.com/go-playground/validator/v10 v10.18.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/jellydator/ttlcache/v3 v3.1.1 h1:RCgYJqo3jgvhl+fEWvjNW8thxGWsgxi+TPhRir1Y9y8= -github.com/jellydator/ttlcache/v3 v3.1.1/go.mod h1:hi7MGFdMAwZna5n2tuvh63DvFLzVKySzCVW6+0gA2n4= +github.com/jellydator/ttlcache/v3 v3.2.0 h1:6lqVJ8X3ZaUwvzENqPAobDsXNExfUJd61u++uW8a3LE= +github.com/jellydator/ttlcache/v3 v3.2.0/go.mod h1:hi7MGFdMAwZna5n2tuvh63DvFLzVKySzCVW6+0gA2n4= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= @@ -44,8 +42,8 @@ github.com/nyaruka/librato v1.1.1 h1:0nTYtJLl3Sn7lX3CuHsLf+nXy1k/tGV0OjVxLy3Et4s github.com/nyaruka/librato v1.1.1/go.mod h1:fme1Fu1PT2qvkaBZyw8WW+SrnFe2qeeCWpvqmAaKAKE= github.com/nyaruka/null/v2 v2.0.3 h1:rdmMRQyVzrOF3Jff/gpU/7BDR9mQX0lcLl4yImsA3kw= github.com/nyaruka/null/v2 v2.0.3/go.mod h1:OCVeCkCXwrg5/qE6RU0c1oUVZBy+ZDrT+xYg1XSaIWA= -github.com/nyaruka/phonenumbers v1.2.3 h1:xjbKWbTk+tTKU+FsHPBhRNZY0Kszk+1+K+fpvdPDLcg= -github.com/nyaruka/phonenumbers v1.2.3/go.mod h1:Jv2/XnmnjYDo3rW3/CSkH0zZB6Gl4RsDmlUKZV0JMW8= +github.com/nyaruka/phonenumbers v1.3.2 h1:ACdPdlDGabEwkF6Asfd1Jv+azcoPJP/FujXnnisp0vw= +github.com/nyaruka/phonenumbers v1.3.2/go.mod h1:4jyKp/BFUokLbCHyoZag+T3S1KezFVoEKtgnbpzItC4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -53,35 +51,27 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb h1:c0vyKkb6yr3KR7jEfJaOSv4lG7xPkbN6r52aJz1d8a8= -golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= +golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/httpx/recorder.go b/httpx/recorder.go index a2980c3..3eb3ff3 100644 --- a/httpx/recorder.go +++ b/httpx/recorder.go @@ -8,7 +8,7 @@ import ( "net/http/httputil" "net/url" - "github.com/go-chi/chi/middleware" + "github.com/go-chi/chi/v5/middleware" "github.com/nyaruka/gocommon/dates" "github.com/pkg/errors" ) From 4a1aaed260588f04e6240f5bacd42b8753369bfc Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 1 Mar 2024 09:12:45 -0500 Subject: [PATCH 087/141] Update CHANGELOG.md for v1.53.0 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6f85b7..8969368 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.53.0 (2024-03-01) +------------------------- + * Update to chi v5 + v1.52.4 (2024-02-12) ------------------------- * Allow mocked URL matching to be glob based From cf05ba5fd24138a73671c0ba962fb543536ebc99 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 13 Mar 2024 18:44:10 -0500 Subject: [PATCH 088/141] Update to latest phonenumbers / protobuf --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index d0e702d..a722a9b 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/lib/pq v1.10.9 github.com/nyaruka/librato v1.1.1 github.com/nyaruka/null/v2 v2.0.3 - github.com/nyaruka/phonenumbers v1.3.2 + github.com/nyaruka/phonenumbers v1.3.3 github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.3.1 github.com/stretchr/testify v1.8.4 @@ -33,6 +33,6 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/crypto v0.20.0 // indirect golang.org/x/sys v0.17.0 // indirect - google.golang.org/protobuf v1.32.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index e90a66a..6ab657f 100644 --- a/go.sum +++ b/go.sum @@ -42,8 +42,8 @@ github.com/nyaruka/librato v1.1.1 h1:0nTYtJLl3Sn7lX3CuHsLf+nXy1k/tGV0OjVxLy3Et4s github.com/nyaruka/librato v1.1.1/go.mod h1:fme1Fu1PT2qvkaBZyw8WW+SrnFe2qeeCWpvqmAaKAKE= github.com/nyaruka/null/v2 v2.0.3 h1:rdmMRQyVzrOF3Jff/gpU/7BDR9mQX0lcLl4yImsA3kw= github.com/nyaruka/null/v2 v2.0.3/go.mod h1:OCVeCkCXwrg5/qE6RU0c1oUVZBy+ZDrT+xYg1XSaIWA= -github.com/nyaruka/phonenumbers v1.3.2 h1:ACdPdlDGabEwkF6Asfd1Jv+azcoPJP/FujXnnisp0vw= -github.com/nyaruka/phonenumbers v1.3.2/go.mod h1:4jyKp/BFUokLbCHyoZag+T3S1KezFVoEKtgnbpzItC4= +github.com/nyaruka/phonenumbers v1.3.3 h1:20xjcqyG/ocEjuS6ry9XKyXdy8scWzjCiLW9aDyx8ks= +github.com/nyaruka/phonenumbers v1.3.3/go.mod h1:Ut+eFwikULbmCenH6InMKL9csUNLyxHuBLyfkpum11s= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -67,8 +67,8 @@ golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= From fa7d145569038fa7c72283af84b3d9cce83eb5c8 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 14 Mar 2024 10:19:44 -0500 Subject: [PATCH 089/141] Update phonenumbers --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a722a9b..9dc0989 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/lib/pq v1.10.9 github.com/nyaruka/librato v1.1.1 github.com/nyaruka/null/v2 v2.0.3 - github.com/nyaruka/phonenumbers v1.3.3 + github.com/nyaruka/phonenumbers v1.3.4 github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.3.1 github.com/stretchr/testify v1.8.4 diff --git a/go.sum b/go.sum index 6ab657f..d11bb33 100644 --- a/go.sum +++ b/go.sum @@ -42,8 +42,8 @@ github.com/nyaruka/librato v1.1.1 h1:0nTYtJLl3Sn7lX3CuHsLf+nXy1k/tGV0OjVxLy3Et4s github.com/nyaruka/librato v1.1.1/go.mod h1:fme1Fu1PT2qvkaBZyw8WW+SrnFe2qeeCWpvqmAaKAKE= github.com/nyaruka/null/v2 v2.0.3 h1:rdmMRQyVzrOF3Jff/gpU/7BDR9mQX0lcLl4yImsA3kw= github.com/nyaruka/null/v2 v2.0.3/go.mod h1:OCVeCkCXwrg5/qE6RU0c1oUVZBy+ZDrT+xYg1XSaIWA= -github.com/nyaruka/phonenumbers v1.3.3 h1:20xjcqyG/ocEjuS6ry9XKyXdy8scWzjCiLW9aDyx8ks= -github.com/nyaruka/phonenumbers v1.3.3/go.mod h1:Ut+eFwikULbmCenH6InMKL9csUNLyxHuBLyfkpum11s= +github.com/nyaruka/phonenumbers v1.3.4 h1:bF1Wdh++fxw09s3surhVeBhXEcUKG07pHeP8HQXqjn8= +github.com/nyaruka/phonenumbers v1.3.4/go.mod h1:Ut+eFwikULbmCenH6InMKL9csUNLyxHuBLyfkpum11s= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= From 2b20039834dacb5969365b15df746203266211a7 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 14 Mar 2024 10:20:10 -0500 Subject: [PATCH 090/141] Update CHANGELOG.md for v1.53.1 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8969368..19405f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.53.1 (2024-03-14) +------------------------- + * Update to latest phonenumbers / protobuf + v1.53.0 (2024-03-01) ------------------------- * Update to chi v5 From 98ca9733cb255384d59c309f39336ddb0a0fdec0 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 28 Mar 2024 11:29:05 -0500 Subject: [PATCH 091/141] assertdb assert methods should return bool --- dbutil/assertdb/assert.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dbutil/assertdb/assert.go b/dbutil/assertdb/assert.go index de79718..798b92a 100644 --- a/dbutil/assertdb/assert.go +++ b/dbutil/assertdb/assert.go @@ -21,7 +21,7 @@ type TestQuery struct { } // Returns asserts that the query returns a single value -func (q *TestQuery) Returns(expected any, msgAndArgs ...any) { +func (q *TestQuery) Returns(expected any, msgAndArgs ...any) bool { q.t.Helper() // get a variable of same type to hold actual result @@ -36,16 +36,16 @@ func (q *TestQuery) Returns(expected any, msgAndArgs ...any) { actual = int(actual.(int64)) } - assert.Equal(q.t, expected, actual, msgAndArgs...) + return assert.Equal(q.t, expected, actual, msgAndArgs...) } // Columns asserts that the query returns the given column values -func (q *TestQuery) Columns(expected map[string]any, msgAndArgs ...any) { +func (q *TestQuery) Columns(expected map[string]any, msgAndArgs ...any) bool { q.t.Helper() actual := make(map[string]any, len(expected)) err := q.db.QueryRowx(q.sql, q.args...).MapScan(actual) assert.NoError(q.t, err, msgAndArgs...) - assert.Equal(q.t, expected, actual, msgAndArgs...) + return assert.Equal(q.t, expected, actual, msgAndArgs...) } From 64e21d583045e35dd74c62446541c7e8cf9f9087 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 28 Mar 2024 11:29:32 -0500 Subject: [PATCH 092/141] Update CHANGELOG.md for v1.53.2 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19405f2..0e2290b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.53.2 (2024-03-28) +------------------------- + * assertdb assert methods should return bool + v1.53.1 (2024-03-14) ------------------------- * Update to latest phonenumbers / protobuf From fb6f5759295e6ba18e47eb12e8b7d860b015b28c Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 6 May 2024 17:18:49 -0500 Subject: [PATCH 093/141] Refactor urns package --- urns/phone.go | 49 ++++++ urns/phone_test.go | 68 ++++++++ urns/schemes.go | 185 +++++++++++++++++++++ urns/urns.go | 315 ++++------------------------------- urns/urns_test.go | 398 +++++++++------------------------------------ urns/utils.go | 22 --- urns/utils_test.go | 35 ---- 7 files changed, 411 insertions(+), 661 deletions(-) create mode 100644 urns/phone.go create mode 100644 urns/phone_test.go create mode 100644 urns/schemes.go delete mode 100644 urns/utils.go delete mode 100644 urns/utils_test.go diff --git a/urns/phone.go b/urns/phone.go new file mode 100644 index 0000000..78c4acf --- /dev/null +++ b/urns/phone.go @@ -0,0 +1,49 @@ +package urns + +import ( + "strconv" + "strings" + + "github.com/nyaruka/phonenumbers" + "github.com/pkg/errors" +) + +// FromLocalPhone returns a validated tel URN +func FromLocalPhone(number string, country string) (URN, error) { + path, err := ParsePhone(number, country) + if err != nil { + return NilURN, err + } + + return NewURNFromParts(Phone, path, "", "") +} + +// ToLocalPhone converts a phone URN to a local number in the given country +func ToLocalPhone(u URN, country string) string { + _, path, _, _ := u.ToParts() + + parsed, err := phonenumbers.Parse(path, country) + if err == nil { + return strconv.FormatUint(parsed.GetNationalNumber(), 10) + } + return path +} + +// ParsePhone tries to parse the given string as a phone number and if successful returns it as E164 +func ParsePhone(s, country string) (string, error) { + parsed, err := phonenumbers.Parse(s, country) + if err != nil { + return "", errors.Wrap(err, "unable to parse number") + } + + if phonenumbers.IsPossibleNumberWithReason(parsed) != phonenumbers.IS_POSSIBLE { + // if it's not a possible number, try adding a + and parsing again + if !strings.HasPrefix(s, "+") { + return ParsePhone("+"+s, country) + } + + return "", errors.New("not a possible number") + } + + return phonenumbers.Format(parsed, phonenumbers.E164), nil +} diff --git a/urns/phone_test.go b/urns/phone_test.go new file mode 100644 index 0000000..96c2007 --- /dev/null +++ b/urns/phone_test.go @@ -0,0 +1,68 @@ +package urns_test + +import ( + "testing" + + "github.com/nyaruka/gocommon/urns" + "github.com/stretchr/testify/assert" +) + +func TestFromLocalPhone(t *testing.T) { + testCases := []struct { + number string + country string + expected urns.URN + hasError bool + }{ + {"tel:0788383383", "RW", "tel:+250788383383", false}, + {"tel: +250788383383 ", "KE", "tel:+250788383383", false}, // already has country code + {"tel:(917)992-5253", "US", "tel:+19179925253", false}, + {"tel:800-CABBAGE", "US", "tel:+18002222243", false}, + {"tel:+62877747666", "ID", "tel:+62877747666", false}, + {"tel:0877747666", "ID", "tel:+62877747666", false}, + {"tel:07531669965", "GB", "tel:+447531669965", false}, + {"tel:263780821000", "ZW", "tel:+263780821000", false}, + + {"0788383383", "ZZ", urns.NilURN, true}, // invalid country code + {"1", "RW", urns.NilURN, true}, + {"123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", "RW", urns.NilURN, true}, + } + + for i, tc := range testCases { + urn, err := urns.FromLocalPhone(tc.number, tc.country) + + if tc.hasError { + assert.Error(t, err, "%d: expected error for %s, %s", i, tc.number, tc.country) + } else { + assert.NoError(t, err, "%d: unexpected error for %s, %s", i, tc.number, tc.country) + assert.Equal(t, tc.expected, urn, "%d: created URN mismatch for %s, %s", i, tc.number, tc.country) + } + } +} + +func TestParsePhone(t *testing.T) { + tcs := []struct { + input string + country string + parsed string + }{ + {"+250788123123", "", "+250788123123"}, // international number fine without country + {"+250 788 123-123", "", "+250788123123"}, // fine if not E164 formatted + {"0788123123", "RW", "+250788123123"}, + {"206 555 1212", "US", "+12065551212"}, + {"12065551212", "US", "+12065551212"}, // country code but no + + {"5912705", "US", ""}, // is only possible as a local number so ignored + {"10000", "US", ""}, + } + + for _, tc := range tcs { + if tc.parsed != "" { + parsed, err := urns.ParsePhone(tc.input, tc.country) + assert.NoError(t, err, "unexpected error for '%s'", tc.input) + assert.Equal(t, parsed, tc.parsed, "result mismatch for '%s'", tc.input) + } else { + _, err := urns.ParsePhone(tc.input, tc.country) + assert.Error(t, err, "expected error for '%s'", tc.input) + } + } +} diff --git a/urns/schemes.go b/urns/schemes.go new file mode 100644 index 0000000..706b043 --- /dev/null +++ b/urns/schemes.go @@ -0,0 +1,185 @@ +package urns + +import ( + "regexp" + "strings" + + "github.com/nyaruka/phonenumbers" +) + +var allDigitsRegex = regexp.MustCompile(`^[0-9]+$`) +var nonTelCharsRegex = regexp.MustCompile(`[^0-9A-Z]`) + +var emailRegex = regexp.MustCompile(`^[^\s@]+@[^\s@]+$`) +var freshchatRegex = regexp.MustCompile(`^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}/[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$`) +var viberRegex = regexp.MustCompile(`^[a-zA-Z0-9_=/+]{1,24}$`) +var lineRegex = regexp.MustCompile(`^[a-zA-Z0-9_]{1,36}$`) +var telRegex = regexp.MustCompile(`^\+?[a-zA-Z0-9]{1,64}$`) +var twitterHandleRegex = regexp.MustCompile(`^[a-zA-Z0-9_]{1,15}$`) +var webchatRegex = regexp.MustCompile(`^[a-zA-Z0-9]{24}(:[^\s@]+@[^\s@]+)?$`) + +const ( + // FacebookRefPrefix is prefix used for facebook referral URNs + FacebookRefPrefix string = "ref:" +) + +func init() { + register(Discord) + register(Email) + register(External) + register(Facebook) + register(Firebase) + register(FreshChat) + register(Instagram) + register(JioChat) + register(Line) + register(Phone) + register(RocketChat) + register(Slack) + register(Telegram) + register(Twitter) + register(TwitterID) + register(Viber) + register(VK) + register(WebChat) + register(WeChat) + register(WhatsApp) +} + +var schemes = map[string]*Scheme{} + +func register(s *Scheme) { + schemes[s.Prefix] = s +} + +type Scheme struct { + Prefix string + Normalize func(string) string + Validate func(string) bool + Format func(string) string +} + +var Discord = &Scheme{ + Prefix: "discord", + Validate: func(path string) bool { return allDigitsRegex.MatchString(path) }, +} + +var Email = &Scheme{ + Prefix: "mailto", + Normalize: func(path string) string { return strings.ToLower(path) }, + Validate: func(path string) bool { return emailRegex.MatchString(path) }, +} + +var External = &Scheme{ + Prefix: "ext", +} + +var Facebook = &Scheme{ + Prefix: "facebook", + Validate: func(path string) bool { + // we don't validate facebook refs since they come from the outside + if strings.HasPrefix(path, FacebookRefPrefix) { + return true + } + // otherwise, this should be an int + return allDigitsRegex.MatchString(path) + }, +} + +var Firebase = &Scheme{ + Prefix: "fcm", +} + +var FreshChat = &Scheme{ + Prefix: "freshchat", + Validate: func(path string) bool { return freshchatRegex.MatchString(path) }, +} + +var Instagram = &Scheme{ + Prefix: "instagram", + Validate: func(path string) bool { return allDigitsRegex.MatchString(path) }, +} + +var JioChat = &Scheme{ + Prefix: "jiochat", + Validate: func(path string) bool { return allDigitsRegex.MatchString(path) }, +} + +var Line = &Scheme{ + Prefix: "line", + Validate: func(path string) bool { return lineRegex.MatchString(path) }, +} + +var Phone = &Scheme{ + Prefix: "tel", + Normalize: func(path string) string { + e164, err := ParsePhone(path, "") + if err != nil { + // could be a short code so uppercase and remove non alphanumeric characters + return nonTelCharsRegex.ReplaceAllString(strings.ToUpper(path), "") + } + + return e164 + }, + Validate: func(path string) bool { return telRegex.MatchString(path) }, + Format: func(path string) string { + parsed, err := phonenumbers.Parse(path, "") + if err != nil { + return path + } + return phonenumbers.Format(parsed, phonenumbers.NATIONAL) + }, +} + +var RocketChat = &Scheme{ + Prefix: "rocketchat", +} + +var Slack = &Scheme{ + Prefix: "slack", +} + +var Telegram = &Scheme{ + Prefix: "telegram", + Validate: func(path string) bool { return allDigitsRegex.MatchString(path) }, +} + +var Twitter = &Scheme{ + Prefix: "twitter", + Normalize: func(path string) string { + // handles are case-insensitive, so we always store as lowercase + path = strings.ToLower(path) + + // strip @ prefix if provided + return strings.TrimPrefix(path, "@") + }, + Validate: func(path string) bool { return twitterHandleRegex.MatchString(path) }, +} + +var TwitterID = &Scheme{ + Prefix: "twitterid", + Validate: func(path string) bool { return allDigitsRegex.MatchString(path) }, +} + +var Viber = &Scheme{ + Prefix: "viber", + Validate: func(path string) bool { return viberRegex.MatchString(path) }, +} + +var VK = &Scheme{ + Prefix: "vk", +} + +var WebChat = &Scheme{ + Prefix: "webchat", + Validate: func(path string) bool { return webchatRegex.MatchString(path) }, +} + +var WeChat = &Scheme{ + Prefix: "wechat", +} + +var WhatsApp = &Scheme{ + Prefix: "whatsapp", + Validate: func(path string) bool { return allDigitsRegex.MatchString(path) }, +} diff --git a/urns/urns.go b/urns/urns.go index 2b68560..276ad86 100644 --- a/urns/urns.go +++ b/urns/urns.go @@ -3,125 +3,28 @@ package urns import ( "fmt" "net/url" - "regexp" - "strconv" "strings" - - "github.com/nyaruka/phonenumbers" ) const ( - DiscordScheme string = "discord" // (user IDs not usernames) - EmailScheme string = "mailto" - ExternalScheme string = "ext" - FacebookScheme string = "facebook" - FCMScheme string = "fcm" - FreshChatScheme string = "freshchat" - InstagramScheme string = "instagram" - JiochatScheme string = "jiochat" - LineScheme string = "line" - RocketChatScheme string = "rocketchat" - SlackScheme string = "slack" - TeamsScheme string = "teams" - TelegramScheme string = "telegram" - TelScheme string = "tel" - TwitterIDScheme string = "twitterid" // Twitter user ids - TwitterScheme string = "twitter" // Twitter handles - ViberScheme string = "viber" - VKScheme string = "vk" - WebChatScheme string = "webchat" - WeChatScheme string = "wechat" - WhatsAppScheme string = "whatsapp" - - // FacebookRefPrefix is prefix used for facebook referral URNs - FacebookRefPrefix string = "ref:" + maxPathLength = 255 + maxDisplayLength = 255 ) -// ValidSchemes is the set of URN schemes understood by this library -var ValidSchemes = map[string]bool{ - DiscordScheme: true, - EmailScheme: true, - ExternalScheme: true, - FacebookScheme: true, - FCMScheme: true, - FreshChatScheme: true, - InstagramScheme: true, - JiochatScheme: true, - LineScheme: true, - RocketChatScheme: true, - SlackScheme: true, - TeamsScheme: true, - TelegramScheme: true, - TelScheme: true, - TwitterIDScheme: true, - TwitterScheme: true, - ViberScheme: true, - VKScheme: true, - WebChatScheme: true, - WeChatScheme: true, - WhatsAppScheme: true, -} - // IsValidScheme checks whether the provided scheme is valid func IsValidScheme(scheme string) bool { - _, valid := ValidSchemes[scheme] + _, valid := schemes[scheme] return valid } -var nonTelCharsRegex = regexp.MustCompile(`[^0-9a-z]`) -var telRegex = regexp.MustCompile(`^\+?[a-zA-Z0-9]{1,64}$`) -var twitterHandleRegex = regexp.MustCompile(`^[a-zA-Z0-9_]{1,15}$`) -var emailRegex = regexp.MustCompile(`^[^\s@]+@[^\s@]+$`) -var viberRegex = regexp.MustCompile(`^[a-zA-Z0-9_=/+]{1,24}$`) -var lineRegex = regexp.MustCompile(`^[a-zA-Z0-9_]{1,36}$`) -var allDigitsRegex = regexp.MustCompile(`^[0-9]+$`) -var freshchatRegex = regexp.MustCompile(`^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}/[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$`) -var webchatRegex = regexp.MustCompile(`^[a-zA-Z0-9]{24}(:[^\s@]+@[^\s@]+)?$`) - // URN represents a Universal Resource Name, we use this for contact identifiers like phone numbers etc.. type URN string -// NewTelURNForCountry returns a URN for the passed in telephone number and country code ("US") -func NewTelURNForCountry(number string, country string) (URN, error) { - return NewURNFromParts(TelScheme, normalizeNumber(number, country), "", "") -} - -// NewTelegramURN returns a URN for the passed in telegram identifier -func NewTelegramURN(identifier int64, display string) (URN, error) { - return NewURNFromParts(TelegramScheme, strconv.FormatInt(identifier, 10), "", display) -} - -// NewWhatsAppURN returns a URN for the passed in whatsapp identifier -func NewWhatsAppURN(identifier string) (URN, error) { - return NewURNFromParts(WhatsAppScheme, identifier, "", "") -} - -// NewFirebaseURN returns a URN for the passed in firebase identifier -func NewFirebaseURN(identifier string) (URN, error) { - return NewURNFromParts(FCMScheme, identifier, "", "") -} - -// NewFacebookURN returns a URN for the passed in facebook identifier -func NewFacebookURN(identifier string) (URN, error) { - return NewURNFromParts(FacebookScheme, identifier, "", "") -} - -// NewDiscordURN returns a URN for the passed in Discord identifier -func NewDiscordURN(identifier string) (URN, error) { - return NewURNFromParts(DiscordScheme, identifier, "", "") -} - -func NewWebChatURN(identifier string) (URN, error) { - return NewURNFromParts(WebChatScheme, identifier, "", "") -} - -// NewInstagramURN returns a URN for the passed in instagram identifier -func NewInstagramURN(identifier string) (URN, error) { - return NewURNFromParts(InstagramScheme, identifier, "", "") -} +// NilURN is our constant for nil URNs +const NilURN = URN("") // returns a new URN for the given scheme, path, query and display -func newURNFromParts(scheme string, path string, query string, display string) URN { +func newURNFromParts(scheme, path, query, display string) URN { u := &parsedURN{ scheme: scheme, path: path, @@ -132,10 +35,10 @@ func newURNFromParts(scheme string, path string, query string, display string) U } // NewURNFromParts returns a validated URN for the given scheme, path, query and display -func NewURNFromParts(scheme string, path string, query string, display string) (URN, error) { - urn := newURNFromParts(scheme, path, query, display) - err := urn.Validate() - if err != nil { +func NewURNFromParts(typ *Scheme, path string, query string, display string) (URN, error) { + urn := newURNFromParts(typ.Prefix, path, query, display) + + if err := urn.Validate(); err != nil { return NilURN, err } return urn, nil @@ -162,34 +65,17 @@ func (u URN) ToParts() (string, string, string, string) { } // Normalize normalizes the URN into it's canonical form and should be performed before URN comparisons -func (u URN) Normalize(country string) URN { +func (u URN) Normalize() URN { scheme, path, query, display := u.ToParts() - normPath := strings.TrimSpace(path) + s := schemes[scheme] - switch scheme { - case TelScheme: - normPath = normalizeNumber(normPath, country) + path = strings.TrimSpace(path) - case TwitterScheme: - // Twitter handles are case-insensitive, so we always store as lowercase - normPath = strings.ToLower(normPath) - - // strip @ prefix if provided - normPath = strings.TrimPrefix(normPath, "@") - - case TwitterIDScheme: - if display != "" { - display = strings.ToLower(strings.TrimSpace(display)) - if display != "" && strings.HasPrefix(display, "@") { - display = display[1:] - } - } - - case EmailScheme: - normPath = strings.ToLower(normPath) + if s != nil && s.Normalize != nil { + path = s.Normalize(path) } - return newURNFromParts(scheme, normPath, query, display) + return newURNFromParts(scheme, path, query, display) } // Validate returns whether this URN is considered valid @@ -199,94 +85,25 @@ func (u URN) Validate() error { if scheme == "" || path == "" { return fmt.Errorf("scheme or path cannot be empty") } + if !IsValidScheme(scheme) { - return fmt.Errorf("invalid scheme: '%s'", scheme) + return fmt.Errorf("unknown URN scheme") + } + + if len(path) > maxPathLength { + return fmt.Errorf("path component too long") } - switch scheme { - case TelScheme: - // validate is possible phone number - if !telRegex.MatchString(path) { - return fmt.Errorf("invalid tel number: %s", path) - } - - case TwitterScheme: - // validate twitter URNs look like handles - if !twitterHandleRegex.MatchString(path) { - return fmt.Errorf("invalid twitter handle: %s", path) - } - - case TwitterIDScheme: - // validate path is a number and display is a handle if present - if !allDigitsRegex.MatchString(path) { - return fmt.Errorf("invalid twitter id: %s", path) - } - if display != "" && !twitterHandleRegex.MatchString(display) { - return fmt.Errorf("invalid twitter handle: %s", display) - } - - case EmailScheme: - if !emailRegex.MatchString(path) { - return fmt.Errorf("invalid email: %s", path) - } - - case FacebookScheme: - // we don't validate facebook refs since they come from the outside - if u.IsFacebookRef() { - return nil - } - - // otherwise, this should be an int - if !allDigitsRegex.MatchString(path) { - return fmt.Errorf("invalid facebook id: %s", path) - } - case InstagramScheme: - if !allDigitsRegex.MatchString(path) { - return fmt.Errorf("invalid instagram id: %s", path) - } - case JiochatScheme: - if !allDigitsRegex.MatchString(path) { - return fmt.Errorf("invalid jiochat id: %s", path) - } - - case LineScheme: - if !lineRegex.MatchString(path) { - return fmt.Errorf("invalid line id: %s", path) - } - - case TelegramScheme: - if !allDigitsRegex.MatchString(path) { - return fmt.Errorf("invalid telegram id: %s", path) - } - - case ViberScheme: - if !viberRegex.MatchString(path) { - return fmt.Errorf("invalid viber id: %s", path) - } - - case WhatsAppScheme: - if !allDigitsRegex.MatchString(path) { - return fmt.Errorf("invalid whatsapp id: %s", path) - } - - case FreshChatScheme: - // validate path and query is a uuid - if !freshchatRegex.MatchString(path) { - return fmt.Errorf("invalid freshchat id: %s", path) - } - - case DiscordScheme: - if !allDigitsRegex.MatchString(path) { - return fmt.Errorf("invalid discord id: %s", path) - } - - case WebChatScheme: - if !webchatRegex.MatchString(path) { - return fmt.Errorf("invalid webchat id: %s", path) - } + s := schemes[scheme] + if s.Validate != nil && !s.Validate(path) { + return fmt.Errorf("invalid path component") } - return nil // anything goes for external schemes + if len(display) > maxDisplayLength { + return fmt.Errorf("display component too long") + } + + return nil } // Scheme returns the scheme portion for the URN @@ -325,38 +142,6 @@ func (u URN) Identity() URN { return newURNFromParts(scheme, path, "", "") } -// Localize returns a new URN which is local to the given country -func (u URN) Localize(country string) URN { - scheme, path, query, display := u.ToParts() - - if scheme == TelScheme { - parsed, err := phonenumbers.Parse(path, country) - if err == nil { - path = strconv.FormatUint(parsed.GetNationalNumber(), 10) - } - } - return newURNFromParts(scheme, path, query, display) -} - -// IsFacebookRef returns whether this URN is a facebook referral -func (u URN) IsFacebookRef() bool { - return u.Scheme() == FacebookScheme && strings.HasPrefix(u.Path(), FacebookRefPrefix) -} - -// FacebookRef returns the facebook referral portion of our path, this return empty string in the case where we aren't a Facebook scheme -func (u URN) FacebookRef() string { - if u.IsFacebookRef() { - return strings.TrimPrefix(u.Path(), FacebookRefPrefix) - } - return "" -} - -// TeamsServiceURL returns the teams serviceURL part of our path, this empty return string in case we are not a teams schema -func (u URN) TeamsServiceURL() string { - serviceUrl := strings.Split(u.Path(), ":") - return serviceUrl[1] -} - // String returns the string representation of this URN func (u URN) String() string { return string(u) } @@ -364,12 +149,9 @@ func (u URN) String() string { return string(u) } func (u URN) Format() string { scheme, path, _, display := u.ToParts() - if scheme == TelScheme { - parsed, err := phonenumbers.Parse(path, "") - if err != nil { - return path - } - return phonenumbers.Format(parsed, phonenumbers.NATIONAL) + s := schemes[scheme] + if s != nil && s.Format != nil { + return s.Format(path) } if display != "" { @@ -377,34 +159,3 @@ func (u URN) Format() string { } return path } - -// NilURN is our constant for nil URNs -var NilURN = URN("") - -func normalizeNumber(number string, country string) string { - number = strings.TrimSpace(number) - normalized := strings.ToLower(number) - - // if the number ends with e11, then that is Excel corrupting it, remove it - if strings.HasSuffix(normalized, "e+11") || strings.HasSuffix(normalized, "e+12") { - normalized = strings.Replace(normalized[0:len(normalized)-4], ".", "", -1) - } - - // remove non alphanumeric characters - normalized = nonTelCharsRegex.ReplaceAllString(normalized, "") - - parseAs := normalized - - // if we started with + prefix, or we have a sufficiently long number that doesn't start with 0, add + prefix - if strings.HasPrefix(number, "+") || (len(normalized) >= 11 && !strings.HasPrefix(normalized, "0")) { - parseAs = fmt.Sprintf("+%s", normalized) - } - - formatted, err := ParseNumber(parseAs, country) - if err != nil { - // if it's not a possible number, just return what we have minus the + - return normalized - } - - return formatted -} diff --git a/urns/urns_test.go b/urns/urns_test.go index 3f02b31..d35423d 100644 --- a/urns/urns_test.go +++ b/urns/urns_test.go @@ -1,16 +1,22 @@ -package urns +package urns_test import ( "net/url" "strings" "testing" + "github.com/nyaruka/gocommon/urns" "github.com/stretchr/testify/assert" ) +func TestIsValidScheme(t *testing.T) { + assert.True(t, urns.IsValidScheme("tel")) + assert.False(t, urns.IsValidScheme("xyz")) +} + func TestURNProperties(t *testing.T) { testCases := []struct { - urn URN + urn urns.URN format string display string rawQuery string @@ -39,59 +45,28 @@ func TestURNProperties(t *testing.T) { } } -func TestIsFacebookRef(t *testing.T) { +func TestNewFromParts(t *testing.T) { testCases := []struct { - urn URN - isFacebookRef bool - facebookRef string - }{ - {"facebook:ref:12345", true, "12345"}, - {"facebook:12345", false, ""}, - - {"tel:25078838383", false, ""}, - {"discord:732326982863421591", false, ""}, - {"discord:foo", false, ""}, - } - for _, tc := range testCases { - assert.Equal(t, tc.isFacebookRef, tc.urn.IsFacebookRef(), "is facebook ref mismatch for %s", tc.urn) - assert.Equal(t, tc.facebookRef, tc.urn.FacebookRef(), "facebook ref mismatch for %s", tc.urn) - } -} - -func TestTeamsServiceURL(t *testing.T) { - testCases := []struct { - urn URN - }{ - {"teams:a1b2n4:test.com"}, - } - for _, tc := range testCases { - assert.Equal(t, "test.com", tc.urn.TeamsServiceURL()) - } -} - -func TestFromParts(t *testing.T) { - testCases := []struct { - scheme string + scheme *urns.Scheme path string display string - expected URN - identity URN + expected urns.URN + identity urns.URN hasError bool }{ - {"tel", "+250788383383", "", URN("tel:+250788383383"), URN("tel:+250788383383"), false}, - {"twitter", "hello", "", URN("twitter:hello"), URN("twitter:hello"), false}, - {"facebook", "12345", "", URN("facebook:12345"), URN("facebook:12345"), false}, - {"instagram", "12345", "", URN("instagram:12345"), URN("instagram:12345"), false}, - {"telegram", "12345", "Jane", URN("telegram:12345#Jane"), URN("telegram:12345"), false}, - {"whatsapp", "12345", "", URN("whatsapp:12345"), URN("whatsapp:12345"), false}, - {"viber", "", "", NilURN, ":", true}, - {"discord", "732326982863421591", "", URN("discord:732326982863421591"), URN("discord:732326982863421591"), false}, - {"webchat", "123456789012345678901234", "", URN("webchat:123456789012345678901234"), URN("webchat:123456789012345678901234"), false}, - {"teams", "a1b2n4:test.example", "", URN("teams:a1b2n4:test.example"), URN("teams:a1b2n4:test.example"), false}, + {urns.Phone, "+250788383383", "", "tel:+250788383383", "tel:+250788383383", false}, + {urns.Twitter, "hello", "", "twitter:hello", "twitter:hello", false}, + {urns.Facebook, "12345", "", "facebook:12345", "facebook:12345", false}, + {urns.Instagram, "12345", "", "instagram:12345", "instagram:12345", false}, + {urns.Telegram, "12345", "Jane", "telegram:12345#Jane", "telegram:12345", false}, + {urns.WhatsApp, "12345", "", "whatsapp:12345", "whatsapp:12345", false}, + {urns.Viber, "", "", urns.NilURN, ":", true}, + {urns.Discord, "732326982863421591", "", "discord:732326982863421591", "discord:732326982863421591", false}, + {urns.WebChat, "123456789012345678901234", "", "webchat:123456789012345678901234", "webchat:123456789012345678901234", false}, } for _, tc := range testCases { - urn, err := NewURNFromParts(tc.scheme, tc.path, "", tc.display) + urn, err := urns.NewURNFromParts(tc.scheme, tc.path, "", tc.display) identity := urn.Identity() assert.Equal(t, tc.expected, urn, "from parts mismatch for: %s, %s, %s", tc.scheme, tc.path, tc.display) @@ -107,99 +82,63 @@ func TestFromParts(t *testing.T) { func TestNormalize(t *testing.T) { testCases := []struct { - rawURN URN - country string - expected URN + rawURN urns.URN + expected urns.URN }{ // valid tel numbers - {"tel:0788383383", "RW", "tel:+250788383383"}, - {"tel: +250788383383 ", "KE", "tel:+250788383383"}, - {"tel:+250788383383", "", "tel:+250788383383"}, - {"tel:250788383383", "", "tel:+250788383383"}, - {"tel:2.50788383383E+11", "", "tel:+250788383383"}, - {"tel:2.50788383383E+12", "", "tel:+250788383383"}, - {"tel:(917)992-5253", "US", "tel:+19179925253"}, - {"tel:19179925253", "", "tel:+19179925253"}, - {"tel:+62877747666", "", "tel:+62877747666"}, - {"tel:62877747666", "ID", "tel:+62877747666"}, - {"tel:0877747666", "ID", "tel:+62877747666"}, - {"tel:07531669965", "GB", "tel:+447531669965"}, - {"tel:22658125926", "", "tel:+22658125926"}, - {"tel:263780821000", "ZW", "tel:+263780821000"}, - {"tel:+2203693333", "", "tel:+2203693333"}, - - // un-normalizable tel numbers - {"tel:12345", "RW", "tel:12345"}, - {"tel:0788383383", "", "tel:0788383383"}, - {"tel:0788383383", "ZZ", "tel:0788383383"}, - {"tel:MTN", "RW", "tel:mtn"}, - {"tel:+12345678901234567890", "", "tel:12345678901234567890"}, + {"tel: +250788383383 ", "tel:+250788383383"}, + {"tel:+250788383383", "tel:+250788383383"}, + {"tel:250788383383", "tel:+250788383383"}, + {"tel:(917)992-5253", "tel:+19179925253"}, + {"tel:19179925253", "tel:+19179925253"}, + {"tel:+62877747666", "tel:+62877747666"}, + {"tel:62877747666", "tel:+62877747666"}, + {"tel:0877747666", "tel:+62877747666"}, + {"tel:07531669965", "tel:+447531669965"}, + {"tel:22658125926", "tel:+22658125926"}, + {"tel:263780821000", "tel:+263780821000"}, + {"tel:+2203693333", "tel:+2203693333"}, + + // non-standard phone numbers + {"tel:12345", "tel:12345"}, + {"tel:mtn", "tel:MTN"}, + {"tel:+12345678901234567890", "tel:12345678901234567890"}, // twitter handles remove @ - {"twitter: @jimmyJO", "", "twitter:jimmyjo"}, - {"twitterid:12345#@jimmyJO", "", "twitterid:12345#jimmyjo"}, + {"twitter: @jimmyJO", "twitter:jimmyjo"}, + {"twitterid:12345#jimmyJO", "twitterid:12345#jimmyJO"}, // email addresses - {"mailto: nAme@domAIN.cOm ", "", "mailto:name@domain.com"}, + {"mailto: nAme@domAIN.cOm ", "mailto:name@domain.com"}, // external ids are case sensitive - {"ext: eXterNAL123 ", "", "ext:eXterNAL123"}, - } - - for _, tc := range testCases { - normalized := tc.rawURN.Normalize(tc.country) - assert.Equal(t, tc.expected, normalized, "normalize mismatch for '%s' with country '%s'", tc.rawURN, tc.country) - } -} - -func TestLocalize(t *testing.T) { - testCases := []struct { - input URN - country string - expected URN - }{ - // valid tel numbers - {"tel:+250788383383", "RW", URN("tel:788383383")}, - {"tel:+447531669965", "GB", URN("tel:7531669965")}, - {"tel:+19179925253", "US", URN("tel:9179925253")}, - - // un-localizable tel numbers - {"tel:12345", "RW", URN("tel:12345")}, - {"tel:0788383383", "", URN("tel:0788383383")}, - {"tel:0788383383", "ZZ", URN("tel:0788383383")}, - {"tel:MTN", "RW", URN("tel:MTN")}, - - // other schemes left as is - {"twitter:jimmyjo", "RW", URN("twitter:jimmyjo")}, - {"twitterid:12345#jimmyjo", "RW", URN("twitterid:12345#jimmyjo")}, - {"mailto:bob@example.com", "", URN("mailto:bob@example.com")}, + {"ext: eXterNAL123 ", "ext:eXterNAL123"}, } for _, tc := range testCases { - localized := tc.input.Localize(tc.country) - - assert.Equal(t, tc.expected, localized, "localize mismatch for %s in country", tc.input, tc.country) + normalized := tc.rawURN.Normalize() + assert.Equal(t, tc.expected, normalized, "normalize mismatch for '%s'", tc.rawURN) } } func TestParse(t *testing.T) { testCases := []struct { input string - urn URN + urn urns.URN expectedError string }{ - {"xxxx", NilURN, "path cannot be empty"}, - {"tel:", NilURN, "path cannot be empty"}, - {":xxxx", NilURN, "scheme cannot be empty"}, - {"tel:46362#rrh#gege", NilURN, "fragment component can only come after path or query components"}, + {"xxxx", urns.NilURN, "path cannot be empty"}, + {"tel:", urns.NilURN, "path cannot be empty"}, + {":xxxx", urns.NilURN, "scheme cannot be empty"}, + {"tel:46362#rrh#gege", urns.NilURN, "fragment component can only come after path or query components"}, // no semantic validation - {"xyz:abc", URN("xyz:abc"), ""}, - {"tel:****", URN("tel:****"), ""}, + {"xyz:abc", "xyz:abc", ""}, + {"tel:****", "tel:****", ""}, } for _, tc := range testCases { - actual, err := Parse(tc.input) + actual, err := urns.Parse(tc.input) if tc.expectedError != "" { assert.EqualError(t, err, tc.expectedError, "error mismatch for %s", tc.input) @@ -212,11 +151,11 @@ func TestParse(t *testing.T) { func TestValidate(t *testing.T) { testCases := []struct { - urn URN + urn urns.URN expectedError string }{ {"xxxx", "scheme or path cannot be empty"}, // un-parseable URNs don't validate - {"xyz:abc", "invalid scheme"}, // nor do unknown schemes + {"xyz:abc", "unknown URN scheme"}, // nor do unknown schemes {"tel:", "scheme or path cannot be empty"}, // valid tel numbers @@ -229,69 +168,68 @@ func TestValidate(t *testing.T) { {"tel:cellbroadcastchannel50", ""}, // invalid tel numbers - {"tel:07883 83383", "invalid tel number"}, // can't have spaces - {"tel:", "cannot be empty"}, // need a path + {"tel:07883 83383", "invalid path component"}, // can't have spaces + {"tel:", "cannot be empty"}, // need a path // twitter handles {"twitter:jimmyjo", ""}, {"twitter:billy_bob", ""}, - {"twitter:jimmyjo!@", "invalid twitter handle"}, - {"twitter:billy bob", "invalid twitter handle"}, + {"twitter:jimmyjo!@", "invalid path component"}, + {"twitter:billy bob", "invalid path component"}, // twitterid urns {"twitterid:12345#jimmyjo", ""}, {"twitterid:12345#1234567", ""}, - {"twitterid:jimmyjo#1234567", "invalid twitter id"}, - {"twitterid:123#a.!f", "invalid twitter handle"}, + {"twitterid:jimmyjo#1234567", "invalid path component"}, // email addresses {"mailto:abcd+label@x.y.z.com", ""}, - {"mailto:@@@", "invalid email"}, + {"mailto:@@@", "invalid path component"}, // facebook and telegram URN paths must be integers {"telegram:12345678901234567", ""}, - {"telegram:abcdef", "invalid telegram id"}, + {"telegram:abcdef", "invalid path component"}, {"facebook:12345678901234567", ""}, - {"facebook:abcdef", "invalid facebook id"}, + {"facebook:abcdef", "invalid path component"}, {"instagram:12345678901234567", ""}, - {"instagram:abcdef", "invalid instagram id"}, + {"instagram:abcdef", "invalid path component"}, // facebook refs can be anything {"facebook:ref:facebookRef", ""}, // jiochat IDs {"jiochat:12345", ""}, - {"jiochat:123de", "invalid jiochat id"}, + {"jiochat:123de", "invalid path component"}, // WeChat Open IDs {"wechat:o6_bmjrPTlm6_2sgVt7hMZOPfL2M", ""}, // line IDs {"line:Uasd224", ""}, - {"line:Uqw!123", "invalid line id"}, + {"line:Uqw!123", "invalid path component"}, // viber needs to be alphanum {"viber:asdf12354", ""}, - {"viber:asdf!12354", "invalid viber id"}, + {"viber:asdf!12354", "invalid path component"}, {"viber:xy5/5y6O81+/kbWHpLhBoA==", ""}, // whatsapp needs to be integers {"whatsapp:12354", ""}, - {"whatsapp:abcde", "invalid whatsapp id"}, - {"whatsapp:+12067799294", "invalid whatsapp id"}, + {"whatsapp:abcde", "invalid path component"}, + {"whatsapp:+12067799294", "invalid path component"}, // freschat has to be two uuids separated by a colon {"freshchat:6a2f41a3-c54c-fce8-32d2-0324e1c32e22/6a2f41a3-c54c-fce8-32d2-0324e1c32e22", ""}, - {"freshchat:6a2f41a3-c54c-fce8-32d2-0324e1c32e22", "invalid freshchat id"}, - {"freshchat:+12067799294", "invalid freshchat id"}, + {"freshchat:6a2f41a3-c54c-fce8-32d2-0324e1c32e22", "invalid path component"}, + {"freshchat:+12067799294", "invalid path component"}, {"slack:U0123ABCDEF", ""}, {"webchat:aA3456789012345678901234", ""}, {"webchat:aA3456789012345678901234:bob@nyaruka.com", ""}, - {"webchat:1234567890123456789", "invalid webchat id"}, - {"webchat:12345678901234567890123$", "invalid webchat id"}, - {"webchat:aA3456789012345678901234:@@$", "invalid webchat id"}, + {"webchat:1234567890123456789", "invalid path component"}, + {"webchat:12345678901234567890123$", "invalid path component"}, + {"webchat:aA3456789012345678901234:@@$", "invalid path component"}, } for _, tc := range testCases { @@ -307,187 +245,3 @@ func TestValidate(t *testing.T) { } } } - -func TestTelURNs(t *testing.T) { - testCases := []struct { - number string - country string - expected URN - hasError bool - }{ - {"0788383383", "RW", URN("tel:+250788383383"), false}, - {" +250788383383 ", "KE", URN("tel:+250788383383"), false}, - {"+250788383383", "", URN("tel:+250788383383"), false}, - {"250788383383", "", URN("tel:+250788383383"), false}, - {"(917)992-5253", "US", URN("tel:+19179925253"), false}, - {"(917) 992 - 5253", "US", URN("tel:+19179925253"), false}, - {"19179925253", "", URN("tel:+19179925253"), false}, - {"+62877747666", "", URN("tel:+62877747666"), false}, - {"62877747666", "ID", URN("tel:+62877747666"), false}, - {"0877747666", "ID", URN("tel:+62877747666"), false}, - {"07531669965", "GB", URN("tel:+447531669965"), false}, - {"12345", "RW", URN("tel:12345"), false}, - {"0788383383", "", URN("tel:0788383383"), false}, - {"0788383383", "ZZ", URN("tel:0788383383"), false}, - {"PRIZES", "RW", URN("tel:prizes"), false}, - {"PRIZES!", "RW", URN("tel:prizes"), false}, - {"1", "RW", URN("tel:1"), false}, - {"123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", "RW", NilURN, true}, - } - - for _, tc := range testCases { - urn, err := NewTelURNForCountry(tc.number, tc.country) - - if tc.hasError { - assert.Error(t, err, "expected error for %s, %s", tc.number, tc.country) - } else { - assert.NoError(t, err, "unexpected error for %s, %s", tc.number, tc.country) - assert.Equal(t, tc.expected, urn, "created URN mismatch for %s, %s", tc.number, tc.country) - } - } -} - -func TestTelegramURNs(t *testing.T) { - testCases := []struct { - identifier int64 - display string - expected URN - hasError bool - }{ - {12345, "", URN("telegram:12345"), false}, - {12345, "Sarah", URN("telegram:12345#Sarah"), false}, - } - - for _, tc := range testCases { - urn, err := NewTelegramURN(tc.identifier, tc.display) - - if tc.hasError { - assert.Error(t, err, "expected error for %s", tc.identifier) - } else { - assert.NoError(t, err, "unexpected error for %s", tc.identifier) - assert.Equal(t, tc.expected, urn, "created URN mismatch for %s", tc.identifier) - } - } -} - -func TestWhatsAppURNs(t *testing.T) { - testCases := []struct { - identifier string - expected URN - hasError bool - }{ - {"12345", URN("whatsapp:12345"), false}, - {"+12345", NilURN, true}, - } - - for _, tc := range testCases { - urn, err := NewWhatsAppURN(tc.identifier) - - if tc.hasError { - assert.Error(t, err, "expected error for %s", tc.identifier) - } else { - assert.NoError(t, err, "unexpected error for %s", tc.identifier) - assert.Equal(t, tc.expected, urn, "created URN mismatch for %s", tc.identifier) - } - } -} - -func TestFacebookURNs(t *testing.T) { - testCases := []struct { - identifier string - expected URN - hasError bool - }{ - {"12345", URN("facebook:12345"), false}, - {"invalid", NilURN, true}, - } - - for _, tc := range testCases { - urn, err := NewFacebookURN(tc.identifier) - - if tc.hasError { - assert.Error(t, err, "expected error for %s", tc.identifier) - } else { - assert.NoError(t, err, "unexpected error for %s", tc.identifier) - assert.Equal(t, tc.expected, urn, "created URN mismatch for %s", tc.identifier) - } - } -} - -func TestInstagramURNs(t *testing.T) { - testCases := []struct { - identifier string - expected URN - hasError bool - }{ - {"12345", URN("instagram:12345"), false}, - {"invalid", NilURN, true}, - } - - for _, tc := range testCases { - urn, err := NewInstagramURN(tc.identifier) - - if tc.hasError { - assert.Error(t, err, "expected error for %s", tc.identifier) - } else { - assert.NoError(t, err, "unexpected error for %s", tc.identifier) - assert.Equal(t, tc.expected, urn, "created URN mismatch for %s", tc.identifier) - } - } -} - -func TestFirebaseURNs(t *testing.T) { - testCases := []struct { - identifier string - expected URN - hasError bool - }{ - {"12345", URN("fcm:12345"), false}, - {"asdf", URN("fcm:asdf"), false}, - {"", NilURN, true}, - } - - for _, tc := range testCases { - urn, err := NewFirebaseURN(tc.identifier) - - if tc.hasError { - assert.Error(t, err, "expected error for %s", tc.identifier) - } else { - assert.NoError(t, err, "unexpected error for %s", tc.identifier) - assert.Equal(t, tc.expected, urn, "created URN mismatch for %s", tc.identifier) - } - } -} - -func TestDiscordURNs(t *testing.T) { - testCases := []struct { - identifier string - expected URN - hasError bool - }{ - {"732326982863421591", URN("discord:732326982863421591"), false}, - {"notadiscordID", URN("discord:notadiscordID"), true}, - {"", NilURN, true}, - } - for _, tc := range testCases { - urn, err := NewDiscordURN(tc.identifier) - if tc.hasError { - assert.Error(t, err, "expected error for %s", tc.identifier) - } else { - assert.NoError(t, err, "expected error for %s", tc.identifier) - assert.Equal(t, tc.expected, urn, "created URN mismatch for %s", tc.identifier) - } - } -} - -func BenchmarkValidTel(b *testing.B) { - for n := 0; n < b.N; n++ { - NewTelURNForCountry("2065551212", "US") - } -} - -func BenchmarkInvalidTel(b *testing.B) { - for n := 0; n < b.N; n++ { - NewTelURNForCountry("notnumber", "US") - } -} diff --git a/urns/utils.go b/urns/utils.go deleted file mode 100644 index a3ccb23..0000000 --- a/urns/utils.go +++ /dev/null @@ -1,22 +0,0 @@ -package urns - -import ( - "github.com/nyaruka/phonenumbers" - - "github.com/pkg/errors" -) - -// ParseNumber tries to parse the given string as a phone number and if successful returns it as E164 -func ParseNumber(s, country string) (string, error) { - parsed, err := phonenumbers.Parse(s, country) - if err != nil { - return "", errors.Wrap(err, "unable to parse number") - } - - // check if this is possible number, excluding local-only options - if phonenumbers.IsPossibleNumberWithReason(parsed) != phonenumbers.IS_POSSIBLE { - return "", errors.New("not a possible number") - } - - return phonenumbers.Format(parsed, phonenumbers.E164), nil -} diff --git a/urns/utils_test.go b/urns/utils_test.go deleted file mode 100644 index 0f2c993..0000000 --- a/urns/utils_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package urns_test - -import ( - "testing" - - "github.com/nyaruka/gocommon/urns" - "github.com/stretchr/testify/assert" -) - -func TestParseNumber(t *testing.T) { - tcs := []struct { - input string - country string - parsed string - }{ - {"+250788123123", "", "+250788123123"}, // international number fine without country - {"+250 788 123-123", "", "+250788123123"}, // fine if not E164 formatted - {"0788123123", "RW", "+250788123123"}, - {"206 555 1212", "US", "+12065551212"}, - {"12065551212", "US", "+12065551212"}, // country code but no + - {"5912705", "US", ""}, // is only possible as a local number so ignored - {"10000", "US", ""}, - } - - for _, tc := range tcs { - if tc.parsed != "" { - parsed, err := urns.ParseNumber(tc.input, tc.country) - assert.NoError(t, err, "unexpected error for '%s'", tc.input) - assert.Equal(t, parsed, tc.parsed, "result mismatch for '%s'", tc.input) - } else { - _, err := urns.ParseNumber(tc.input, tc.country) - assert.Error(t, err, "expected error for '%s'", tc.input) - } - } -} From 6caa19eb4c900a3033645dcea27a0533fcb189c4 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 6 May 2024 17:24:29 -0500 Subject: [PATCH 094/141] Add urns.Schemes() --- urns/schemes.go | 2 ++ urns/urns.go | 5 +++++ urns/urns_test.go | 3 +++ 3 files changed, 10 insertions(+) diff --git a/urns/schemes.go b/urns/schemes.go index 706b043..ec26e77 100644 --- a/urns/schemes.go +++ b/urns/schemes.go @@ -47,9 +47,11 @@ func init() { } var schemes = map[string]*Scheme{} +var schemePrefixes = []string{} func register(s *Scheme) { schemes[s.Prefix] = s + schemePrefixes = append(schemePrefixes, s.Prefix) } type Scheme struct { diff --git a/urns/urns.go b/urns/urns.go index 276ad86..6a81732 100644 --- a/urns/urns.go +++ b/urns/urns.go @@ -17,6 +17,11 @@ func IsValidScheme(scheme string) bool { return valid } +// Schemes returns the valid URN schemes +func Schemes() []string { + return schemePrefixes +} + // URN represents a Universal Resource Name, we use this for contact identifiers like phone numbers etc.. type URN string diff --git a/urns/urns_test.go b/urns/urns_test.go index d35423d..b42ade2 100644 --- a/urns/urns_test.go +++ b/urns/urns_test.go @@ -12,6 +12,9 @@ import ( func TestIsValidScheme(t *testing.T) { assert.True(t, urns.IsValidScheme("tel")) assert.False(t, urns.IsValidScheme("xyz")) + + assert.Len(t, urns.Schemes(), 20) + assert.Equal(t, "discord", urns.Schemes()[0]) } func TestURNProperties(t *testing.T) { From e8695b3d8583ef083976852f9d602684d36cfa70 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 7 May 2024 12:08:48 -0500 Subject: [PATCH 095/141] Rework handling of phone URNs --- urns/phone.go | 67 ++++++++++++++++++++------------ urns/phone_test.go | 96 ++++++++++++++++++++++++++++------------------ urns/schemes.go | 10 +---- urns/urns.go | 20 +++++----- urns/urns_test.go | 16 ++------ 5 files changed, 118 insertions(+), 91 deletions(-) diff --git a/urns/phone.go b/urns/phone.go index 78c4acf..b04eab2 100644 --- a/urns/phone.go +++ b/urns/phone.go @@ -1,49 +1,66 @@ package urns import ( + "regexp" "strconv" "strings" + "github.com/nyaruka/gocommon/i18n" "github.com/nyaruka/phonenumbers" "github.com/pkg/errors" ) -// FromLocalPhone returns a validated tel URN -func FromLocalPhone(number string, country string) (URN, error) { - path, err := ParsePhone(number, country) +var nonTelCharsRegex = regexp.MustCompile(`[^0-9A-Za-z]`) + +// ParsePhone returns a validated phone URN. If it can parse a possible number then that is used.. otherwise any value +// that validates as a phone URN is used. +func ParsePhone(raw string, country i18n.Country) (URN, error) { + // strip all non-tel characters.. only preserving an optional leading + + raw = strings.TrimSpace(raw) + hasPlus := strings.HasPrefix(raw, "+") + raw = nonTelCharsRegex.ReplaceAllString(raw, "") + if hasPlus { + raw = "+" + raw + } + + number, err := parsePhoneOrShortcode(raw, country) if err != nil { - return NilURN, err + if err == phonenumbers.ErrInvalidCountryCode { + return NilURN, errors.New("invalid country code") + } + + return NewFromParts(Phone, raw, "", "") } - return NewURNFromParts(Phone, path, "", "") + return NewFromParts(Phone, number, "", "") } -// ToLocalPhone converts a phone URN to a local number in the given country -func ToLocalPhone(u URN, country string) string { - _, path, _, _ := u.ToParts() +// tries to extract a valid phone number or shortcode from the given string +func parsePhoneOrShortcode(raw string, country i18n.Country) (string, error) { + parsed, err := phonenumbers.Parse(raw, string(country)) + if err != nil { + return "", err + } - parsed, err := phonenumbers.Parse(path, country) - if err == nil { - return strconv.FormatUint(parsed.GetNationalNumber(), 10) + if phonenumbers.IsPossibleNumberWithReason(parsed) == phonenumbers.IS_POSSIBLE { + return phonenumbers.Format(parsed, phonenumbers.E164), nil } - return path -} -// ParsePhone tries to parse the given string as a phone number and if successful returns it as E164 -func ParsePhone(s, country string) (string, error) { - parsed, err := phonenumbers.Parse(s, country) - if err != nil { - return "", errors.Wrap(err, "unable to parse number") + if phonenumbers.IsPossibleShortNumberForRegion(parsed, string(country)) { + return phonenumbers.Format(parsed, phonenumbers.NATIONAL), nil } - if phonenumbers.IsPossibleNumberWithReason(parsed) != phonenumbers.IS_POSSIBLE { - // if it's not a possible number, try adding a + and parsing again - if !strings.HasPrefix(s, "+") { - return ParsePhone("+"+s, country) - } + return "", errors.New("unable to parse phone number or shortcode") +} - return "", errors.New("not a possible number") +// ToLocalPhone converts a phone URN to a local phone number.. without any leading zeros +func ToLocalPhone(u URN, country i18n.Country) string { + _, path, _, _ := u.ToParts() + + parsed, err := phonenumbers.Parse(path, string(country)) + if err != nil { + return path } - return phonenumbers.Format(parsed, phonenumbers.E164), nil + return strconv.FormatUint(parsed.GetNationalNumber(), 10) } diff --git a/urns/phone_test.go b/urns/phone_test.go index 96c2007..6d6b0fc 100644 --- a/urns/phone_test.go +++ b/urns/phone_test.go @@ -1,68 +1,90 @@ -package urns_test +package urns import ( "testing" - "github.com/nyaruka/gocommon/urns" + "github.com/nyaruka/gocommon/i18n" "github.com/stretchr/testify/assert" ) -func TestFromLocalPhone(t *testing.T) { +func TestParsePhone(t *testing.T) { testCases := []struct { - number string - country string - expected urns.URN - hasError bool + input string + country i18n.Country + expected URN }{ - {"tel:0788383383", "RW", "tel:+250788383383", false}, - {"tel: +250788383383 ", "KE", "tel:+250788383383", false}, // already has country code - {"tel:(917)992-5253", "US", "tel:+19179925253", false}, - {"tel:800-CABBAGE", "US", "tel:+18002222243", false}, - {"tel:+62877747666", "ID", "tel:+62877747666", false}, - {"tel:0877747666", "ID", "tel:+62877747666", false}, - {"tel:07531669965", "GB", "tel:+447531669965", false}, - {"tel:263780821000", "ZW", "tel:+263780821000", false}, + {" 0788383383 ", "RW", "tel:+250788383383"}, + {"+250788383383 ", "RW", "tel:+250788383383"}, // already has country code and leading + + {"250788383383 ", "RW", "tel:+250788383383"}, // already has country code and no leading + + {"+250788383383 ", "KE", "tel:+250788383383"}, // already has a different country code + {"(917)992-5253", "US", "tel:+19179925253"}, + {"800-CABBAGE", "US", "tel:+18002222243"}, + {"+62877747666", "ID", "tel:+62877747666"}, + {"0877747666", "ID", "tel:+62877747666"}, + {"07531669965", "GB", "tel:+447531669965"}, + {"263780821000", "ZW", "tel:+263780821000"}, + + {"1", "RW", "tel:1"}, + {"123456", "RW", "tel:123456"}, + {"mtn", "RW", "tel:mtn"}, + {"!mtn!", "RW", "tel:mtn"}, // non tel chars stripped - {"0788383383", "ZZ", urns.NilURN, true}, // invalid country code - {"1", "RW", urns.NilURN, true}, - {"123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", "RW", urns.NilURN, true}, + {"0788383383", "ZZ", NilURN}, // invalid country code + {"1234567890123456789012345678901234567890123456789012345678901234567890123456789", "RW", NilURN}, // too long } for i, tc := range testCases { - urn, err := urns.FromLocalPhone(tc.number, tc.country) + urn, err := ParsePhone(tc.input, tc.country) - if tc.hasError { - assert.Error(t, err, "%d: expected error for %s, %s", i, tc.number, tc.country) + if tc.expected == NilURN { + assert.Error(t, err, "%d: expected error for %s, %s", i, tc.input, tc.country) } else { - assert.NoError(t, err, "%d: unexpected error for %s, %s", i, tc.number, tc.country) - assert.Equal(t, tc.expected, urn, "%d: created URN mismatch for %s, %s", i, tc.number, tc.country) + assert.NoError(t, err, "%d: unexpected error for %s, %s", i, tc.input, tc.country) + assert.Equal(t, tc.expected, urn, "%d: created URN mismatch for %s, %s", i, tc.input, tc.country) } } } -func TestParsePhone(t *testing.T) { +func TestParsePhoneOrShortcode(t *testing.T) { tcs := []struct { - input string - country string - parsed string + input string + country i18n.Country + expected string }{ {"+250788123123", "", "+250788123123"}, // international number fine without country - {"+250 788 123-123", "", "+250788123123"}, // fine if not E164 formatted - {"0788123123", "RW", "+250788123123"}, - {"206 555 1212", "US", "+12065551212"}, - {"12065551212", "US", "+12065551212"}, // country code but no + - {"5912705", "US", ""}, // is only possible as a local number so ignored - {"10000", "US", ""}, + {"+250 788 123-123", "", "+250788123123"}, // still fine if not E164 formatted + + {"0788123123", "RW", "+250788123123"}, // country code added + {" (206)555-1212 ", "US", "+12065551212"}, // punctiation removed + {"800-CABBAGE", "US", "+18002222243"}, // letters converted to numbers + {"12065551212", "US", "+12065551212"}, // country code but no + + {"10000", "US", "10000"}, // valid short code for US + + {"5912705", "US", ""}, // is only possible as a local number so ignored } for _, tc := range tcs { - if tc.parsed != "" { - parsed, err := urns.ParsePhone(tc.input, tc.country) + parsed, err := parsePhoneOrShortcode(tc.input, tc.country) + + if tc.expected != "" { assert.NoError(t, err, "unexpected error for '%s'", tc.input) - assert.Equal(t, parsed, tc.parsed, "result mismatch for '%s'", tc.input) + assert.Equal(t, tc.expected, parsed, "result mismatch for '%s'", tc.input) } else { - _, err := urns.ParsePhone(tc.input, tc.country) assert.Error(t, err, "expected error for '%s'", tc.input) } } } +func TestToLocalPhone(t *testing.T) { + tcs := []struct { + urn URN + country i18n.Country + expected string + }{ + {"tel:+250788123123", "", "788123123"}, + {"tel:123123", "", "123123"}, + } + + for _, tc := range tcs { + assert.Equal(t, tc.expected, ToLocalPhone(tc.urn, tc.country), "local mismatch for '%s'", tc.urn) + } +} diff --git a/urns/schemes.go b/urns/schemes.go index ec26e77..954bda1 100644 --- a/urns/schemes.go +++ b/urns/schemes.go @@ -8,7 +8,6 @@ import ( ) var allDigitsRegex = regexp.MustCompile(`^[0-9]+$`) -var nonTelCharsRegex = regexp.MustCompile(`[^0-9A-Z]`) var emailRegex = regexp.MustCompile(`^[^\s@]+@[^\s@]+$`) var freshchatRegex = regexp.MustCompile(`^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}/[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$`) @@ -115,13 +114,8 @@ var Line = &Scheme{ var Phone = &Scheme{ Prefix: "tel", Normalize: func(path string) string { - e164, err := ParsePhone(path, "") - if err != nil { - // could be a short code so uppercase and remove non alphanumeric characters - return nonTelCharsRegex.ReplaceAllString(strings.ToUpper(path), "") - } - - return e164 + // might have alpha characters in it + return strings.ToUpper(path) }, Validate: func(path string) bool { return telRegex.MatchString(path) }, Format: func(path string) string { diff --git a/urns/urns.go b/urns/urns.go index 6a81732..afd2dec 100644 --- a/urns/urns.go +++ b/urns/urns.go @@ -29,7 +29,7 @@ type URN string const NilURN = URN("") // returns a new URN for the given scheme, path, query and display -func newURNFromParts(scheme, path, query, display string) URN { +func newFromParts(scheme, path, query, display string) URN { u := &parsedURN{ scheme: scheme, path: path, @@ -39,9 +39,9 @@ func newURNFromParts(scheme, path, query, display string) URN { return URN(u.String()) } -// NewURNFromParts returns a validated URN for the given scheme, path, query and display -func NewURNFromParts(typ *Scheme, path string, query string, display string) (URN, error) { - urn := newURNFromParts(typ.Prefix, path, query, display) +// NewFromParts returns a validated URN for the given scheme, path, query and display +func NewFromParts(typ *Scheme, path string, query string, display string) (URN, error) { + urn := newFromParts(typ.Prefix, path, query, display) if err := urn.Validate(); err != nil { return NilURN, err @@ -80,7 +80,7 @@ func (u URN) Normalize() URN { path = s.Normalize(path) } - return newURNFromParts(scheme, path, query, display) + return newFromParts(scheme, path, query, display) } // Validate returns whether this URN is considered valid @@ -144,7 +144,7 @@ func (u URN) Query() (url.Values, error) { // Identity returns the URN with any query or display attributes stripped func (u URN) Identity() URN { scheme, path, _, _ := u.ToParts() - return newURNFromParts(scheme, path, "", "") + return newFromParts(scheme, path, "", "") } // String returns the string representation of this URN @@ -154,13 +154,15 @@ func (u URN) String() string { return string(u) } func (u URN) Format() string { scheme, path, _, display := u.ToParts() + // display always takes precedence + if display != "" { + return display + } + s := schemes[scheme] if s != nil && s.Format != nil { return s.Format(path) } - if display != "" { - return display - } return path } diff --git a/urns/urns_test.go b/urns/urns_test.go index b42ade2..cc5f440 100644 --- a/urns/urns_test.go +++ b/urns/urns_test.go @@ -26,6 +26,7 @@ func TestURNProperties(t *testing.T) { query url.Values }{ {"tel:+250788383383", "0788 383 383", "", "", map[string][]string{}}, + {"tel:+250788383383#my-phone", "my-phone", "my-phone", "", map[string][]string{}}, {"twitter:85114#billy_bob", "billy_bob", "billy_bob", "", map[string][]string{}}, {"twitter:billy_bob", "billy_bob", "", "", map[string][]string{}}, {"tel:not-a-number", "not-a-number", "", "", map[string][]string{}}, @@ -69,7 +70,7 @@ func TestNewFromParts(t *testing.T) { } for _, tc := range testCases { - urn, err := urns.NewURNFromParts(tc.scheme, tc.path, "", tc.display) + urn, err := urns.NewFromParts(tc.scheme, tc.path, "", tc.display) identity := urn.Identity() assert.Equal(t, tc.expected, urn, "from parts mismatch for: %s, %s, %s", tc.scheme, tc.path, tc.display) @@ -88,24 +89,15 @@ func TestNormalize(t *testing.T) { rawURN urns.URN expected urns.URN }{ - // valid tel numbers - {"tel: +250788383383 ", "tel:+250788383383"}, + // valid tel numbers left as they are {"tel:+250788383383", "tel:+250788383383"}, - {"tel:250788383383", "tel:+250788383383"}, - {"tel:(917)992-5253", "tel:+19179925253"}, - {"tel:19179925253", "tel:+19179925253"}, {"tel:+62877747666", "tel:+62877747666"}, - {"tel:62877747666", "tel:+62877747666"}, - {"tel:0877747666", "tel:+62877747666"}, - {"tel:07531669965", "tel:+447531669965"}, - {"tel:22658125926", "tel:+22658125926"}, - {"tel:263780821000", "tel:+263780821000"}, {"tel:+2203693333", "tel:+2203693333"}, // non-standard phone numbers {"tel:12345", "tel:12345"}, {"tel:mtn", "tel:MTN"}, - {"tel:+12345678901234567890", "tel:12345678901234567890"}, + {"tel:+12345678901234567890", "tel:+12345678901234567890"}, // twitter handles remove @ {"twitter: @jimmyJO", "twitter:jimmyjo"}, From cd756a1b32509e764e436634af93fa2f15c9fcae Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 7 May 2024 13:30:14 -0500 Subject: [PATCH 096/141] Add urns.New --- urns/phone.go | 3 ++- urns/urns.go | 9 +++++++-- urns/urns_test.go | 5 +++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/urns/phone.go b/urns/phone.go index b04eab2..3d03e17 100644 --- a/urns/phone.go +++ b/urns/phone.go @@ -53,7 +53,8 @@ func parsePhoneOrShortcode(raw string, country i18n.Country) (string, error) { return "", errors.New("unable to parse phone number or shortcode") } -// ToLocalPhone converts a phone URN to a local phone number.. without any leading zeros +// ToLocalPhone converts a phone URN to a local phone number.. without any leading zeros. Kinda weird but used by +// Courier where channels want the number in that format. func ToLocalPhone(u URN, country i18n.Country) string { _, path, _, _ := u.ToParts() diff --git a/urns/urns.go b/urns/urns.go index afd2dec..2415153 100644 --- a/urns/urns.go +++ b/urns/urns.go @@ -40,8 +40,8 @@ func newFromParts(scheme, path, query, display string) URN { } // NewFromParts returns a validated URN for the given scheme, path, query and display -func NewFromParts(typ *Scheme, path string, query string, display string) (URN, error) { - urn := newFromParts(typ.Prefix, path, query, display) +func NewFromParts(scheme *Scheme, path, query, display string) (URN, error) { + urn := newFromParts(scheme.Prefix, path, query, display) if err := urn.Validate(); err != nil { return NilURN, err @@ -49,6 +49,11 @@ func NewFromParts(typ *Scheme, path string, query string, display string) (URN, return urn, nil } +// New returns a validated URN for the given scheme and path +func New(scheme *Scheme, path string) (URN, error) { + return NewFromParts(scheme, path, "", "") +} + // Parse parses a URN from the given string. The returned URN is only guaranteed to be structurally valid. func Parse(s string) (URN, error) { parsed, err := parseURN(s) diff --git a/urns/urns_test.go b/urns/urns_test.go index cc5f440..c00a914 100644 --- a/urns/urns_test.go +++ b/urns/urns_test.go @@ -82,6 +82,11 @@ func TestNewFromParts(t *testing.T) { assert.NoError(t, err, "unexpected error for: %s, %s, %s", tc.scheme, tc.path, tc.display) } } + + // test New shortcut + urn, err := urns.New(urns.Phone, "+250788383383") + assert.NoError(t, err) + assert.Equal(t, "tel:+250788383383", urn.String()) } func TestNormalize(t *testing.T) { From b40a07142414ceb8ce3bc6adde57672fc18fa9a1 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 7 May 2024 13:35:52 -0500 Subject: [PATCH 097/141] Test with both go 1.21 and 1.22 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2599e44..d2db257 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - go-version: [1.21.x] + go-version: [1.21.x, 1.22.x] services: redis: From b4343db9aed6b3f3e1511b2194e045700988ec17 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 7 May 2024 13:39:58 -0500 Subject: [PATCH 098/141] Update deps --- go.mod | 24 +++++++++++------------ go.sum | 61 ++++++++++++++++++++++++++++++---------------------------- 2 files changed, 44 insertions(+), 41 deletions(-) diff --git a/go.mod b/go.mod index 9dc0989..1223db4 100644 --- a/go.mod +++ b/go.mod @@ -3,25 +3,25 @@ module github.com/nyaruka/gocommon go 1.21 require ( - github.com/aws/aws-sdk-go v1.50.29 + github.com/aws/aws-sdk-go v1.52.3 github.com/gabriel-vasile/mimetype v1.4.3 github.com/go-chi/chi/v5 v5.0.12 - github.com/go-playground/validator/v10 v10.18.0 + github.com/go-playground/validator/v10 v10.20.0 github.com/gofrs/uuid v4.4.0+incompatible github.com/gorilla/websocket v1.5.1 github.com/jellydator/ttlcache/v3 v3.2.0 - github.com/jmoiron/sqlx v1.3.5 + github.com/jmoiron/sqlx v1.4.0 github.com/lib/pq v1.10.9 github.com/nyaruka/librato v1.1.1 github.com/nyaruka/null/v2 v2.0.3 github.com/nyaruka/phonenumbers v1.3.4 github.com/pkg/errors v0.9.1 - github.com/shopspring/decimal v1.3.1 - github.com/stretchr/testify v1.8.4 - golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 - golang.org/x/net v0.21.0 - golang.org/x/sync v0.6.0 - golang.org/x/text v0.14.0 + github.com/shopspring/decimal v1.4.0 + github.com/stretchr/testify v1.9.0 + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 + golang.org/x/net v0.25.0 + golang.org/x/sync v0.7.0 + golang.org/x/text v0.15.0 ) require ( @@ -31,8 +31,8 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/crypto v0.20.0 // indirect - golang.org/x/sys v0.17.0 // indirect - google.golang.org/protobuf v1.33.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/sys v0.20.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index d11bb33..61cc752 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ -github.com/aws/aws-sdk-go v1.50.29 h1:Ol2FYzesF2tsQrgVSnDWRFI60+FsSqKKdt7MLlZKubc= -github.com/aws/aws-sdk-go v1.50.29/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/aws/aws-sdk-go v1.52.3 h1:BNPJmHOXNoM/iBWJKrvaQvJOweRcp3KLpzdb65CfQwU= +github.com/aws/aws-sdk-go v1.52.3/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -13,14 +15,14 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.18.0 h1:BvolUXjp4zuvkZ5YN5t7ebzbhlUtPsPm2S9NAZ5nl9U= -github.com/go-playground/validator/v10 v10.18.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/jellydator/ttlcache/v3 v3.2.0 h1:6lqVJ8X3ZaUwvzENqPAobDsXNExfUJd61u++uW8a3LE= @@ -29,15 +31,14 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= -github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= +github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= +github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= -github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/nyaruka/librato v1.1.1 h1:0nTYtJLl3Sn7lX3CuHsLf+nXy1k/tGV0OjVxLy3Et4s= github.com/nyaruka/librato v1.1.1/go.mod h1:fme1Fu1PT2qvkaBZyw8WW+SrnFe2qeeCWpvqmAaKAKE= github.com/nyaruka/null/v2 v2.0.3 h1:rdmMRQyVzrOF3Jff/gpU/7BDR9mQX0lcLl4yImsA3kw= @@ -48,27 +49,29 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= -golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= From 9bde363b8cc99fa57f93df3ff3167d1c8191c207 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 7 May 2024 13:41:04 -0500 Subject: [PATCH 099/141] Update CHANGELOG.md for v2.0.0 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e2290b..8b9ec96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +v2.0.0 (2024-05-07) +------------------------- + * Update deps + * Test with both go 1.21 and 1.22 + * Refactor urns package + v1.53.2 (2024-03-28) ------------------------- * assertdb assert methods should return bool From b37f776f670eab6ea8aa91af02b127da4fa16ad1 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 7 May 2024 13:43:35 -0500 Subject: [PATCH 100/141] Revert "Update CHANGELOG.md for v2.0.0" This reverts commit 9bde363b8cc99fa57f93df3ff3167d1c8191c207. --- CHANGELOG.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b9ec96..0e2290b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,3 @@ -v2.0.0 (2024-05-07) -------------------------- - * Update deps - * Test with both go 1.21 and 1.22 - * Refactor urns package - v1.53.2 (2024-03-28) ------------------------- * assertdb assert methods should return bool From bce5ccd91ae7427d9332f5e2aa4046cbf55c33db Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 7 May 2024 13:45:09 -0500 Subject: [PATCH 101/141] Update CHANGELOG.md for v1.54.0 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e2290b..0966a32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +v1.54.0 (2024-05-07) +------------------------- + * Update deps + * Test with both go 1.21 and 1.22 + * Refactor urns package + v1.53.2 (2024-03-28) ------------------------- * assertdb assert methods should return bool From bfde49079005d46b43886b397e6c23c4e2d953e3 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 7 May 2024 13:56:07 -0500 Subject: [PATCH 102/141] Add names to schemes and make urns.Schemes() return full Scheme objects --- urns/schemes.go | 29 +++++++++++++++++++++++++---- urns/urns.go | 12 ++++++------ urns/urns_test.go | 2 +- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/urns/schemes.go b/urns/schemes.go index 954bda1..69ba2cf 100644 --- a/urns/schemes.go +++ b/urns/schemes.go @@ -45,16 +45,17 @@ func init() { register(WhatsApp) } -var schemes = map[string]*Scheme{} -var schemePrefixes = []string{} +var schemeByPrefix = map[string]*Scheme{} +var schemes = []*Scheme{} func register(s *Scheme) { - schemes[s.Prefix] = s - schemePrefixes = append(schemePrefixes, s.Prefix) + schemeByPrefix[s.Prefix] = s + schemes = append(schemes, s) } type Scheme struct { Prefix string + Name string Normalize func(string) string Validate func(string) bool Format func(string) string @@ -62,21 +63,25 @@ type Scheme struct { var Discord = &Scheme{ Prefix: "discord", + Name: "Discord", Validate: func(path string) bool { return allDigitsRegex.MatchString(path) }, } var Email = &Scheme{ Prefix: "mailto", + Name: "Email", Normalize: func(path string) string { return strings.ToLower(path) }, Validate: func(path string) bool { return emailRegex.MatchString(path) }, } var External = &Scheme{ Prefix: "ext", + Name: "External", } var Facebook = &Scheme{ Prefix: "facebook", + Name: "Facebook", Validate: func(path string) bool { // we don't validate facebook refs since they come from the outside if strings.HasPrefix(path, FacebookRefPrefix) { @@ -89,30 +94,36 @@ var Facebook = &Scheme{ var Firebase = &Scheme{ Prefix: "fcm", + Name: "Firebase", } var FreshChat = &Scheme{ Prefix: "freshchat", + Name: "FreshChat", Validate: func(path string) bool { return freshchatRegex.MatchString(path) }, } var Instagram = &Scheme{ Prefix: "instagram", + Name: "Instagram", Validate: func(path string) bool { return allDigitsRegex.MatchString(path) }, } var JioChat = &Scheme{ Prefix: "jiochat", + Name: "JioChat", Validate: func(path string) bool { return allDigitsRegex.MatchString(path) }, } var Line = &Scheme{ Prefix: "line", + Name: "LINE", Validate: func(path string) bool { return lineRegex.MatchString(path) }, } var Phone = &Scheme{ Prefix: "tel", + Name: "Phone", Normalize: func(path string) string { // might have alpha characters in it return strings.ToUpper(path) @@ -129,19 +140,23 @@ var Phone = &Scheme{ var RocketChat = &Scheme{ Prefix: "rocketchat", + Name: "Rocket.Chat", } var Slack = &Scheme{ Prefix: "slack", + Name: "Slack", } var Telegram = &Scheme{ Prefix: "telegram", + Name: "Telegram", Validate: func(path string) bool { return allDigitsRegex.MatchString(path) }, } var Twitter = &Scheme{ Prefix: "twitter", + Name: "Twitter Handle", Normalize: func(path string) string { // handles are case-insensitive, so we always store as lowercase path = strings.ToLower(path) @@ -154,28 +169,34 @@ var Twitter = &Scheme{ var TwitterID = &Scheme{ Prefix: "twitterid", + Name: "Twitter", Validate: func(path string) bool { return allDigitsRegex.MatchString(path) }, } var Viber = &Scheme{ Prefix: "viber", + Name: "Viber", Validate: func(path string) bool { return viberRegex.MatchString(path) }, } var VK = &Scheme{ Prefix: "vk", + Name: "VK", } var WebChat = &Scheme{ Prefix: "webchat", + Name: "WebChat", Validate: func(path string) bool { return webchatRegex.MatchString(path) }, } var WeChat = &Scheme{ Prefix: "wechat", + Name: "WeChat", } var WhatsApp = &Scheme{ Prefix: "whatsapp", + Name: "WhatsApp", Validate: func(path string) bool { return allDigitsRegex.MatchString(path) }, } diff --git a/urns/urns.go b/urns/urns.go index 2415153..adf94e0 100644 --- a/urns/urns.go +++ b/urns/urns.go @@ -13,13 +13,13 @@ const ( // IsValidScheme checks whether the provided scheme is valid func IsValidScheme(scheme string) bool { - _, valid := schemes[scheme] + _, valid := schemeByPrefix[scheme] return valid } // Schemes returns the valid URN schemes -func Schemes() []string { - return schemePrefixes +func Schemes() []*Scheme { + return schemes } // URN represents a Universal Resource Name, we use this for contact identifiers like phone numbers etc.. @@ -77,7 +77,7 @@ func (u URN) ToParts() (string, string, string, string) { // Normalize normalizes the URN into it's canonical form and should be performed before URN comparisons func (u URN) Normalize() URN { scheme, path, query, display := u.ToParts() - s := schemes[scheme] + s := schemeByPrefix[scheme] path = strings.TrimSpace(path) @@ -104,7 +104,7 @@ func (u URN) Validate() error { return fmt.Errorf("path component too long") } - s := schemes[scheme] + s := schemeByPrefix[scheme] if s.Validate != nil && !s.Validate(path) { return fmt.Errorf("invalid path component") } @@ -164,7 +164,7 @@ func (u URN) Format() string { return display } - s := schemes[scheme] + s := schemeByPrefix[scheme] if s != nil && s.Format != nil { return s.Format(path) } diff --git a/urns/urns_test.go b/urns/urns_test.go index c00a914..616ec2b 100644 --- a/urns/urns_test.go +++ b/urns/urns_test.go @@ -14,7 +14,7 @@ func TestIsValidScheme(t *testing.T) { assert.False(t, urns.IsValidScheme("xyz")) assert.Len(t, urns.Schemes(), 20) - assert.Equal(t, "discord", urns.Schemes()[0]) + assert.Equal(t, "Discord", urns.Schemes()[0].Name) } func TestURNProperties(t *testing.T) { From cb0fea5528aad182b2bc9229c63274beab332827 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 7 May 2024 14:10:16 -0500 Subject: [PATCH 103/141] Update CHANGELOG.md for v1.54.1 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0966a32..b613127 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.54.1 (2024-05-07) +------------------------- + * Add names to schemes and make urns.Schemes() return full Scheme objects + v1.54.0 (2024-05-07) ------------------------- * Update deps From 3b68358cb53045723bcdd49b4f0808140c8ade4b Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 7 May 2024 15:13:14 -0500 Subject: [PATCH 104/141] Bring back auto adding of + to sufficiently long phone numbers when parsing URNs --- urns/phone.go | 5 +++++ urns/phone_test.go | 1 + 2 files changed, 6 insertions(+) diff --git a/urns/phone.go b/urns/phone.go index 3d03e17..053db10 100644 --- a/urns/phone.go +++ b/urns/phone.go @@ -23,6 +23,11 @@ func ParsePhone(raw string, country i18n.Country) (URN, error) { raw = "+" + raw } + // if we're sufficienly long and don't start with a 0 then add a + + if len(raw) >= 11 && !strings.HasPrefix(raw, "0") { + raw = "+" + raw + } + number, err := parsePhoneOrShortcode(raw, country) if err != nil { if err == phonenumbers.ErrInvalidCountryCode { diff --git a/urns/phone_test.go b/urns/phone_test.go index 6d6b0fc..0bae043 100644 --- a/urns/phone_test.go +++ b/urns/phone_test.go @@ -23,6 +23,7 @@ func TestParsePhone(t *testing.T) { {"0877747666", "ID", "tel:+62877747666"}, {"07531669965", "GB", "tel:+447531669965"}, {"263780821000", "ZW", "tel:+263780821000"}, + {"254791541111", "US", "tel:+254791541111"}, // international but missing + and wrong country {"1", "RW", "tel:1"}, {"123456", "RW", "tel:123456"}, From a3ac3a52dbe7ed5e0ff38831d2db1a6bfb72bd19 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 7 May 2024 15:13:57 -0500 Subject: [PATCH 105/141] Update CHANGELOG.md for v1.54.2 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b613127..138e351 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.54.2 (2024-05-07) +------------------------- + * Bring back auto adding of + to sufficiently long phone numbers when parsing URNs + v1.54.1 (2024-05-07) ------------------------- * Add names to schemes and make urns.Schemes() return full Scheme objects From f36959f0e2871bcf5d810c41b3fc3bf93198c9ab Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 7 May 2024 17:08:07 -0500 Subject: [PATCH 106/141] Tweak urns.NewFromParts so scheme is a string and export the urns.Schemes slice instead of exposing via function --- urns/phone.go | 4 ++-- urns/schemes.go | 5 +++-- urns/urns.go | 11 +++-------- urns/urns_test.go | 5 +---- 4 files changed, 9 insertions(+), 16 deletions(-) diff --git a/urns/phone.go b/urns/phone.go index 053db10..9358b4c 100644 --- a/urns/phone.go +++ b/urns/phone.go @@ -34,10 +34,10 @@ func ParsePhone(raw string, country i18n.Country) (URN, error) { return NilURN, errors.New("invalid country code") } - return NewFromParts(Phone, raw, "", "") + return NewFromParts(Phone.Prefix, raw, "", "") } - return NewFromParts(Phone, number, "", "") + return NewFromParts(Phone.Prefix, number, "", "") } // tries to extract a valid phone number or shortcode from the given string diff --git a/urns/schemes.go b/urns/schemes.go index 69ba2cf..8a17422 100644 --- a/urns/schemes.go +++ b/urns/schemes.go @@ -46,13 +46,14 @@ func init() { } var schemeByPrefix = map[string]*Scheme{} -var schemes = []*Scheme{} +var Schemes = []*Scheme{} func register(s *Scheme) { schemeByPrefix[s.Prefix] = s - schemes = append(schemes, s) + Schemes = append(Schemes, s) } +// Scheme represents a URN scheme, e.g. tel, email, etc. type Scheme struct { Prefix string Name string diff --git a/urns/urns.go b/urns/urns.go index adf94e0..001a47d 100644 --- a/urns/urns.go +++ b/urns/urns.go @@ -17,11 +17,6 @@ func IsValidScheme(scheme string) bool { return valid } -// Schemes returns the valid URN schemes -func Schemes() []*Scheme { - return schemes -} - // URN represents a Universal Resource Name, we use this for contact identifiers like phone numbers etc.. type URN string @@ -40,8 +35,8 @@ func newFromParts(scheme, path, query, display string) URN { } // NewFromParts returns a validated URN for the given scheme, path, query and display -func NewFromParts(scheme *Scheme, path, query, display string) (URN, error) { - urn := newFromParts(scheme.Prefix, path, query, display) +func NewFromParts(scheme, path, query, display string) (URN, error) { + urn := newFromParts(scheme, path, query, display) if err := urn.Validate(); err != nil { return NilURN, err @@ -51,7 +46,7 @@ func NewFromParts(scheme *Scheme, path, query, display string) (URN, error) { // New returns a validated URN for the given scheme and path func New(scheme *Scheme, path string) (URN, error) { - return NewFromParts(scheme, path, "", "") + return NewFromParts(scheme.Prefix, path, "", "") } // Parse parses a URN from the given string. The returned URN is only guaranteed to be structurally valid. diff --git a/urns/urns_test.go b/urns/urns_test.go index 616ec2b..7d1a00b 100644 --- a/urns/urns_test.go +++ b/urns/urns_test.go @@ -12,9 +12,6 @@ import ( func TestIsValidScheme(t *testing.T) { assert.True(t, urns.IsValidScheme("tel")) assert.False(t, urns.IsValidScheme("xyz")) - - assert.Len(t, urns.Schemes(), 20) - assert.Equal(t, "Discord", urns.Schemes()[0].Name) } func TestURNProperties(t *testing.T) { @@ -70,7 +67,7 @@ func TestNewFromParts(t *testing.T) { } for _, tc := range testCases { - urn, err := urns.NewFromParts(tc.scheme, tc.path, "", tc.display) + urn, err := urns.NewFromParts(tc.scheme.Prefix, tc.path, "", tc.display) identity := urn.Identity() assert.Equal(t, tc.expected, urn, "from parts mismatch for: %s, %s, %s", tc.scheme, tc.path, tc.display) From 40a12c7976e9eb278af85008393c0b2077acf7c0 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 7 May 2024 17:13:16 -0500 Subject: [PATCH 107/141] Update CHANGELOG.md for v1.54.3 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 138e351..eda08e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.54.3 (2024-05-07) +------------------------- + * Tweak urns.NewFromParts so scheme is a string and export the urns.Schemes slice instead of exposing via function + v1.54.2 (2024-05-07) ------------------------- * Bring back auto adding of + to sufficiently long phone numbers when parsing URNs From a21da323cefffd4cb4d970d76b4ecdf3ab3ab7f7 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 8 May 2024 10:31:42 -0500 Subject: [PATCH 108/141] Make phone parsing stricter --- urns/phone.go | 27 +++++++----- urns/phone_test.go | 106 +++++++++++++++++++++------------------------ urns/schemes.go | 4 +- urns/urns_test.go | 5 +-- 4 files changed, 70 insertions(+), 72 deletions(-) diff --git a/urns/phone.go b/urns/phone.go index 9358b4c..8b9ba3f 100644 --- a/urns/phone.go +++ b/urns/phone.go @@ -12,10 +12,19 @@ import ( var nonTelCharsRegex = regexp.MustCompile(`[^0-9A-Za-z]`) -// ParsePhone returns a validated phone URN. If it can parse a possible number then that is used.. otherwise any value -// that validates as a phone URN is used. +// ParsePhone returns a validated phone URN or an error. func ParsePhone(raw string, country i18n.Country) (URN, error) { - // strip all non-tel characters.. only preserving an optional leading + + number, err := ParseNumber(raw, country) + if err != nil { + return "", err + } + + return NewFromParts(Phone.Prefix, number, "", "") +} + +// ParseNumber tries to extact a possible number or shortcode from the given string, returning an error if it can't. +func ParseNumber(raw string, country i18n.Country) (string, error) { + // strip all non-alphanumeric characters.. only preserving an optional leading + raw = strings.TrimSpace(raw) hasPlus := strings.HasPrefix(raw, "+") raw = nonTelCharsRegex.ReplaceAllString(raw, "") @@ -23,21 +32,17 @@ func ParsePhone(raw string, country i18n.Country) (URN, error) { raw = "+" + raw } - // if we're sufficienly long and don't start with a 0 then add a + + // if we're sufficiently long and don't start with a 0 then add a + if len(raw) >= 11 && !strings.HasPrefix(raw, "0") { raw = "+" + raw } number, err := parsePhoneOrShortcode(raw, country) if err != nil { - if err == phonenumbers.ErrInvalidCountryCode { - return NilURN, errors.New("invalid country code") - } - - return NewFromParts(Phone.Prefix, raw, "", "") + return "", err } - return NewFromParts(Phone.Prefix, number, "", "") + return number, nil } // tries to extract a valid phone number or shortcode from the given string @@ -55,7 +60,7 @@ func parsePhoneOrShortcode(raw string, country i18n.Country) (string, error) { return phonenumbers.Format(parsed, phonenumbers.NATIONAL), nil } - return "", errors.New("unable to parse phone number or shortcode") + return "", errors.New("not a possible number or shortcode") } // ToLocalPhone converts a phone URN to a local phone number.. without any leading zeros. Kinda weird but used by diff --git a/urns/phone_test.go b/urns/phone_test.go index 0bae043..e0486df 100644 --- a/urns/phone_test.go +++ b/urns/phone_test.go @@ -1,83 +1,77 @@ -package urns +package urns_test import ( "testing" "github.com/nyaruka/gocommon/i18n" + "github.com/nyaruka/gocommon/urns" "github.com/stretchr/testify/assert" ) func TestParsePhone(t *testing.T) { testCases := []struct { - input string - country i18n.Country - expected URN + input string + country i18n.Country + expectedURN urns.URN + expectedErr string }{ - {" 0788383383 ", "RW", "tel:+250788383383"}, - {"+250788383383 ", "RW", "tel:+250788383383"}, // already has country code and leading + - {"250788383383 ", "RW", "tel:+250788383383"}, // already has country code and no leading + - {"+250788383383 ", "KE", "tel:+250788383383"}, // already has a different country code - {"(917)992-5253", "US", "tel:+19179925253"}, - {"800-CABBAGE", "US", "tel:+18002222243"}, - {"+62877747666", "ID", "tel:+62877747666"}, - {"0877747666", "ID", "tel:+62877747666"}, - {"07531669965", "GB", "tel:+447531669965"}, - {"263780821000", "ZW", "tel:+263780821000"}, - {"254791541111", "US", "tel:+254791541111"}, // international but missing + and wrong country + {"+250788123123", "", "tel:+250788123123", ""}, // international number fine without country + {"+250 788 123-123", "", "tel:+250788123123", ""}, // still fine if not E164 formatted + {"250788123123", "", "tel:+250788123123", ""}, // still fine without leading + because it's long enough - {"1", "RW", "tel:1"}, - {"123456", "RW", "tel:123456"}, - {"mtn", "RW", "tel:mtn"}, - {"!mtn!", "RW", "tel:mtn"}, // non tel chars stripped + {" 0788383383 ", "RW", "tel:+250788383383", ""}, // country code added + {"+250788383383 ", "RW", "tel:+250788383383", ""}, // already has country code and leading + + {"250788383383 ", "RW", "tel:+250788383383", ""}, // already has country code and no leading + + {"+250788383383 ", "KE", "tel:+250788383383", ""}, // already has a different country code + {"(917)992-5253", "US", "tel:+19179925253", ""}, // punctuation removed + {"800-CABBAGE", "US", "tel:+18002222243", ""}, // vanity numbers converted to digits + {"+62877747666", "ID", "tel:+62877747666", ""}, + {"0877747666", "ID", "tel:+62877747666", ""}, + {"07531669965", "GB", "tel:+447531669965", ""}, + {"263780821000", "ZW", "tel:+263780821000", ""}, + {"254791541111", "US", "tel:+254791541111", ""}, // international but missing + and wrong country - {"0788383383", "ZZ", NilURN}, // invalid country code - {"1234567890123456789012345678901234567890123456789012345678901234567890123456789", "RW", NilURN}, // too long - } + {"1234", "US", "tel:1234", ""}, + {"12345", "US", "tel:12345", ""}, + {"123", "RW", "tel:123", ""}, - for i, tc := range testCases { - urn, err := ParsePhone(tc.input, tc.country) + {"1", "RW", "", "the phone number supplied is not a number"}, + {"1234", "RW", "", "not a possible number or shortcode"}, // RW short codes are 3 digits + {"567-1234", "US", "", "not a possible number or shortcode"}, // only dialable locally + {"mtn", "RW", "", "the phone number supplied is not a number"}, - if tc.expected == NilURN { - assert.Error(t, err, "%d: expected error for %s, %s", i, tc.input, tc.country) - } else { - assert.NoError(t, err, "%d: unexpected error for %s, %s", i, tc.input, tc.country) - assert.Equal(t, tc.expected, urn, "%d: created URN mismatch for %s, %s", i, tc.input, tc.country) - } + {"0788383383", "ZZ", "", "invalid country code"}, // invalid country code + {"1234567890123456789012345678901234567890123456789012345678901234567890123456789", "RW", "", "the string supplied is too long to be a phone number"}, // too long } -} -func TestParsePhoneOrShortcode(t *testing.T) { - tcs := []struct { - input string - country i18n.Country - expected string - }{ - {"+250788123123", "", "+250788123123"}, // international number fine without country - {"+250 788 123-123", "", "+250788123123"}, // still fine if not E164 formatted - - {"0788123123", "RW", "+250788123123"}, // country code added - {" (206)555-1212 ", "US", "+12065551212"}, // punctiation removed - {"800-CABBAGE", "US", "+18002222243"}, // letters converted to numbers - {"12065551212", "US", "+12065551212"}, // country code but no + - {"10000", "US", "10000"}, // valid short code for US - - {"5912705", "US", ""}, // is only possible as a local number so ignored - } + for i, tc := range testCases { + urn, err := urns.ParsePhone(tc.input, tc.country) - for _, tc := range tcs { - parsed, err := parsePhoneOrShortcode(tc.input, tc.country) + if tc.expectedErr != "" { + if assert.EqualError(t, err, tc.expectedErr, "%d: expected error for %s, %s", i, tc.input, tc.country) { + assert.Equal(t, urns.NilURN, urn) - if tc.expected != "" { - assert.NoError(t, err, "unexpected error for '%s'", tc.input) - assert.Equal(t, tc.expected, parsed, "result mismatch for '%s'", tc.input) + // check parsing as just a number rather than a phone URN + num, err := urns.ParseNumber(tc.input, tc.country) + assert.EqualError(t, err, tc.expectedErr) + assert.Equal(t, "", num) + } } else { - assert.Error(t, err, "expected error for '%s'", tc.input) + if assert.NoError(t, err, "%d: unexpected error for %s, %s", i, tc.input, tc.country) { + assert.Equal(t, tc.expectedURN, urn, "%d: URN mismatch for %s, %s", i, tc.input, tc.country) + + // check parsing as just a number rather than a phone URN + num, err := urns.ParseNumber(tc.input, tc.country) + assert.NoError(t, err) + assert.Equal(t, tc.expectedURN.Path(), num) + } } } } + func TestToLocalPhone(t *testing.T) { tcs := []struct { - urn URN + urn urns.URN country i18n.Country expected string }{ @@ -86,6 +80,6 @@ func TestToLocalPhone(t *testing.T) { } for _, tc := range tcs { - assert.Equal(t, tc.expected, ToLocalPhone(tc.urn, tc.country), "local mismatch for '%s'", tc.urn) + assert.Equal(t, tc.expected, urns.ToLocalPhone(tc.urn, tc.country), "local mismatch for '%s'", tc.urn) } } diff --git a/urns/schemes.go b/urns/schemes.go index 8a17422..495b5be 100644 --- a/urns/schemes.go +++ b/urns/schemes.go @@ -13,7 +13,7 @@ var emailRegex = regexp.MustCompile(`^[^\s@]+@[^\s@]+$`) var freshchatRegex = regexp.MustCompile(`^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}/[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$`) var viberRegex = regexp.MustCompile(`^[a-zA-Z0-9_=/+]{1,24}$`) var lineRegex = regexp.MustCompile(`^[a-zA-Z0-9_]{1,36}$`) -var telRegex = regexp.MustCompile(`^\+?[a-zA-Z0-9]{1,64}$`) +var phoneRegex = regexp.MustCompile(`^\+?\d{1,64}$`) var twitterHandleRegex = regexp.MustCompile(`^[a-zA-Z0-9_]{1,15}$`) var webchatRegex = regexp.MustCompile(`^[a-zA-Z0-9]{24}(:[^\s@]+@[^\s@]+)?$`) @@ -129,7 +129,7 @@ var Phone = &Scheme{ // might have alpha characters in it return strings.ToUpper(path) }, - Validate: func(path string) bool { return telRegex.MatchString(path) }, + Validate: func(path string) bool { return phoneRegex.MatchString(path) }, Format: func(path string) string { parsed, err := phonenumbers.Parse(path, "") if err != nil { diff --git a/urns/urns_test.go b/urns/urns_test.go index 7d1a00b..c534a32 100644 --- a/urns/urns_test.go +++ b/urns/urns_test.go @@ -161,12 +161,11 @@ func TestValidate(t *testing.T) { {"tel:+250123", ""}, {"tel:1337", ""}, {"tel:1", ""}, // one digit shortcodes are a thing - {"tel:PRIZES", ""}, - {"tel:cellbroadcastchannel50", ""}, // invalid tel numbers - {"tel:07883 83383", "invalid path component"}, // can't have spaces {"tel:", "cannot be empty"}, // need a path + {"tel:07883 83383", "invalid path component"}, // can't have spaces + {"tel:PRIZES", "invalid path component"}, // vanity numbers should be parsed into real digits // twitter handles {"twitter:jimmyjo", ""}, From c9bf887938f14291233f3eed92f282e617935a7d Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 8 May 2024 11:30:07 -0500 Subject: [PATCH 109/141] Allow shortcodes that libphonenumber doesn't know about --- go.mod | 4 ++-- go.sum | 10 ++++------ urns/phone.go | 11 +++++++++-- urns/phone_test.go | 8 ++++++-- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 1223db4..decccd0 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/nyaruka/gocommon go 1.21 require ( - github.com/aws/aws-sdk-go v1.52.3 + github.com/aws/aws-sdk-go v1.52.4 github.com/gabriel-vasile/mimetype v1.4.3 github.com/go-chi/chi/v5 v5.0.12 github.com/go-playground/validator/v10 v10.20.0 @@ -14,7 +14,7 @@ require ( github.com/lib/pq v1.10.9 github.com/nyaruka/librato v1.1.1 github.com/nyaruka/null/v2 v2.0.3 - github.com/nyaruka/phonenumbers v1.3.4 + github.com/nyaruka/phonenumbers v1.3.5 github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.4.0 github.com/stretchr/testify v1.9.0 diff --git a/go.sum b/go.sum index 61cc752..5830e79 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/aws/aws-sdk-go v1.52.3 h1:BNPJmHOXNoM/iBWJKrvaQvJOweRcp3KLpzdb65CfQwU= -github.com/aws/aws-sdk-go v1.52.3/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.52.4 h1:9VsBVJ2TKf8xPP3+yIPGSYcEBIEymXsJzQoFgQuyvA0= +github.com/aws/aws-sdk-go v1.52.4/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -43,8 +43,8 @@ github.com/nyaruka/librato v1.1.1 h1:0nTYtJLl3Sn7lX3CuHsLf+nXy1k/tGV0OjVxLy3Et4s github.com/nyaruka/librato v1.1.1/go.mod h1:fme1Fu1PT2qvkaBZyw8WW+SrnFe2qeeCWpvqmAaKAKE= github.com/nyaruka/null/v2 v2.0.3 h1:rdmMRQyVzrOF3Jff/gpU/7BDR9mQX0lcLl4yImsA3kw= github.com/nyaruka/null/v2 v2.0.3/go.mod h1:OCVeCkCXwrg5/qE6RU0c1oUVZBy+ZDrT+xYg1XSaIWA= -github.com/nyaruka/phonenumbers v1.3.4 h1:bF1Wdh++fxw09s3surhVeBhXEcUKG07pHeP8HQXqjn8= -github.com/nyaruka/phonenumbers v1.3.4/go.mod h1:Ut+eFwikULbmCenH6InMKL9csUNLyxHuBLyfkpum11s= +github.com/nyaruka/phonenumbers v1.3.5 h1:WZLbQn61j2E1OFnvpUTYbK/6hViUgl6tppJ55/E2iQM= +github.com/nyaruka/phonenumbers v1.3.5/go.mod h1:Ut+eFwikULbmCenH6InMKL9csUNLyxHuBLyfkpum11s= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -68,8 +68,6 @@ golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= diff --git a/urns/phone.go b/urns/phone.go index 8b9ba3f..8ebd7e8 100644 --- a/urns/phone.go +++ b/urns/phone.go @@ -11,6 +11,7 @@ import ( ) var nonTelCharsRegex = regexp.MustCompile(`[^0-9A-Za-z]`) +var altShortCodeRegex = regexp.MustCompile(`^[1-9][0-9]{2,5}$`) // ParsePhone returns a validated phone URN or an error. func ParsePhone(raw string, country i18n.Country) (URN, error) { @@ -46,8 +47,8 @@ func ParseNumber(raw string, country i18n.Country) (string, error) { } // tries to extract a valid phone number or shortcode from the given string -func parsePhoneOrShortcode(raw string, country i18n.Country) (string, error) { - parsed, err := phonenumbers.Parse(raw, string(country)) +func parsePhoneOrShortcode(input string, country i18n.Country) (string, error) { + parsed, err := phonenumbers.Parse(input, string(country)) if err != nil { return "", err } @@ -60,6 +61,12 @@ func parsePhoneOrShortcode(raw string, country i18n.Country) (string, error) { return phonenumbers.Format(parsed, phonenumbers.NATIONAL), nil } + // it seems libphonenumber's metadata regarding shortcodes is lacking so we also accept any sequence of 3-6 digits + // that doesn't start with a zero as a shortcode + if altShortCodeRegex.MatchString(input) { + return input, nil + } + return "", errors.New("not a possible number or shortcode") } diff --git a/urns/phone_test.go b/urns/phone_test.go index e0486df..e9edd6e 100644 --- a/urns/phone_test.go +++ b/urns/phone_test.go @@ -34,12 +34,16 @@ func TestParsePhone(t *testing.T) { {"1234", "US", "tel:1234", ""}, {"12345", "US", "tel:12345", ""}, {"123", "RW", "tel:123", ""}, + {"8080", "EC", "tel:8080", ""}, + // inputs that fail parsing by libphonenumber {"1", "RW", "", "the phone number supplied is not a number"}, - {"1234", "RW", "", "not a possible number or shortcode"}, // RW short codes are 3 digits - {"567-1234", "US", "", "not a possible number or shortcode"}, // only dialable locally {"mtn", "RW", "", "the phone number supplied is not a number"}, + // inputa that fail checking for possible number or shortcode + {"99", "EC", "", "not a possible number or shortcode"}, + {"567-1234", "US", "", "not a possible number or shortcode"}, // only dialable locally + {"0788383383", "ZZ", "", "invalid country code"}, // invalid country code {"1234567890123456789012345678901234567890123456789012345678901234567890123456789", "RW", "", "the string supplied is too long to be a phone number"}, // too long } From 8f1fb9926281375f048d1be14b00edc3dd968ecb Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 8 May 2024 11:49:13 -0500 Subject: [PATCH 110/141] Update CHANGELOG.md for v1.54.4 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eda08e4..2f78164 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.54.4 (2024-05-08) +------------------------- + * Make phone parsing stricter + v1.54.3 (2024-05-07) ------------------------- * Tweak urns.NewFromParts so scheme is a string and export the urns.Schemes slice instead of exposing via function From 739dca64c593aafd78b2b3ea1a54adaa325d78e0 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 8 May 2024 13:03:44 -0500 Subject: [PATCH 111/141] Add arg to urns.ParseNumber to determine if it allows short codes --- urns/phone.go | 26 ++++++++++++++------------ urns/phone_test.go | 44 +++++++++++++++++++++++++++++++++----------- 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/urns/phone.go b/urns/phone.go index 8ebd7e8..22b5c3e 100644 --- a/urns/phone.go +++ b/urns/phone.go @@ -15,7 +15,7 @@ var altShortCodeRegex = regexp.MustCompile(`^[1-9][0-9]{2,5}$`) // ParsePhone returns a validated phone URN or an error. func ParsePhone(raw string, country i18n.Country) (URN, error) { - number, err := ParseNumber(raw, country) + number, err := ParseNumber(raw, country, true) if err != nil { return "", err } @@ -24,7 +24,7 @@ func ParsePhone(raw string, country i18n.Country) (URN, error) { } // ParseNumber tries to extact a possible number or shortcode from the given string, returning an error if it can't. -func ParseNumber(raw string, country i18n.Country) (string, error) { +func ParseNumber(raw string, country i18n.Country, allowShort bool) (string, error) { // strip all non-alphanumeric characters.. only preserving an optional leading + raw = strings.TrimSpace(raw) hasPlus := strings.HasPrefix(raw, "+") @@ -38,7 +38,7 @@ func ParseNumber(raw string, country i18n.Country) (string, error) { raw = "+" + raw } - number, err := parsePhoneOrShortcode(raw, country) + number, err := parsePossibleNumber(raw, country, allowShort) if err != nil { return "", err } @@ -47,7 +47,7 @@ func ParseNumber(raw string, country i18n.Country) (string, error) { } // tries to extract a valid phone number or shortcode from the given string -func parsePhoneOrShortcode(input string, country i18n.Country) (string, error) { +func parsePossibleNumber(input string, country i18n.Country, allowShort bool) (string, error) { parsed, err := phonenumbers.Parse(input, string(country)) if err != nil { return "", err @@ -57,17 +57,19 @@ func parsePhoneOrShortcode(input string, country i18n.Country) (string, error) { return phonenumbers.Format(parsed, phonenumbers.E164), nil } - if phonenumbers.IsPossibleShortNumberForRegion(parsed, string(country)) { - return phonenumbers.Format(parsed, phonenumbers.NATIONAL), nil - } + if allowShort { + if phonenumbers.IsPossibleShortNumberForRegion(parsed, string(country)) { + return phonenumbers.Format(parsed, phonenumbers.NATIONAL), nil + } - // it seems libphonenumber's metadata regarding shortcodes is lacking so we also accept any sequence of 3-6 digits - // that doesn't start with a zero as a shortcode - if altShortCodeRegex.MatchString(input) { - return input, nil + // it seems libphonenumber's metadata regarding shortcodes is lacking so we also accept any sequence of 3-6 digits + // that doesn't start with a zero as a shortcode + if altShortCodeRegex.MatchString(input) { + return input, nil + } } - return "", errors.New("not a possible number or shortcode") + return "", errors.New("not a possible number") } // ToLocalPhone converts a phone URN to a local phone number.. without any leading zeros. Kinda weird but used by diff --git a/urns/phone_test.go b/urns/phone_test.go index e9edd6e..3566141 100644 --- a/urns/phone_test.go +++ b/urns/phone_test.go @@ -39,10 +39,11 @@ func TestParsePhone(t *testing.T) { // inputs that fail parsing by libphonenumber {"1", "RW", "", "the phone number supplied is not a number"}, {"mtn", "RW", "", "the phone number supplied is not a number"}, + {"1234", "", "", "invalid country code"}, // can't parse short without country // inputa that fail checking for possible number or shortcode - {"99", "EC", "", "not a possible number or shortcode"}, - {"567-1234", "US", "", "not a possible number or shortcode"}, // only dialable locally + {"99", "EC", "", "not a possible number"}, + {"567-1234", "US", "", "not a possible number"}, // only dialable locally {"0788383383", "ZZ", "", "invalid country code"}, // invalid country code {"1234567890123456789012345678901234567890123456789012345678901234567890123456789", "RW", "", "the string supplied is too long to be a phone number"}, // too long @@ -54,20 +55,41 @@ func TestParsePhone(t *testing.T) { if tc.expectedErr != "" { if assert.EqualError(t, err, tc.expectedErr, "%d: expected error for %s, %s", i, tc.input, tc.country) { assert.Equal(t, urns.NilURN, urn) - - // check parsing as just a number rather than a phone URN - num, err := urns.ParseNumber(tc.input, tc.country) - assert.EqualError(t, err, tc.expectedErr) - assert.Equal(t, "", num) } } else { if assert.NoError(t, err, "%d: unexpected error for %s, %s", i, tc.input, tc.country) { assert.Equal(t, tc.expectedURN, urn, "%d: URN mismatch for %s, %s", i, tc.input, tc.country) + } + } + } +} - // check parsing as just a number rather than a phone URN - num, err := urns.ParseNumber(tc.input, tc.country) - assert.NoError(t, err) - assert.Equal(t, tc.expectedURN.Path(), num) +func TestParseNumber(t *testing.T) { + testCases := []struct { + input string + country i18n.Country + allowShort bool + expectedNum string + expectedErr string + }{ + {"+250788123123", "", true, "+250788123123", ""}, + {"+250788123123", "", false, "+250788123123", ""}, + {"0788123123", "RW", true, "+250788123123", ""}, + {"0788123123", "RW", false, "+250788123123", ""}, + {"123", "RW", true, "123", ""}, + {"123", "RW", false, "", "not a possible number"}, + } + + for i, tc := range testCases { + num, err := urns.ParseNumber(tc.input, tc.country, tc.allowShort) + + if tc.expectedErr != "" { + if assert.EqualError(t, err, tc.expectedErr, "%d: expected error for %s, %s", i, tc.input, tc.country) { + assert.Equal(t, "", num) + } + } else { + if assert.NoError(t, err, "%d: unexpected error for %s, %s", i, tc.input, tc.country) { + assert.Equal(t, tc.expectedNum, num, "%d: URN mismatch for %s, %s", i, tc.input, tc.country) } } } From 274ad75b645cfbdbfc8450dbece41792d51f5079 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 8 May 2024 13:08:43 -0500 Subject: [PATCH 112/141] Phone URN normalization should re-parse --- urns/schemes.go | 8 ++++++-- urns/urns_test.go | 10 ++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/urns/schemes.go b/urns/schemes.go index 495b5be..4189f83 100644 --- a/urns/schemes.go +++ b/urns/schemes.go @@ -126,8 +126,12 @@ var Phone = &Scheme{ Prefix: "tel", Name: "Phone", Normalize: func(path string) string { - // might have alpha characters in it - return strings.ToUpper(path) + // try to parse again + norm, err := ParseNumber(path, "", true) + if err != nil { + return path + } + return norm }, Validate: func(path string) bool { return phoneRegex.MatchString(path) }, Format: func(path string) string { diff --git a/urns/urns_test.go b/urns/urns_test.go index c534a32..3e771ea 100644 --- a/urns/urns_test.go +++ b/urns/urns_test.go @@ -91,14 +91,16 @@ func TestNormalize(t *testing.T) { rawURN urns.URN expected urns.URN }{ - // valid tel numbers left as they are + // tel numbers re-parsed {"tel:+250788383383", "tel:+250788383383"}, + {"tel:250788383383", "tel:+250788383383"}, // + added + {"tel:1(800)CABBAGE", "tel:+18002222243"}, {"tel:+62877747666", "tel:+62877747666"}, {"tel:+2203693333", "tel:+2203693333"}, - // non-standard phone numbers - {"tel:12345", "tel:12345"}, - {"tel:mtn", "tel:MTN"}, + // or left as they are if not valid + {"tel:000", "tel:000"}, + {"tel:mtn", "tel:mtn"}, {"tel:+12345678901234567890", "tel:+12345678901234567890"}, // twitter handles remove @ From 6defd868bd9dd892caf1e9393408775ede604b2d Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 8 May 2024 13:09:28 -0500 Subject: [PATCH 113/141] Update CHANGELOG.md for v1.54.5 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f78164..9077977 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +v1.54.5 (2024-05-08) +------------------------- + * Phone URN normalization should re-parse + * Add arg to urns.ParseNumber to determine if it allows short codes + v1.54.4 (2024-05-08) ------------------------- * Make phone parsing stricter From e7e281df50b51fe6d9320a46514c7f4f0deb11da Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 8 May 2024 13:34:48 -0500 Subject: [PATCH 114/141] Tweak urns.ParseNumber so addition of a + is a fallback --- urns/phone.go | 15 +++++++++------ urns/phone_test.go | 1 + 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/urns/phone.go b/urns/phone.go index 22b5c3e..f79c14c 100644 --- a/urns/phone.go +++ b/urns/phone.go @@ -33,14 +33,17 @@ func ParseNumber(raw string, country i18n.Country, allowShort bool) (string, err raw = "+" + raw } - // if we're sufficiently long and don't start with a 0 then add a + - if len(raw) >= 11 && !strings.HasPrefix(raw, "0") { - raw = "+" + raw - } - number, err := parsePossibleNumber(raw, country, allowShort) if err != nil { - return "", err + // if we're sufficiently long and don't start with a 0 then add a + + if len(raw) >= 11 && !strings.HasPrefix(raw, "0") { + raw = "+" + raw + } + + number, err = parsePossibleNumber(raw, country, allowShort) + if err != nil { + return "", err + } } return number, nil diff --git a/urns/phone_test.go b/urns/phone_test.go index 3566141..9bff19e 100644 --- a/urns/phone_test.go +++ b/urns/phone_test.go @@ -26,6 +26,7 @@ func TestParsePhone(t *testing.T) { {"(917)992-5253", "US", "tel:+19179925253", ""}, // punctuation removed {"800-CABBAGE", "US", "tel:+18002222243", ""}, // vanity numbers converted to digits {"+62877747666", "ID", "tel:+62877747666", ""}, + {"812111005611", "ID", "tel:+62812111005611", ""}, {"0877747666", "ID", "tel:+62877747666", ""}, {"07531669965", "GB", "tel:+447531669965", ""}, {"263780821000", "ZW", "tel:+263780821000", ""}, From 0c3ff584a3caa08141feaf6ab577e8a557c971c5 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 8 May 2024 13:35:23 -0500 Subject: [PATCH 115/141] Update CHANGELOG.md for v1.54.6 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9077977..9ea1617 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.54.6 (2024-05-08) +------------------------- + * Tweak urns.ParseNumber so addition of a + is a fallback + v1.54.5 (2024-05-08) ------------------------- * Phone URN normalization should re-parse From 9e8109f88e4e488861207d0e84db495aec3325da Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 9 May 2024 08:42:56 -0500 Subject: [PATCH 116/141] Always trim whitespace on all parts of new URNs --- urns/urns.go | 7 ++++++- urns/urns_test.go | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/urns/urns.go b/urns/urns.go index 001a47d..68aff64 100644 --- a/urns/urns.go +++ b/urns/urns.go @@ -36,7 +36,12 @@ func newFromParts(scheme, path, query, display string) URN { // NewFromParts returns a validated URN for the given scheme, path, query and display func NewFromParts(scheme, path, query, display string) (URN, error) { - urn := newFromParts(scheme, path, query, display) + urn := newFromParts( + strings.TrimSpace(scheme), + strings.TrimSpace(path), + strings.TrimSpace(query), + strings.TrimSpace(display), + ) if err := urn.Validate(); err != nil { return NilURN, err diff --git a/urns/urns_test.go b/urns/urns_test.go index 3e771ea..cad89e0 100644 --- a/urns/urns_test.go +++ b/urns/urns_test.go @@ -55,6 +55,7 @@ func TestNewFromParts(t *testing.T) { identity urns.URN hasError bool }{ + {urns.External, " 87654 \t\n", "", "ext:87654", "ext:87654", false}, {urns.Phone, "+250788383383", "", "tel:+250788383383", "tel:+250788383383", false}, {urns.Twitter, "hello", "", "twitter:hello", "twitter:hello", false}, {urns.Facebook, "12345", "", "facebook:12345", "facebook:12345", false}, From b54456b76c87ee31d7fc6ec2fa3012851bc2282a Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 9 May 2024 08:48:06 -0500 Subject: [PATCH 117/141] Update CHANGELOG.md for v1.54.7 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ea1617..19b47d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.54.7 (2024-05-09) +------------------------- + * Always trim whitespace on all parts of new URNs + v1.54.6 (2024-05-08) ------------------------- * Tweak urns.ParseNumber so addition of a + is a fallback From 36f0d12056a0d476829ee343225d9051e0cc7e0b Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 9 May 2024 09:37:52 -0500 Subject: [PATCH 118/141] Ensure that new URNs are normalized and change signaure of urns.NewFromParts to take url.Values --- urns/phone.go | 2 +- urns/urns.go | 21 ++++++++++++--------- urns/urns_test.go | 27 ++++++++++++++++----------- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/urns/phone.go b/urns/phone.go index f79c14c..703b8e6 100644 --- a/urns/phone.go +++ b/urns/phone.go @@ -20,7 +20,7 @@ func ParsePhone(raw string, country i18n.Country) (URN, error) { return "", err } - return NewFromParts(Phone.Prefix, number, "", "") + return NewFromParts(Phone.Prefix, number, nil, "") } // ParseNumber tries to extact a possible number or shortcode from the given string, returning an error if it can't. diff --git a/urns/urns.go b/urns/urns.go index 68aff64..bcfddbd 100644 --- a/urns/urns.go +++ b/urns/urns.go @@ -34,14 +34,16 @@ func newFromParts(scheme, path, query, display string) URN { return URN(u.String()) } -// NewFromParts returns a validated URN for the given scheme, path, query and display -func NewFromParts(scheme, path, query, display string) (URN, error) { - urn := newFromParts( - strings.TrimSpace(scheme), - strings.TrimSpace(path), - strings.TrimSpace(query), - strings.TrimSpace(display), - ) +// NewFromParts returns a normalized and validated URN for the given scheme, path, query and display +func NewFromParts(scheme, path string, query url.Values, display string) (URN, error) { + var queryStr string + if query != nil { + queryStr = query.Encode() + } + + urn := newFromParts(scheme, path, queryStr, display) + + urn = urn.Normalize() if err := urn.Validate(); err != nil { return NilURN, err @@ -51,7 +53,7 @@ func NewFromParts(scheme, path, query, display string) (URN, error) { // New returns a validated URN for the given scheme and path func New(scheme *Scheme, path string) (URN, error) { - return NewFromParts(scheme.Prefix, path, "", "") + return NewFromParts(scheme.Prefix, path, nil, "") } // Parse parses a URN from the given string. The returned URN is only guaranteed to be structurally valid. @@ -80,6 +82,7 @@ func (u URN) Normalize() URN { s := schemeByPrefix[scheme] path = strings.TrimSpace(path) + display = strings.TrimSpace(display) if s != nil && s.Normalize != nil { path = s.Normalize(path) diff --git a/urns/urns_test.go b/urns/urns_test.go index cad89e0..93792d0 100644 --- a/urns/urns_test.go +++ b/urns/urns_test.go @@ -50,25 +50,30 @@ func TestNewFromParts(t *testing.T) { testCases := []struct { scheme *urns.Scheme path string + query url.Values display string expected urns.URN identity urns.URN hasError bool }{ - {urns.External, " 87654 \t\n", "", "ext:87654", "ext:87654", false}, - {urns.Phone, "+250788383383", "", "tel:+250788383383", "tel:+250788383383", false}, - {urns.Twitter, "hello", "", "twitter:hello", "twitter:hello", false}, - {urns.Facebook, "12345", "", "facebook:12345", "facebook:12345", false}, - {urns.Instagram, "12345", "", "instagram:12345", "instagram:12345", false}, - {urns.Telegram, "12345", "Jane", "telegram:12345#Jane", "telegram:12345", false}, - {urns.WhatsApp, "12345", "", "whatsapp:12345", "whatsapp:12345", false}, - {urns.Viber, "", "", urns.NilURN, ":", true}, - {urns.Discord, "732326982863421591", "", "discord:732326982863421591", "discord:732326982863421591", false}, - {urns.WebChat, "123456789012345678901234", "", "webchat:123456789012345678901234", "webchat:123456789012345678901234", false}, + {urns.External, " Aa123 \t\n", nil, "", "ext:Aa123", "ext:Aa123", false}, // whitespace trimmed + {urns.External, "12345", url.Values{"id": []string{"2"}}, "cool", "ext:12345?id=2#cool", "ext:12345", false}, + {urns.Email, "BoB@NYARUKA.com", nil, "", "mailto:bob@nyaruka.com", "mailto:bob@nyaruka.com", false}, // emails lowercased + {urns.Phone, "+250788383383", nil, "", "tel:+250788383383", "tel:+250788383383", false}, + {urns.Twitter, "1234", nil, "bob", "twitter:1234#bob", "twitter:1234", false}, + {urns.Facebook, "12345", nil, "", "facebook:12345", "facebook:12345", false}, + {urns.Instagram, "12345", nil, "", "instagram:12345", "instagram:12345", false}, + {urns.Telegram, "12345", nil, "Jane", "telegram:12345#Jane", "telegram:12345", false}, + {urns.WhatsApp, "12345", nil, "", "whatsapp:12345", "whatsapp:12345", false}, + {urns.Discord, "732326982863421591", nil, "", "discord:732326982863421591", "discord:732326982863421591", false}, + {urns.WebChat, "123456789012345678901234", nil, "", "webchat:123456789012345678901234", "webchat:123456789012345678901234", false}, + {urns.WebChat, "123456789012345678901234", nil, "bob@nyaruka.com", "webchat:123456789012345678901234#bob@nyaruka.com", "webchat:123456789012345678901234", false}, + + {urns.Viber, "", nil, "", urns.NilURN, ":", true}, } for _, tc := range testCases { - urn, err := urns.NewFromParts(tc.scheme.Prefix, tc.path, "", tc.display) + urn, err := urns.NewFromParts(tc.scheme.Prefix, tc.path, tc.query, tc.display) identity := urn.Identity() assert.Equal(t, tc.expected, urn, "from parts mismatch for: %s, %s, %s", tc.scheme, tc.path, tc.display) From 13e604142f9f7c243da322c15a6c87e9ffcd3b2d Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 9 May 2024 09:38:41 -0500 Subject: [PATCH 119/141] Update CHANGELOG.md for v1.54.8 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19b47d7..3fc35a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.54.8 (2024-05-09) +------------------------- + * Ensure that new URNs are normalized and change signaure of urns.NewFromParts to take url.Values + v1.54.7 (2024-05-09) ------------------------- * Always trim whitespace on all parts of new URNs From 9d5c82bad58eb0c2101a4fc86256f8ffaac8d2b1 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 9 May 2024 09:53:20 -0500 Subject: [PATCH 120/141] Add test to ensure normalization is idempotent --- urns/urns_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/urns/urns_test.go b/urns/urns_test.go index 93792d0..b1a8df1 100644 --- a/urns/urns_test.go +++ b/urns/urns_test.go @@ -123,6 +123,10 @@ func TestNormalize(t *testing.T) { for _, tc := range testCases { normalized := tc.rawURN.Normalize() assert.Equal(t, tc.expected, normalized, "normalize mismatch for '%s'", tc.rawURN) + + // check we're idempotent + normalized = normalized.Normalize() + assert.Equal(t, tc.expected, normalized, "re-normalize mismatch for '%s'", tc.rawURN) } } From ccd41ba93489072eebeb05c42d2aa107668e6eca Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 9 May 2024 15:17:14 -0500 Subject: [PATCH 121/141] Allow sender id phone URNs --- urns/phone.go | 53 ++++++++++++++-------- urns/phone_test.go | 109 ++++++++++++++++++++++++++------------------- urns/schemes.go | 4 +- urns/urns_test.go | 9 ++-- 4 files changed, 105 insertions(+), 70 deletions(-) diff --git a/urns/phone.go b/urns/phone.go index 703b8e6..51a6dc0 100644 --- a/urns/phone.go +++ b/urns/phone.go @@ -12,10 +12,13 @@ import ( var nonTelCharsRegex = regexp.MustCompile(`[^0-9A-Za-z]`) var altShortCodeRegex = regexp.MustCompile(`^[1-9][0-9]{2,5}$`) +var senderIDRegex = regexp.MustCompile(`^[0-9A-Za-z]{3,64}$`) + +var ErrNotNumber = errors.New("not a possible number") // ParsePhone returns a validated phone URN or an error. -func ParsePhone(raw string, country i18n.Country) (URN, error) { - number, err := ParseNumber(raw, country, true) +func ParsePhone(raw string, country i18n.Country, allowShort, allowSenderID bool) (URN, error) { + number, err := ParseNumber(raw, country, allowShort, allowSenderID) if err != nil { return "", err } @@ -24,7 +27,7 @@ func ParsePhone(raw string, country i18n.Country) (URN, error) { } // ParseNumber tries to extact a possible number or shortcode from the given string, returning an error if it can't. -func ParseNumber(raw string, country i18n.Country, allowShort bool) (string, error) { +func ParseNumber(raw string, country i18n.Country, allowShort, allowSenderID bool) (string, error) { // strip all non-alphanumeric characters.. only preserving an optional leading + raw = strings.TrimSpace(raw) hasPlus := strings.HasPrefix(raw, "+") @@ -33,34 +36,41 @@ func ParseNumber(raw string, country i18n.Country, allowShort bool) (string, err raw = "+" + raw } - number, err := parsePossibleNumber(raw, country, allowShort) + number, err := parsePossibleNumber(raw, country, allowShort, allowSenderID) if err != nil { - // if we're sufficiently long and don't start with a 0 then add a + - if len(raw) >= 11 && !strings.HasPrefix(raw, "0") { - raw = "+" + raw - } - - number, err = parsePossibleNumber(raw, country, allowShort) - if err != nil { - return "", err - } + return "", err } return number, nil } // tries to extract a valid phone number or shortcode from the given string -func parsePossibleNumber(input string, country i18n.Country, allowShort bool) (string, error) { +func parsePossibleNumber(input string, country i18n.Country, allowShort, allowSenderID bool) (string, error) { + // try parsing as is, only bailing if we have a junk country code parsed, err := phonenumbers.Parse(input, string(country)) - if err != nil { + if country != "" && err == phonenumbers.ErrInvalidCountryCode { return "", err } - if phonenumbers.IsPossibleNumberWithReason(parsed) == phonenumbers.IS_POSSIBLE { - return phonenumbers.Format(parsed, phonenumbers.E164), nil + // check to see if we have a possible number + if err == nil { + if phonenumbers.IsPossibleNumberWithReason(parsed) == phonenumbers.IS_POSSIBLE { + return phonenumbers.Format(parsed, phonenumbers.E164), nil + } + } + + // if we're sufficiently long and don't start with a 0, try adding a + prefix and re-parsing + if len(input) >= 11 && !strings.HasPrefix(input, "0") { + parsedWithPlus, err := phonenumbers.Parse("+"+input, string(country)) + if err == nil { + if phonenumbers.IsPossibleNumberWithReason(parsedWithPlus) == phonenumbers.IS_POSSIBLE { + return phonenumbers.Format(parsedWithPlus, phonenumbers.E164), nil + } + } } - if allowShort { + // if we allow short codes and we have a country.. check for one + if parsed != nil && country != i18n.NilCountry && allowShort { if phonenumbers.IsPossibleShortNumberForRegion(parsed, string(country)) { return phonenumbers.Format(parsed, phonenumbers.NATIONAL), nil } @@ -72,7 +82,12 @@ func parsePossibleNumber(input string, country i18n.Country, allowShort bool) (s } } - return "", errors.New("not a possible number") + // carriers send all sorts of junk, so if we're being very lenient... + if allowSenderID && senderIDRegex.MatchString(input) { + return strings.ToLower(input), nil + } + + return "", ErrNotNumber } // ToLocalPhone converts a phone URN to a local phone number.. without any leading zeros. Kinda weird but used by diff --git a/urns/phone_test.go b/urns/phone_test.go index 9bff19e..2062031 100644 --- a/urns/phone_test.go +++ b/urns/phone_test.go @@ -10,48 +10,52 @@ import ( func TestParsePhone(t *testing.T) { testCases := []struct { - input string - country i18n.Country - expectedURN urns.URN - expectedErr string + input string + country i18n.Country + allowShort bool + allowSenderID bool + expectedURN urns.URN + expectedErr string }{ - {"+250788123123", "", "tel:+250788123123", ""}, // international number fine without country - {"+250 788 123-123", "", "tel:+250788123123", ""}, // still fine if not E164 formatted - {"250788123123", "", "tel:+250788123123", ""}, // still fine without leading + because it's long enough - - {" 0788383383 ", "RW", "tel:+250788383383", ""}, // country code added - {"+250788383383 ", "RW", "tel:+250788383383", ""}, // already has country code and leading + - {"250788383383 ", "RW", "tel:+250788383383", ""}, // already has country code and no leading + - {"+250788383383 ", "KE", "tel:+250788383383", ""}, // already has a different country code - {"(917)992-5253", "US", "tel:+19179925253", ""}, // punctuation removed - {"800-CABBAGE", "US", "tel:+18002222243", ""}, // vanity numbers converted to digits - {"+62877747666", "ID", "tel:+62877747666", ""}, - {"812111005611", "ID", "tel:+62812111005611", ""}, - {"0877747666", "ID", "tel:+62877747666", ""}, - {"07531669965", "GB", "tel:+447531669965", ""}, - {"263780821000", "ZW", "tel:+263780821000", ""}, - {"254791541111", "US", "tel:+254791541111", ""}, // international but missing + and wrong country - - {"1234", "US", "tel:1234", ""}, - {"12345", "US", "tel:12345", ""}, - {"123", "RW", "tel:123", ""}, - {"8080", "EC", "tel:8080", ""}, + {"+250788123123", "", true, true, "tel:+250788123123", ""}, // international number fine without country + {"+250 788 123-123", "", true, true, "tel:+250788123123", ""}, // still fine if not E164 formatted + {"250788123123", "", true, true, "tel:+250788123123", ""}, // still fine without leading + because it's long enough + {" 0788383383 ", "RW", true, true, "tel:+250788383383", ""}, // country code added + {"+250788383383 ", "RW", true, true, "tel:+250788383383", ""}, // already has country code and leading + + {"250788383383 ", "RW", true, true, "tel:+250788383383", ""}, // already has country code and no leading + + {"+250788383383 ", "KE", true, true, "tel:+250788383383", ""}, // already has a different country code + {"(917)992-5253", "US", true, true, "tel:+19179925253", ""}, // punctuation removed + {"800-CABBAGE", "US", true, true, "tel:+18002222243", ""}, // vanity numbers converted to digits + {"+62877747666", "ID", true, true, "tel:+62877747666", ""}, + {"812111005611", "ID", true, true, "tel:+62812111005611", ""}, + {"0877747666", "ID", true, true, "tel:+62877747666", ""}, + {"07531669965", "GB", true, true, "tel:+447531669965", ""}, + {"263780821000", "ZW", true, true, "tel:+263780821000", ""}, + {"254791541111", "US", true, true, "tel:+254791541111", ""}, // international but missing + and wrong country + + {"123456", "US", true, false, "tel:123456", ""}, + {"12345", "US", true, false, "tel:12345", ""}, + {"1234", "US", true, false, "tel:1234", ""}, + {"1234", "US", false, false, "", "not a possible number"}, + {"1234", "", true, false, "", "not a possible number"}, // can't parse short without country + {"123", "RW", true, false, "tel:123", ""}, + {"8080", "EC", true, false, "tel:8080", ""}, + + {"PRIZES", "RW", true, false, "", "not a possible number"}, // inputs that fail parsing by libphonenumber - {"1", "RW", "", "the phone number supplied is not a number"}, - {"mtn", "RW", "", "the phone number supplied is not a number"}, - {"1234", "", "", "invalid country code"}, // can't parse short without country + {"1", "RW", true, false, "", "not a possible number"}, - // inputa that fail checking for possible number or shortcode - {"99", "EC", "", "not a possible number"}, - {"567-1234", "US", "", "not a possible number"}, // only dialable locally + // input that fails checking for possible number or shortcode + {"99", "EC", true, false, "", "not a possible number"}, + {"567-1234", "US", true, false, "", "not a possible number"}, // only dialable locally - {"0788383383", "ZZ", "", "invalid country code"}, // invalid country code - {"1234567890123456789012345678901234567890123456789012345678901234567890123456789", "RW", "", "the string supplied is too long to be a phone number"}, // too long + {"0788383383", "ZZ", true, false, "", "invalid country code"}, // invalid country code + {"1234567890123456789012345678901234567890123456789012345678901234567890123456789", "RW", true, false, "", "not a possible number"}, // too long } for i, tc := range testCases { - urn, err := urns.ParsePhone(tc.input, tc.country) + urn, err := urns.ParsePhone(tc.input, tc.country, tc.allowShort, tc.allowSenderID) if tc.expectedErr != "" { if assert.EqualError(t, err, tc.expectedErr, "%d: expected error for %s, %s", i, tc.input, tc.country) { @@ -60,6 +64,9 @@ func TestParsePhone(t *testing.T) { } else { if assert.NoError(t, err, "%d: unexpected error for %s, %s", i, tc.input, tc.country) { assert.Equal(t, tc.expectedURN, urn, "%d: URN mismatch for %s, %s", i, tc.input, tc.country) + + // check the returned URN is valid + assert.Nil(t, urn.Validate()) } } } @@ -67,22 +74,32 @@ func TestParsePhone(t *testing.T) { func TestParseNumber(t *testing.T) { testCases := []struct { - input string - country i18n.Country - allowShort bool - expectedNum string - expectedErr string + input string + country i18n.Country + allowShort bool + allowSenderID bool + expectedNum string + expectedErr string }{ - {"+250788123123", "", true, "+250788123123", ""}, - {"+250788123123", "", false, "+250788123123", ""}, - {"0788123123", "RW", true, "+250788123123", ""}, - {"0788123123", "RW", false, "+250788123123", ""}, - {"123", "RW", true, "123", ""}, - {"123", "RW", false, "", "not a possible number"}, + {"+250788123123", "", false, false, "+250788123123", ""}, + {"+250788123123", "", true, false, "+250788123123", ""}, + {"+250788123123", "", true, true, "+250788123123", ""}, + + {"0788123123", "RW", false, false, "+250788123123", ""}, + {"0788123123", "RW", true, false, "+250788123123", ""}, + {"0788123123", "RW", true, true, "+250788123123", ""}, + + {"123", "RW", false, false, "", "not a possible number"}, + {"123", "RW", true, false, "123", ""}, + {"123", "RW", true, true, "123", ""}, + + {"PRIZES", "RW", false, false, "", "not a possible number"}, + {"PRIZES", "RW", true, false, "", "not a possible number"}, + {"PRIZES", "RW", true, true, "prizes", ""}, } for i, tc := range testCases { - num, err := urns.ParseNumber(tc.input, tc.country, tc.allowShort) + num, err := urns.ParseNumber(tc.input, tc.country, tc.allowShort, tc.allowSenderID) if tc.expectedErr != "" { if assert.EqualError(t, err, tc.expectedErr, "%d: expected error for %s, %s", i, tc.input, tc.country) { diff --git a/urns/schemes.go b/urns/schemes.go index 4189f83..379e431 100644 --- a/urns/schemes.go +++ b/urns/schemes.go @@ -13,7 +13,7 @@ var emailRegex = regexp.MustCompile(`^[^\s@]+@[^\s@]+$`) var freshchatRegex = regexp.MustCompile(`^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}/[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$`) var viberRegex = regexp.MustCompile(`^[a-zA-Z0-9_=/+]{1,24}$`) var lineRegex = regexp.MustCompile(`^[a-zA-Z0-9_]{1,36}$`) -var phoneRegex = regexp.MustCompile(`^\+?\d{1,64}$`) +var phoneRegex = regexp.MustCompile(`^((\+[0-9]{7,15})|([a-z0-9]{1,64}))$`) // E164 or short code or sender ID var twitterHandleRegex = regexp.MustCompile(`^[a-zA-Z0-9_]{1,15}$`) var webchatRegex = regexp.MustCompile(`^[a-zA-Z0-9]{24}(:[^\s@]+@[^\s@]+)?$`) @@ -127,7 +127,7 @@ var Phone = &Scheme{ Name: "Phone", Normalize: func(path string) string { // try to parse again - norm, err := ParseNumber(path, "", true) + norm, err := ParseNumber(path, "", true, true) if err != nil { return path } diff --git a/urns/urns_test.go b/urns/urns_test.go index b1a8df1..80fe493 100644 --- a/urns/urns_test.go +++ b/urns/urns_test.go @@ -170,14 +170,17 @@ func TestValidate(t *testing.T) { // valid tel numbers {"tel:+250788383383", ""}, {"tel:+250788383383", ""}, - {"tel:+250123", ""}, + {"tel:250123", ""}, {"tel:1337", ""}, - {"tel:1", ""}, // one digit shortcodes are a thing + {"tel:1", ""}, + {"tel:prizes", ""}, // invalid tel numbers {"tel:", "cannot be empty"}, // need a path {"tel:07883 83383", "invalid path component"}, // can't have spaces - {"tel:PRIZES", "invalid path component"}, // vanity numbers should be parsed into real digits + {"tel:PRIZES", "invalid path component"}, // we allow letters but we always lowercase + {"tel:+123", "invalid path component"}, // too short to have a + + {"tel:+prizes", "invalid path component"}, // sender ids don't have + // twitter handles {"twitter:jimmyjo", ""}, From d0d96e3304685ec603522c13bf0fef83839b493f Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 9 May 2024 15:24:05 -0500 Subject: [PATCH 122/141] Update CHANGELOG.md for v1.54.9 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fc35a0..50dd7c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.54.9 (2024-05-09) +------------------------- + * Allow sender id phone URNs + v1.54.8 (2024-05-09) ------------------------- * Ensure that new URNs are normalized and change signaure of urns.NewFromParts to take url.Values From 71b0ed540b464beeaa8e056b2ab192de6017126e Mon Sep 17 00:00:00 2001 From: Norbert Kwizera Date: Thu, 16 May 2024 11:11:35 +0200 Subject: [PATCH 123/141] Update Github actions to latest versions --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d2db257..3949e9d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,13 +25,13 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Linux packages run: sudo apt install -y --no-install-recommends pandoc - name: Install Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: go-version: ${{ matrix.go-version }} @@ -40,7 +40,7 @@ jobs: - name: Upload coverage if: success() - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true From fa6f40ad055e8bfbc7159408ddab3040d6841af1 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 20 May 2024 11:32:18 -0500 Subject: [PATCH 124/141] Move elastic utils from goflow --- elastic/query.go | 132 ++++++++++++++++++++++++++++++++++++++++++ elastic/query_test.go | 56 ++++++++++++++++++ elastic/sort.go | 23 ++++++++ elastic/sort_test.go | 27 +++++++++ 4 files changed, 238 insertions(+) create mode 100644 elastic/query.go create mode 100644 elastic/query_test.go create mode 100644 elastic/sort.go create mode 100644 elastic/sort_test.go diff --git a/elastic/query.go b/elastic/query.go new file mode 100644 index 0000000..ded4f51 --- /dev/null +++ b/elastic/query.go @@ -0,0 +1,132 @@ +package elastic + +type Query map[string]any + +// Not is a shortcut for an ids query +func Ids(values ...string) Query { + return Query{"ids": map[string]any{"values": values}} +} + +// Term is a shortcut for a term query +func Term(field string, value any) Query { + return Query{"term": map[string]any{field: value}} +} + +// Exists is a shortcut for an exists query +func Exists(field string) Query { + return Query{"exists": map[string]any{"field": field}} +} + +// Match is a shortcut for a match query +func Match(field string, value any) Query { + return Query{"match": map[string]any{field: map[string]any{"query": value}}} +} + +// MatchPhrase is a shortcut for a match_phrase query +func MatchPhrase(field, value string) Query { + return Query{"match_phrase": map[string]any{field: map[string]any{"query": value}}} +} + +// GreaterThan is a shortcut for a range query where x > value +func GreaterThan(field string, value any) Query { + return Query{ + "range": map[string]any{ + field: map[string]any{ + "from": value, + "include_lower": false, + "include_upper": true, + "to": nil, + }, + }, + } +} + +// GreaterThanOrEqual is a shortcut for a range query where x >= value +func GreaterThanOrEqual(field string, value any) Query { + return Query{ + "range": map[string]any{ + field: map[string]any{ + "from": value, + "include_lower": true, + "include_upper": true, + "to": nil, + }, + }, + } +} + +// LessThan is a shortcut for a range query where x < value +func LessThan(field string, value any) Query { + return Query{ + "range": map[string]any{ + field: map[string]any{ + "from": nil, + "include_lower": true, + "include_upper": false, + "to": value, + }, + }, + } +} + +// LessThanOrEqual is a shortcut for a range query where x <= value +func LessThanOrEqual(field string, value any) Query { + return Query{ + "range": map[string]any{ + field: map[string]any{ + "from": nil, + "include_lower": true, + "include_upper": true, + "to": value, + }, + }, + } +} + +// Between is a shortcut for a range query where from <= x < to +func Between(field string, from, to any) Query { + return Query{ + "range": map[string]any{ + field: map[string]any{ + "from": from, + "include_lower": true, + "include_upper": false, + "to": to, + }, + }, + } +} + +// Any is a shortcut for a bool query with a should clause +func Any(queries ...Query) Query { + return Query{"bool": map[string]any{"should": queries}} +} + +// All is a shortcut for a bool query with a must clause +func All(queries ...Query) Query { + return Query{"bool": map[string]any{"must": queries}} +} + +// Not is a shortcut for a bool query with a must_not clause +func Not(query Query) Query { + return Query{"bool": map[string]any{"must_not": query}} +} + +// Bool is a shortcut for a bool query with multiple must and must_not clauses +func Bool(all []Query, none []Query) Query { + bq := map[string]any{} + + if len(all) > 0 { + bq["must"] = all + } + if len(none) > 0 { + bq["must_not"] = none + } + + return Query{"bool": bq} +} + +// Nested is a shortcut for a nested query +func Nested(path string, query Query) Query { + return Query{"nested": map[string]any{"path": path, "query": query}} +} diff --git a/elastic/query_test.go b/elastic/query_test.go new file mode 100644 index 0000000..1da3fbf --- /dev/null +++ b/elastic/query_test.go @@ -0,0 +1,56 @@ +package elastic_test + +import ( + "testing" + + "github.com/nyaruka/gocommon/elastic" + "github.com/nyaruka/gocommon/jsonx" + "github.com/stretchr/testify/assert" +) + +func TestQuery(t *testing.T) { + tcs := []struct { + q elastic.Query + json []byte + }{ + {elastic.Ids("235", "465", "787"), []byte(`{"ids": {"values": ["235", "465", "787"]}}`)}, + {elastic.Term("age", 42), []byte(`{"term": {"age": 42}}`)}, + {elastic.Exists("age"), []byte(`{"exists": {"field": "age"}}`)}, + {elastic.Match("name", "Bob"), []byte(`{"match": {"name": {"query": "Bob"}}}`)}, + {elastic.MatchPhrase("name", "Bob"), []byte(`{"match_phrase": {"name": {"query": "Bob"}}}`)}, + {elastic.GreaterThan("age", 45), []byte(`{"range": {"age": {"from": 45, "include_lower": false, "include_upper": true, "to": null}}}`)}, + {elastic.GreaterThanOrEqual("age", 45), []byte(`{"range": {"age": {"from": 45, "include_lower": true, "include_upper": true, "to": null}}}`)}, + {elastic.LessThan("age", 45), []byte(`{"range": {"age": {"from": null, "include_lower": true, "include_upper": false, "to": 45}}}`)}, + {elastic.LessThanOrEqual("age", 45), []byte(`{"range": {"age": {"from": null, "include_lower": true, "include_upper": true, "to": 45}}}`)}, + {elastic.Between("age", 20, 45), []byte(`{"range": {"age": {"from": 20, "include_lower": true, "include_upper": false, "to": 45}}}`)}, + { + elastic.Any(elastic.Ids("235"), elastic.Term("age", 42)), + []byte(`{"bool": {"should": [{"ids": {"values": ["235"]}}, {"term": {"age": 42}}]}}`), + }, + { + elastic.All(elastic.Ids("235"), elastic.Term("age", 42)), + []byte(`{"bool": {"must": [{"ids": {"values": ["235"]}}, {"term": {"age": 42}}]}}`), + }, + { + elastic.Not(elastic.Ids("235")), + []byte(`{"bool": {"must_not": {"ids": {"values": ["235"]}}}}`), + }, + { + elastic.Bool([]elastic.Query{elastic.Ids("235"), elastic.Term("age", 42)}, []elastic.Query{elastic.Exists("age")}), + []byte(`{"bool": {"must": [{"ids": {"values": ["235"]}}, {"term": {"age": 42}}], "must_not": [{"exists": {"field": "age"}}]}}`), + }, + { + elastic.Bool([]elastic.Query{}, []elastic.Query{elastic.Exists("age")}), + []byte(`{"bool": {"must_not": [{"exists": {"field": "age"}}]}}`), + }, + { + elastic.Bool([]elastic.Query{elastic.Ids("235"), elastic.Term("age", 42)}, []elastic.Query{}), + []byte(`{"bool": {"must": [{"ids": {"values": ["235"]}}, {"term": {"age": 42}}]}}`), + }, + {elastic.Nested("group", elastic.Term("group.id", 10)), []byte(`{"nested": {"path": "group", "query": {"term": {"group.id": 10}}}}`)}, + } + + for i, tc := range tcs { + assert.JSONEq(t, string(tc.json), string(jsonx.MustMarshal(tc.q)), "%d: elastic mismatch", i) + } +} diff --git a/elastic/sort.go b/elastic/sort.go new file mode 100644 index 0000000..c4c04f2 --- /dev/null +++ b/elastic/sort.go @@ -0,0 +1,23 @@ +package elastic + +type Sort map[string]any + +// SortBy is a shortcut for a simple field sort +func SortBy(field string, ascending bool) Sort { + return Sort{field: map[string]any{"order": order(ascending)}} +} + +// SortNested is a shortcut for a nested field sort +func SortNested(field string, filter Query, path string, ascending bool) Sort { + return Sort{field: map[string]any{ + "nested": map[string]any{"filter": filter, "path": path}, + "order": order(ascending), + }} +} + +func order(asc bool) string { + if asc { + return "asc" + } + return "desc" +} diff --git a/elastic/sort_test.go b/elastic/sort_test.go new file mode 100644 index 0000000..86df842 --- /dev/null +++ b/elastic/sort_test.go @@ -0,0 +1,27 @@ +package elastic_test + +import ( + "testing" + + "github.com/nyaruka/gocommon/elastic" + "github.com/nyaruka/gocommon/jsonx" + "github.com/stretchr/testify/assert" +) + +func TestSort(t *testing.T) { + tcs := []struct { + q elastic.Sort + json []byte + }{ + {elastic.SortBy("name", true), []byte(`{"name": {"order": "asc"}}`)}, + {elastic.SortBy("name", false), []byte(`{"name": {"order": "desc"}}`)}, + { + elastic.SortNested("age", elastic.Term("fields.field", "1234"), "fields", true), + []byte(`{"age": {"nested": {"filter": {"term": {"fields.field": "1234"}}, "path": "fields"}, "order":"asc"}}`), + }, + } + + for i, tc := range tcs { + assert.JSONEq(t, string(tc.json), string(jsonx.MustMarshal(tc.q)), "%d: elastic mismatch", i) + } +} From 8627d1caf45bf22e8917c2db6e42a44fe10720d7 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 20 May 2024 11:38:19 -0500 Subject: [PATCH 125/141] Update CHANGELOG.md for v1.55.0 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50dd7c6..47e030e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.55.0 (2024-05-20) +------------------------- + * Move elastic utils from goflow + v1.54.9 (2024-05-09) ------------------------- * Allow sender id phone URNs From 4db38cde492651c6aaa8940fe2f3b1683288889c Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 20 May 2024 16:48:54 -0500 Subject: [PATCH 126/141] Use std library for errors --- analytics/base.go | 6 +++--- dates/format.go | 4 ++-- dates/parse.go | 5 ++--- dbutil/bulk.go | 9 +++++---- dbutil/errors_test.go | 9 ++++----- dbutil/scan.go | 8 ++++---- go.mod | 1 - go.sum | 2 -- httpx/access.go | 6 +++--- httpx/http.go | 2 +- httpx/mock.go | 2 +- httpx/recorder.go | 5 ++--- i18n/language.go | 6 +++--- storage/s3.go | 7 +++---- urns/phone.go | 2 +- 15 files changed, 34 insertions(+), 40 deletions(-) diff --git a/analytics/base.go b/analytics/base.go index a02f4e0..44acab5 100644 --- a/analytics/base.go +++ b/analytics/base.go @@ -1,6 +1,6 @@ package analytics -import "github.com/pkg/errors" +import "fmt" // Backend is the interface for backends type Backend interface { @@ -21,7 +21,7 @@ func RegisterBackend(b Backend) { func Start() error { for _, b := range backends { if err := b.Start(); err != nil { - return errors.Wrapf(err, "error starting %s analytics backend", b.Name()) + return fmt.Errorf("error starting %s analytics backend: %w", b.Name(), err) } } return nil @@ -38,7 +38,7 @@ func Gauge(name string, value float64) { func Stop() error { for _, b := range backends { if err := b.Stop(); err != nil { - return errors.Wrapf(err, "error stopping %s analytics backend", b.Name()) + return fmt.Errorf("error stopping %s analytics backend: %w", b.Name(), err) } } return nil diff --git a/dates/format.go b/dates/format.go index 2299d11..586a7b7 100644 --- a/dates/format.go +++ b/dates/format.go @@ -2,11 +2,11 @@ package dates import ( "bytes" + "fmt" "strings" "time" "github.com/nyaruka/gocommon/i18n" - "github.com/pkg/errors" ) // Custom date/time formatting using layout strings like YYYY-MM-DD @@ -236,7 +236,7 @@ func visitLayout(layout string, type_ LayoutType, mode LayoutMode, callback func if exists && type_.Includes(layoutSeq.seqType) && (mode != ParsingMode || layoutSeq.parseable) { mapped = layoutSeq.mapped } else { - return errors.Errorf("'%s' is not valid in a %s %s layout", seq, type_, mode) + return fmt.Errorf("'%s' is not valid in a %s %s layout", seq, type_, mode) } } diff --git a/dates/parse.go b/dates/parse.go index ad34377..5d26682 100644 --- a/dates/parse.go +++ b/dates/parse.go @@ -1,9 +1,8 @@ package dates import ( + "fmt" "time" - - "github.com/pkg/errors" ) // ZeroDateTime is our uninitialized datetime value @@ -67,7 +66,7 @@ func parseError(err error) error { } } - return errors.Errorf("cannot parse '%s' as '%s'", typed.ValueElem, origLayoutSeq) + return fmt.Errorf("cannot parse '%s' as '%s'", typed.ValueElem, origLayoutSeq) default: return err } diff --git a/dbutil/bulk.go b/dbutil/bulk.go index 52e0c9c..0d1b9f6 100644 --- a/dbutil/bulk.go +++ b/dbutil/bulk.go @@ -2,10 +2,11 @@ package dbutil import ( "context" + "errors" + "fmt" "strings" "github.com/jmoiron/sqlx" - "github.com/pkg/errors" ) // BulkQueryer is the DB/TX functionality needed for these bulk operations @@ -32,13 +33,13 @@ func BulkSQL[T any](db BulkQueryer, sql string, structs []T) (string, []any, err for i, value := range structs { valueSQL, valueArgs, err := sqlx.Named(sql, value) if err != nil { - return "", nil, errors.Wrapf(err, "error converting bulk insert args") + return "", nil, fmt.Errorf("error converting bulk insert args: %w", err) } args = append(args, valueArgs...) argValues := extractValues(valueSQL) if argValues == "" { - return "", nil, errors.Errorf("error extracting VALUES from sql: %s", valueSQL) + return "", nil, fmt.Errorf("error extracting VALUES from sql: %s", valueSQL) } // append to our global values, adding comma if necessary @@ -50,7 +51,7 @@ func BulkSQL[T any](db BulkQueryer, sql string, structs []T) (string, []any, err valuesSQL := extractValues(sql) if valuesSQL == "" { - return "", nil, errors.Errorf("error extracting VALUES from sql: %s", sql) + return "", nil, fmt.Errorf("error extracting VALUES from sql: %s", sql) } return db.Rebind(strings.Replace(sql, valuesSQL, values.String(), -1)), args, nil diff --git a/dbutil/errors_test.go b/dbutil/errors_test.go index f96d3ab..f55df4e 100644 --- a/dbutil/errors_test.go +++ b/dbutil/errors_test.go @@ -1,13 +1,12 @@ package dbutil_test import ( + "errors" "fmt" "testing" "github.com/lib/pq" "github.com/nyaruka/gocommon/dbutil" - - "github.com/pkg/errors" "github.com/stretchr/testify/assert" ) @@ -15,7 +14,7 @@ func TestIsUniqueViolation(t *testing.T) { var err error = &pq.Error{Code: pq.ErrorCode("23505")} assert.True(t, dbutil.IsUniqueViolation(err)) - assert.True(t, dbutil.IsUniqueViolation(errors.Wrap(err, "wrapped"))) + assert.True(t, dbutil.IsUniqueViolation(fmt.Errorf("wrapped: %w", err))) assert.False(t, dbutil.IsUniqueViolation(errors.New("boom"))) } @@ -39,12 +38,12 @@ func TestQueryError(t *testing.T) { assert.Equal(t, err, pqerr) // can unwrap a wrapped error to find the first query error - wrapped := errors.Wrap(errors.Wrap(qerr, "error doing this"), "error doing that") + wrapped := fmt.Errorf("error doing that: %w", fmt.Errorf("error doing this: %w", qerr)) unwrapped := dbutil.AsQueryError(wrapped) assert.Equal(t, qerr, unwrapped) // nil if error was never a query error - wrapped = errors.Wrap(errors.New("error doing this"), "error doing that") + wrapped = fmt.Errorf("error doing that: %w", errors.New("error doing this")) assert.Nil(t, dbutil.AsQueryError(wrapped)) query, params := unwrapped.Query() diff --git a/dbutil/scan.go b/dbutil/scan.go index e83b326..3683a97 100644 --- a/dbutil/scan.go +++ b/dbutil/scan.go @@ -3,9 +3,9 @@ package dbutil import ( "database/sql" "encoding/json" + "fmt" "github.com/go-playground/validator/v10" - "github.com/pkg/errors" ) var validate = validator.New() @@ -15,12 +15,12 @@ func ScanJSON(rows *sql.Rows, destination any) error { var raw json.RawMessage err := rows.Scan(&raw) if err != nil { - return errors.Wrap(err, "error scanning row JSON") + return fmt.Errorf("error scanning row JSON: %w", err) } err = json.Unmarshal(raw, destination) if err != nil { - return errors.Wrap(err, "error unmarshalling row JSON") + return fmt.Errorf("error unmarshalling row JSON: %w", err) } return nil @@ -34,7 +34,7 @@ func ScanAndValidateJSON(rows *sql.Rows, destination any) error { err := validate.Struct(destination) if err != nil { - return errors.Wrapf(err, "error validating unmarsalled JSON") + return fmt.Errorf("error validating unmarsalled JSON: %w", err) } return nil diff --git a/go.mod b/go.mod index decccd0..a6e9244 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,6 @@ require ( github.com/nyaruka/librato v1.1.1 github.com/nyaruka/null/v2 v2.0.3 github.com/nyaruka/phonenumbers v1.3.5 - github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.4.0 github.com/stretchr/testify v1.9.0 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 diff --git a/go.sum b/go.sum index 5830e79..596da8a 100644 --- a/go.sum +++ b/go.sum @@ -45,8 +45,6 @@ github.com/nyaruka/null/v2 v2.0.3 h1:rdmMRQyVzrOF3Jff/gpU/7BDR9mQX0lcLl4yImsA3kw github.com/nyaruka/null/v2 v2.0.3/go.mod h1:OCVeCkCXwrg5/qE6RU0c1oUVZBy+ZDrT+xYg1XSaIWA= github.com/nyaruka/phonenumbers v1.3.5 h1:WZLbQn61j2E1OFnvpUTYbK/6hViUgl6tppJ55/E2iQM= github.com/nyaruka/phonenumbers v1.3.5/go.mod h1:Ut+eFwikULbmCenH6InMKL9csUNLyxHuBLyfkpum11s= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= diff --git a/httpx/access.go b/httpx/access.go index ec62e12..36f2f8d 100644 --- a/httpx/access.go +++ b/httpx/access.go @@ -1,12 +1,12 @@ package httpx import ( + "fmt" "net" "net/http" "strings" "time" - "github.com/pkg/errors" "golang.org/x/net/context" ) @@ -63,13 +63,13 @@ func ParseNetworks(addrs ...string) ([]net.IP, []*net.IPNet, error) { if strings.Contains(addr, "/") { _, ipNet, err := net.ParseCIDR(addr) if err != nil { - return nil, nil, errors.Errorf("couldn't parse '%s' as an IP network", addr) + return nil, nil, fmt.Errorf("couldn't parse '%s' as an IP network", addr) } ipNets = append(ipNets, ipNet) } else { ip := net.ParseIP(addr) if ip == nil { - return nil, nil, errors.Errorf("couldn't parse '%s' as an IP address", addr) + return nil, nil, fmt.Errorf("couldn't parse '%s' as an IP address", addr) } ips = append(ips, ip) } diff --git a/httpx/http.go b/httpx/http.go index d2d9512..376e369 100644 --- a/httpx/http.go +++ b/httpx/http.go @@ -3,6 +3,7 @@ package httpx import ( "bytes" "encoding/base64" + "errors" "fmt" "io" "net/http" @@ -13,7 +14,6 @@ import ( "github.com/gabriel-vasile/mimetype" "github.com/nyaruka/gocommon/dates" - "github.com/pkg/errors" ) // ErrResponseSize is returned when response size exceeds provided limit diff --git a/httpx/mock.go b/httpx/mock.go index 8a5fe12..c794ef0 100644 --- a/httpx/mock.go +++ b/httpx/mock.go @@ -3,13 +3,13 @@ package httpx import ( "bytes" "encoding/json" + "errors" "fmt" "io" "net/http" "github.com/nyaruka/gocommon/jsonx" "github.com/nyaruka/gocommon/stringsx" - "github.com/pkg/errors" "golang.org/x/exp/maps" ) diff --git a/httpx/recorder.go b/httpx/recorder.go index 3eb3ff3..a950d2f 100644 --- a/httpx/recorder.go +++ b/httpx/recorder.go @@ -10,7 +10,6 @@ import ( "github.com/go-chi/chi/v5/middleware" "github.com/nyaruka/gocommon/dates" - "github.com/pkg/errors" ) // Recorder is a utility for creating traces of HTTP requests being handled @@ -31,7 +30,7 @@ func NewRecorder(r *http.Request, w http.ResponseWriter, reconstruct bool) (*Rec requestTrace, err := httputil.DumpRequest(or, true) if err != nil { - return nil, errors.Wrap(err, "error dumping request") + return nil, fmt.Errorf("error dumping request: %w", err) } // if we cloned the request above, DumpRequest will have drained the body and saved a copy on the reconstructed @@ -66,7 +65,7 @@ func (r *Recorder) End() error { // and parse as response object response, err := http.ReadResponse(bufio.NewReader(bytes.NewReader(responseTrace.Bytes())), r.Trace.Request) if err != nil { - return errors.Wrap(err, "error reading response trace") + return fmt.Errorf("error reading response trace: %w", err) } r.Trace.Response = response diff --git a/i18n/language.go b/i18n/language.go index 2572296..516ea8a 100644 --- a/i18n/language.go +++ b/i18n/language.go @@ -2,9 +2,9 @@ package i18n import ( "database/sql/driver" + "fmt" "github.com/nyaruka/null/v2" - "github.com/pkg/errors" "golang.org/x/text/language" ) @@ -32,12 +32,12 @@ var NilLanguage = Language("") // ParseLanguage returns a new Language for the passed in language string, or an error if not found func ParseLanguage(lang string) (Language, error) { if len(lang) != 3 { - return NilLanguage, errors.Errorf("iso-639-3 codes must be 3 characters, got: %s", lang) + return NilLanguage, fmt.Errorf("iso-639-3 codes must be 3 characters, got: %s", lang) } base, err := language.ParseBase(lang) if err != nil { - return NilLanguage, errors.Errorf("unrecognized language code: %s", lang) + return NilLanguage, fmt.Errorf("unrecognized language code: %s", lang) } return Language(base.ISO3()), nil diff --git a/storage/s3.go b/storage/s3.go index 28ad340..b5a1a04 100644 --- a/storage/s3.go +++ b/storage/s3.go @@ -13,7 +13,6 @@ import ( "github.com/aws/aws-sdk-go/aws/request" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" - "github.com/pkg/errors" ) var s3BucketURL = "https://%s.s3.%s.amazonaws.com/%s" @@ -88,12 +87,12 @@ func (s *s3Storage) Get(ctx context.Context, path string) (string, []byte, error Key: aws.String(path), }) if err != nil { - return "", nil, errors.Wrapf(err, "error getting S3 object") + return "", nil, fmt.Errorf("error getting S3 object: %w", err) } body, err := io.ReadAll(out.Body) if err != nil { - return "", nil, errors.Wrapf(err, "error reading S3 object") + return "", nil, fmt.Errorf("error reading S3 object: %w", err) } return aws.StringValue(out.ContentType), body, nil @@ -109,7 +108,7 @@ func (s *s3Storage) Put(ctx context.Context, path string, contentType string, bo ACL: aws.String(s.acl), }) if err != nil { - return "", errors.Wrapf(err, "error putting S3 object") + return "", fmt.Errorf("error putting S3 object: %w", err) } return s.url(path), nil diff --git a/urns/phone.go b/urns/phone.go index 51a6dc0..58a7962 100644 --- a/urns/phone.go +++ b/urns/phone.go @@ -1,13 +1,13 @@ package urns import ( + "errors" "regexp" "strconv" "strings" "github.com/nyaruka/gocommon/i18n" "github.com/nyaruka/phonenumbers" - "github.com/pkg/errors" ) var nonTelCharsRegex = regexp.MustCompile(`[^0-9A-Za-z]`) From d00a4d4beaff3de08fde33e89de0d3ee21c4921c Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 20 May 2024 16:57:03 -0500 Subject: [PATCH 127/141] Update CHANGELOG.md for v1.55.1 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47e030e..69b557f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.55.1 (2024-05-20) +------------------------- + * Use std library for errors + v1.55.0 (2024-05-20) ------------------------- * Move elastic utils from goflow From 7592b9b19863c068bde99f2fb4cb93c93c849353 Mon Sep 17 00:00:00 2001 From: Norbert Kwizera Date: Wed, 22 May 2024 19:30:10 +0200 Subject: [PATCH 128/141] Update elastic query DSL syntax --- elastic/query.go | 28 +++++++--------------------- elastic/query_test.go | 22 +++++++++++----------- elastic/sort_test.go | 2 +- 3 files changed, 19 insertions(+), 33 deletions(-) diff --git a/elastic/query.go b/elastic/query.go index ded4f51..419c67c 100644 --- a/elastic/query.go +++ b/elastic/query.go @@ -9,7 +9,7 @@ func Ids(values ...string) Query { // Term is a shortcut for a term query func Term(field string, value any) Query { - return Query{"term": map[string]any{field: value}} + return Query{"term": map[string]any{field: map[string]any{"value": value}}} } // Exists is a shortcut for an exists query @@ -32,10 +32,7 @@ func GreaterThan(field string, value any) Query { return Query{ "range": map[string]any{ field: map[string]any{ - "from": value, - "include_lower": false, - "include_upper": true, - "to": nil, + "gt": value, }, }, } @@ -46,10 +43,7 @@ func GreaterThanOrEqual(field string, value any) Query { return Query{ "range": map[string]any{ field: map[string]any{ - "from": value, - "include_lower": true, - "include_upper": true, - "to": nil, + "gte": value, }, }, } @@ -60,10 +54,7 @@ func LessThan(field string, value any) Query { return Query{ "range": map[string]any{ field: map[string]any{ - "from": nil, - "include_lower": true, - "include_upper": false, - "to": value, + "lt": value, }, }, } @@ -74,10 +65,7 @@ func LessThanOrEqual(field string, value any) Query { return Query{ "range": map[string]any{ field: map[string]any{ - "from": nil, - "include_lower": true, - "include_upper": true, - "to": value, + "lte": value, }, }, } @@ -88,10 +76,8 @@ func Between(field string, from, to any) Query { return Query{ "range": map[string]any{ field: map[string]any{ - "from": from, - "include_lower": true, - "include_upper": false, - "to": to, + "gte": from, + "lt": to, }, }, } diff --git a/elastic/query_test.go b/elastic/query_test.go index 1da3fbf..02f2968 100644 --- a/elastic/query_test.go +++ b/elastic/query_test.go @@ -14,22 +14,22 @@ func TestQuery(t *testing.T) { json []byte }{ {elastic.Ids("235", "465", "787"), []byte(`{"ids": {"values": ["235", "465", "787"]}}`)}, - {elastic.Term("age", 42), []byte(`{"term": {"age": 42}}`)}, + {elastic.Term("age", 42), []byte(`{"term": {"age": {"value":42}}}`)}, {elastic.Exists("age"), []byte(`{"exists": {"field": "age"}}`)}, {elastic.Match("name", "Bob"), []byte(`{"match": {"name": {"query": "Bob"}}}`)}, {elastic.MatchPhrase("name", "Bob"), []byte(`{"match_phrase": {"name": {"query": "Bob"}}}`)}, - {elastic.GreaterThan("age", 45), []byte(`{"range": {"age": {"from": 45, "include_lower": false, "include_upper": true, "to": null}}}`)}, - {elastic.GreaterThanOrEqual("age", 45), []byte(`{"range": {"age": {"from": 45, "include_lower": true, "include_upper": true, "to": null}}}`)}, - {elastic.LessThan("age", 45), []byte(`{"range": {"age": {"from": null, "include_lower": true, "include_upper": false, "to": 45}}}`)}, - {elastic.LessThanOrEqual("age", 45), []byte(`{"range": {"age": {"from": null, "include_lower": true, "include_upper": true, "to": 45}}}`)}, - {elastic.Between("age", 20, 45), []byte(`{"range": {"age": {"from": 20, "include_lower": true, "include_upper": false, "to": 45}}}`)}, + {elastic.GreaterThan("age", 45), []byte(`{"range": {"age": {"gt": 45}}}`)}, + {elastic.GreaterThanOrEqual("age", 45), []byte(`{"range": {"age": {"gte": 45}}}`)}, + {elastic.LessThan("age", 45), []byte(`{"range": {"age": {"lt": 45}}}`)}, + {elastic.LessThanOrEqual("age", 45), []byte(`{"range": {"age": {"lte": 45}}}`)}, + {elastic.Between("age", 20, 45), []byte(`{"range": {"age": {"gte": 20, "lt": 45}}}`)}, { elastic.Any(elastic.Ids("235"), elastic.Term("age", 42)), - []byte(`{"bool": {"should": [{"ids": {"values": ["235"]}}, {"term": {"age": 42}}]}}`), + []byte(`{"bool": {"should": [{"ids": {"values": ["235"]}}, {"term": {"age": {"value":42}}}]}}`), }, { elastic.All(elastic.Ids("235"), elastic.Term("age", 42)), - []byte(`{"bool": {"must": [{"ids": {"values": ["235"]}}, {"term": {"age": 42}}]}}`), + []byte(`{"bool": {"must": [{"ids": {"values": ["235"]}}, {"term": {"age": {"value":42}}}]}}`), }, { elastic.Not(elastic.Ids("235")), @@ -37,7 +37,7 @@ func TestQuery(t *testing.T) { }, { elastic.Bool([]elastic.Query{elastic.Ids("235"), elastic.Term("age", 42)}, []elastic.Query{elastic.Exists("age")}), - []byte(`{"bool": {"must": [{"ids": {"values": ["235"]}}, {"term": {"age": 42}}], "must_not": [{"exists": {"field": "age"}}]}}`), + []byte(`{"bool": {"must": [{"ids": {"values": ["235"]}}, {"term": {"age": {"value":42}}}], "must_not": [{"exists": {"field": "age"}}]}}`), }, { elastic.Bool([]elastic.Query{}, []elastic.Query{elastic.Exists("age")}), @@ -45,9 +45,9 @@ func TestQuery(t *testing.T) { }, { elastic.Bool([]elastic.Query{elastic.Ids("235"), elastic.Term("age", 42)}, []elastic.Query{}), - []byte(`{"bool": {"must": [{"ids": {"values": ["235"]}}, {"term": {"age": 42}}]}}`), + []byte(`{"bool": {"must": [{"ids": {"values": ["235"]}}, {"term": {"age": {"value":42}}}]}}`), }, - {elastic.Nested("group", elastic.Term("group.id", 10)), []byte(`{"nested": {"path": "group", "query": {"term": {"group.id": 10}}}}`)}, + {elastic.Nested("group", elastic.Term("group.id", 10)), []byte(`{"nested": {"path": "group", "query": {"term": {"group.id": {"value":10}}}}}`)}, } for i, tc := range tcs { diff --git a/elastic/sort_test.go b/elastic/sort_test.go index 86df842..45e2c16 100644 --- a/elastic/sort_test.go +++ b/elastic/sort_test.go @@ -17,7 +17,7 @@ func TestSort(t *testing.T) { {elastic.SortBy("name", false), []byte(`{"name": {"order": "desc"}}`)}, { elastic.SortNested("age", elastic.Term("fields.field", "1234"), "fields", true), - []byte(`{"age": {"nested": {"filter": {"term": {"fields.field": "1234"}}, "path": "fields"}, "order":"asc"}}`), + []byte(`{"age": {"nested": {"filter": {"term": {"fields.field": {"value":"1234"}}}, "path": "fields"}, "order":"asc"}}`), }, } From 64862970ec3e543c768c8098c55e46b8287aa55a Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 22 May 2024 13:33:05 -0500 Subject: [PATCH 129/141] Update CHANGELOG.md for v1.55.2 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69b557f..b53685d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.55.2 (2024-05-22) +------------------------- + * Update elastic query DSL syntax + v1.55.1 (2024-05-20) ------------------------- * Use std library for errors From 3f8bab605df87f7ed1db3f46e7dc1570d73e6ef4 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 27 May 2024 16:10:08 -0500 Subject: [PATCH 130/141] Update deps --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index a6e9244..77239bd 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/nyaruka/gocommon go 1.21 require ( - github.com/aws/aws-sdk-go v1.52.4 - github.com/gabriel-vasile/mimetype v1.4.3 + github.com/aws/aws-sdk-go v1.53.10 + github.com/gabriel-vasile/mimetype v1.4.4 github.com/go-chi/chi/v5 v5.0.12 github.com/go-playground/validator/v10 v10.20.0 github.com/gofrs/uuid v4.4.0+incompatible @@ -14,10 +14,10 @@ require ( github.com/lib/pq v1.10.9 github.com/nyaruka/librato v1.1.1 github.com/nyaruka/null/v2 v2.0.3 - github.com/nyaruka/phonenumbers v1.3.5 + github.com/nyaruka/phonenumbers v1.3.6 github.com/shopspring/decimal v1.4.0 github.com/stretchr/testify v1.9.0 - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 + golang.org/x/exp v0.0.0-20240525044651-4c93da0ed11d golang.org/x/net v0.25.0 golang.org/x/sync v0.7.0 golang.org/x/text v0.15.0 diff --git a/go.sum b/go.sum index 596da8a..84e35d9 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,12 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/aws/aws-sdk-go v1.52.4 h1:9VsBVJ2TKf8xPP3+yIPGSYcEBIEymXsJzQoFgQuyvA0= -github.com/aws/aws-sdk-go v1.52.4/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.53.10 h1:3enP5l5WtezT9Ql+XZqs56JBf5YUd/FEzTCg///OIGY= +github.com/aws/aws-sdk-go v1.53.10/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I= +github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s= github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= @@ -43,8 +43,8 @@ github.com/nyaruka/librato v1.1.1 h1:0nTYtJLl3Sn7lX3CuHsLf+nXy1k/tGV0OjVxLy3Et4s github.com/nyaruka/librato v1.1.1/go.mod h1:fme1Fu1PT2qvkaBZyw8WW+SrnFe2qeeCWpvqmAaKAKE= github.com/nyaruka/null/v2 v2.0.3 h1:rdmMRQyVzrOF3Jff/gpU/7BDR9mQX0lcLl4yImsA3kw= github.com/nyaruka/null/v2 v2.0.3/go.mod h1:OCVeCkCXwrg5/qE6RU0c1oUVZBy+ZDrT+xYg1XSaIWA= -github.com/nyaruka/phonenumbers v1.3.5 h1:WZLbQn61j2E1OFnvpUTYbK/6hViUgl6tppJ55/E2iQM= -github.com/nyaruka/phonenumbers v1.3.5/go.mod h1:Ut+eFwikULbmCenH6InMKL9csUNLyxHuBLyfkpum11s= +github.com/nyaruka/phonenumbers v1.3.6 h1:33owXWp4d1U+Tyaj9fpci6PbvaQZcXBUO2FybeKeLwQ= +github.com/nyaruka/phonenumbers v1.3.6/go.mod h1:Ut+eFwikULbmCenH6InMKL9csUNLyxHuBLyfkpum11s= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= @@ -56,8 +56,8 @@ go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/exp v0.0.0-20240525044651-4c93da0ed11d h1:N0hmiNbwsSNwHBAvR3QB5w25pUwH4tK0Y/RltD1j1h4= +golang.org/x/exp v0.0.0-20240525044651-4c93da0ed11d/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= From b978c088c6348a6d9eb1f3ef31c5ee3c19d26239 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 27 May 2024 16:10:34 -0500 Subject: [PATCH 131/141] Update CHANGELOG.md for v1.55.3 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b53685d..ba97eaf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.55.3 (2024-05-27) +------------------------- + * Update deps + v1.55.2 (2024-05-22) ------------------------- * Update elastic query DSL syntax From d0d701ca4b626a1d2a86fa8b30de5245e753ac77 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 3 Jun 2024 09:42:42 -0500 Subject: [PATCH 132/141] Update date data from go-locales --- dates/i18n/dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dates/i18n/dates.json b/dates/i18n/dates.json index 6a3ce60..c33f604 100644 --- a/dates/i18n/dates.json +++ b/dates/i18n/dates.json @@ -1 +1 @@ -{"aa_DJ":{"am_pm":["saaku","carra"],"days":["Acaada","Etleeni","Talaata","Arbaqa","Kamiisi","Gumqata","Sabti"],"months":["Qunxa Garablu","Naharsi Kudo","Ciggilta Kudo","Agda Baxis","Caxah Alsa","Qasa Dirri","Qado Dirri","Leqeeni","Waysu","Diteli","Ximoli","Kaxxa Garablu"],"short_days":["Aca","Etl","Tal","Arb","Kam","Gum","Sab"],"short_months":["Qun","Nah","Cig","Agd","Cax","Qas","Qad","Leq","Way","Dit","Xim","Kax"]},"aa_ER":{"am_pm":["saaku","carra"],"days":["Acaada","Etleeni","Talaata","Arbaqa","Kamiisi","Gumqata","Sabti"],"months":["Qunxa Garablu","Naharsi Kudo","Ciggilta Kudo","Agda Baxis","Caxah Alsa","Qasa Dirri","Qado Dirri","Liiqen","Waysu","Diteli","Ximoli","Kaxxa Garablu"],"short_days":["Aca","Etl","Tal","Arb","Kam","Gum","Sab"],"short_months":["Qun","Nah","Cig","Agd","Cax","Qas","Qad","Leq","Way","Dit","Xim","Kax"]},"aa_ET":{"am_pm":["saaku","carra"],"days":["Acaada","Etleeni","Talaata","Arbaqa","Kamiisi","Gumqata","Sabti"],"months":["Qunxa Garablu","Naharsi Kudo","Ciggilta Kudo","Agda Baxis","Caxah Alsa","Qasa Dirri","Qado Dirri","Liiqen","Waysu","Diteli","Ximoli","Kaxxa Garablu"],"short_days":["Aca","Etl","Tal","Arb","Kam","Gum","Sab"],"short_months":["Qun","Nah","Cig","Agd","Cax","Qas","Qad","Leq","Way","Dit","Xim","Kax"]},"ab":{"am_pm":["",""],"days":["Амҽыша","Ашәахьа","Аҩаша","Ахаша","Аԥшьаша","Ахәаша","Асабша"],"months":["Ажьырныҳәа","Жәабран","Хәажәкыра","Мшаԥы","Лаҵара","Рашәара","Ԥхынгәы","Нанҳәа","Цәыббра","Жьҭаара","Абҵара","Ԥхынҷкәын"],"short_days":["Ам","Ашә","Аҩ","Ах","Аԥ","Ахә","Ас"],"short_months":["Ажь","Жәаб","Хәажә","Мш","Лаҵ","Рашә","Ԥхынгә","Нанҳә","Цәыб","Жьҭ","Абҵ","Ԥхынҷ"]},"af":{"am_pm":["VM","NM"],"days":["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],"months":["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],"short_days":["So","Ma","Di","Wo","Do","Vr","Sa"],"short_months":["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"]},"agr":{"am_pm":["VM","NM"],"days":["Tuntuamtin","Achutin","Kugkuktin","Saketin","Shimpitin","Imaptin","Bataetin"],"months":["Petsatin","Kupitin","Uyaitin","Tayutin","Kegketin","Tegmatin","Kuntutin","Yagkujutin","Daiktatin","Ipamtatin","Shinutin","Sakamtin"],"short_days":["Tun","Ach","Kug","Sak","Shim","Im","Bat"],"short_months":["Pet","Kup","Uya","Tay","Keg","Teg","Kun","Yag","Dait","Ipam","Shin","Sak"]},"ak":{"am_pm":["AN","EW"],"days":["Kwesida","Dwowda","Benada","Wukuda","Yawda","Fida","Memeneda"],"months":["Sanda-Ɔpɛpɔn","Kwakwar-Ɔgyefuo","Ebɔw-Ɔbenem","Ebɔbira-Oforisuo","Esusow Aketseaba-Kɔtɔnimba","Obirade-Ayɛwohomumu","Ayɛwoho-Kitawonsa","Difuu-Ɔsandaa","Fankwa-Ɛbɔ","Ɔbɛsɛ-Ahinime","Ɔberɛfɛw-Obubuo","Mumu-Ɔpɛnimba"],"short_days":["Kwe","Dwo","Ben","Wuk","Yaw","Fia","Mem"],"short_months":["S-Ɔ","K-Ɔ","E-Ɔ","E-O","E-K","O-A","A-K","D-Ɔ","F-Ɛ","Ɔ-A","Ɔ-O","M-Ɔ"]},"am":{"am_pm":["ጡዋት","ከሰዓት"],"days":["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"months":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕሪል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክቶበር","ኖቬምበር","ዲሴምበር"],"short_days":["እሑድ","ሰኞ ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"short_months":["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ ","ጁን ","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም"]},"an":{"am_pm":["",""],"days":["domingo","luns","martes","mierques","chueves","viernes","sabado"],"months":["chinero","febrero","marzo","abril","mayo","chunyo","chuliol","agosto","setiembre","octubre","noviembre","aviento"],"short_days":["dom","lun","mar","mie","chu","vie","sab"],"short_months":["chi","feb","mar","abr","may","chn","chl","ago","set","oct","nov","avi"]},"anp":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवार","सोमवार","मंगलवार","बुधवार","बृहस्पतिवार","शुक्रवार","शनिवार"],"months":["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्टूबर","नवंबर","दिसंबर"],"short_days":["रवि","सोम","मंगल","बुध","बृहस्पति","शुक्र","शनि"],"short_months":["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्टूबर","नवंबर","दिसंबर"]},"ar_AE":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت "],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_BH":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_DZ":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"]},"ar_EG":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_IN":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_IQ":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar_JO":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar_KW":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_LB":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar_LY":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_MA":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر"]},"ar_OM":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_QA":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_SA":{"am_pm":["",""],"days":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعـة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"]},"ar_SD":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_SS":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_SY":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar_TN":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"]},"ar_YE":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"as":{"am_pm":["পূৰ্ব্বাহ্ন","অপৰাহ্ন"],"days":["দেওবাৰ","সোমবাৰ","মঙ্গলবাৰ","বুধবাৰ","বৃহষ্পতিবাৰ","শুক্ৰবাৰ","শনিবাৰ"],"months":["জানুৱাৰী","ফেব্ৰুৱাৰী","মাৰ্চ","এপ্ৰিল","মে","জুন","জুলাই","আগষ্ট","ছেপ্তেম্বৰ","অক্টোবৰ","নৱেম্বৰ","ডিচেম্বৰ"],"short_days":["দেও","সোম","মঙ্গল","বুধ","বৃহষ্পতি","শুক্ৰ","শনি"],"short_months":["জানু","ফেব্ৰু","মাৰ্চ","এপ্ৰিল","মে","জুন","জুলাই","আগ","সেপ্ট","অক্টো","নভে","ডিসে"]},"ast":{"am_pm":["",""],"days":["domingu","llunes","martes","miércoles","xueves","vienres","sábadu"],"months":["de xineru","de febreru","de marzu","d’abril","de mayu","de xunu","de xunetu","d’agostu","de setiembre","d’ochobre","de payares","d’avientu"],"short_days":["dom","llu","mar","mié","xue","vie","sáb"],"short_months":["xin","feb","mar","abr","may","xun","xnt","ago","set","och","pay","avi"]},"ayc":{"am_pm":["VM","NM"],"days":["tuminku","lunisa","martisa","mirkulisa","juywisa","wirnisa","sawäru"],"months":["inïru","phiwriru","marsu","awrila","mayu","junyu","julyu","awustu","sitimri","uktuwri","nuwimri","risimri"],"short_days":["tum","lun","mar","mir","juy","wir","saw"],"short_months":["ini","phi","mar","awr","may","jun","jul","awu","sit","ukt","nuw","ris"]},"az_AZ":{"am_pm":["",""],"days":["bazar günü","bazar ertəsi","çərşənbə axşamı","çərşənbə","cümə axşamı","cümə","şənbə"],"months":["yanvar","fevral","mart","aprel","may","iyun","iyul","avqust","sentyabr","oktyabr","noyabr","dekabr"],"short_days":["baz","ber","çax","çər","cax","cüm","şnb"],"short_months":["Yan","Fev","Mar","Apr","May","İyn","İyl","Avq","Sen","Okt","Noy","Dek"]},"az_IR":{"am_pm":["",""],"days":["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","جۆمعه آخشامی","جۆمعه","شنبه"],"months":["ژانویه","فوریه","مارس","آوریل","مئی","ژوئن","جولای","آقۇست","سپتامبر","اوْکتوْبر","نوْوامبر","دسامبر"],"short_days":["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","جۆمعه آخشامی","جۆمعه","شنبه"],"short_months":["ژانویه","فوریه","مارس","آوریل","مئی","ژوئن","جولای","آقۇست","سپتامبر","اوْکتوْبر","نوْوامبر","دسامبر"]},"be":{"am_pm":["",""],"days":["Нядзеля","Панядзелак","Аўторак","Серада","Чацвер","Пятніца","Субота"],"months":["студзеня","лютага","сакавіка","красавіка","мая","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня"],"short_days":["Няд","Пан","Аўт","Срд","Чцв","Пят","Суб"],"short_months":["сту","лют","сак","кра","мая","чэр","ліп","жні","вер","кас","ліс","сне"]},"bem":{"am_pm":["uluchelo","akasuba"],"days":["Pa Mulungu","Palichimo","Palichibuli","Palichitatu","Palichine","Palichisano","Pachibelushi"],"months":["Januari","Februari","Machi","Epreo","Mei","Juni","Julai","Ogasti","Septemba","Oktoba","Novemba","Disemba"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mac","Epr","Mei","Jun","Jul","Oga","Sep","Okt","Nov","Dis"]},"ber":{"am_pm":["",""],"days":["bazar günü","birinci gün","ikinci gün","üçüncü gün","dördüncü gün","beşinci gün","altıncı gün"],"months":["yanvar","fevral","mart","aprel","may","iyun","iyul","avqust","sentyabr","oktyabr","noyabr","dekabr"],"short_days":["baz","bir","iki","üçü","dör","beş","alt"],"short_months":["Yan","Fev","Mar","Apr","May","İyn","İyl","Avq","Sen","Okt","Noy","Dek"]},"bg":{"am_pm":["",""],"days":["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],"months":["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември"],"short_days":["нд","пн","вт","ср","чт","пт","сб"],"short_months":["яну","фев","мар","апр","май","юни","юли","авг","сеп","окт","ное","дек"]},"bhb":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"bho":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"months":["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],"short_days":["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],"short_months":["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"]},"bi":{"am_pm":["AM","PM"],"days":["Sande","Mande","Tusde","Wenesde","Tosde","Fraede","Sarere"],"months":["Jenuware","Febwari","Maj","Epril","Mei","Jun","Julae","Ogis","Septemba","Oktoba","Novemba","Disemba"],"short_days":["San","Man","Tus","Wen","Tas","Fra","Sar"],"short_months":["Jan","Feb","Maj","Epr","Mei","Jun","Jul","Ogs","Sep","Okt","Nov","Dis"]},"bn_BD":{"am_pm":["পূর্বাহ্ণ","অপরাহ্ণ"],"days":["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],"months":["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"short_days":["রবি","সোম","মঙ্গল","বুধ","বৃহঃ","শুক্র","শনি"],"short_months":["জানু","ফেব","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"]},"bn_IN":{"am_pm":["পূর্বাহ্ণ","অপরাহ্ণ"],"days":["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],"months":["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"short_days":["রবি","সোম","মঙ্গল","বুধ","বৃহস্পতি","শুক্র","শনি"],"short_months":["জানু","ফেব","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"]},"bo":{"am_pm":["ངས་ཆ","ཕྱི་ཆ"],"days":["གཟའ་ཉི་མ་","གཟའ་ཟླ་བ་","གཟའ་མིག་དམར་","གཟའ་ལྷག་ཕ་","གཟའ་པུར་བུ་","གཟའ་པ་སངས་","གཟའ་སྤེན་ཕ་"],"months":["ཟླ་བ་དང་པ་","ཟླ་བ་གཉིས་པ་","ཟླ་བ་གསུམ་པ་","ཟླ་བ་བཞི་པ་","ཟླ་བ་ལྔ་ཕ་","ཟླ་བ་དྲུག་པ་","ཟླ་བ་བདུནཔ་","ཟླ་བ་བརྒྱད་པ་","ཟླ་བ་དགུ་པ་","ཟླ་བ་བཅུ་པ་","ཟླ་བ་བཅུ་གཅིག་པ་","ཟླ་བ་བཅུ་གཉིས་པ་"],"short_days":["ཉི་","ཟླ་","མིར་","ལྷག་","པུར་","སངས་","སྤེན་"],"short_months":["ཟླ་༡","ཟླ་༢","ཟླ་༣","ཟླ་༤","ཟླ་༥","ཟླ་༦","ཟླ་༧","ཟླ་༨","ཟླ་༩","ཟླ་༡༠","ཟླ་༡༡","ཟླ་༡༢"]},"br":{"am_pm":[" "," "],"days":["sul","lun","meurzh","mercʼher","yaou","gwener","sadorn"],"months":["Genver","Cʼhwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu"],"short_days":["sul","lun","meu","mer","yao","gwe","sad"],"short_months":["Gen ","Cʼhw","Meu ","Ebr ","Mae ","Mezh","Gou ","Eos ","Gwe ","Her ","Du ","Ker "]},"brx":{"am_pm":["फुं.","बेलासे."],"days":["रबिबार","सोबार","मंगलबार","बुदबार","बिसथिबार","सुखुरबार","सुनिबार"],"months":["जानुवारी","फेब्रुवारी","मार्स","एफ्रिल","मे","जुन","जुलाइ","आगस्थ","सेबथेज्ब़र","अखथबर","नबेज्ब़र","दिसेज्ब़र"],"short_days":["रबि","सम","मंगल","बुद","बिसथि","सुखुर","सुनि"],"short_months":["जानुवारी","फेब्रुवारी","मार्स","एप्रिल","मे","जुन","जुलाइ","आगस्थ","सेबथेज्ब़र","अखथबर","नबेज्ब़र","दिसेज्ब़र"]},"bs":{"am_pm":["",""],"days":["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],"months":["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novembar","Decembar"],"short_days":["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],"short_months":["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"]},"byn":{"am_pm":["ፋዱስ ጃብ","ፋዱስ ደምቢ"],"days":["ሰንበር ቅዳዅ","ሰኑ","ሰሊጝ","ለጓ ወሪ ለብዋ","ኣምድ","ኣርብ","ሰንበር ሽጓዅ"],"months":["ልደትሪ","ካብኽብቲ","ክብላ","ፋጅኺሪ","ክቢቅሪ","ምኪኤል ትጓ̅ኒሪ","ኰርኩ","ማርያም ትሪ","ያኸኒ መሳቅለሪ","መተሉ","ምኪኤል መሽወሪ","ተሕሳስሪ"],"short_days":["ሰ/ቅ","ሰኑ","ሰሊጝ","ለጓ","ኣምድ","ኣርብ","ሰ/ሽ"],"short_months":["ልደት","ካብኽ","ክብላ","ፋጅኺ","ክቢቅ","ም/ት","ኰር","ማርያ","ያኸኒ","መተሉ","ም/ም","ተሕሳ"]},"ca":{"am_pm":["a. m.","p. m."],"days":["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],"months":["de gener","de febrer","de març","d’abril","de maig","de juny","de juliol","d’agost","de setembre","d’octubre","de novembre","de desembre"],"short_days":["dg.","dl.","dt.","dc.","dj.","dv.","ds."],"short_months":["de gen.","de febr.","de març","d’abr.","de maig","de juny","de jul.","d’ag.","de set.","d’oct.","de nov.","de des."]},"ce":{"am_pm":["",""],"days":["КӀиранан де","Оршотан де","Шинарин де","Кхаарин де","Еарин де","ПӀераскан де","Шот де"],"months":["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],"short_days":["КӀ","Ор","Ши","Кх","Еа","ПӀ","Шо"],"short_months":["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек"]},"chr":{"am_pm":["ᏌᎾᎴ","ᏒᎯᏱᎢᏗᏢ"],"days":["ᎤᎾᏙᏓᏆᏍᎬ","ᎤᎾᏙᏓᏉᏅᎯ","ᏔᎵᏁᎢᎦ","ᏦᎢᏁᎢᎦ","ᏅᎩᏁᎢᎦ","ᏧᎾᎩᎶᏍᏗ","ᎤᎾᏙᏓᏈᏕᎾ"],"months":["ᎤᏃᎸᏔᏅ","ᎧᎦᎵ","ᎠᏅᏱ","ᎧᏬᏂ","ᎠᏂᏍᎬᏘ","ᏕᎭᎷᏱ","ᎫᏰᏉᏂ","ᎦᎶᏂ","ᏚᎵᏍᏗ","ᏚᏂᏅᏗ","ᏅᏓᏕᏆ","ᎥᏍᎩᏱ"],"short_days":["ᏆᏍᎬ","ᏉᏅᎯ","ᏔᎵᏁ","ᏦᎢᏁ","ᏅᎩᏁ","ᏧᎾᎩ","ᏈᏕᎾ"],"short_months":["ᎤᏃ","ᎧᎦ","ᎠᏅ","ᎧᏬ","ᎠᏂ","ᏕᎭ","ᎫᏰ","ᎦᎶ","ᏚᎵ","ᏚᏂ","ᏅᏓ","ᎥᏍ"]},"ckb":{"am_pm":["پن","دن"],"days":["یەكشەممە","دووشەممە","سێشەممە","چوارشەممە","پێنجشەممە","هەینی","شەممە"],"months":["کانونی دووەم","شوبات","ئازار","نیسان","ئایار","حوزەیران","تەموز","ئاب","ئەیلوول","تشرینی یەکەم","تشرینی دووەم","کانونی یەکەم"],"short_days":["شەم","یەکش","دووش","سێش","چواش","پێنش","هەین"],"short_months":["کا٢","شوب","ئاز","نیس","ئای","حوز","تەم","ئاب","ئەی","تش١","تش٢","کا١"]},"cmn":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"crh":{"am_pm":["ÜE","ÜS"],"days":["Bazar","Bazarertesi","Salı","Çarşembe","Cumaaqşamı","Cuma","Cumaertesi"],"months":["Yanvar","Fevral","Mart","Aprel","Mayıs","İyun","İyul","Avgust","Sentâbr","Oktâbr","Noyabr","Dekabr"],"short_days":["Baz","Ber","Sal","Çar","Caq","Cum","Cer"],"short_months":["Yan","Fev","Mar","Apr","May","İyn","İyl","Avg","Sen","Okt","Noy","Dek"]},"cs":{"am_pm":["",""],"days":["Neděle","Pondělí","Úterý","Středa","Čtvrtek","Pátek","Sobota"],"months":["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"],"short_days":["Ne","Po","Út","St","Čt","Pá","So"],"short_months":["led","úno","bře","dub","kvě","čen","čec","srp","zář","říj","lis","pro"]},"csb":{"am_pm":["",""],"days":["niedzela","pòniedzôłk","wtórk","strzoda","czwiôrtk","piątk","sobòta"],"months":["stëcznika","gromicznika","strëmiannika","łżëkwiata","maja","czerwińca","lëpińca","zélnika","séwnika","rujana","lëstopadnika","gòdnika"],"short_days":["nie","pòn","wtó","str","czw","pią","sob"],"short_months":["stë","gro","str","łżë","maj","cze","lëp","zél","séw","ruj","lës","gòd"]},"cv":{"am_pm":["",""],"days":["vyrsarnikun","tuntikun","ytlarikun","junkun","kĕşnernikun","ernekun","šămatkun"],"months":["kărlac","narăs","puš","aka","şu","şĕrtme","ută","şurla","avăn","jupa","cük","raštav"],"short_days":["vr","tn","yt","jn","kş","er","šm"],"short_months":["KĂR","NAR","PUŠ","AKA","ŞU","ŞĔR","UTĂ","ŞUR","AVĂ","JUP","CÜK","RAŠ"]},"cy":{"am_pm":["am","pm"],"days":["Sul","Llun","Mawrth","Mercher","Iau","Gwener","Sadwrn"],"months":["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],"short_days":["Sul","Llu","Maw","Mer","Iau","Gwe","Sad"],"short_months":["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rha"]},"da":{"am_pm":["",""],"days":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"months":["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],"short_days":["søn","man","tir","ons","tor","fre","lør"],"short_months":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"]},"de_AT":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_BE":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_CH":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_DE":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_IT":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_LI":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_LU":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"doi":{"am_pm":["सञं","सबेर"],"days":["ऐतबार","सोमबार","मंगलबर","बुधबार","बीरबार","शुक्करबार","श्नीचरबार"],"months":["जनवरी","फरवरी","मार्च","एप्रैल","मेई","जून","जूलै","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर"],"short_days":["ऐत","सोम","मंगल","बुध","बीर","शुक्कर","श्नीचर"],"short_months":["जनवरी","फरवरी","मार्च","एप्रैल","मेई","जून","जूलै","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर"]},"dsb":{"am_pm":["",""],"days":["Njeźela","Pónjeźele","Wałtora","Srjoda","Stwórtk","Pětk","Sobota"],"months":["januara","februara","měrca","apryla","maja","junija","julija","awgusta","septembra","oktobra","nowembra","decembra"],"short_days":["Nj","Pó","Wa","Sr","St","Pě","So"],"short_months":["Jan","Feb","Měr","Apr","Maj","Jun","Jul","Awg","Sep","Okt","Now","Dec"]},"dv":{"am_pm":["މކ","މފ"],"days":["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],"months":["ޖެނުއަރީ","ފެބްރުއަރީ","މާރޗް","އެޕްރީލް","މެއި","ޖޫން","ޖުލައި","އޮގަސްޓް","ސެޕްޓެންބަރ","އޮކްޓޫބަރ","ނޮވެންބަރ","ޑިސެންބަރ"],"short_days":["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],"short_months":["ޖެނުއަރީ","ފެބްރުއަރީ","މާރޗް","އެޕްރީލް","މެއި","ޖޫން","ޖުލައި","އޮގަސްޓް","ސެޕްޓެންބަރ","އޮކްޓޫބަރ","ނޮވެންބަރ","ޑިސެންބަރ"]},"dz":{"am_pm":["ངས་ཆ","ཕྱི་ཆ"],"days":["གཟའ་ཟླ་བ་","གཟའ་མིག་དམར་","གཟའ་ལྷག་ཕ་","གཟའ་པུར་བུ་","གཟའ་པ་སངས་","གཟའ་སྤེན་ཕ་","གཟའ་ཉི་མ་"],"months":["ཟླ་བ་དང་པ་","ཟླ་བ་གཉིས་པ་","ཟླ་བ་གསུམ་པ་","ཟླ་བ་བཞི་པ་","ཟླ་བ་ལྔ་ཕ་","ཟླ་བ་དྲུག་པ་","ཟླ་བ་བདུནཔ་","ཟླ་བ་བརྒྱད་པ་","ཟླ་བ་དགུ་པ་","ཟླ་བ་བཅུ་པ་","ཟླ་བ་བཅུ་གཅིག་པ་","ཟླ་བ་བཅུ་གཉིས་པ་"],"short_days":["ཟླ་","མིར་","ལྷག་","པུར་","སངས་","སྤེན་","ཉི་"],"short_months":["ཟླ་༡","ཟླ་༢","ཟླ་༣","ཟླ་༤","ཟླ་༥","ཟླ་༦","ཟླ་༧","ཟླ་༨","ཟླ་༩","ཟླ་༡༠","ཟླ་༡༡","ཟླ་༡༢"]},"el":{"am_pm":["πμ","μμ"],"days":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"months":["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου"],"short_days":["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],"short_months":["Ιαν","Φεβ","Μαρ","Απρ","Μαΐ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"]},"en_AG":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_AU":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_BW":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_CA":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_DK":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_GB":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_HK":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_IE":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_IL":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_IN":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_NG":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_NZ":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_PH":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_SC":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_SG":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_US":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_ZA":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_ZM":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_ZW":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"es_AR":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_BO":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_CL":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_CO":{"am_pm":["AM","PM"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_CR":{"am_pm":["a.m.","p.m."],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_CU":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_DO":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_EC":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_ES":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_GT":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_HN":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_MX":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_NI":{"am_pm":["AM","PM"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_PA":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_PE":{"am_pm":["AM","PM"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","setiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","set","oct","nov","dic"]},"es_PR":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_PY":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_SV":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_US":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_UY":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","setiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","set","oct","nov","dic"]},"es_VE":{"am_pm":["am","pm"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"et":{"am_pm":["",""],"days":["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],"months":["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember"],"short_days":["P","E","T","K","N","R","L"],"short_months":["jaan ","veebr","märts","apr ","mai ","juuni","juuli","aug ","sept ","okt ","nov ","dets "]},"eu":{"am_pm":["",""],"days":["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],"months":["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],"short_days":["ig.","al.","ar.","az.","og.","or.","lr."],"short_months":["urt","ots","mar","api","mai","eka","uzt","abu","ira","urr","aza","abe"]},"fa":{"am_pm":["",""],"days":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"months":["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اكتبر","نوامبر","دسامبر"],"short_days":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"short_months":["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اكتبر","نوامبر","دسامبر"]},"ff":{"am_pm":["subaka","kikiiɗe"],"days":["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],"months":["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"],"short_days":["dew","aaɓ","maw","nje","naa","mwd","hbi"],"short_months":["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"]},"fi":{"am_pm":["",""],"days":["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],"months":["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],"short_days":["su","ma","ti","ke","to","pe","la"],"short_months":["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu"]},"fil":{"am_pm":["N.U.","N.H."],"days":["Linggo","Lunes","Martes","Miyerkoles","Huwebes","Biyernes","Sabado"],"months":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre"],"short_days":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"short_months":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"]},"fo":{"am_pm":["",""],"days":["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],"months":["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember"],"short_days":["sun","mán","týs","mik","hós","frí","ley"],"short_months":["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"]},"fr_BE":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fr_CA":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fr_CH":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fr_FR":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"short_months":["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."]},"fr_LU":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fur":{"am_pm":["",""],"days":["Domenie","Lunis","Martars","Miercus","Joibe","Vinars","Sabide"],"months":["Zenâr","Fevrâr","Març","Avrîl","Mai","Jugn","Lui","Avost","Setembar","Otubar","Novembar","Dicembar"],"short_days":["Dom","Lun","Mar","Mie","Joi","Vin","Sab"],"short_months":["Zen","Fev","Mar","Avr","Mai","Jug","Lui","Avo","Set","Otu","Nov","Dic"]},"fy_DE":{"am_pm":["",""],"days":["Sinndag","Mondag","Dingsdag","Meddwäakj","Donnadag","Friedag","Sinnowend"],"months":["Jaunuwoa","Februwoa","Moaz","Aprell","Mai","Juni","Juli","August","Septamba","Oktoba","Nowamba","Dezamba"],"short_days":["Sdg","Mdg","Dsg","Mwk","Ddg","Fdg","Swd"],"short_months":["Jan","Feb","Moz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Now","Dez"]},"fy_NL":{"am_pm":["",""],"days":["Snein","Moandei","Tiisdei","Woansdei","Tongersdei","Freed","Sneon"],"months":["Jannewaris","Febrewaris","Maart","April","Maaie","Juny","July","Augustus","Septimber","Oktober","Novimber","Desimber"],"short_days":["Sn","Mo","Ti","Wo","To","Fr","Sn"],"short_months":["Jan","Feb","Mrt","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Des"]},"ga":{"am_pm":["",""],"days":["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],"months":["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig"],"short_days":["Domh","Luan","Máirt","Céad","Déar","Aoine","Sath"],"short_months":["Ean","Feabh","Márta","Aib","Beal","Meith","Iúil","Lún","MFómh","DFómh","Samh","Noll"]},"gd":{"am_pm":["m","f"],"days":["DiDòmhnaich","DiLuain","DiMàirt","DiCiadain","DiarDaoin","DihAoine","DiSathairne"],"months":["dhen Fhaoilleach","dhen Ghearran","dhen Mhàrt","dhen Ghiblean","dhen Chèitean","dhen Ògmhios","dhen Iuchar","dhen Lùnastal","dhen t-Sultain","dhen Dàmhair","dhen t-Samhain","dhen Dùbhlachd"],"short_days":["DiD","DiL","DiM","DiC","Dia","Dih","DiS"],"short_months":["Faoi","Gearr","Màrt","Gibl","Cèit","Ògmh","Iuch","Lùna","Sult","Dàmh","Samh","Dùbh"]},"gez_ER":{"am_pm":["ጽባሕ","ምሴት"],"days":["እኁድ","ሰኑይ","ሠሉስ","ራብዕ","ሐሙስ","ዓርበ","ቀዳሚት"],"months":["ጠሐረ","ከተተ","መገበ","አኀዘ","ግንባት","ሠንየ","ሐመለ","ነሐሰ","ከረመ","ጠቀመ","ኀደረ","ኀሠሠ"],"short_days":["እኁድ","ሰኑይ","ሠሉስ","ራብዕ","ሐሙስ","ዓርበ","ቀዳሚ"],"short_months":["ጠሐረ","ከተተ","መገበ","አኀዘ","ግንባ","ሠንየ","ሐመለ","ነሐሰ","ከረመ","ጠቀመ","ኀደረ","ኀሠሠ"]},"gez_ET":{"am_pm":["ጽባሕ","ምሴት"],"days":["እኁድ","ሰኑይ","ሠሉስ","ራብዕ","ሐሙስ","ዓርበ","ቀዳሚት"],"months":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር"],"short_days":["እኁድ","ሰኑይ","ሠሉስ","ራብዕ","ሐሙስ","ዓርበ","ቀዳሚ"],"short_months":["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ ","ጁን ","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም"]},"gl":{"am_pm":["",""],"days":["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],"months":["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],"short_days":["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],"short_months":["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"]},"gu":{"am_pm":["સવારે","સાંજે"],"days":["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],"months":["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટોબર","નવેમ્બર","ડિસેમ્બર"],"short_days":["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],"short_months":["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે"]},"gv":{"am_pm":["",""],"days":["Jedoonee","Jelhein","Jemayrt","Jercean","Jerdein","Jeheiney","Jesarn"],"months":["Jerrey-geuree","Toshiaght-arree","Mayrnt","Averil","Boaldyn","Mean-souree","Jerrey-souree","Luanistyn","Mean-fouyir","Jerrey-fouyir","Mee Houney","Mee ny Nollick"],"short_days":["Jed","Jel","Jem","Jerc","Jerd","Jeh","Jes"],"short_months":["J-guer","T-arree","Mayrnt","Avrril","Boaldyn","M-souree","J-souree","Luanistyn","M-fouyir","J-fouyir","M.Houney","M.Nollick"]},"ha":{"am_pm":["AM","PM"],"days":["Lahadi","Litini","Talata","Laraba","Alhamis","Juma'a","Asabar"],"months":["Janairu","Faburairu","Maris","Afirilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktoba","Nuwamba","Disamba"],"short_days":["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],"short_months":["Jan","Fab","Mar","Afi","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis"]},"hak":{"am_pm":["上晝","下晝"],"days":["禮拜日","禮拜一","禮拜二","禮拜三","禮拜四","禮拜五","禮拜六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"he":{"am_pm":["AM","PM"],"days":["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],"months":["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"short_days":["א'","ב'","ג'","ד'","ה'","ו'","ש'"],"short_months":["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ"]},"hi":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"months":["जनवरी","फ़रवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर"],"short_days":["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],"short_months":["जन॰","फ़र॰","मार्च","अप्रैल","मई","जून","जुल॰","अग॰","सित॰","अक्तू॰","नव॰","दिस॰"]},"hif":{"am_pm":["Purvahan","Aparaahna"],"days":["Ravivar","Somvar","Mangalvar","Budhvar","Guruvar","Shukravar","Shanivar"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Ravi","Som","Mangal","Budh","Guru","Shukra","Shani"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"hne":{"am_pm":["बिहिनियाँ","मंझनियाँ"],"days":["इतवार","सोमवार","मंगलवार","बुधवार","बिरसपत","सुकरवार","सनिवार"],"months":["जनवरी","फरवरी","मार्च","अपरेल","मई","जून","जुलाई","अगस्त","सितमबर","अकटूबर","नवमबर","दिसमबर"],"short_days":["इत","सोम","मंग","बुध","बिर","सुक","सनि"],"short_months":["जन","फर","मार्च","अप","मई","जून","जुला","अग","सित","अकटू","नव","दिस"]},"hr":{"am_pm":["",""],"days":["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],"months":["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenoga","prosinca"],"short_days":["ned","pon","uto","sri","čet","pet","sub"],"short_months":["sij","velj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro"]},"hsb":{"am_pm":["",""],"days":["Njedźela","Póndźela","Wutora","Srjeda","Štvórtk","Pjatk","Sobota"],"months":["januara","februara","měrca","apryla","meje","junija","julija","awgusta","septembra","oktobra","nowembra","decembra"],"short_days":["Nj","Pó","Wu","Sr","Št","Pj","So"],"short_months":["Jan","Feb","Měr","Apr","Mej","Jun","Jul","Awg","Sep","Okt","Now","Dec"]},"ht":{"am_pm":["",""],"days":["dimanch","lendi","madi","mèkredi","jedi","vandredi","samdi"],"months":["janvye","fevriye","mas","avril","me","jen","jiyè","out","septanm","oktòb","novanm","desanm"],"short_days":["dim","len","mad","mèk","jed","van","sam"],"short_months":["jan","fev","mas","avr","me","jen","jiy","out","sep","okt","nov","des"]},"hu":{"am_pm":["",""],"days":["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],"months":["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december"],"short_days":["v","h","k","sze","cs","p","szo"],"short_months":["jan","febr","márc","ápr","máj","jún","júl","aug","szept","okt","nov","dec"]},"hy":{"am_pm":["",""],"days":["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","Ուրբաթ","Շաբաթ"],"months":["հունվարի","փետրվարի","մարտի","ապրիլի","մայիսի","հունիսի","հուլիսի","օգոստոսի","սեպտեմբերի","հոկտեմբերի","նոյեմբերի","դեկտեմբերի"],"short_days":["Կրկ","Երկ","Երք","Չրք","Հնգ","Ուր","Շբթ"],"short_months":["Հնվ","Փտր","Մար","Ապր","Մայ","Հնս","Հլս","Օգս","Սեպ","Հոկ","Նմբ","Դեկ"]},"ia":{"am_pm":["AM","PM"],"days":["dominica","lunedi","martedi","mercuridi","jovedi","venerdi","sabbato"],"months":["januario","februario","martio","april","maio","junio","julio","augusto","septembre","octobre","novembre","decembre"],"short_days":["dom","lun","mar","mer","jov","ven","sab"],"short_months":["jan","feb","mar","apr","mai","jun","jul","aug","sep","oct","nov","dec"]},"id":{"am_pm":["",""],"days":["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],"months":["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],"short_days":["Min","Sen","Sel","Rab","Kam","Jum","Sab"],"short_months":["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agu","Sep","Okt","Nov","Des"]},"ig":{"am_pm":["AM","PM"],"days":["sọnde","mọnde","tuzde","wenzde","tọsde","fraịde","satọde"],"months":["Jenụwarị","Febrụwarị","Maachị","Eprel","Mee","Juun","Julaị","Ọgọọst","Septemba","Ọktoba","Novemba","Disemba"],"short_days":["sọn","mọn","tuz","wen","tọs","fra","sat"],"short_months":["Jen","Feb","Maa","Epr","Mee","Juu","Jul","Ọgọ","Sep","Ọkt","Nov","Dis"]},"ik":{"am_pm":["AM","PM"],"days":["Minġuiqsioiq","Savałłiq","Ilaqtchiioiq","Qitchiioiq","Sisamiioiq","Tallimmiioiq","Maqinġuoiq"],"months":["Siqiññaatchiaq","Siqiññaasrugruk","Paniqsiqsiivik","Qilġich Tatqiat","Suppivik","Iġñivik","Itchavik","Tiññivik","Amiġaiqsivik","Sikkuvik","Nippivik","Siqiñġiḷaq"],"short_days":["Min","Sav","Ila","Qit","Sis","Tal","Maq"],"short_months":["Sñt","Sñs","Pan","Qil","Sup","Iġñ","Itc","Tiñ","Ami","Sik","Nip","Siq"]},"is":{"am_pm":["fh","eh"],"days":["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],"months":["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember"],"short_days":["sun","mán","þri","mið","fim","fös","lau"],"short_months":["jan","feb","mar","apr","maí","jún","júl","ágú","sep","okt","nóv","des"]},"it":{"am_pm":["",""],"days":["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],"months":["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"],"short_days":["dom","lun","mar","mer","gio","ven","sab"],"short_months":["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"]},"iu":{"am_pm":["AM","PM"],"days":["ᓈᑦᑎᖑᔭᕐᕕᒃ","ᓇᒡᒐᔾᔭᐅ","ᓇᒡᒐᔾᔭᐅᓕᖅᑭᑦ","ᐱᖓᓲᓕᖅᓯᐅᑦ","ᕿᑎᖅᑰᑦ","ᐅᓪᓗᕈᓘᑐᐃᓇᖅ","ᓯᕙᑖᕕᒃ"],"months":["ᔮᓄᐊᓕ","ᕕᕗᐊᓕ","ᒪᔅᓯ","ᐃᐳᓗ","ᒪᐃ","ᔪᓂ","ᔪᓚᐃ","ᐊᒋᓯ","ᓯᑎᕙ","ᐊᑦᑐᕙ","ᓄᕕᕙ","ᑎᓯᕝᕙ"],"short_days":["ᓈ","ᓇ","ᓕ","ᐱ","ᕿ","ᐅ","ᓯ"],"short_months":["ᔮᓄ","ᕕᕗ","ᒪᔅ","ᐃᐳ","ᒪᐃ","ᔪᓂ","ᔪᓚ","ᐊᒋ","ᓯᑎ","ᐊᑦ","ᓄᕕ","ᑎᓯ"]},"ja":{"am_pm":["午前","午後"],"days":["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],"months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"short_days":["日","月","火","水","木","金","土"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"ka":{"am_pm":["",""],"days":["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],"months":["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],"short_days":["კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],"short_months":["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"]},"kab":{"am_pm":["FT","MD"],"days":["Acer","Arim","Aram","Ahad","Amhad","Sem","Sed"],"months":["Yennayer","Fuṛar","Meɣres","Yebrir","Mayyu","Yunyu","Yulyu","ɣuct","Ctembeṛ","Tubeṛ","Wambeṛ","Dujembeṛ"],"short_days":["Ace","Ari","Ara","Aha","Amh","Sem","Sed"],"short_months":["Yen","Fur","Meɣ","Yeb","May","Yun","Yul","ɣuc","Cte","Tub","Wam","Duj"]},"kk":{"am_pm":["",""],"days":["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],"months":["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"],"short_days":["Жк","Дс","Сс","Ср","Бс","Жм","Сб"],"short_months":["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"]},"kl":{"am_pm":["",""],"days":["sapaat","ataasinngorneq","marlunngorneq","pingasunngorneq","sisamanngorneq","tallimanngorneq","arfininngorneq"],"months":["januaarip","februaarip","marsip","apriilip","maajip","juunip","juulip","aggustip","septembarip","oktobarip","novembarip","decembarip"],"short_days":["sap","ata","mar","pin","sis","tal","arf"],"short_months":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"]},"km":{"am_pm":["ព្រឹក","ល្ងាច"],"days":["ថ្ងៃ​អាទិត្យ","ថ្ងៃ​ច័ន្ទ","ថ្ងៃ​អង្គារ","ថ្ងៃ​ពុធ","ថ្ងៃ​ព្រហស្បតិ៍","ថ្ងៃ​សុក្រ","ថ្ងៃ​សៅរ៍"],"months":["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],"short_days":["អា","ច","អ","ពុ","ព្រ","សុ","ស"],"short_months":["១","២","៣","៤","៥","៦","៧","៨","៩","១០","១១","១២"]},"kn":{"am_pm":["ಪೂರ್ವಾಹ್ನ","ಅಪರಾಹ್ನ"],"days":["ರವಿವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],"months":["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಏಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟೆಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್"],"short_days":["ರ","ಸೋ","ಮಂ","ಬು","ಗು","ಶು","ಶ"],"short_months":["ಜನ","ಫೆಬ್ರ","ಮಾರ್ಚ್","ಏಪ್ರಿ","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆ","ಸೆಪ್ಟೆಂ","ಅಕ್ಟೋ","ನವೆಂ","ಡಿಸೆಂ"]},"ko":{"am_pm":["오전","오후"],"days":["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],"months":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"short_days":["일","월","화","수","목","금","토"],"short_months":[" 1월"," 2월"," 3월"," 4월"," 5월"," 6월"," 7월"," 8월"," 9월","10월","11월","12월"]},"kok":{"am_pm":["म.पू.","म.नं."],"days":["आयतार","सोमार","मंगळवार","बुधवार","बेरेसतार","शुकरार","शेनवार"],"months":["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ओगस्ट","सेप्टेंबर","ओक्टोबर","नोव्हेंबर","डिसेंबर"],"short_days":["आयतार","सोमार","मंगळवार","बुधवार","बेरेसतार","शुकरार","शेनवार"],"short_months":["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ओगस्ट","सेप्टेंबर","ओक्टोबर","नोव्हेंबर","डिसेंबर"]},"ks":{"am_pm":["دوپھربرونھ","دوپھرپتھ"],"days":["آتهوار","ژءندروار","بوءںوار","بودهوار","برىسوار","جمع","بٹوار"],"months":["جنؤری","فرؤری","مارٕچ","اپریل","میٔ","جوٗن","جوٗلایی","اگست","ستمبر","اکتوٗبر","نومبر","دسمبر"],"short_days":["آتهوار","ژءنتروار","بوءںوار","بودهوار","برىسوار","جمع","بٹوار"],"short_months":["جنؤری","فرؤری","مارٕچ","اپریل","میٔ","جوٗن","جوٗلایی","اگست","ستمبر","اکتوٗبر","نومبر","دسمبر"]},"ku":{"am_pm":["",""],"days":["yêksêm","dusêm","sêsêm","çarsêm","pêncsêm","înî","sept"],"months":["Çile","Sibat","Adar","Nîsan","Gulan","Hezîran","Tîrmeh","Tebax","Îlon","Cotmeh","Mijdar","Kanûn"],"short_days":["yêk","dus","sês","çar","pên","înî","sep"],"short_months":["Çil","Sib","Ada","Nîs","Gul","Hez","Tîr","Teb","Îlo","Cot","Mij","Kan"]},"kw":{"am_pm":["",""],"days":["De Sul","De Lun","De Merth","De Merher","De Yow","De Gwener","De Sadorn"],"months":["mis Genver","mis Hwevrer","mis Meurth","mis Ebrel","mis Me","mis Metheven","mis Gortheren","mis Est","mis Gwynngala","mis Hedra","mis Du","mis Kevardhu"],"short_days":["Sul","Lun","Mth","Mhr","Yow","Gwe","Sad"],"short_months":["Gen","Hwe","Meu","Ebr","Me","Met","Gor","Est","Gwn","Hed","Du","Kev"]},"ky":{"am_pm":["",""],"days":["жекшемби","дүйшөмбү","шейшемби","шаршемби","бейшемби","жума","ишемби"],"months":["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"],"short_days":["жк","дш","ше","ша","бш","жм","иш"],"short_months":["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек"]},"lb":{"am_pm":["",""],"days":["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],"months":["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mé","Dë","Më","Do","Fr","Sa"],"short_months":["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"lg":{"am_pm":["",""],"days":["Sabiiti","Balaza","Lwakubiri","Lwakusatu","Lwakuna","Lwakutaano","Lwamukaaga"],"months":["Janwaliyo","Febwaliyo","Marisi","Apuli","Maayi","Juuni","Julaayi","Agusito","Sebuttemba","Okitobba","Novemba","Desemba"],"short_days":["Sab","Bal","Lw2","Lw3","Lw4","Lw5","Lw6"],"short_months":["Jan","Feb","Mar","Apu","Maa","Juu","Jul","Agu","Seb","Oki","Nov","Des"]},"li":{"am_pm":["",""],"days":["zóndig","maondig","daensdig","goonsdig","dónderdig","vriedig","zaoterdig"],"months":["jannewarie","fibberwarie","miert","eprèl","meij","junie","julie","augustus","september","oktober","november","desember"],"short_days":["zón","mao","dae","goo","dón","vri","zao"],"short_months":["jan","fib","mie","epr","mei","jun","jul","aug","sep","okt","nov","des"]},"lij":{"am_pm":["",""],"days":["domenega","lûnedì","martedì","mercUrdì","zêggia","venardì","sabbo"],"months":["zenâ","fevrâ","marzo","avrî","mazzo","zûgno","lûggio","agosto","settembre","ottobre","novembre","dixembre"],"short_days":["dom","lûn","mar","mer","zêu","ven","sab"],"short_months":["zen","fev","mar","arv","maz","zûg","lûg","ago","set","ött","nov","dix"]},"ln":{"am_pm":["",""],"days":["Lomíngo","Mosálá mɔ̌kɔ́","Misálá míbalé","Misálá mísáto","Misálá mínei","Misálá mítáno","Mpɔ́sɔ"],"months":["sánzá ya yambo","sánzá ya míbalé","sánzá ya mísáto","sánzá ya mínei","sánzá ya mítáno","sánzá ya motóbá","sánzá ya nsambo","sánzá ya mwambe","sánzá ya libwa","sánzá ya zómi","sánzá ya zómi na mɔ̌kɔ́","sánzá ya zómi na míbalé"],"short_days":["m1.","m2.","m3.","m4.","m5.","m6.","m7."],"short_months":["yan","fbl","msi","apl","mai","yun","yul","agt","stb","ɔtb","nvb","dsb"]},"lo":{"am_pm":["AM","PM"],"days":["ອາທິດ","ຈັນ","ອັງຄານ","ພຸດ","ພະຫັດ","ສຸກ","ເສົາ"],"months":["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ"],"short_days":["ອາ.","ຈ.","ຄ.","ພ.","ພຫ.","ສ.","ສ."],"short_months":["ມ.ກ.","ກ.ພ.","ມ.ນ.","ມ.ສ.","ພ.ພ.","ມິ.ຖ.","ກ.ລ.","ສ.ຫ.","ກ.ຍ.","ຕ.ລ.","ພ.ຈ.","ທ.ວ."]},"lt":{"am_pm":["",""],"days":["Sekmadienis","Pirmadienis","Antradienis","Trečiadienis","Ketvirtadienis","Penktadienis","Šeštadienis"],"months":["sausio","vasario","kovo","balandžio","gegužės","birželio","liepos","rugpjūčio","rugsėjo","spalio","lapkričio","gruodžio"],"short_days":["Sk","Pr","An","Tr","Kt","Pn","Št"],"short_months":["saus.","vas.","kov.","bal.","geg.","birž.","liep.","rugp.","rugs.","spal.","lapkr.","gruod."]},"lv":{"am_pm":["",""],"days":["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],"months":["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris"],"short_days":["Sv","P ","O ","T ","C ","Pk","S "],"short_months":["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec"]},"lzh":{"am_pm":["朝","暮"],"days":["週日","週一","週二","週三","週四","週五","週六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 一 "," 二 "," 三 "," 四 "," 五 "," 六 "," 七 "," 八 "," 九 "," 十 ","十一","十二"]},"mag":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["एतवार","सोमार","मंगर","बुध","बिफे","सूक","सनिचर"],"months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],"short_days":["एतवार","सोमार","मंगर","बुध","बिफे","सूक","सनिचर"],"short_months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"]},"mai":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविदिन","सोमदिन","मंगलदिन","बुधदिन","बृहस्पतीदिन","शुक्रदिन","शनीदिन"],"months":["बैसाख","जेठ","अषाढ़","सावोन","भादो","आसिन","कातिक","अगहन","पूस","माघ","फागुन","चैति"],"short_days":["रवि","सोम","मंगल","बुध","बृहस्पती","शुक्र","शनी"],"short_months":["बैसाख","जेठ","अषाढ़","सावोन","भादो","आसिन","कातिक","अगहन","पूस","माघ","फागुन","चैति"]},"mfe":{"am_pm":["AM","PM"],"days":["dimans","lindi","mardi","merkredi","zedi","vandredi","samdi"],"months":["zanvie","fevriye","mars","avril","me","zin","zilye","out","septam","oktob","novam","desam"],"short_days":["dim","lin","mar","mer","ze","van","sam"],"short_months":["zan","fev","mar","avr","me","zin","zil","out","sep","okt","nov","des"]},"mg":{"am_pm":["",""],"days":["alahady","alatsinainy","talata","alarobia","alakamisy","zoma","sabotsy"],"months":["Janoary","Febroary","Martsa","Aprily","Mey","Jona","Jolay","Aogositra","Septambra","Oktobra","Novambra","Desambra"],"short_days":["lhd","lts","tlt","lrb","lkm","zom","sab"],"short_months":["Jan","Feb","Mar","Apr","Mey","Jon","Jol","Aog","Sep","Okt","Nov","Des"]},"mhr":{"am_pm":["",""],"days":["Рушарня","Шочмо","Кушкыжмо","Вӱргече","Изарня","Кугарня","Шуматкече"],"months":["Шорыкйол","Пургыж","Ӱярня","Вӱдшор","Ага","Пеледыш","Сӱрем","Сорла","Идым","Шыжа","Кылме","Теле"],"short_days":["Ршр","Шчм","Кжм","Вгч","Изр","Кгр","Шмт"],"short_months":["Шрк","Пгж","Ӱрн","Вшр","Ага","Пдш","Срм","Срл","Идм","Шыж","Клм","Тел"]},"mi":{"am_pm":["",""],"days":["Rātapu","Mane","Tūrei","Wenerei","Tāite","Paraire","Hātarei"],"months":["Kohi-tātea","Hui-tanguru","Poutū-te-rangi","Paenga-whāwhā","Haratua","Pipiri","Hōngoingoi","Here-turi-kōkā","Mahuru","Whiringa-ā-nuku","Whiringa-ā-rangi","Hakihea"],"short_days":["Ta","Ma","Tū","We","Tāi","Pa","Hā"],"short_months":["Kohi","Hui","Pou","Pae","Hara","Pipi","Hōngoi","Here","Mahu","Whi-nu","Whi-ra","Haki"]},"miq":{"am_pm":["VM","NM"],"days":["sandi","mundi","tiusdi","wensde","tausde","praidi","satadi"],"months":["siakwa kati","kuswa kati","kakamuk kati","lî wainhka kati","lih mairin kati","lî kati","pastara kati","sikla kati","wîs kati","waupasa kati","yahbra kati","trisu kati"],"short_days":["san","mun","tius","wens","taus","prai","sat"],"short_months":["siakwa kati","kuswa kati","kakamuk kati","lî wainhka kati","lih mairin kati","lî kati","pastara kati","sikla kati","wîs kati","waupasa kati","yahbra kati","trisu kati"]},"mjw":{"am_pm":["AM","PM"],"days":["Bhomkuru","Urmi","Durmi","Thelang","Theman","Bhomta","Bhomti"],"months":["Arkoi","Thangthang","There","Jangmi","Aru","Vosik","Jakhong","Paipai","Chiti","Phere","Phaikuni","Matijong"],"short_days":["Bhom","Ur","Dur","Tkel","Tkem","Bhta","Bhti"],"short_months":["Ark","Thang","The","Jang","Aru","Vos","Jak","Pai","Chi","Phe","Phai","Mati"]},"mk":{"am_pm":["",""],"days":["недела","понеделник","вторник","среда","четврток","петок","сабота"],"months":["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],"short_days":["нед","пон","вто","сре","чет","пет","саб"],"short_months":["јан","фев","мар","апр","мај","јун","јул","авг","сеп","окт","ное","дек"]},"ml":{"am_pm":["രാവിലെ","വൈകു"],"days":["ഞായര്‍","തിങ്കള്‍","ചൊവ്വ","ബുധന്‍","വ്യാഴം","വെള്ളി","ശനി"],"months":["ജനുവരി","ഫെബ്രുവരി","മാർച്ച്","ഏപ്രിൽ","മേയ്","ജൂൺ","ജൂലൈ","ഓഗസ്റ്റ്","സെപ്റ്റംബർ","ഒക്‌ടോബർ","നവംബർ","ഡിസംബർ"],"short_days":["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],"short_months":["ജനു","ഫെബ്രു","മാർ","ഏപ്രി","മേയ്","ജൂൺ","ജൂലൈ","ഓഗ","സെപ്റ്റം","ഒക്ടോ","നവം","ഡിസം"]},"mn":{"am_pm":["",""],"days":["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],"months":["Нэгдүгээр сар","Хоёрдугаар сар","Гуравдугаар сар","Дөрөвдүгээр сар","Тавдугаар сар","Зургадугаар сар","Долдугаар сар","Наймдугаар сар","Есдүгээр сар","Аравдугаар сар","Арван нэгдүгээр сар","Арван хоёрдугаар сар"],"short_days":["Ня","Да","Мя","Лх","Пү","Ба","Бя"],"short_months":["1-р сар","2-р сар","3-р сар","4-р сар","5-р сар","6-р сар","7-р сар","8-р сар","9-р сар","10-р сар","11-р сар","12-р сар"]},"mni":{"am_pm":["এ.ম.","প.ম."],"days":["নোংমাইজিং","নিংথৌকাবা","লৈবাকপোকপা","য়ুমশকৈশা","শগোলশেন","ইরাই","থাংজ"],"months":["জানুৱারি","ফেব্রুৱারি","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","সেপ্তেম্বর","ওক্তোবর","নবেম্বর","ডিসেম্বর"],"short_days":["নোং","নিং","লৈবাক","য়ুম","শগোল","ইরা","থাং"],"short_months":["জান","ফেব","মার","এপ্রি","মে","জুন","জুল","আগ","সেপ","ওক্ত","নবে","ডিস"]},"mnw":{"am_pm":["ဂယး","တ္ၚဲစေၚ်"],"days":["အဒိုတ်","စန်","အၚာ","ဗုဒ္ဓဝါ","ဗြဴဗ္တိ","သိုက်","သ္ၚိသဝ်"],"months":["ဂျာန်နျူအာရဳ","ဝှေဝ်ဗြူအာရဳ","မာတ်ချ်","အေပြေယ်လ်","မေ","ဂျုန်","ဂျူလာၚ်","အဝ်ဂါတ်","သိပ်တီဗာ","အံက်တဝ်ဗာ","နဝ်ဝါမ်ဗာ","ဒဳသီဗာ"],"short_days":["ဒိုတ်","စန်","ၚာ","ဝါ","တိ","သိုက်","သဝ်"],"short_months":["ဂျာန်","ဝှေဝ်","မာတ်","အေ","မေ","ဂျုန်","ဂျူ","အဝ်","သိပ်","အံက်","နဝ်","ဒဳ"]},"mr":{"am_pm":["म.पू.","म.नं."],"days":["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"months":["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर"],"short_days":["रवि","सोम","मंगळ","बुध","गुरु","शुक्र","शनि"],"short_months":["जाने","फेब्रु","मार्च","एप्रि","मे","जून","जुलै","ऑग","सप्टें","ऑक्टो","नोव्हें","डिसें"]},"ms":{"am_pm":["",""],"days":["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],"months":["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],"short_days":["Ahd","Isn","Sel","Rab","Kha","Jum","Sab"],"short_months":["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sep","Okt","Nov","Dis"]},"mt":{"am_pm":["",""],"days":["il-Ħadd","it-Tnejn","it-Tlieta","l-Erbgħa","il-Ħamis","il-Ġimgħa","is-Sibt"],"months":["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awwissu","Settembru","Ottubru","Novembru","Diċembru"],"short_days":["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],"short_months":["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Aww","Set","Ott","Nov","Diċ"]},"my":{"am_pm":["နံနက်","ညနေ"],"days":["တနင်္ဂနွေ","တနင်္လာ","အင်္ဂါ","ဗုဒ္ဓဟူး","ကြာသပတေး","သောကြာ","စနေ"],"months":["ဇန်နဝါရီ","ဖေဖော်ဝါရီ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူလိုင်","ဩဂုတ်","စက်တင်ဘာ","အောက်တိုဘာ","နိုဝင်ဘာ","ဒီဇင်ဘာ"],"short_days":["နွေ","လာ","ဂါ","ဟူး","တေး","သော","နေ"],"short_months":["ဇန်","ဖေ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူ","ဩ","စက်","အောက်","နို","ဒီ"]},"nan":{"am_pm":["頂晡","下晡"],"days":["禮拜日","禮拜一","禮拜二","禮拜三","禮拜四","禮拜五","禮拜六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"nb":{"am_pm":["",""],"days":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"months":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"short_days":["sø.","ma.","ti.","on.","to.","fr.","lø."],"short_months":["jan.","feb.","mars","april","mai","juni","juli","aug.","sep.","okt.","nov.","des."]},"nds_DE":{"am_pm":["",""],"days":["Sünndag","Maandag","Dingsdag","Middeweek","Dunnersdag","Freedag","Sünnavend"],"months":["Jannuaar","Feberwaar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["Sdag","Maan","Ding","Migg","Dunn","Free","Svd."],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"nds_NL":{"am_pm":["",""],"days":["Sinndag","Mondag","Dingsdag","Meddwäakj","Donnadag","Friedag","Sinnowend"],"months":["Jaunuwoa","Februwoa","Moaz","Aprell","Mai","Juni","Juli","August","Septamba","Oktoba","Nowamba","Dezamba"],"short_days":["Sdg","Mdg","Dsg","Mwk","Ddg","Fdg","Swd"],"short_months":["Jan","Feb","Moz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Now","Dez"]},"ne":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["आइतबार","सोमबार","मङ्गलबार","बुधबार","बिहीबार","शुक्रबार","शनिबार"],"months":["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],"short_days":["आइत","सोम","मङ्गल","बुध","बिही","शुक्र","शनि"],"short_months":["जन","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"]},"nhn":{"am_pm":["",""],"days":["teoilhuitl","ceilhuitl","omeilhuitl","yeilhuitl","nahuilhuitl","macuililhuitl","chicuaceilhuitl"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["teo","cei","ome","yei","nau","mac","chi"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"niu":{"am_pm":["AM","PM"],"days":["Aho Tapu","Aho Gofua","Aho Ua","Aho Lotu","Aho Tuloto","Aho Falaile","Aho Faiumu"],"months":["Ianuali","Fepuali","Masi","Apelila","Me","Iuni","Iulai","Aokuso","Sepetema","Oketopa","Novema","Tesemo"],"short_days":["Tapu","Gofua","Ua","Lotu","Tuloto","Falaile","Faiumu"],"short_months":["Ian","Fep","Mas","Ape","Me","Iun","Iul","Aok","Sep","Oke","Nov","Tes"]},"nl":{"am_pm":["",""],"days":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"months":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"short_days":["zo","ma","di","wo","do","vr","za"],"short_months":["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"]},"nn":{"am_pm":["",""],"days":["sundag ","måndag ","tysdag ","onsdag ","torsdag ","fredag ","laurdag "],"months":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"short_days":["su.","må.","ty.","on.","to.","fr.","la."],"short_months":["jan.","feb.","mars","april","mai","juni","juli","aug.","sep.","okt.","nov.","des."]},"nr":{"am_pm":["",""],"days":["uSonto","uMvulo","uLesibili","lesithathu","uLesine","ngoLesihlanu","umGqibelo"],"months":["Janabari","uFeberbari","uMatjhi","u-Apreli","Meyi","Juni","Julayi","Arhostosi","Septemba","Oktoba","Usinyikhaba","Disemba"],"short_days":["Son","Mvu","Bil","Tha","Ne","Hla","Gqi"],"short_months":["Jan","Feb","Mat","Apr","Mey","Jun","Jul","Arh","Sep","Okt","Usi","Dis"]},"nso":{"am_pm":["",""],"days":["LaMorena","Mošupologo","Labobedi","Laboraro","Labone","Labohlano","Mokibelo"],"months":["Janaware","Febereware","Matšhe","Aprele","Mei","June","Julae","Agostose","Setemere","Oktobere","Nofemere","Disemere"],"short_days":["Son","Moš","Bed","Rar","Ne","Hla","Mok"],"short_months":["Jan","Feb","Mat","Apr","Mei","Jun","Jul","Ago","Set","Okt","Nof","Dis"]},"oc":{"am_pm":["",""],"days":["dimenge","diluns","dimars","dimècres","dijòus","divendres","dissabte"],"months":["de genièr","de febrièr","de març","d’abril","de mai","de junh","de julhet","d’agost","de setembre","d’octòbre","de novembre","de decembre"],"short_days":["dg.","dl.","dm.","dc.","dj.","dv.","ds."],"short_months":["gen.","febr.","març","abr.","mai","junh","jul.","ago.","set.","oct.","nov.","dec."]},"om":{"am_pm":["WD","WB"],"days":["Dilbata","Wiixata","Qibxata","Roobii","Kamiisa","Jimaata","Sanbata"],"months":["Amajjii","Guraandhala","Bitooteessa","Elba","Caamsa","Waxabajjii","Adooleessa","Hagayya","Fuulbana","Onkololeessa","Sadaasa","Muddee"],"short_days":["Dil","Wix","Qib","Rob","Kam","Jim","San"],"short_months":["Ama","Gur","Bit","Elb","Cam","Wax","Ado","Hag","Ful","Onk","Sad","Mud"]},"or":{"am_pm":["AM","PM"],"days":["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],"months":["ଜାନୁଆରୀ","ଫେବୃଆରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମଇ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"],"short_days":["ରବି","ସୋମ","ମଙ୍ଗଳ","ବୁଧ","ଗୁରୁ","ଶୁକ୍ର","ଶନି"],"short_months":["ଜାନୁଆରୀ","ଫେବୃଆରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମଇ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"]},"os":{"am_pm":["",""],"days":["Хуыцаубон","Къуырисæр","Дыццæг","Æртыццæг","Цыппæрæм","Майрæмбон","Сабат"],"months":["январы","февралы","мартъийы","апрелы","майы","июны","июлы","августы","сентябры","октябры","ноябры","декабры"],"short_days":["Хцб","Крс","Дцг","Æрт","Цпр","Мрб","Сбт"],"short_months":["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"]},"pa_IN":{"am_pm":["ਸਵੇਰੇ","ਸ਼ਾਮ"],"days":["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],"months":["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ"],"short_days":["ਐਤ","ਸੋਮ","ਮੰਗਲ","ਬੁੱਧ","ਵੀਰ","ਸ਼ੁੱਕਰ","ਸ਼ਨਿੱਚਰ"],"short_months":["ਜਨ","ਫ਼ਰ","ਮਾਰਚ","ਅਪ੍ਰੈ","ਮਈ","ਜੂਨ","ਜੁਲਾ","ਅਗ","ਸਤੰ","ਅਕਤੂ","ਨਵੰ","ਦਸੰ"]},"pa_PK":{"am_pm":["ص","ش"],"days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"months":["جنوري","فروري","مارچ","اپريل","مٓی","جون","جولاي","اگست","ستمبر","اكتوبر","نومبر","دسمبر"],"short_days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"short_months":["جنوري","فروري","مارچ","اپريل","مٓی","جون","جولاي","اگست","ستمبر","اكتوبر","نومبر","دسمبر"]},"pap":{"am_pm":["",""],"days":["Djadomingo","Djaluna","Djamars","Djawebs","Djarason","Djabierne","Djasabra"],"months":["Yanüari","Febrüari","Mart","Aprel","Mei","Yüni","Yüli","Ougùstùs","Sèptèmber","Oktober","Novèmber","Desèmber"],"short_days":["do","lu","ma","we","ra","bi","sa"],"short_months":["Yan","Feb","Mar","Apr","Mei","Yün","Yül","Oug","Sèp","Okt","Nov","Des"]},"pl":{"am_pm":["",""],"days":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"months":["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia"],"short_days":["nie","pon","wto","śro","czw","pią","sob"],"short_months":["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"]},"ps":{"am_pm":["غ.م.","غ.و."],"days":["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],"months":["جنوري","فبروري","مارچ","اپریل","مۍ","جون","جولای","اګست","سپتمبر","اکتوبر","نومبر","دسمبر"],"short_days":["ی.","د.","س.","چ.","پ.","ج.","ش."],"short_months":["جنوري","فبروري","مارچ","اپریل","مۍ","جون","جولای","اګست","سپتمبر","اکتوبر","نومبر","دسمبر"]},"pt":{"am_pm":["",""],"days":["domingo","segunda","terça","quarta","quinta","sexta","sábado"],"months":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"short_days":["dom","seg","ter","qua","qui","sex","sáb"],"short_months":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"]},"quz":{"am_pm":["AM","PM"],"days":["tuminku","lunis","martis","miyirkulis","juywis","wiyirnis","sawatu"],"months":["iniru","phiwriru","marsu","awril","mayu","huniyu","huliyu","agustu","siptiyimri","uktuwri","nuwiyimri","tisiyimri"],"short_days":["tum","lun","mar","miy","juy","wiy","saw"],"short_months":["ini","phi","mar","awr","may","hun","hul","agu","sip","ukt","nuw","tis"]},"raj":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवार","सोमवार","मंगल्लवार","बुधवार","बृहस्पतिवार","शुक्रवार","शनिवार"],"months":["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्टूबर","नवंबर","दिसंबर"],"short_days":["रवि","सोम","मंगल","बुध","बृहस्पति","शुक्र","शनि"],"short_months":["जन","फर","मार्च","अप्रै","मई","जून","जुल","अग","सित","अक्टू","नव","दिस"]},"rif":{"am_pm":["sb","aɛ"],"days":["Lḥed","Letnayen","Ttlat","Larbeɛ","Lexmiss","Jjemɛa","Ssebt"],"months":["Yennayer","Febrayer","Mares","Yebril","Mayyu","Yunyu","Yulyuz","Ɣuct","Cutenber","Kṭuber","Nuvember","Dujember"],"short_days":["Lḥe","Let","Ttl","Lar","Lex","Jje","Sbt"],"short_months":["Yen","Feb","Mar","Yeb","May","Yun","Yul","Ɣuc","Cut","Kṭu","Nuv","Duj"]},"ro":{"am_pm":["",""],"days":["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],"months":["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"],"short_days":["Du","Lu","Ma","Mi","Jo","Vi","Sb"],"short_months":["ian","feb","mar","apr","mai","iun","iul","aug","sep","oct","nov","dec"]},"ru":{"am_pm":["",""],"days":["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],"months":["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"],"short_days":["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],"short_months":["янв","фев","мар","апр","мая","июн","июл","авг","сен","окт","ноя","дек"]},"rw":{"am_pm":["",""],"days":["Ku cyumweru","Kuwa mbere","Kuwa kabiri","Kuwa gatatu","Kuwa kane","Kuwa gatanu","Kuwa gatandatu"],"months":["Mutarama","Gashyantare","Werurwe","Mata","Gicuransi","Kamena","Nyakanga","Kanama","Nzeli","Ukwakira","Ugushyingo","Ukuboza"],"short_days":["Mwe","Mbe","Kab","Gtu","Kan","Gnu","Gnd"],"short_months":["Mut","Gas","Wer","Mat","Gic","Kam","Nya","Kan","Nze","Ukw","Ugu","Uku"]},"sa":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवासर:","सोमवासर:","मंगलवासर:","बुधवासर:","बृहस्पतिवासरः","शुक्रवासर","शनिवासर:"],"months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],"short_days":["रविः","सोम:","मंगल:","बुध:","बृहस्पतिः","शुक्र","शनि:"],"short_months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"]},"sah":{"am_pm":["",""],"days":["баскыһыанньа","бэнидиэнньик","оптуорунньук","сэрэдэ","чэппиэр","бээтинсэ","субуота"],"months":["тохсунньу","олунньу","кулун тутар","муус устар","ыам ыйын","бэс ыйын","от ыйын","атырдьах ыйын","балаҕан ыйын","алтынньы","сэтинньи","ахсынньы"],"short_days":["бс","бн","оп","ср","чп","бт","сб"],"short_months":["тохс","олун","кул","муус","ыам","бэс","от","атыр","бал","алт","сэт","ахс"]},"sat":{"am_pm":["AM","PM"],"days":["सिंगेमाँहाँ","ओतेमाँहाँ","बालेमाँहाँ","सागुनमाँहाँ","सारदीमाँहाँ","जारुममाँहाँ","ञुहुममाँहाँ"],"months":["जनवरी","फरवरी","मार्च","अप्रेल","मई","जुन","जुलाई","अगस्त","सितम्बर","अखथबर","नवम्बर","दिसम्बर"],"short_days":["सिंगे","ओते","बाले","सागुन","सारदी","जारुम","ञुहुम"],"short_months":["जनवरी","फरवरी","मार्च","अप्रेल","मई","जुन","जुलाई","अगस्त","सितम्बर","अखथबर","नवम्बर","दिसम्बर"]},"sc":{"am_pm":["",""],"days":["Domìnigu","Lunis","Martis","Mèrcuris","Giòbia","Chenàbura","Sàbadu"],"months":["Ghennàrgiu","Freàrgiu","Martzu","Abrile","Maju","Làmpadas","Argiolas/Trìulas","Austu","Cabudanni","Santugaine/Ladàmine","Onniasantu/Santandria","Nadale/Idas"],"short_days":["Dom","Lun","Mar","Mèr","Giò","Che","Sàb"],"short_months":["Ghe","Fre","Mar","Abr","Maj","Làm","Arg","Aus","Cab","Lad","Onn","Nad"]},"sd":{"am_pm":["AM","PM"],"days":["آرتوارُ","سومرُ","منگلُ","ٻُڌرُ","وسپت","جُمو","ڇنڇر"],"months":["جنوري","فبروري","مارچ","اپريل","مي","جون","جولاءِ","آگسٽ","سيپٽيمبر","آڪٽوبر","نومبر","ڊسمبر"],"short_days":["آرتوارُ","سومرُ","منگلُ","ٻُڌرُ","وسپت","جُمو","ڇنڇر"],"short_months":["جنوري","فبروري","مارچ","اپريل","مي","جون","جولاءِ","آگسٽ","سيپٽيمبر","آڪٽوبر","نومبر","ڊسمبر"]},"se":{"am_pm":["",""],"days":["sotnabeaivi","vuossárga","maŋŋebarga","gaskavahkku","duorasdat","bearjadat","lávvardat"],"months":["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu"],"short_days":["sotn","vuos","maŋ","gask","duor","bear","láv"],"short_months":["ođđj","guov","njuk","cuoŋ","mies","geas","suoi","borg","čakč","golg","skáb","juov"]},"sgs":{"am_pm":["",""],"days":["nedielės dëna","panedielis","oterninks","sereda","četvergs","petnīčė","sobata"],"months":["sausė","vasarė","kuova","balondė","gegožės","bėrželė","lëpas","rogpjūtė","siejės","spalė","lapkrėstė","grůdė"],"short_days":["Nd","Pn","Ot","Sr","Čt","Pt","Sb"],"short_months":["Sau","Vas","Kuo","Bal","Geg","Bėr","Lëp","Rgp","Sie","Spa","Lap","Grd"]},"shn":{"am_pm":["ပွတ်းၼႂ်","ဝၢႆးဝၼ်း"],"days":["ဝၼ်းဢႃးတိတ်ႉ","ဝၼ်းၸၼ်","ဝၼ်းဢၢင်းၵၢၼ်း","ဝၼ်းပုတ်ႉ","ဝၼ်းၽတ်း","ဝၼ်းသုၵ်း","ဝၼ်းသဝ်"],"months":["လိူၼ်ၵမ်","လိူၼ်သၢမ်","လိူၼ်သီႇ","လိူၼ်ႁႃႈ","လိူၼ်ႁူၵ်း","လိူၼ်ၸဵတ်း","လိူၼ်ပႅတ်ႇ","လိူၼ်ၵဝ်ႈ","လိူၼ်သိပ်း","လိူၼ်သိပ်းဢဵတ်း","လိူၼ်သိပ်းသွင်","လိူၼ်ၸဵင်"],"short_days":["တိတ်ႉ","ၸၼ်","ၵၢၼ်း","ပုတ်ႉ","ၽတ်း","သုၵ်း","သဝ်"],"short_months":["လိူၼ်ၵမ်","လိူၼ်သၢမ်","လိူၼ်သီႇ","လိူၼ်ႁႃႈ","လိူၼ်ႁူၵ်း","လိူၼ်ၸဵတ်း","လိူၼ်ပႅတ်ႇ","လိူၼ်ၵဝ်ႈ","လိူၼ်သိပ်း","လိူၼ်သိပ်းဢဵတ်း","လိူၼ်သိပ်းသွင်","လိူၼ်ၸဵင်"]},"shs":{"am_pm":["AM","PM"],"days":["Sxetspesq̓t","Spetkesq̓t","Selesq̓t","Skellesq̓t","Smesesq̓t","Stselkstesq̓t","Stqmekstesq̓t"],"months":["Pellkwet̓min","Pelctsipwen̓ten","Pellsqépts","Peslléwten","Pell7ell7é7llqten","Pelltspéntsk","Pelltqwelq̓wél̓t","Pellct̓éxel̓cten","Pesqelqlélten","Pesllwélsten","Pellc7ell7é7llcwten̓","Pelltetétq̓em"],"short_days":["Sxe","Spe","Sel","Ske","Sme","Sts","Stq"],"short_months":["Kwe","Tsi","Sqe","Éwt","Ell","Tsp","Tqw","Ct̓é","Qel","Wél","U7l","Tet"]},"si":{"am_pm":["පෙ.ව.","ප.ව."],"days":["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],"months":["ජනවාරි","පෙබරවාරි","මාර්තු","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්"],"short_days":["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"],"short_months":["ජන","පෙබ","මාර්","අප්‍රි","මැයි","ජූනි","ජූලි","අගෝ","සැප්","ඔක්","නෙවැ","දෙසැ"]},"sid":{"am_pm":["soodo","hawwaro"],"days":["Sambata","Sanyo","Maakisanyo","Roowe","Hamuse","Arbe","Qidaame"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sam","San","Mak","Row","Ham","Arb","Qid"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"sk":{"am_pm":["",""],"days":["Nedeľa","Pondelok","Utorok","Streda","Štvrtok","Piatok","Sobota"],"months":["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],"short_days":["Ne","Po","Ut","St","Št","Pi","So"],"short_months":["jan","feb","mar","apr","máj","jún","júl","aug","sep","okt","nov","dec"]},"sl":{"am_pm":["",""],"days":["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],"months":["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],"short_days":["ned","pon","tor","sre","čet","pet","sob"],"short_months":["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"]},"sm":{"am_pm":["",""],"days":["Aso Sa","Aso Gafua","Aso Lua","Aso Lulu","Aso Tofi","Aso Farail","Aso To'ana'i"],"months":["Ianuari","Fepuari","Mati","Aperila","Me","Iuni","Iulai","Auguso","Setema","Oketopa","Novema","Tesema"],"short_days":["Aso Sa","Aso Gaf","Aso Lua","Aso Lul","Aso Tof","Aso Far","Aso To'"],"short_months":["Ian","Fep","Mat","Ape","Me","Iun","Iul","Aug","Set","Oke","Nov","Tes"]},"so_DJ":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Tal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"so_ET":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Sal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"so_KE":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Sal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"so_SO":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Sal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"sq":{"am_pm":["PD","MD"],"days":["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],"months":["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor"],"short_days":["Die","Hën","Mar","Mër","Enj","Pre","Sht"],"short_months":["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj"]},"sr_ME":{"am_pm":["",""],"days":["недјеља","понедељак","уторак","сриједа","четвртак","петак","субота"],"months":["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],"short_days":["нед","пон","уто","сри","чет","пет","суб"],"short_months":["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"]},"sr_RS":{"am_pm":["",""],"days":["недеља","понедељак","уторак","среда","четвртак","петак","субота"],"months":["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],"short_days":["нед","пон","уто","сре","чет","пет","суб"],"short_months":["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"]},"ss":{"am_pm":["",""],"days":["Lisontfo","uMsombuluko","Lesibili","Lesitsatfu","Lesine","Lesihlanu","uMgcibelo"],"months":["Bhimbidvwane","iNdlovane","iNdlovulenkhulu","Mabasa","Inkhwenkhweti","iNhlaba","Kholwane","iNgci","iNyoni","Impala","Lweti","iNgongoni"],"short_days":["Son","Mso","Bil","Tsa","Ne","Hla","Mgc"],"short_months":["Bhi","Van","Vul","Mab","Khk","Nhl","Kho","Ngc","Nyo","Imp","Lwe","Ngo"]},"st":{"am_pm":["",""],"days":["Sontaha","Mantaha","Labobedi","Laboraro","Labone","Labohlano","Moqebelo"],"months":["Pherekgong","Hlakola","Tlhakubele","Mmese","Motsheanong","Phupjane","Phupu","Phato","Leotse","Mphalane","Pudungwana","Tshitwe"],"short_days":["Son","Mma","Bed","Rar","Ne","Hla","Moq"],"short_months":["Phe","Hla","TlH","Mme","Mot","Jan","Upu","Pha","Leo","Mph","Pud","Tsh"]},"sv":{"am_pm":["",""],"days":["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],"months":["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],"short_days":["sön","mån","tis","ons","tor","fre","lör"],"short_months":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"]},"sw":{"am_pm":["asubuhi","alasiri"],"days":["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],"months":["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"],"short_days":["J2","J3","J4","J5","Alh","Ij","J1"],"short_months":["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"]},"szl":{"am_pm":["",""],"days":["niydziela","pyńdziałek","wtorek","strzoda","sztwortek","piōntek","sobota"],"months":["stycznia","lutego","marca","kwietnia","moja","czyrwca","lipca","sierpnia","września","października","listopada","grudnia"],"short_days":["niy","pyń","wto","str","szt","piō","sob"],"short_months":["sty","lut","mar","kwi","moj","czy","lip","sie","wrz","paź","lis","gru"]},"ta_IN":{"am_pm":["காலை","மாலை"],"days":["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],"months":["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"],"short_days":["ஞா","தி","செ","பு","வி","வெ","ச"],"short_months":["ஜன.","பிப்.","மார்.","ஏப்.","மே","ஜூன்","ஜூலை","ஆக.","செப்.","அக்.","நவ.","டிச."]},"ta_LK":{"am_pm":["காலை","மாலை"],"days":["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],"months":["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"],"short_days":["ஞா","தி","செ","பு","வி","வெ","ச"],"short_months":["ஜன","பிப்","மார்","ஏப்","மே","ஜூன்","ஜூலை","ஆக","செப்","அக்","நவ","டிச"]},"tcy":{"am_pm":["ಕಾಂಡೆ","ಬಯ್ಯ"],"days":["ಐಥಾರ","ಸೋಮಾರ","ಅಂಗರೆ","ಬುಧಾರ","ಗುರುವಾರ","ಶುಕ್ರರ","ಶನಿವಾರ"],"months":["ಜನವರಿ","ಫೆಬ್ರುವರಿ","ಮಾರ್ಚ್","ಏಪ್ರಿಲ್‌‌","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟೆಂಬರ್‌","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್"],"short_days":["ಐ","ಸೋ","ಅಂ","ಬು","ಗು","ಶು","ಶ"],"short_months":["ಜ","ಫೆ","ಮಾ","ಏ","ಮೇ","ಜೂ","ಜು","ಆ","ಸೆ","ಅ","ನ","ಡಿ"]},"te":{"am_pm":["ఉ.","సా."],"days":["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],"months":["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జులై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్"],"short_days":["ఆది","సోమ","మంగళ","బుధ","గురు","శుక్ర","శని"],"short_months":["జన","ఫిబ్ర","మార్చి","ఏప్రి","మే","జూన్","జులై","ఆగ","సెప్టెం","అక్టో","నవం","డిసెం"]},"tg":{"am_pm":["",""],"days":["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],"months":["Января","Февраля","Марта","Апреля","Мая","Июня","Июля","Августа","Сентября","Октября","Ноября","Декабря"],"short_days":["Вск","Пнд","Втр","Срд","Чтв","Птн","Сбт"],"short_months":["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"]},"th":{"am_pm":["AM","PM"],"days":["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],"months":["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],"short_days":["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],"short_months":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."]},"the":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["आइतबार","सोमबार","मंगलबार","बुधबार","बिहिबार","शुक्रबार","शनिबार"],"months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],"short_days":["आइत","सोम","मंगल","बुध","बिहि","शुक्र","शनि"],"short_months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"]},"ti_ER":{"am_pm":["ንጉሆ ሰዓተ","ድሕር ሰዓት"],"days":["ሰንበት","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"months":["ጥሪ","ለካቲት","መጋቢት","ሚያዝያ","ግንቦት","ሰነ","ሓምለ","ነሓሰ","መስከረም","ጥቅምቲ","ሕዳር","ታሕሳስ"],"short_days":["ሰንበ","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"short_months":["ጥሪ ","ለካቲ","መጋቢ","ሚያዝ","ግንቦ","ሰነ ","ሓምለ","ነሓሰ","መስከ","ጥቅም","ሕዳር","ታሕሳ"]},"ti_ET":{"am_pm":["ንጉሆ ሰዓተ","ድሕር ሰዓት"],"days":["ሰንበት","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"months":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር"],"short_days":["ሰንበ","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"short_months":["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ ","ጁን ","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም"]},"tig":{"am_pm":["ቀደም ሰር ምዕል","ሓቆ ሰር ምዕል"],"days":["ሰንበት ዓባይ","ሰኖ","ታላሸኖ","ኣረርባዓ","ከሚሽ","ጅምዓት","ሰንበት ንኢሽ"],"months":["ጥሪ","ለካቲት","መጋቢት","ሚያዝያ","ግንቦት","ሰነ","ሓምለ","ነሓሰ","መስከረም","ጥቅምቲ","ሕዳር","ታሕሳስ"],"short_days":["ሰ/ዓ","ሰኖ ","ታላሸ","ኣረር","ከሚሽ","ጅምዓ","ሰ/ን"],"short_months":["ጥሪ ","ለካቲ","መጋቢ","ሚያዝ","ግንቦ","ሰነ ","ሓምለ","ነሓሰ","መስከ","ጥቅም","ሕዳር","ታሕሳ"]},"tk":{"am_pm":["",""],"days":["Duşenbe","Sişenbe","Çarşenbe","Penşenbe","Anna","Şenbe","Ýekşenbe"],"months":["Ýanwar","Fewral","Mart","Aprel","Maý","Iýun","Iýul","Awgust","Sentýabr","Oktýabr","Noýabr","Dekabr"],"short_days":["Duş","Siş","Çar","Pen","Ann","Şen","Ýek"],"short_months":["Ýan","Few","Mar","Apr","Maý","Iýn","Iýl","Awg","Sen","Okt","Noý","Dek"]},"tl":{"am_pm":["AM","PM"],"days":["Linggo","Lunes","Martes","Miyerkoles","Huwebes","Biyernes","Sabado"],"months":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Septiyembre","Oktubre","Nobiyembre","Disyembre"],"short_days":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"short_months":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Sep","Okt","Nob","Dis"]},"tn":{"am_pm":["",""],"days":["laTshipi","Mosupologo","Labobedi","Laboraro","Labone","Labotlhano","Lamatlhatso"],"months":["Ferikgong","Tlhakole","Mopitlwe","Moranang","Motsheganong","Seetebosigo","Phukwi","Phatwe","Lwetse","Diphalane","Ngwanatsele","Sedimonthole"],"short_days":["Tsh","Mos","Bed","Rar","Ne","Tlh","Mat"],"short_months":["Fer","Tlh","Mop","Mor","Mot","See","Phu","Pha","Lwe","Dip","Ngw","Sed"]},"to":{"am_pm":["hengihengi","efiafi"],"days":["Sāpate","Mōnite","Tūsite","Pulelulu","Tuʻapulelulu","Falaite","Tokonaki"],"months":["Sānuali","Fēpueli","Maʻasi","ʻEpeleli","Mē","Sune","Siulai","ʻAokosi","Sepitema","ʻOkatopa","Nōvema","Tīsema"],"short_days":["Sāp","Mōn","Tūs","Pul","Tuʻa","Fal","Tok"],"short_months":["Sān","Fēp","Maʻa","ʻEpe","Mē","Sun","Siu","ʻAok","Sep","ʻOka","Nōv","Tīs"]},"tpi":{"am_pm":["biknait","apinun"],"days":["Sande","Mande","Tunde","Trinde","Fonde","Fraide","Sarere"],"months":["Janueri","Februeri","Mas","Epril","Me","Jun","Julai","Ogas","Septemba","Oktoba","Novemba","Desemba"],"short_days":["San","Man","Tun","Tri","Fon","Fra","Sar"],"short_months":["Jan","Feb","Mas","Epr","Me","Jun","Jul","Oga","Sep","Okt","Nov","Des"]},"tr":{"am_pm":["ÖÖ","ÖS"],"days":["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],"months":["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],"short_days":["Paz","Pzt","Sal","Çrş","Prş","Cum","Cts"],"short_months":["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"]},"ts":{"am_pm":["",""],"days":["Sonto","Musumbhunuku","Ravumbirhi","Ravunharhu","Ravumune","Ravuntlhanu","Mugqivela"],"months":["Sunguti","Nyenyenyani","Nyenyankulu","Dzivamisoko","Mudyaxihi","Khotavuxika","Mawuwani","Mhawuri","Ndzhati","Nhlangula","Hukuri","N'wendzamhala"],"short_days":["Son","Mus","Bir","Har","Ne","Tlh","Mug"],"short_months":["Sun","Yan","Kul","Dzi","Mud","Kho","Maw","Mha","Ndz","Nhl","Huk","N'w"]},"tt":{"am_pm":["",""],"days":["якшәмбе","дүшәмбе","сишәмбе","чәршәмбе","пәнҗешәмбе","җомга","шимбә"],"months":["гыйнвар","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"],"short_days":["якш","дүш","сиш","чәр","пәнҗ","җом","шим"],"short_months":["гыйн","фев","мар","апр","май","июнь","июль","авг","сент","окт","нояб","дек"]},"ug":{"am_pm":["",""],"days":["يەكشەنبە","دۈشەنبە","سەيشەنبە","چارشەنبە","پەيشەنبە","جۈمە","شەنبە"],"months":["يانۋار","فېۋرال","مارت","ئاپرېل","ماي","ئىيۇن","ئىيۇل","ئاۋغۇست","سېنتەبىر","ئۆكتەبىر","نويابىر","دېكابىر"],"short_days":["ي","د","س","چ","پ","ج","ش"],"short_months":["يانۋار","فېۋرال","مارت","ئاپرېل","ماي","ئىيۇن","ئىيۇل","ئاۋغۇست","سېنتەبىر","ئۆكتەبىر","نويابىر","دېكابىر"]},"uk":{"am_pm":["",""],"days":["неділя","понеділок","вівторок","середа","четвер","п'ятниця","субота"],"months":["січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня"],"short_days":["нд","пн","вт","ср","чт","пт","сб"],"short_months":["січ","лют","бер","кві","тра","чер","лип","сер","вер","жов","лис","гру"]},"unm":{"am_pm":["",""],"days":["kentuwei","manteke","tusteke","lelai","tasteke","pelaiteke","sateteke"],"months":["enikwsi","chkwali","xamokhwite","kwetayoxe","tainipen","kichinipen","lainipen","winaminke","kichitahkok","puksit","wini","muxkotae"],"short_days":["ken","man","tus","lel","tas","pel","sat"],"short_months":["eni","chk","xam","kwe","tai","nip","lai","win","tah","puk","kun","mux"]},"ur_IN":{"am_pm":["AM","PM"],"days":["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","سنیچر"],"months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"short_days":["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","سنیچر"],"short_months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"]},"ur_PK":{"am_pm":["ص","ش"],"days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"short_days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"short_months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"]},"uz":{"am_pm":["",""],"days":["Yakshanba","Dushanba","Seshanba","Chorshanba","Payshanba","Juma","Shanba"],"months":["Yanvar","Fevral","Mart","Aprel","May","Iyun","Iyul","Avgust","Sentabr","Oktabr","Noyabr","Dekabr"],"short_days":["Yak","Du","Se","Cho","Pay","Ju","Sha"],"short_months":["Yan","Fev","Mar","Apr","May","Iyn","Iyl","Avg","Sen","Okt","Noy","Dek"]},"ve":{"am_pm":["",""],"days":["Swondaha","Musumbuluwo","Ḽavhuvhili","Ḽavhuraru","Ḽavhuṋa","Ḽavhuṱanu","Mugivhela"],"months":["Phando","Luhuhi","Ṱhafamuhwe","Lambamai","Shundunthule","Fulwi","Fulwana","Ṱhangule","Khubvumedzi","Tshimedzi","Ḽara","Nyendavhusiku"],"short_days":["Swo","Mus","Vhi","Rar","ṋa","Ṱan","Mug"],"short_months":["Pha","Luh","Fam","Lam","Shu","Lwi","Lwa","Ngu","Khu","Tsh","Ḽar","Nye"]},"vi":{"am_pm":["AM","PM"],"days":["Chủ nhật","Thứ hai","Thứ ba","Thứ tư","Thứ năm","Thứ sáu","Thứ bảy"],"months":["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],"short_days":["CN","T2","T3","T4","T5","T6","T7"],"short_months":["Thg 1","Thg 2","Thg 3","Thg 4","Thg 5","Thg 6","Thg 7","Thg 8","Thg 9","Thg 10","Thg 11","Thg 12"]},"wa":{"am_pm":["AM","PM"],"days":["dimegne","londi","mårdi","mierkidi","djudi","vénrdi","semdi"],"months":["di djanvî","di fevrî","di måss","d’ avri","di may","di djun","di djulete","d’ awousse","di setimbe","d’ octôbe","di nôvimbe","di decimbe"],"short_days":["dim","lon","mår","mie","dju","vén","sem"],"short_months":["dja","fev","mås","avr","may","djn","djl","awo","set","oct","nôv","dec"]},"wae":{"am_pm":["",""],"days":["Suntag","Mäntag","Zischtag","Mittwuch","Frontag","Fritag","Samschtag"],"months":["Jenner","Hornig","Märze","Abrille","Meije","Bráčet","Heiwet","Öigšte","Herbštmánet","Wímánet","Wintermánet","Chrištmánet"],"short_days":["Sun","Män","Zis","Mit","Fro","Fri","Sam"],"short_months":["Jen","Hor","Mär","Abr","Mei","Brá","Hei","Öig","Her","Wím","Win","Chr"]},"wal":{"am_pm":["ማለዶ","ቃማ"],"days":["ወጋ","ሳይኖ","ማቆሳኛ","አሩዋ","ሃሙሳ","አርባ","ቄራ"],"months":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር"],"short_days":["ወጋ ","ሳይኖ","ማቆሳ","አሩዋ","ሃሙሳ","አርባ","ቄራ "],"short_months":["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ ","ጁን ","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም"]},"wo":{"am_pm":["",""],"days":["dib'eer","altine","talaata","allarba","alxames","ajjuma","gaawu"],"months":["sanwiy'e","feebriy'e","mars","awril","me","suwen","sulet","uut","septaambar","oktoobar","nowaambar","desaambar"],"short_days":["dib","alt","tal","all","alx","ajj","gaa"],"short_months":["san","fee","mar","awr","me ","suw","sul","uut","sep","okt","now","des"]},"xh":{"am_pm":["",""],"days":["iCawa","uMvulo","lwesiBini","lwesiThathu","ulweSine","lwesiHlanu","uMgqibelo"],"months":["eyoMqungu","eyoMdumba","eyoKwindla","uTshazimpuzi","uCanzibe","eyeSilimela","eyeKhala","eyeThupa","eyoMsintsi","eyeDwarha","eyeNkanga","eyoMnga"],"short_days":["Caw","Mvu","Bin","Tha","Sin","Hla","Mgq"],"short_months":["Mqu","Mdu","Kwi","Tsh","Can","Sil","Kha","Thu","Msi","Dwa","Nka","Mng"]},"yi":{"am_pm":["AM","PM"],"days":["זונטיק","מאָנטיק","דינסטיק","מיטװאָך","דאָנערשטיק","פֿרײַטיק","שבת"],"months":["יאַנואַר","פֿעברואַר","מערץ","אַפּריל","מיי","יוני","יולי","אויגוסט","סעפּטעמבער","אקטאבער","נאוועמבער","דעצעמבער"],"short_days":["זונ'","מאָנ'","דינ'","מיט'","דאָנ'","פֿרײַ'","שבת"],"short_months":["יאַנ","פֿעב","מאַר","אַפּר","מײַ ","יונ","יול","אױג","סעפּ","אָקט","נאָװ","דעצ"]},"yo":{"am_pm":["AM","PM"],"days":["Ọjọ́ Àìkú","Ọjọ́ Ajé","Ọjọ́ Ìsẹ́gun","Ọjọ́rú","Ọjọ́bọ","Ọjọ́ Ẹtì","Ọjọ́ Àbámẹ́ta"],"months":["Oṣù Ṣẹ́rẹ́","Oṣù Èrèlè","Oṣù Ẹrẹ̀nà","Oṣù Ìgbé","Oṣù Ẹ̀bibi","Oṣù Òkúdu","Oṣù Agẹmọ","Oṣù Ògún","Oṣù Owewe","Oṣù Ọ̀wàrà","Oṣù Bélú","Oṣù Ọ̀pẹ̀"],"short_days":["Àìkú","Ajé","Ìsẹ́gun","Ọjọ́rú","Ọjọ́bọ","Ẹtì","Àbámẹ́ta"],"short_months":["Ṣẹ́rẹ́","Èrèlè","Ẹrẹ̀nà","Ìgbé","Ẹ̀bibi","Òkúdu","Agẹmọ","Ògún","Owewe","Ọ̀wàrà","Bélú","Ọ̀pẹ̀"]},"yue":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"short_days":["日","一","二","三","四","五","六"],"short_months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]},"yuw":{"am_pm":["AM","PM"],"days":["sönda","mönda","sinda","mitiwö","sogipbono","nenggo","söndanggie"],"months":["jenuari","febuari","mas","epril","mei","jun","julai","ögus","septemba","öktoba","nöwemba","diksemba"],"short_days":["sön","mön","sin","mit","soi","nen","sab"],"short_months":["jen","feb","mas","epr","mei","jun","jul","ögu","sep","ökt","nöw","dis"]},"zh_CN":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]},"zh_HK":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]},"zh_SG":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},"zh_TW":{"am_pm":["上午","下午"],"days":["週日","週一","週二","週三","週四","週五","週六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"zu":{"am_pm":["",""],"days":["iSonto","uMsombuluko","uLwesibili","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],"months":["Januwari","Februwari","Mashi","Ephreli","Meyi","Juni","Julayi","Agasti","Septhemba","Okthoba","Novemba","Disemba"],"short_days":["Son","Mso","Bil","Tha","Sin","Hla","Mgq"],"short_months":["Jan","Feb","Mas","Eph","Mey","Jun","Jul","Aga","Sep","Okt","Nov","Dis"]}} +{"aa_DJ":{"am_pm":["saaku","carra"],"days":["Acaada","Etleeni","Talaata","Arbaqa","Kamiisi","Gumqata","Sabti"],"months":["Qunxa Garablu","Naharsi Kudo","Ciggilta Kudo","Agda Baxis","Caxah Alsa","Qasa Dirri","Qado Dirri","Leqeeni","Waysu","Diteli","Ximoli","Kaxxa Garablu"],"short_days":["Aca","Etl","Tal","Arb","Kam","Gum","Sab"],"short_months":["Qun","Nah","Cig","Agd","Cax","Qas","Qad","Leq","Way","Dit","Xim","Kax"]},"aa_ER":{"am_pm":["saaku","carra"],"days":["Acaada","Etleeni","Talaata","Arbaqa","Kamiisi","Gumqata","Sabti"],"months":["Qunxa Garablu","Naharsi Kudo","Ciggilta Kudo","Agda Baxis","Caxah Alsa","Qasa Dirri","Qado Dirri","Liiqen","Waysu","Diteli","Ximoli","Kaxxa Garablu"],"short_days":["Aca","Etl","Tal","Arb","Kam","Gum","Sab"],"short_months":["Qun","Nah","Cig","Agd","Cax","Qas","Qad","Leq","Way","Dit","Xim","Kax"]},"aa_ET":{"am_pm":["saaku","carra"],"days":["Acaada","Etleeni","Talaata","Arbaqa","Kamiisi","Gumqata","Sabti"],"months":["Qunxa Garablu","Naharsi Kudo","Ciggilta Kudo","Agda Baxis","Caxah Alsa","Qasa Dirri","Qado Dirri","Liiqen","Waysu","Diteli","Ximoli","Kaxxa Garablu"],"short_days":["Aca","Etl","Tal","Arb","Kam","Gum","Sab"],"short_months":["Qun","Nah","Cig","Agd","Cax","Qas","Qad","Leq","Way","Dit","Xim","Kax"]},"ab":{"am_pm":["",""],"days":["Амҽыша","Ашәахьа","Аҩаша","Ахаша","Аԥшьаша","Ахәаша","Асабша"],"months":["Ажьырныҳәа","Жәабран","Хәажәкыра","Мшаԥы","Лаҵара","Рашәара","Ԥхынгәы","Нанҳәа","Цәыббра","Жьҭаара","Абҵара","Ԥхынҷкәын"],"short_days":["Ам","Ашә","Аҩ","Ах","Аԥ","Ахә","Ас"],"short_months":["Ажь","Жәаб","Хәажә","Мш","Лаҵ","Рашә","Ԥхынгә","Нанҳә","Цәыб","Жьҭ","Абҵ","Ԥхынҷ"]},"af":{"am_pm":["VM","NM"],"days":["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],"months":["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],"short_days":["So","Ma","Di","Wo","Do","Vr","Sa"],"short_months":["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"]},"agr":{"am_pm":["VM","NM"],"days":["Tuntuamtin","Achutin","Kugkuktin","Saketin","Shimpitin","Imaptin","Bataetin"],"months":["Petsatin","Kupitin","Uyaitin","Tayutin","Kegketin","Tegmatin","Kuntutin","Yagkujutin","Daiktatin","Ipamtatin","Shinutin","Sakamtin"],"short_days":["Tun","Ach","Kug","Sak","Shim","Im","Bat"],"short_months":["Pet","Kup","Uya","Tay","Keg","Teg","Kun","Yag","Dait","Ipam","Shin","Sak"]},"ak":{"am_pm":["AN","EW"],"days":["Kwesida","Dwowda","Benada","Wukuda","Yawda","Fida","Memeneda"],"months":["Sanda-Ɔpɛpɔn","Kwakwar-Ɔgyefuo","Ebɔw-Ɔbenem","Ebɔbira-Oforisuo","Esusow Aketseaba-Kɔtɔnimba","Obirade-Ayɛwohomumu","Ayɛwoho-Kitawonsa","Difuu-Ɔsandaa","Fankwa-Ɛbɔ","Ɔbɛsɛ-Ahinime","Ɔberɛfɛw-Obubuo","Mumu-Ɔpɛnimba"],"short_days":["Kwe","Dwo","Ben","Wuk","Yaw","Fia","Mem"],"short_months":["S-Ɔ","K-Ɔ","E-Ɔ","E-O","E-K","O-A","A-K","D-Ɔ","F-Ɛ","Ɔ-A","Ɔ-O","M-Ɔ"]},"am":{"am_pm":["ጡዋት","ከሰዓት"],"days":["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"months":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕሪል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክቶበር","ኖቬምበር","ዲሴምበር"],"short_days":["እሑድ","ሰኞ ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"short_months":["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ ","ጁን ","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም"]},"an":{"am_pm":["",""],"days":["domingo","luns","martes","mierques","chueves","viernes","sabado"],"months":["chinero","febrero","marzo","abril","mayo","chunyo","chuliol","agosto","setiembre","octubre","noviembre","aviento"],"short_days":["dom","lun","mar","mie","chu","vie","sab"],"short_months":["chi","feb","mar","abr","may","chn","chl","ago","set","oct","nov","avi"]},"anp":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवार","सोमवार","मंगलवार","बुधवार","बृहस्पतिवार","शुक्रवार","शनिवार"],"months":["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्टूबर","नवंबर","दिसंबर"],"short_days":["रवि","सोम","मंगल","बुध","बृहस्पति","शुक्र","शनि"],"short_months":["जन","फर","मार्च","अप्रै","मई","जून","जुल","अग","सित","अक्टू","नव","दिस"]},"ar_AE":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت "],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_BH":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_DZ":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"]},"ar_EG":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_IN":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_IQ":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar_JO":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar_KW":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_LB":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar_LY":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_MA":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر"]},"ar_OM":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_QA":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_SA":{"am_pm":["",""],"days":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعـة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"]},"ar_SD":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_SS":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"ar_SY":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]},"ar_TN":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"]},"ar_YE":{"am_pm":["ص","م"],"days":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"short_days":["ح","ن","ث","ر","خ","ج","س"],"short_months":["ينا","فبر","مار","أبر","ماي","يون","يول","أغس","سبت","أكت","نوف","ديس"]},"as":{"am_pm":["পূৰ্ব্বাহ্ন","অপৰাহ্ন"],"days":["দেওবাৰ","সোমবাৰ","মঙ্গলবাৰ","বুধবাৰ","বৃহষ্পতিবাৰ","শুক্ৰবাৰ","শনিবাৰ"],"months":["জানুৱাৰী","ফেব্ৰুৱাৰী","মাৰ্চ","এপ্ৰিল","মে","জুন","জুলাই","আগষ্ট","ছেপ্তেম্বৰ","অক্টোবৰ","নৱেম্বৰ","ডিচেম্বৰ"],"short_days":["দেও","সোম","মঙ্গল","বুধ","বৃহষ্পতি","শুক্ৰ","শনি"],"short_months":["জানু","ফেব্ৰু","মাৰ্চ","এপ্ৰিল","মে","জুন","জুলাই","আগ","সেপ্ট","অক্টো","নভে","ডিসে"]},"ast":{"am_pm":["",""],"days":["domingu","llunes","martes","miércoles","xueves","vienres","sábadu"],"months":["de xineru","de febreru","de marzu","d’abril","de mayu","de xunu","de xunetu","d’agostu","de setiembre","d’ochobre","de payares","d’avientu"],"short_days":["dom","llu","mar","mié","xue","vie","sáb"],"short_months":["xin","feb","mar","abr","may","xun","xnt","ago","set","och","pay","avi"]},"ayc":{"am_pm":["VM","NM"],"days":["tuminku","lunisa","martisa","mirkulisa","juywisa","wirnisa","sawäru"],"months":["inïru","phiwriru","marsu","awrila","mayu","junyu","julyu","awustu","sitimri","uktuwri","nuwimri","risimri"],"short_days":["tum","lun","mar","mir","juy","wir","saw"],"short_months":["ini","phi","mar","awr","may","jun","jul","awu","sit","ukt","nuw","ris"]},"az_AZ":{"am_pm":["",""],"days":["bazar günü","bazar ertəsi","çərşənbə axşamı","çərşənbə","cümə axşamı","cümə","şənbə"],"months":["yanvar","fevral","mart","aprel","may","iyun","iyul","avqust","sentyabr","oktyabr","noyabr","dekabr"],"short_days":["baz","ber","çax","çər","cax","cüm","şnb"],"short_months":["Yan","Fev","Mar","Apr","May","İyn","İyl","Avq","Sen","Okt","Noy","Dek"]},"az_IR":{"am_pm":["",""],"days":["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","جۆمعه آخشامی","جۆمعه","شنبه"],"months":["ژانویه","فوریه","مارس","آوریل","مئی","ژوئن","جولای","آقۇست","سپتامبر","اوْکتوْبر","نوْوامبر","دسامبر"],"short_days":["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","جۆمعه آخشامی","جۆمعه","شنبه"],"short_months":["ژانویه","فوریه","مارس","آوریل","مئی","ژوئن","جولای","آقۇست","سپتامبر","اوْکتوْبر","نوْوامبر","دسامبر"]},"be":{"am_pm":["",""],"days":["Нядзеля","Панядзелак","Аўторак","Серада","Чацвер","Пятніца","Субота"],"months":["студзеня","лютага","сакавіка","красавіка","мая","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня"],"short_days":["Няд","Пан","Аўт","Срд","Чцв","Пят","Суб"],"short_months":["сту","лют","сак","кра","мая","чэр","ліп","жні","вер","кас","ліс","сне"]},"bem":{"am_pm":["uluchelo","akasuba"],"days":["Pa Mulungu","Palichimo","Palichibuli","Palichitatu","Palichine","Palichisano","Pachibelushi"],"months":["Januari","Februari","Machi","Epreo","Mei","Juni","Julai","Ogasti","Septemba","Oktoba","Novemba","Disemba"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mac","Epr","Mei","Jun","Jul","Oga","Sep","Okt","Nov","Dis"]},"ber":{"am_pm":["",""],"days":["bazar günü","birinci gün","ikinci gün","üçüncü gün","dördüncü gün","beşinci gün","altıncı gün"],"months":["yanvar","fevral","mart","aprel","may","iyun","iyul","avqust","sentyabr","oktyabr","noyabr","dekabr"],"short_days":["baz","bir","iki","üçü","dör","beş","alt"],"short_months":["Yan","Fev","Mar","Apr","May","İyn","İyl","Avq","Sen","Okt","Noy","Dek"]},"bg":{"am_pm":["",""],"days":["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],"months":["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември"],"short_days":["нд","пн","вт","ср","чт","пт","сб"],"short_months":["яну","фев","мар","апр","май","юни","юли","авг","сеп","окт","ное","дек"]},"bhb":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"bho":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"months":["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],"short_days":["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],"short_months":["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"]},"bi":{"am_pm":["AM","PM"],"days":["Sande","Mande","Tusde","Wenesde","Tosde","Fraede","Sarere"],"months":["Jenuware","Febwari","Maj","Epril","Mei","Jun","Julae","Ogis","Septemba","Oktoba","Novemba","Disemba"],"short_days":["San","Man","Tus","Wen","Tas","Fra","Sar"],"short_months":["Jan","Feb","Maj","Epr","Mei","Jun","Jul","Ogs","Sep","Okt","Nov","Dis"]},"bn_BD":{"am_pm":["পূর্বাহ্ণ","অপরাহ্ণ"],"days":["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],"months":["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"short_days":["রবি","সোম","মঙ্গল","বুধ","বৃহঃ","শুক্র","শনি"],"short_months":["জানু","ফেব","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"]},"bn_IN":{"am_pm":["পূর্বাহ্ণ","অপরাহ্ণ"],"days":["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],"months":["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"short_days":["রবি","সোম","মঙ্গল","বুধ","বৃহস্পতি","শুক্র","শনি"],"short_months":["জানু","ফেব","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"]},"bo":{"am_pm":["སྔ་ཆ","ཕྱི་ཆ"],"days":["གཟའ་ཉི་མ་","གཟའ་ཟླ་བ་","གཟའ་མིག་དམར་","གཟའ་ལྷག་པ་","གཟའ་ཕུར་བུ་","གཟའ་པ་སངས་","གཟའ་སྤེན་པ་"],"months":["ཟླ་བ་དང་པོ་","ཟླ་བ་གཉིས་པ་","ཟླ་བ་གསུམ་པ་","ཟླ་བ་བཞི་པ་","ཟླ་བ་ལྔ་པ་","ཟླ་བ་དྲུག་པ་","ཟླ་བ་བདུནཔ་","ཟླ་བ་བརྒྱད་པ་","ཟླ་བ་དགུ་པ་","ཟླ་བ་བཅུ་པ་","ཟླ་བ་བཅུ་གཅིག་པ་","ཟླ་བ་བཅུ་གཉིས་པ་"],"short_days":["ཉི་","ཟླ་","མིར་","ལྷག་","ཕུར་","སངས་","སྤེན་"],"short_months":["ཟླ་༡","ཟླ་༢","ཟླ་༣","ཟླ་༤","ཟླ་༥","ཟླ་༦","ཟླ་༧","ཟླ་༨","ཟླ་༩","ཟླ་༡༠","ཟླ་༡༡","ཟླ་༡༢"]},"br":{"am_pm":[" "," "],"days":["sul","lun","meurzh","mercʼher","yaou","gwener","sadorn"],"months":["Genver","Cʼhwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu"],"short_days":["sul","lun","meu","mer","yao","gwe","sad"],"short_months":["Gen ","Cʼhw","Meu ","Ebr ","Mae ","Mezh","Gou ","Eos ","Gwe ","Her ","Du ","Ker "]},"brx":{"am_pm":["फुं.","बेलासे."],"days":["रबिबार","सोबार","मंगलबार","बुदबार","बिसथिबार","सुखुरबार","सुनिबार"],"months":["जानुवारी","फेब्रुवारी","मार्स","एफ्रिल","मे","जुन","जुलाइ","आगस्थ","सेबथेज्ब़र","अखथबर","नबेज्ब़र","दिसेज्ब़र"],"short_days":["रबि","सम","मंगल","बुद","बिसथि","सुखुर","सुनि"],"short_months":["जानुवारी","फेब्रुवारी","मार्स","एप्रिल","मे","जुन","जुलाइ","आगस्थ","सेबथेज्ब़र","अखथबर","नबेज्ब़र","दिसेज्ब़र"]},"bs":{"am_pm":["",""],"days":["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],"months":["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novembar","Decembar"],"short_days":["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],"short_months":["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"]},"byn":{"am_pm":["ፋዱስ ጃብ","ፋዱስ ደምቢ"],"days":["ሰንበር ቅዳዅ","ሰኑ","ሰሊጝ","ለጓ ወሪ ለብዋ","ኣምድ","ኣርብ","ሰንበር ሽጓዅ"],"months":["ልደትሪ","ካብኽብቲ","ክብላ","ፋጅኺሪ","ክቢቅሪ","ምኪኤል ትጓ̅ኒሪ","ኰርኩ","ማርያም ትሪ","ያኸኒ መሳቅለሪ","መተሉ","ምኪኤል መሽወሪ","ተሕሳስሪ"],"short_days":["ሰ/ቅ","ሰኑ","ሰሊጝ","ለጓ","ኣምድ","ኣርብ","ሰ/ሽ"],"short_months":["ልደት","ካብኽ","ክብላ","ፋጅኺ","ክቢቅ","ም/ት","ኰር","ማርያ","ያኸኒ","መተሉ","ም/ም","ተሕሳ"]},"ca":{"am_pm":["a. m.","p. m."],"days":["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],"months":["de gener","de febrer","de març","d’abril","de maig","de juny","de juliol","d’agost","de setembre","d’octubre","de novembre","de desembre"],"short_days":["dg.","dl.","dt.","dc.","dj.","dv.","ds."],"short_months":["de gen.","de febr.","de març","d’abr.","de maig","de juny","de jul.","d’ag.","de set.","d’oct.","de nov.","de des."]},"ce":{"am_pm":["",""],"days":["КӀиранан де","Оршотан де","Шинарин де","Кхаарин де","Еарин де","ПӀераскан де","Шот де"],"months":["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],"short_days":["КӀ","Ор","Ши","Кх","Еа","ПӀ","Шо"],"short_months":["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек"]},"chr":{"am_pm":["ᏌᎾᎴ","ᏒᎯᏱᎢᏗᏢ"],"days":["ᎤᎾᏙᏓᏆᏍᎬ","ᎤᎾᏙᏓᏉᏅᎯ","ᏔᎵᏁᎢᎦ","ᏦᎢᏁᎢᎦ","ᏅᎩᏁᎢᎦ","ᏧᎾᎩᎶᏍᏗ","ᎤᎾᏙᏓᏈᏕᎾ"],"months":["ᎤᏃᎸᏔᏅ","ᎧᎦᎵ","ᎠᏅᏱ","ᎧᏬᏂ","ᎠᏂᏍᎬᏘ","ᏕᎭᎷᏱ","ᎫᏰᏉᏂ","ᎦᎶᏂ","ᏚᎵᏍᏗ","ᏚᏂᏅᏗ","ᏅᏓᏕᏆ","ᎥᏍᎩᏱ"],"short_days":["ᏆᏍᎬ","ᏉᏅᎯ","ᏔᎵᏁ","ᏦᎢᏁ","ᏅᎩᏁ","ᏧᎾᎩ","ᏈᏕᎾ"],"short_months":["ᎤᏃ","ᎧᎦ","ᎠᏅ","ᎧᏬ","ᎠᏂ","ᏕᎭ","ᎫᏰ","ᎦᎶ","ᏚᎵ","ᏚᏂ","ᏅᏓ","ᎥᏍ"]},"ckb":{"am_pm":["پن","دن"],"days":["یەكشەممە","دووشەممە","سێشەممە","چوارشەممە","پێنجشەممە","هەینی","شەممە"],"months":["کانونی دووەم","شوبات","ئازار","نیسان","ئایار","حوزەیران","تەموز","ئاب","ئەیلوول","تشرینی یەکەم","تشرینی دووەم","کانونی یەکەم"],"short_days":["شەم","یەکش","دووش","سێش","چواش","پێنش","هەین"],"short_months":["کا٢","شوب","ئاز","نیس","ئای","حوز","تەم","ئاب","ئەی","تش١","تش٢","کا١"]},"cmn":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"crh_RU":{"am_pm":["",""],"days":["базар","базарэртеси","салы","чаршенбе","джумаакъшамы","джума","джумаэртеси"],"months":["январь","февраль","март","апрель","майыс","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"],"short_days":["Баз","Бзэ","Сал","Чар","Джма","Джу","Джмэ"],"short_months":["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек"]},"crh_UA":{"am_pm":["ÜE","ÜS"],"days":["Bazar","Bazarertesi","Salı","Çarşembe","Cumaaqşamı","Cuma","Cumaertesi"],"months":["Yanvar","Fevral","Mart","Aprel","Mayıs","İyun","İyul","Avgust","Sentâbr","Oktâbr","Noyabr","Dekabr"],"short_days":["Baz","Ber","Sal","Çar","Caq","Cum","Cer"],"short_months":["Yan","Fev","Mar","Apr","May","İyn","İyl","Avg","Sen","Okt","Noy","Dek"]},"cs":{"am_pm":["",""],"days":["Neděle","Pondělí","Úterý","Středa","Čtvrtek","Pátek","Sobota"],"months":["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"],"short_days":["Ne","Po","Út","St","Čt","Pá","So"],"short_months":["led","úno","bře","dub","kvě","čen","čec","srp","zář","říj","lis","pro"]},"csb":{"am_pm":["",""],"days":["niedzela","pòniedzôłk","wtórk","strzoda","czwiôrtk","piątk","sobòta"],"months":["stëcznika","gromicznika","strëmiannika","łżëkwiata","maja","czerwińca","lëpińca","zélnika","séwnika","rujana","lëstopadnika","gòdnika"],"short_days":["nie","pòn","wtó","str","czw","pią","sob"],"short_months":["stë","gro","str","łżë","maj","cze","lëp","zél","séw","ruj","lës","gòd"]},"cv":{"am_pm":["",""],"days":["вырсарникун","тунтикун","ытларикун","юнкун","кӗҫнерникун","эрнекун","шӑматкун"],"months":["кӑрлач","нарӑс","пуш","ака","ҫу","ҫӗртме","утӑ","ҫурла","авӑн","юпа","чӳк","раштав"],"short_days":["вр","тн","ыт","юн","кҫ","эр","шм"],"short_months":["кӑр","нар","пуш","ака","ҫӑв","ҫрт","утӑ","ҫур","авн","юпа","чӳк","ршт"]},"cy":{"am_pm":["am","pm"],"days":["Sul","Llun","Mawrth","Mercher","Iau","Gwener","Sadwrn"],"months":["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],"short_days":["Sul","Llu","Maw","Mer","Iau","Gwe","Sad"],"short_months":["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rha"]},"da":{"am_pm":["",""],"days":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"months":["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],"short_days":["søn","man","tir","ons","tor","fre","lør"],"short_months":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"]},"de_AT":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_BE":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_CH":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_DE":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_IT":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_LI":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"de_LU":{"am_pm":["",""],"days":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mo","Di","Mi","Do","Fr","Sa"],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"doi":{"am_pm":["सञं","सबेर"],"days":["ऐतबार","सोमबार","मंगलबर","बुधबार","बीरबार","शुक्करबार","श्नीचरबार"],"months":["जनवरी","फरवरी","मार्च","एप्रैल","मेई","जून","जूलै","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर"],"short_days":["ऐत","सोम","मंगल","बुध","बीर","शुक्कर","श्नीचर"],"short_months":["जनवरी","फरवरी","मार्च","एप्रैल","मेई","जून","जूलै","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर"]},"dsb":{"am_pm":["",""],"days":["Njeźela","Pónjeźele","Wałtora","Srjoda","Stwórtk","Pětk","Sobota"],"months":["januara","februara","měrca","apryla","maja","junija","julija","awgusta","septembra","oktobra","nowembra","decembra"],"short_days":["Nj","Pó","Wa","Sr","St","Pě","So"],"short_months":["Jan","Feb","Měr","Apr","Maj","Jun","Jul","Awg","Sep","Okt","Now","Dec"]},"dv":{"am_pm":["މކ","މފ"],"days":["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],"months":["ޖެނުއަރީ","ފެބްރުއަރީ","މާރޗް","އެޕްރީލް","މެއި","ޖޫން","ޖުލައި","އޮގަސްޓް","ސެޕްޓެންބަރ","އޮކްޓޫބަރ","ނޮވެންބަރ","ޑިސެންބަރ"],"short_days":["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],"short_months":["ޖެނުއަރީ","ފެބްރުއަރީ","މާރޗް","އެޕްރީލް","މެއި","ޖޫން","ޖުލައި","އޮގަސްޓް","ސެޕްޓެންބަރ","އޮކްޓޫބަރ","ނޮވެންބަރ","ޑިސެންބަރ"]},"dz":{"am_pm":["སྔ་ཆ","ཕྱི་ཆ"],"days":["གཟའ་ཟླ་བ་","གཟའ་མིག་དམར་","གཟའ་ལྷག་པ་","གཟའ་ཕུར་བུ་","གཟའ་པ་སངས་","གཟའ་སྤེན་པ་","གཟའ་ཉི་མ་"],"months":["ཟླ་བ་དང་པོ་","ཟླ་བ་གཉིས་པ་","ཟླ་བ་གསུམ་པ་","ཟླ་བ་བཞི་པ་","ཟླ་བ་ལྔ་པ་","ཟླ་བ་དྲུག་པ་","ཟླ་བ་བདུནཔ་","ཟླ་བ་བརྒྱད་པ་","ཟླ་བ་དགུ་པ་","ཟླ་བ་བཅུ་པ་","ཟླ་བ་བཅུ་གཅིག་པ་","ཟླ་བ་བཅུ་གཉིས་པ་"],"short_days":["ཟླ་","མིར་","ལྷག་","ཕུར་","སངས་","སྤེན་","ཉི་"],"short_months":["ཟླ་༡","ཟླ་༢","ཟླ་༣","ཟླ་༤","ཟླ་༥","ཟླ་༦","ཟླ་༧","ཟླ་༨","ཟླ་༩","ཟླ་༡༠","ཟླ་༡༡","ཟླ་༡༢"]},"el":{"am_pm":["πμ","μμ"],"days":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"months":["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου"],"short_days":["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],"short_months":["Ιαν","Φεβ","Μαρ","Απρ","Μαΐ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"]},"en_AG":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_AU":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_BW":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_CA":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_DK":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_GB":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_HK":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_IE":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_IL":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_IN":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_NG":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_NZ":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_PH":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_SC":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_SG":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_US":{"am_pm":["AM","PM"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_ZA":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_ZM":{"am_pm":["am","pm"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en_ZW":{"am_pm":["",""],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"es_AR":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_BO":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_CL":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_CO":{"am_pm":["AM","PM"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_CR":{"am_pm":["a.m.","p.m."],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_CU":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_DO":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_EC":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_ES":{"am_pm":["a. m.","p. m."],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_GT":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_HN":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_MX":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_NI":{"am_pm":["AM","PM"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_PA":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_PE":{"am_pm":["AM","PM"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","setiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","set","oct","nov","dic"]},"es_PR":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_PY":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_SV":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_US":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es_UY":{"am_pm":["",""],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","setiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","set","oct","nov","dic"]},"es_VE":{"am_pm":["am","pm"],"days":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["dom","lun","mar","mié","jue","vie","sáb"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"et":{"am_pm":["",""],"days":["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],"months":["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember"],"short_days":["P","E","T","K","N","R","L"],"short_months":["jaan ","veebr","märts","apr ","mai ","juuni","juuli","aug ","sept ","okt ","nov ","dets "]},"eu":{"am_pm":["",""],"days":["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],"months":["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],"short_days":["ig.","al.","ar.","az.","og.","or.","lr."],"short_months":["urt","ots","mar","api","mai","eka","uzt","abu","ira","urr","aza","abe"]},"fa":{"am_pm":["",""],"days":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"months":["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اكتبر","نوامبر","دسامبر"],"short_days":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"short_months":["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اكتبر","نوامبر","دسامبر"]},"ff":{"am_pm":["subaka","kikiiɗe"],"days":["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],"months":["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"],"short_days":["dew","aaɓ","maw","nje","naa","mwd","hbi"],"short_months":["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"]},"fi":{"am_pm":["",""],"days":["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],"months":["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],"short_days":["su","ma","ti","ke","to","pe","la"],"short_months":["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu"]},"fil":{"am_pm":["N.U.","N.H."],"days":["Linggo","Lunes","Martes","Miyerkoles","Huwebes","Biyernes","Sabado"],"months":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre"],"short_days":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"short_months":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"]},"fo":{"am_pm":["",""],"days":["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],"months":["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember"],"short_days":["sun","mán","týs","mik","hós","frí","ley"],"short_months":["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"]},"fr_BE":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fr_CA":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fr_CH":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fr_FR":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"short_months":["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."]},"fr_LU":{"am_pm":["",""],"days":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"months":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"short_days":["dim","lun","mar","mer","jeu","ven","sam"],"short_months":["jan","fév","mar","avr","mai","jun","jui","aoû","sep","oct","nov","déc"]},"fur":{"am_pm":["",""],"days":["Domenie","Lunis","Martars","Miercus","Joibe","Vinars","Sabide"],"months":["Zenâr","Fevrâr","Març","Avrîl","Mai","Jugn","Lui","Avost","Setembar","Otubar","Novembar","Dicembar"],"short_days":["Dom","Lun","Mar","Mie","Joi","Vin","Sab"],"short_months":["Zen","Fev","Mar","Avr","Mai","Jug","Lui","Avo","Set","Otu","Nov","Dic"]},"fy":{"am_pm":["",""],"days":["Snein","Moandei","Tiisdei","Woansdei","Tongersdei","Freed","Sneon"],"months":["Jannewaris","Febrewaris","Maart","April","Maaie","Juny","July","Augustus","Septimber","Oktober","Novimber","Desimber"],"short_days":["Sn","Mo","Ti","Wo","To","Fr","Sn"],"short_months":["Jan","Feb","Mrt","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Des"]},"ga":{"am_pm":["",""],"days":["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],"months":["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig"],"short_days":["Domh","Luan","Máirt","Céad","Déar","Aoine","Sath"],"short_months":["Ean","Feabh","Márta","Aib","Beal","Meith","Iúil","Lún","MFómh","DFómh","Samh","Noll"]},"gbm":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["अतवार","सोमवार","मंगलवार","बुधवार","भुपयार","शुकार","छनछर"],"months":["जनवअर","फरवअर","मार्च","अप्रैल","मए","जून","जुलऐ","अगस्त","सितंबर","अक्टूबर","नवंबर","दिसंबर"],"short_days":["अत","सोम","मंगल","बुध","भुप","शुक","छन"],"short_months":["जन","फर","मार्च","अप्रै","मए","जून","जुल","अग","सित","अक्टू","नव","दिस"]},"gd":{"am_pm":["m","f"],"days":["DiDòmhnaich","DiLuain","DiMàirt","DiCiadain","DiarDaoin","DihAoine","DiSathairne"],"months":["dhen Fhaoilleach","dhen Ghearran","dhen Mhàrt","dhen Ghiblean","dhen Chèitean","dhen Ògmhios","dhen Iuchar","dhen Lùnastal","dhen t-Sultain","dhen Dàmhair","dhen t-Samhain","dhen Dùbhlachd"],"short_days":["DiD","DiL","DiM","DiC","Dia","Dih","DiS"],"short_months":["Faoi","Gearr","Màrt","Gibl","Cèit","Ògmh","Iuch","Lùna","Sult","Dàmh","Samh","Dùbh"]},"gez_ER":{"am_pm":["ጽባሕ","ምሴት"],"days":["እኁድ","ሰኑይ","ሠሉስ","ራብዕ","ሐሙስ","ዓርበ","ቀዳሚት"],"months":["ጠሐረ","ከተተ","መገበ","አኀዘ","ግንባት","ሠንየ","ሐመለ","ነሐሰ","ከረመ","ጠቀመ","ኀደረ","ኀሠሠ"],"short_days":["እኁድ","ሰኑይ","ሠሉስ","ራብዕ","ሐሙስ","ዓርበ","ቀዳሚ"],"short_months":["ጠሐረ","ከተተ","መገበ","አኀዘ","ግንባ","ሠንየ","ሐመለ","ነሐሰ","ከረመ","ጠቀመ","ኀደረ","ኀሠሠ"]},"gez_ET":{"am_pm":["ጽባሕ","ምሴት"],"days":["እኁድ","ሰኑይ","ሠሉስ","ራብዕ","ሐሙስ","ዓርበ","ቀዳሚት"],"months":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር"],"short_days":["እኁድ","ሰኑይ","ሠሉስ","ራብዕ","ሐሙስ","ዓርበ","ቀዳሚ"],"short_months":["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ ","ጁን ","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም"]},"gl":{"am_pm":["",""],"days":["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],"months":["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],"short_days":["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],"short_months":["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"]},"gu":{"am_pm":["સવારે","સાંજે"],"days":["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],"months":["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટોબર","નવેમ્બર","ડિસેમ્બર"],"short_days":["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],"short_months":["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે"]},"gv":{"am_pm":["",""],"days":["Jedoonee","Jelhein","Jemayrt","Jercean","Jerdein","Jeheiney","Jesarn"],"months":["Jerrey-geuree","Toshiaght-arree","Mayrnt","Averil","Boaldyn","Mean-souree","Jerrey-souree","Luanistyn","Mean-fouyir","Jerrey-fouyir","Mee Houney","Mee ny Nollick"],"short_days":["Jed","Jel","Jem","Jerc","Jerd","Jeh","Jes"],"short_months":["J-guer","T-arree","Mayrnt","Avrril","Boaldyn","M-souree","J-souree","Luanistyn","M-fouyir","J-fouyir","M.Houney","M.Nollick"]},"ha":{"am_pm":["AM","PM"],"days":["Lahadi","Litini","Talata","Laraba","Alhamis","Juma'a","Asabar"],"months":["Janairu","Faburairu","Maris","Afirilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktoba","Nuwamba","Disamba"],"short_days":["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],"short_months":["Jan","Fab","Mar","Afi","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis"]},"hak":{"am_pm":["上晝","下晝"],"days":["禮拜日","禮拜一","禮拜二","禮拜三","禮拜四","禮拜五","禮拜六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"he":{"am_pm":["AM","PM"],"days":["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],"months":["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"short_days":["א'","ב'","ג'","ד'","ה'","ו'","ש'"],"short_months":["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ"]},"hi":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"months":["जनवरी","फ़रवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर"],"short_days":["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],"short_months":["जन॰","फ़र॰","मार्च","अप्रैल","मई","जून","जुल॰","अग॰","सित॰","अक्तू॰","नव॰","दिस॰"]},"hif":{"am_pm":["Purvahan","Aparaahna"],"days":["Ravivar","Somvar","Mangalvar","Budhvar","Guruvar","Shukravar","Shanivar"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Ravi","Som","Mangal","Budh","Guru","Shukra","Shani"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"hne":{"am_pm":["बिहिनियाँ","मंझनियाँ"],"days":["इतवार","सोमवार","मंगलवार","बुधवार","बिरसपत","सुकरवार","सनिवार"],"months":["जनवरी","फरवरी","मार्च","अपरेल","मई","जून","जुलाई","अगस्त","सितमबर","अकटूबर","नवमबर","दिसमबर"],"short_days":["इत","सोम","मंग","बुध","बिर","सुक","सनि"],"short_months":["जन","फर","मार्च","अप","मई","जून","जुला","अग","सित","अकटू","नव","दिस"]},"hr":{"am_pm":["",""],"days":["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],"months":["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenoga","prosinca"],"short_days":["ned","pon","uto","sri","čet","pet","sub"],"short_months":["sij","velj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro"]},"hsb":{"am_pm":["",""],"days":["Njedźela","Póndźela","Wutora","Srjeda","Štvórtk","Pjatk","Sobota"],"months":["januara","februara","měrca","apryla","meje","junija","julija","awgusta","septembra","oktobra","nowembra","decembra"],"short_days":["Nj","Pó","Wu","Sr","Št","Pj","So"],"short_months":["Jan","Feb","Měr","Apr","Mej","Jun","Jul","Awg","Sep","Okt","Now","Dec"]},"ht":{"am_pm":["",""],"days":["dimanch","lendi","madi","mèkredi","jedi","vandredi","samdi"],"months":["janvye","fevriye","mas","avril","me","jen","jiyè","out","septanm","oktòb","novanm","desanm"],"short_days":["dim","len","mad","mèk","jed","van","sam"],"short_months":["jan","fev","mas","avr","me","jen","jiy","out","sep","okt","nov","des"]},"hu":{"am_pm":["",""],"days":["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],"months":["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december"],"short_days":["v","h","k","sze","cs","p","szo"],"short_months":["jan","febr","márc","ápr","máj","jún","júl","aug","szept","okt","nov","dec"]},"hy":{"am_pm":["",""],"days":["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","Ուրբաթ","Շաբաթ"],"months":["հունվարի","փետրվարի","մարտի","ապրիլի","մայիսի","հունիսի","հուլիսի","օգոստոսի","սեպտեմբերի","հոկտեմբերի","նոյեմբերի","դեկտեմբերի"],"short_days":["Կրկ","Երկ","Երք","Չրք","Հնգ","Ուր","Շբթ"],"short_months":["Հնվ","Փտր","Մար","Ապր","Մայ","Հնս","Հլս","Օգս","Սեպ","Հոկ","Նմբ","Դեկ"]},"ia":{"am_pm":["AM","PM"],"days":["dominica","lunedi","martedi","mercuridi","jovedi","venerdi","sabbato"],"months":["januario","februario","martio","april","maio","junio","julio","augusto","septembre","octobre","novembre","decembre"],"short_days":["dom","lun","mar","mer","jov","ven","sab"],"short_months":["jan","feb","mar","apr","mai","jun","jul","aug","sep","oct","nov","dec"]},"id":{"am_pm":["AM","PM"],"days":["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],"months":["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],"short_days":["Min","Sen","Sel","Rab","Kam","Jum","Sab"],"short_months":["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agu","Sep","Okt","Nov","Des"]},"ig":{"am_pm":["AM","PM"],"days":["sọnde","mọnde","tuzde","wenzde","tọsde","fraịde","satọde"],"months":["Jenụwarị","Febrụwarị","Maachị","Eprel","Mee","Juun","Julaị","Ọgọọst","Septemba","Ọktoba","Novemba","Disemba"],"short_days":["sọn","mọn","tuz","wen","tọs","fra","sat"],"short_months":["Jen","Feb","Maa","Epr","Mee","Juu","Jul","Ọgọ","Sep","Ọkt","Nov","Dis"]},"ik":{"am_pm":["AM","PM"],"days":["Minġuiqsioiq","Savałłiq","Ilaqtchiioiq","Qitchiioiq","Sisamiioiq","Tallimmiioiq","Maqinġuoiq"],"months":["Siqiññaatchiaq","Siqiññaasrugruk","Paniqsiqsiivik","Qilġich Tatqiat","Suppivik","Iġñivik","Itchavik","Tiññivik","Amiġaiqsivik","Sikkuvik","Nippivik","Siqiñġiḷaq"],"short_days":["Min","Sav","Ila","Qit","Sis","Tal","Maq"],"short_months":["Sñt","Sñs","Pan","Qil","Sup","Iġñ","Itc","Tiñ","Ami","Sik","Nip","Siq"]},"is":{"am_pm":["fh","eh"],"days":["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],"months":["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember"],"short_days":["sun","mán","þri","mið","fim","fös","lau"],"short_months":["jan","feb","mar","apr","maí","jún","júl","ágú","sep","okt","nóv","des"]},"it":{"am_pm":["",""],"days":["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],"months":["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"],"short_days":["dom","lun","mar","mer","gio","ven","sab"],"short_months":["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"]},"iu":{"am_pm":["AM","PM"],"days":["ᓈᑦᑎᖑᔭᕐᕕᒃ","ᓇᒡᒐᔾᔭᐅ","ᓇᒡᒐᔾᔭᐅᓕᖅᑭᑦ","ᐱᖓᓲᓕᖅᓯᐅᑦ","ᕿᑎᖅᑰᑦ","ᐅᓪᓗᕈᓘᑐᐃᓇᖅ","ᓯᕙᑖᕕᒃ"],"months":["ᔮᓄᐊᓕ","ᕕᕗᐊᓕ","ᒪᔅᓯ","ᐃᐳᓗ","ᒪᐃ","ᔪᓂ","ᔪᓚᐃ","ᐊᒋᓯ","ᓯᑎᕙ","ᐊᑦᑐᕙ","ᓄᕕᕙ","ᑎᓯᕝᕙ"],"short_days":["ᓈ","ᓇ","ᓕ","ᐱ","ᕿ","ᐅ","ᓯ"],"short_months":["ᔮᓄ","ᕕᕗ","ᒪᔅ","ᐃᐳ","ᒪᐃ","ᔪᓂ","ᔪᓚ","ᐊᒋ","ᓯᑎ","ᐊᑦ","ᓄᕕ","ᑎᓯ"]},"ja":{"am_pm":["午前","午後"],"days":["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],"months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"short_days":["日","月","火","水","木","金","土"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"ka":{"am_pm":["",""],"days":["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],"months":["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],"short_days":["კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],"short_months":["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"]},"kab":{"am_pm":["FT","MD"],"days":["Acer","Arim","Aram","Ahad","Amhad","Sem","Sed"],"months":["Yennayer","Fuṛar","Meɣres","Yebrir","Mayyu","Yunyu","Yulyu","ɣuct","Ctembeṛ","Tubeṛ","Wambeṛ","Dujembeṛ"],"short_days":["Ace","Ari","Ara","Aha","Amh","Sem","Sed"],"short_months":["Yen","Fur","Meɣ","Yeb","May","Yun","Yul","ɣuc","Cte","Tub","Wam","Duj"]},"kk":{"am_pm":["",""],"days":["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],"months":["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"],"short_days":["Жк","Дс","Сс","Ср","Бс","Жм","Сб"],"short_months":["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"]},"kl":{"am_pm":["",""],"days":["sapaat","ataasinngorneq","marlunngorneq","pingasunngorneq","sisamanngorneq","tallimanngorneq","arfininngorneq"],"months":["januaarip","februaarip","marsip","apriilip","maajip","juunip","juulip","aggustip","septembarip","oktobarip","novembarip","decembarip"],"short_days":["sap","ata","mar","pin","sis","tal","arf"],"short_months":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"]},"km":{"am_pm":["ព្រឹក","ល្ងាច"],"days":["ថ្ងៃ​អាទិត្យ","ថ្ងៃ​ច័ន្ទ","ថ្ងៃ​អង្គារ","ថ្ងៃ​ពុធ","ថ្ងៃ​ព្រហស្បតិ៍","ថ្ងៃ​សុក្រ","ថ្ងៃ​សៅរ៍"],"months":["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],"short_days":["អា","ច","អ","ពុ","ព្រ","សុ","ស"],"short_months":["១","២","៣","៤","៥","៦","៧","៨","៩","១០","១១","១២"]},"kn":{"am_pm":["ಪೂರ್ವಾಹ್ನ","ಅಪರಾಹ್ನ"],"days":["ರವಿವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],"months":["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಏಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟೆಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್"],"short_days":["ರ","ಸೋ","ಮಂ","ಬು","ಗು","ಶು","ಶ"],"short_months":["ಜನ","ಫೆಬ್ರ","ಮಾರ್ಚ್","ಏಪ್ರಿ","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆ","ಸೆಪ್ಟೆಂ","ಅಕ್ಟೋ","ನವೆಂ","ಡಿಸೆಂ"]},"ko":{"am_pm":["오전","오후"],"days":["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],"months":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"short_days":["일","월","화","수","목","금","토"],"short_months":[" 1월"," 2월"," 3월"," 4월"," 5월"," 6월"," 7월"," 8월"," 9월","10월","11월","12월"]},"kok":{"am_pm":["म.पू.","म.नं."],"days":["आयतार","सोमार","मंगळवार","बुधवार","बेरेसतार","शुकरार","शेनवार"],"months":["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ओगस्ट","सेप्टेंबर","ओक्टोबर","नोव्हेंबर","डिसेंबर"],"short_days":["आयतार","सोमार","मंगळवार","बुधवार","बेरेसतार","शुकरार","शेनवार"],"short_months":["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ओगस्ट","सेप्टेंबर","ओक्टोबर","नोव्हेंबर","डिसेंबर"]},"ks":{"am_pm":["دوپھربرونھ","دوپھرپتھ"],"days":["آتهوار","ژءندروار","بوءںوار","بودهوار","برىسوار","جمع","بٹوار"],"months":["جنؤری","فرؤری","مارٕچ","اپریل","میٔ","جوٗن","جوٗلایی","اگست","ستمبر","اکتوٗبر","نومبر","دسمبر"],"short_days":["آتهوار","ژءنتروار","بوءںوار","بودهوار","برىسوار","جمع","بٹوار"],"short_months":["جنؤری","فرؤری","مارٕچ","اپریل","میٔ","جوٗن","جوٗلایی","اگست","ستمبر","اکتوٗبر","نومبر","دسمبر"]},"ku":{"am_pm":["",""],"days":["yêksêm","dusêm","sêsêm","çarsêm","pêncsêm","înî","sept"],"months":["Çile","Sibat","Adar","Nîsan","Gulan","Hezîran","Tîrmeh","Tebax","Îlon","Cotmeh","Mijdar","Kanûn"],"short_days":["yêk","dus","sês","çar","pên","înî","sep"],"short_months":["Çil","Sib","Ada","Nîs","Gul","Hez","Tîr","Teb","Îlo","Cot","Mij","Kan"]},"kv":{"am_pm":["",""],"days":["Вежалун","Выльлун","Воторник","Шӧрлун","Четверг","Пекнича","Субӧта"],"months":["тӧвшӧр","урасьӧм","рака т.","косму","ода-кора","лӧддза-н.","сора т.","моз т.","кӧч т.","йирым","вӧльгым","ӧшым"],"short_days":["ВЖ","ВЛ","ВТ","ШР","ЧТ","ПК","СБ"],"short_months":["ТВШ","УРС","РКТ","КСМ","ОДК","ЛДН","СРТ","МЗТ","КЧТ","ЙРМ","ВЛГ","ӦШМ"]},"kw":{"am_pm":["",""],"days":["De Sul","De Lun","De Merth","De Merher","De Yow","De Gwener","De Sadorn"],"months":["mis Genver","mis Hwevrer","mis Meurth","mis Ebrel","mis Me","mis Metheven","mis Gortheren","mis Est","mis Gwynngala","mis Hedra","mis Du","mis Kevardhu"],"short_days":["Sul","Lun","Mth","Mhr","Yow","Gwe","Sad"],"short_months":["Gen","Hwe","Meu","Ebr","Me","Met","Gor","Est","Gwn","Hed","Du","Kev"]},"ky":{"am_pm":["",""],"days":["жекшемби","дүйшөмбү","шейшемби","шаршемби","бейшемби","жума","ишемби"],"months":["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"],"short_days":["жк","дш","ше","ша","бш","жм","иш"],"short_months":["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек"]},"lb":{"am_pm":["",""],"days":["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],"months":["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["So","Mé","Dë","Më","Do","Fr","Sa"],"short_months":["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"lg":{"am_pm":["",""],"days":["Sabiiti","Balaza","Lwakubiri","Lwakusatu","Lwakuna","Lwakutaano","Lwamukaaga"],"months":["Janwaliyo","Febwaliyo","Marisi","Apuli","Maayi","Juuni","Julaayi","Agusito","Sebuttemba","Okitobba","Novemba","Desemba"],"short_days":["Sab","Bal","Lw2","Lw3","Lw4","Lw5","Lw6"],"short_months":["Jan","Feb","Mar","Apu","Maa","Juu","Jul","Agu","Seb","Oki","Nov","Des"]},"li":{"am_pm":["",""],"days":["zóndig","maondig","daensdig","goonsdig","dónderdig","vriedig","zaoterdig"],"months":["jannewarie","fibberwarie","miert","eprèl","meij","junie","julie","augustus","september","oktober","november","desember"],"short_days":["zón","mao","dae","goo","dón","vri","zao"],"short_months":["jan","fib","mie","epr","mei","jun","jul","aug","sep","okt","nov","des"]},"lij":{"am_pm":["",""],"days":["domenega","lûnedì","martedì","mercUrdì","zêggia","venardì","sabbo"],"months":["zenâ","fevrâ","marzo","avrî","mazzo","zûgno","lûggio","agosto","settembre","ottobre","novembre","dixembre"],"short_days":["dom","lûn","mar","mer","zêu","ven","sab"],"short_months":["zen","fev","mar","arv","maz","zûg","lûg","ago","set","ött","nov","dix"]},"ln":{"am_pm":["",""],"days":["Lomíngo","Mosálá mɔ̌kɔ́","Misálá míbalé","Misálá mísáto","Misálá mínei","Misálá mítáno","Mpɔ́sɔ"],"months":["sánzá ya yambo","sánzá ya míbalé","sánzá ya mísáto","sánzá ya mínei","sánzá ya mítáno","sánzá ya motóbá","sánzá ya nsambo","sánzá ya mwambe","sánzá ya libwa","sánzá ya zómi","sánzá ya zómi na mɔ̌kɔ́","sánzá ya zómi na míbalé"],"short_days":["m1.","m2.","m3.","m4.","m5.","m6.","m7."],"short_months":["yan","fbl","msi","apl","mai","yun","yul","agt","stb","ɔtb","nvb","dsb"]},"lo":{"am_pm":["AM","PM"],"days":["ອາທິດ","ຈັນ","ອັງຄານ","ພຸດ","ພະຫັດ","ສຸກ","ເສົາ"],"months":["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ"],"short_days":["ອາ.","ຈ.","ຄ.","ພ.","ພຫ.","ສ.","ສ."],"short_months":["ມ.ກ.","ກ.ພ.","ມ.ນ.","ມ.ສ.","ພ.ພ.","ມິ.ຖ.","ກ.ລ.","ສ.ຫ.","ກ.ຍ.","ຕ.ລ.","ພ.ຈ.","ທ.ວ."]},"lt":{"am_pm":["",""],"days":["Sekmadienis","Pirmadienis","Antradienis","Trečiadienis","Ketvirtadienis","Penktadienis","Šeštadienis"],"months":["sausio","vasario","kovo","balandžio","gegužės","birželio","liepos","rugpjūčio","rugsėjo","spalio","lapkričio","gruodžio"],"short_days":["Sk","Pr","An","Tr","Kt","Pn","Št"],"short_months":["saus.","vas.","kov.","bal.","geg.","birž.","liep.","rugp.","rugs.","spal.","lapkr.","gruod."]},"lv":{"am_pm":["",""],"days":["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],"months":["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris"],"short_days":["Sv","P ","O ","T ","C ","Pk","S "],"short_months":["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec"]},"lzh":{"am_pm":["朝","暮"],"days":["週日","週一","週二","週三","週四","週五","週六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 一 "," 二 "," 三 "," 四 "," 五 "," 六 "," 七 "," 八 "," 九 "," 十 ","十一","十二"]},"mag":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["एतवार","सोमार","मंगर","बुध","बिफे","सूक","सनिचर"],"months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],"short_days":["एतवार","सोमार","मंगर","बुध","बिफे","सूक","सनिचर"],"short_months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"]},"mai":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविदिन","सोमदिन","मंगलदिन","बुधदिन","बृहस्पतीदिन","शुक्रदिन","शनीदिन"],"months":["बैसाख","जेठ","अषाढ़","सावोन","भादो","आसिन","कातिक","अगहन","पूस","माघ","फागुन","चैति"],"short_days":["रवि","सोम","मंगल","बुध","बृहस्पती","शुक्र","शनी"],"short_months":["बैसाख","जेठ","अषाढ़","सावोन","भादो","आसिन","कातिक","अगहन","पूस","माघ","फागुन","चैति"]},"mdf":{"am_pm":["",""],"days":["Недляши","Атяньжи","Шавши","Вержи","Шуваланя","Пяденця","Ёткши"],"months":["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"],"short_days":["Нед","Атя","Шав","Вер","Шув","Пяд","Ётк"],"short_months":["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек"]},"mfe":{"am_pm":["AM","PM"],"days":["dimans","lindi","mardi","merkredi","zedi","vandredi","samdi"],"months":["zanvie","fevriye","mars","avril","me","zin","zilye","out","septam","oktob","novam","desam"],"short_days":["dim","lin","mar","mer","ze","van","sam"],"short_months":["zan","fev","mar","avr","me","zin","zil","out","sep","okt","nov","des"]},"mg":{"am_pm":["",""],"days":["alahady","alatsinainy","talata","alarobia","alakamisy","zoma","sabotsy"],"months":["Janoary","Febroary","Martsa","Aprily","Mey","Jona","Jolay","Aogositra","Septambra","Oktobra","Novambra","Desambra"],"short_days":["lhd","lts","tlt","lrb","lkm","zom","sab"],"short_months":["Jan","Feb","Mar","Apr","Mey","Jon","Jol","Aog","Sep","Okt","Nov","Des"]},"mhr":{"am_pm":["",""],"days":["Рушарня","Шочмо","Кушкыжмо","Вӱргече","Изарня","Кугарня","Шуматкече"],"months":["Шорыкйол","Пургыж","Ӱярня","Вӱдшор","Ага","Пеледыш","Сӱрем","Сорла","Идым","Шыжа","Кылме","Теле"],"short_days":["Ршр","Шчм","Кжм","Вгч","Изр","Кгр","Шмт"],"short_months":["Шрк","Пгж","Ӱрн","Вшр","Ага","Пдш","Срм","Срл","Идм","Шыж","Клм","Тел"]},"mi":{"am_pm":["",""],"days":["Rātapu","Mane","Tūrei","Wenerei","Tāite","Paraire","Hātarei"],"months":["Kohi-tātea","Hui-tanguru","Poutū-te-rangi","Paenga-whāwhā","Haratua","Pipiri","Hōngoingoi","Here-turi-kōkā","Mahuru","Whiringa-ā-nuku","Whiringa-ā-rangi","Hakihea"],"short_days":["Ta","Ma","Tū","We","Tāi","Pa","Hā"],"short_months":["Kohi","Hui","Pou","Pae","Hara","Pipi","Hōngoi","Here","Mahu","Whi-nu","Whi-ra","Haki"]},"miq":{"am_pm":["VM","NM"],"days":["sandi","mundi","tiusdi","wensde","tausde","praidi","satadi"],"months":["siakwa kati","kuswa kati","kakamuk kati","lî wainhka kati","lih mairin kati","lî kati","pastara kati","sikla kati","wîs kati","waupasa kati","yahbra kati","trisu kati"],"short_days":["san","mun","tius","wens","taus","prai","sat"],"short_months":["siakwa","kuswa","kakamuk","lî wainhka","lih mairin","lî","pastara","sikla","wîs","waupasa","yahbra","trisu"]},"mjw":{"am_pm":["AM","PM"],"days":["Bhomkuru","Urmi","Durmi","Thelang","Theman","Bhomta","Bhomti"],"months":["Arkoi","Thangthang","There","Jangmi","Aru","Vosik","Jakhong","Paipai","Chiti","Phere","Phaikuni","Matijong"],"short_days":["Bhom","Ur","Dur","Tkel","Tkem","Bhta","Bhti"],"short_months":["Ark","Thang","The","Jang","Aru","Vos","Jak","Pai","Chi","Phe","Phai","Mati"]},"mk":{"am_pm":["",""],"days":["недела","понеделник","вторник","среда","четврток","петок","сабота"],"months":["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],"short_days":["нед","пон","вто","сре","чет","пет","саб"],"short_months":["јан","фев","мар","апр","мај","јун","јул","авг","сеп","окт","ное","дек"]},"ml":{"am_pm":["രാവിലെ","വൈകു"],"days":["ഞായര്‍","തിങ്കള്‍","ചൊവ്വ","ബുധന്‍","വ്യാഴം","വെള്ളി","ശനി"],"months":["ജനുവരി","ഫെബ്രുവരി","മാർച്ച്","ഏപ്രിൽ","മേയ്","ജൂൺ","ജൂലൈ","ഓഗസ്റ്റ്","സെപ്റ്റംബർ","ഒക്‌ടോബർ","നവംബർ","ഡിസംബർ"],"short_days":["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],"short_months":["ജനു","ഫെബ്രു","മാർ","ഏപ്രി","മേയ്","ജൂൺ","ജൂലൈ","ഓഗ","സെപ്റ്റം","ഒക്ടോ","നവം","ഡിസം"]},"mn":{"am_pm":["",""],"days":["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],"months":["Нэгдүгээр сар","Хоёрдугаар сар","Гуравдугаар сар","Дөрөвдүгээр сар","Тавдугаар сар","Зургадугаар сар","Долдугаар сар","Наймдугаар сар","Есдүгээр сар","Аравдугаар сар","Арван нэгдүгээр сар","Арван хоёрдугаар сар"],"short_days":["Ня","Да","Мя","Лх","Пү","Ба","Бя"],"short_months":["1-р сар","2-р сар","3-р сар","4-р сар","5-р сар","6-р сар","7-р сар","8-р сар","9-р сар","10-р сар","11-р сар","12-р сар"]},"mni":{"am_pm":["এ.ম.","প.ম."],"days":["নোংমাইজিং","নিংথৌকাবা","লৈবাকপোকপা","য়ুমশকৈশা","শগোলশেন","ইরাই","থাংজ"],"months":["জানুৱারি","ফেব্রুৱারি","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","সেপ্তেম্বর","ওক্তোবর","নবেম্বর","ডিসেম্বর"],"short_days":["নোং","নিং","লৈবাক","য়ুম","শগোল","ইরা","থাং"],"short_months":["জান","ফেব","মার","এপ্রি","মে","জুন","জুল","আগ","সেপ","ওক্ত","নবে","ডিস"]},"mnw":{"am_pm":["ဂယး","တ္ၚဲစေၚ်"],"days":["အဒိုတ်","စန်","အၚာ","ဗုဒ္ဓဝါ","ဗြဴဗ္တိ","သိုက်","သ္ၚိသဝ်"],"months":["ဂျာန်နျူအာရဳ","ဝှေဝ်ဗြူအာရဳ","မာတ်ချ်","အေပြေယ်လ်","မေ","ဂျုန်","ဂျူလာၚ်","အဝ်ဂါတ်","သိပ်တီဗာ","အံက်တဝ်ဗာ","နဝ်ဝါမ်ဗာ","ဒဳသီဗာ"],"short_days":["ဒိုတ်","စန်","ၚာ","ဝါ","တိ","သိုက်","သဝ်"],"short_months":["ဂျာန်","ဝှေဝ်","မာတ်","အေ","မေ","ဂျုန်","ဂျူ","အဝ်","သိပ်","အံက်","နဝ်","ဒဳ"]},"mr":{"am_pm":["म.पू.","म.नं."],"days":["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"months":["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर"],"short_days":["रवि","सोम","मंगळ","बुध","गुरु","शुक्र","शनि"],"short_months":["जाने","फेब्रु","मार्च","एप्रि","मे","जून","जुलै","ऑग","सप्टें","ऑक्टो","नोव्हें","डिसें"]},"ms":{"am_pm":["",""],"days":["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],"months":["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],"short_days":["Ahd","Isn","Sel","Rab","Kha","Jum","Sab"],"short_months":["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sep","Okt","Nov","Dis"]},"mt":{"am_pm":["",""],"days":["il-Ħadd","it-Tnejn","it-Tlieta","l-Erbgħa","il-Ħamis","il-Ġimgħa","is-Sibt"],"months":["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awwissu","Settembru","Ottubru","Novembru","Diċembru"],"short_days":["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],"short_months":["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Aww","Set","Ott","Nov","Diċ"]},"my":{"am_pm":["နံနက်","ညနေ"],"days":["တနင်္ဂနွေ","တနင်္လာ","အင်္ဂါ","ဗုဒ္ဓဟူး","ကြာသပတေး","သောကြာ","စနေ"],"months":["ဇန်နဝါရီ","ဖေဖော်ဝါရီ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူလိုင်","ဩဂုတ်","စက်တင်ဘာ","အောက်တိုဘာ","နိုဝင်ဘာ","ဒီဇင်ဘာ"],"short_days":["နွေ","လာ","ဂါ","ဟူး","တေး","သော","နေ"],"short_months":["ဇန်","ဖေ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူ","ဩ","စက်","အောက်","နို","ဒီ"]},"nan":{"am_pm":["頂晡","下晡"],"days":["禮拜日","禮拜一","禮拜二","禮拜三","禮拜四","禮拜五","禮拜六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"nb":{"am_pm":["",""],"days":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"months":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"short_days":["sø.","ma.","ti.","on.","to.","fr.","lø."],"short_months":["jan.","feb.","mars","april","mai","juni","juli","aug.","sep.","okt.","nov.","des."]},"nds_DE":{"am_pm":["",""],"days":["Sünndag","Maandag","Dingsdag","Middeweek","Dunnersdag","Freedag","Sünnavend"],"months":["Jannuaar","Feberwaar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"short_days":["Sdag","Maan","Ding","Migg","Dunn","Free","Svd."],"short_months":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"nds_NL":{"am_pm":["",""],"days":["Sinndag","Mondag","Dingsdag","Meddwäakj","Donnadag","Friedag","Sinnowend"],"months":["Jaunuwoa","Februwoa","Moaz","Aprell","Mai","Juni","Juli","August","Septamba","Oktoba","Nowamba","Dezamba"],"short_days":["Sdg","Mdg","Dsg","Mwk","Ddg","Fdg","Swd"],"short_months":["Jan","Feb","Moz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Now","Dez"]},"ne":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["आइतबार","सोमबार","मङ्गलबार","बुधबार","बिहीबार","शुक्रबार","शनिबार"],"months":["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],"short_days":["आइत","सोम","मङ्गल","बुध","बिही","शुक्र","शनि"],"short_months":["जन","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"]},"nhn":{"am_pm":["",""],"days":["teoilhuitl","ceilhuitl","omeilhuitl","yeilhuitl","nahuilhuitl","macuililhuitl","chicuaceilhuitl"],"months":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"short_days":["teo","cei","ome","yei","nau","mac","chi"],"short_months":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"niu":{"am_pm":["AM","PM"],"days":["Aho Tapu","Aho Gofua","Aho Ua","Aho Lotu","Aho Tuloto","Aho Falaile","Aho Faiumu"],"months":["Ianuali","Fepuali","Masi","Apelila","Me","Iuni","Iulai","Aokuso","Sepetema","Oketopa","Novema","Tesemo"],"short_days":["Tapu","Gofua","Ua","Lotu","Tuloto","Falaile","Faiumu"],"short_months":["Ian","Fep","Mas","Ape","Me","Iun","Iul","Aok","Sep","Oke","Nov","Tes"]},"nl":{"am_pm":["",""],"days":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"months":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"short_days":["zo","ma","di","wo","do","vr","za"],"short_months":["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"]},"nn":{"am_pm":["",""],"days":["sundag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],"months":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"short_days":["su.","må.","ty.","on.","to.","fr.","la."],"short_months":["jan.","feb.","mars","april","mai","juni","juli","aug.","sep.","okt.","nov.","des."]},"nr":{"am_pm":["",""],"days":["uSonto","uMvulo","uLesibili","lesithathu","uLesine","ngoLesihlanu","umGqibelo"],"months":["Janabari","uFeberbari","uMatjhi","u-Apreli","Meyi","Juni","Julayi","Arhostosi","Septemba","Oktoba","Usinyikhaba","Disemba"],"short_days":["Son","Mvu","Bil","Tha","Ne","Hla","Gqi"],"short_months":["Jan","Feb","Mat","Apr","Mey","Jun","Jul","Arh","Sep","Okt","Usi","Dis"]},"nso":{"am_pm":["",""],"days":["LaMorena","Mošupologo","Labobedi","Laboraro","Labone","Labohlano","Mokibelo"],"months":["Janaware","Febereware","Matšhe","Aprele","Mei","June","Julae","Agostose","Setemere","Oktobere","Nofemere","Disemere"],"short_days":["Son","Moš","Bed","Rar","Ne","Hla","Mok"],"short_months":["Jan","Feb","Mat","Apr","Mei","Jun","Jul","Ago","Set","Okt","Nof","Dis"]},"oc":{"am_pm":["",""],"days":["dimenge","diluns","dimars","dimècres","dijòus","divendres","dissabte"],"months":["de genièr","de febrièr","de març","d’abril","de mai","de junh","de julhet","d’agost","de setembre","d’octòbre","de novembre","de decembre"],"short_days":["dg.","dl.","dm.","dc.","dj.","dv.","ds."],"short_months":["gen.","febr.","març","abr.","mai","junh","jul.","ago.","set.","oct.","nov.","dec."]},"om":{"am_pm":["WD","WB"],"days":["Dilbata","Wiixata","Qibxata","Roobii","Kamiisa","Jimaata","Sanbata"],"months":["Amajjii","Guraandhala","Bitooteessa","Elba","Caamsa","Waxabajjii","Adooleessa","Hagayya","Fuulbana","Onkololeessa","Sadaasa","Muddee"],"short_days":["Dil","Wix","Qib","Rob","Kam","Jim","San"],"short_months":["Ama","Gur","Bit","Elb","Cam","Wax","Ado","Hag","Ful","Onk","Sad","Mud"]},"or":{"am_pm":["AM","PM"],"days":["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],"months":["ଜାନୁଆରୀ","ଫେବୃଆରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମଇ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"],"short_days":["ରବି","ସୋମ","ମଙ୍ଗଳ","ବୁଧ","ଗୁରୁ","ଶୁକ୍ର","ଶନି"],"short_months":["ଜାନୁଆରୀ","ଫେବୃଆରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମଇ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"]},"os":{"am_pm":["",""],"days":["Хуыцаубон","Къуырисæр","Дыццæг","Æртыццæг","Цыппæрæм","Майрæмбон","Сабат"],"months":["январы","февралы","мартъийы","апрелы","майы","июны","июлы","августы","сентябры","октябры","ноябры","декабры"],"short_days":["Хцб","Крс","Дцг","Æрт","Цпр","Мрб","Сбт"],"short_months":["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"]},"pa_IN":{"am_pm":["ਸਵੇਰੇ","ਸ਼ਾਮ"],"days":["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],"months":["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ"],"short_days":["ਐਤ","ਸੋਮ","ਮੰਗਲ","ਬੁੱਧ","ਵੀਰ","ਸ਼ੁੱਕਰ","ਸ਼ਨਿੱਚਰ"],"short_months":["ਜਨ","ਫ਼ਰ","ਮਾਰਚ","ਅਪ੍ਰੈ","ਮਈ","ਜੂਨ","ਜੁਲਾ","ਅਗ","ਸਤੰ","ਅਕਤੂ","ਨਵੰ","ਦਸੰ"]},"pa_PK":{"am_pm":["ص","ش"],"days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"months":["جنوري","فروري","مارچ","اپريل","مٓی","جون","جولاي","اگست","ستمبر","اكتوبر","نومبر","دسمبر"],"short_days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"short_months":["جنوري","فروري","مارچ","اپريل","مٓی","جون","جولاي","اگست","ستمبر","اكتوبر","نومبر","دسمبر"]},"pap":{"am_pm":["",""],"days":["Djadomingo","Djaluna","Djamars","Djawebs","Djarason","Djabierne","Djasabra"],"months":["Yanüari","Febrüari","Mart","Aprel","Mei","Yüni","Yüli","Ougùstùs","Sèptèmber","Oktober","Novèmber","Desèmber"],"short_days":["do","lu","ma","we","ra","bi","sa"],"short_months":["Yan","Feb","Mar","Apr","Mei","Yün","Yül","Oug","Sèp","Okt","Nov","Des"]},"pl":{"am_pm":["",""],"days":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"months":["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia"],"short_days":["nie","pon","wto","śro","czw","pią","sob"],"short_months":["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"]},"ps":{"am_pm":["غ.م.","غ.و."],"days":["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],"months":["جنوري","فبروري","مارچ","اپریل","مۍ","جون","جولای","اګست","سپتمبر","اکتوبر","نومبر","دسمبر"],"short_days":["ی.","د.","س.","چ.","پ.","ج.","ش."],"short_months":["جنوري","فبروري","مارچ","اپریل","مۍ","جون","جولای","اګست","سپتمبر","اکتوبر","نومبر","دسمبر"]},"pt":{"am_pm":["",""],"days":["domingo","segunda","terça","quarta","quinta","sexta","sábado"],"months":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"short_days":["dom","seg","ter","qua","qui","sex","sáb"],"short_months":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"]},"quz":{"am_pm":["AM","PM"],"days":["tuminku","lunis","martis","miyirkulis","juywis","wiyirnis","sawatu"],"months":["iniru","phiwriru","marsu","awril","mayu","huniyu","huliyu","agustu","siptiyimri","uktuwri","nuwiyimri","tisiyimri"],"short_days":["tum","lun","mar","miy","juy","wiy","saw"],"short_months":["ini","phi","mar","awr","may","hun","hul","agu","sip","ukt","nuw","tis"]},"raj":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवार","सोमवार","मंगल्लवार","बुधवार","बृहस्पतिवार","शुक्रवार","शनिवार"],"months":["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्टूबर","नवंबर","दिसंबर"],"short_days":["रवि","सोम","मंगल","बुध","बृहस्पति","शुक्र","शनि"],"short_months":["जन","फर","मार्च","अप्रै","मई","जून","जुल","अग","सित","अक्टू","नव","दिस"]},"rif":{"am_pm":["sb","aɛ"],"days":["Lḥed","Letnayen","Ttlat","Larbeɛ","Lexmiss","Jjemɛa","Ssebt"],"months":["Yennayer","Febrayer","Mares","Yebril","Mayyu","Yunyu","Yulyuz","Ɣuct","Cutenber","Kṭuber","Nuvember","Dujember"],"short_days":["Lḥe","Let","Ttl","Lar","Lex","Jje","Sbt"],"short_months":["Yen","Feb","Mar","Yeb","May","Yun","Yul","Ɣuc","Cut","Kṭu","Nuv","Duj"]},"ro":{"am_pm":["",""],"days":["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],"months":["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"],"short_days":["Du","Lu","Ma","Mi","Jo","Vi","Sb"],"short_months":["ian","feb","mar","apr","mai","iun","iul","aug","sep","oct","nov","dec"]},"ru":{"am_pm":["",""],"days":["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],"months":["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"],"short_days":["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],"short_months":["янв","фев","мар","апр","мая","июн","июл","авг","сен","окт","ноя","дек"]},"rw":{"am_pm":["",""],"days":["Ku cyumweru","Kuwa mbere","Kuwa kabiri","Kuwa gatatu","Kuwa kane","Kuwa gatanu","Kuwa gatandatu"],"months":["Mutarama","Gashyantare","Werurwe","Mata","Gicuransi","Kamena","Nyakanga","Kanama","Nzeli","Ukwakira","Ugushyingo","Ukuboza"],"short_days":["Mwe","Mbe","Kab","Gtu","Kan","Gnu","Gnd"],"short_months":["Mut","Gas","Wer","Mat","Gic","Kam","Nya","Kan","Nze","Ukw","Ugu","Uku"]},"sa":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["रविवासर:","सोमवासर:","मंगलवासर:","बुधवासर:","बृहस्पतिवासरः","शुक्रवासर","शनिवासर:"],"months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],"short_days":["रविः","सोम:","मंगल:","बुध:","बृहस्पतिः","शुक्र","शनि:"],"short_months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"]},"sah":{"am_pm":["",""],"days":["баскыһыанньа","бэнидиэнньик","оптуорунньук","сэрэдэ","чэппиэр","бээтинсэ","субуота"],"months":["тохсунньу","олунньу","кулун тутар","муус устар","ыам ыйын","бэс ыйын","от ыйын","атырдьах ыйын","балаҕан ыйын","алтынньы","сэтинньи","ахсынньы"],"short_days":["бс","бн","оп","ср","чп","бт","сб"],"short_months":["тохс","олун","кул","муус","ыам","бэс","от","атыр","бал","алт","сэт","ахс"]},"sat":{"am_pm":["AM","PM"],"days":["सिंगेमाँहाँ","ओतेमाँहाँ","बालेमाँहाँ","सागुनमाँहाँ","सारदीमाँहाँ","जारुममाँहाँ","ञुहुममाँहाँ"],"months":["जनवरी","फरवरी","मार्च","अप्रेल","मई","जुन","जुलाई","अगस्त","सितम्बर","अखथबर","नवम्बर","दिसम्बर"],"short_days":["सिंगे","ओते","बाले","सागुन","सारदी","जारुम","ञुहुम"],"short_months":["जनवरी","फरवरी","मार्च","अप्रेल","मई","जुन","जुलाई","अगस्त","सितम्बर","अखथबर","नवम्बर","दिसम्बर"]},"sc":{"am_pm":["",""],"days":["Domìnigu","Lunis","Martis","Mèrcuris","Giòbia","Chenàbura","Sàbadu"],"months":["Ghennàrgiu","Freàrgiu","Martzu","Abrile","Maju","Làmpadas","Argiolas/Trìulas","Austu","Cabudanni","Santugaine/Ladàmine","Onniasantu/Santandria","Nadale/Idas"],"short_days":["Dom","Lun","Mar","Mèr","Giò","Che","Sàb"],"short_months":["Ghe","Fre","Mar","Abr","Maj","Làm","Arg","Aus","Cab","Lad","Onn","Nad"]},"sd":{"am_pm":["AM","PM"],"days":["آرتوارُ","سومرُ","منگلُ","ٻُڌرُ","وسپت","جُمو","ڇنڇر"],"months":["جنوري","فبروري","مارچ","اپريل","مي","جون","جولاءِ","آگسٽ","سيپٽيمبر","آڪٽوبر","نومبر","ڊسمبر"],"short_days":["آرتوارُ","سومرُ","منگلُ","ٻُڌرُ","وسپت","جُمو","ڇنڇر"],"short_months":["جنوري","فبروري","مارچ","اپريل","مي","جون","جولاءِ","آگسٽ","سيپٽيمبر","آڪٽوبر","نومبر","ڊسمبر"]},"se":{"am_pm":["",""],"days":["sotnabeaivi","vuossárga","maŋŋebarga","gaskavahkku","duorasdat","bearjadat","lávvardat"],"months":["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu"],"short_days":["sotn","vuos","maŋ","gask","duor","bear","láv"],"short_months":["ođđj","guov","njuk","cuoŋ","mies","geas","suoi","borg","čakč","golg","skáb","juov"]},"sgs":{"am_pm":["",""],"days":["nedielės dëna","panedielis","oterninks","sereda","četvergs","petnīčė","sobata"],"months":["sausė","vasarė","kuova","balondė","gegožės","bėrželė","lëpas","rogpjūtė","siejės","spalė","lapkrėstė","grůdė"],"short_days":["Nd","Pn","Ot","Sr","Čt","Pt","Sb"],"short_months":["Sau","Vas","Kuo","Bal","Geg","Bėr","Lëp","Rgp","Sie","Spa","Lap","Grd"]},"shn":{"am_pm":["ပွတ်းၼႂ်","ဝၢႆးဝၼ်း"],"days":["ဝၼ်းဢႃးတိတ်ႉ","ဝၼ်းၸၼ်","ဝၼ်းဢၢင်းၵၢၼ်း","ဝၼ်းပုတ်ႉ","ဝၼ်းၽတ်း","ဝၼ်းသုၵ်း","ဝၼ်းသဝ်"],"months":["လိူၼ်ၵမ်","လိူၼ်သၢမ်","လိူၼ်သီႇ","လိူၼ်ႁႃႈ","လိူၼ်ႁူၵ်း","လိူၼ်ၸဵတ်း","လိူၼ်ပႅတ်ႇ","လိူၼ်ၵဝ်ႈ","လိူၼ်သိပ်း","လိူၼ်သိပ်းဢဵတ်း","လိူၼ်သိပ်းသွင်","လိူၼ်ၸဵင်"],"short_days":["တိတ်ႉ","ၸၼ်","ၵၢၼ်း","ပုတ်ႉ","ၽတ်း","သုၵ်း","သဝ်"],"short_months":["လိူၼ်ၵမ်","လိူၼ်သၢမ်","လိူၼ်သီႇ","လိူၼ်ႁႃႈ","လိူၼ်ႁူၵ်း","လိူၼ်ၸဵတ်း","လိူၼ်ပႅတ်ႇ","လိူၼ်ၵဝ်ႈ","လိူၼ်သိပ်း","လိူၼ်သိပ်းဢဵတ်း","လိူၼ်သိပ်းသွင်","လိူၼ်ၸဵင်"]},"shs":{"am_pm":["AM","PM"],"days":["Sxetspesq̓t","Spetkesq̓t","Selesq̓t","Skellesq̓t","Smesesq̓t","Stselkstesq̓t","Stqmekstesq̓t"],"months":["Pellkwet̓min","Pelctsipwen̓ten","Pellsqépts","Peslléwten","Pell7ell7é7llqten","Pelltspéntsk","Pelltqwelq̓wél̓t","Pellct̓éxel̓cten","Pesqelqlélten","Pesllwélsten","Pellc7ell7é7llcwten̓","Pelltetétq̓em"],"short_days":["Sxe","Spe","Sel","Ske","Sme","Sts","Stq"],"short_months":["Kwe","Tsi","Sqe","Éwt","Ell","Tsp","Tqw","Ct̓é","Qel","Wél","U7l","Tet"]},"si":{"am_pm":["පෙ.ව.","ප.ව."],"days":["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],"months":["ජනවාරි","පෙබරවාරි","මාර්තු","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්"],"short_days":["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"],"short_months":["ජන","පෙබ","මාර්","අප්‍රි","මැයි","ජූනි","ජූලි","අගෝ","සැප්","ඔක්","නෙවැ","දෙසැ"]},"sid":{"am_pm":["soodo","hawwaro"],"days":["Sambata","Sanyo","Maakisanyo","Roowe","Hamuse","Arbe","Qidaame"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"short_days":["Sam","San","Mak","Row","Ham","Arb","Qid"],"short_months":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"sk":{"am_pm":["",""],"days":["Nedeľa","Pondelok","Utorok","Streda","Štvrtok","Piatok","Sobota"],"months":["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],"short_days":["Ne","Po","Ut","St","Št","Pi","So"],"short_months":["jan","feb","mar","apr","máj","jún","júl","aug","sep","okt","nov","dec"]},"sl":{"am_pm":["",""],"days":["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],"months":["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],"short_days":["ned","pon","tor","sre","čet","pet","sob"],"short_months":["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"]},"sm":{"am_pm":["",""],"days":["Aso Sa","Aso Gafua","Aso Lua","Aso Lulu","Aso Tofi","Aso Farail","Aso To'ana'i"],"months":["Ianuari","Fepuari","Mati","Aperila","Me","Iuni","Iulai","Auguso","Setema","Oketopa","Novema","Tesema"],"short_days":["Aso Sa","Aso Gaf","Aso Lua","Aso Lul","Aso Tof","Aso Far","Aso To'"],"short_months":["Ian","Fep","Mat","Ape","Me","Iun","Iul","Aug","Set","Oke","Nov","Tes"]},"so_DJ":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Tal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"so_ET":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Sal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"so_KE":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Sal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"so_SO":{"am_pm":["subaxnimo","galabnimo"],"days":["Axad","Isniin","Salaaso","Arbaco","Khamiis","Jimco","Sabti"],"months":["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"],"short_days":["Axd","Isn","Sal","Arb","Kha","Jim","Sab"],"short_months":["Kob","Lab","Sad","Afr","Sha","Lix","Tod","Sid","Sag","Tob","KIT","LIT"]},"sq":{"am_pm":["PD","MD"],"days":["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],"months":["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor"],"short_days":["Die","Hën","Mar","Mër","Enj","Pre","Sht"],"short_months":["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj"]},"sr_ME":{"am_pm":["",""],"days":["недјеља","понедељак","уторак","сриједа","четвртак","петак","субота"],"months":["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],"short_days":["нед","пон","уто","сри","чет","пет","суб"],"short_months":["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"]},"sr_RS":{"am_pm":["",""],"days":["недеља","понедељак","уторак","среда","четвртак","петак","субота"],"months":["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],"short_days":["нед","пон","уто","сре","чет","пет","суб"],"short_months":["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"]},"ss":{"am_pm":["",""],"days":["Lisontfo","uMsombuluko","Lesibili","Lesitsatfu","Lesine","Lesihlanu","uMgcibelo"],"months":["Bhimbidvwane","iNdlovane","iNdlovulenkhulu","Mabasa","Inkhwenkhweti","iNhlaba","Kholwane","iNgci","iNyoni","Impala","Lweti","iNgongoni"],"short_days":["Son","Mso","Bil","Tsa","Ne","Hla","Mgc"],"short_months":["Bhi","Van","Vul","Mab","Khk","Nhl","Kho","Ngc","Nyo","Imp","Lwe","Ngo"]},"ssy":{"am_pm":["saaku","carra"],"days":["Naba Sambat","Sani","Salus","Rabuq","Camus","Jumqata","Qunxa Sambat"],"months":["Qunxa Garablu","Naharsi Kudo","Ciggilta Kudo","Agda Baxis","Caxah Alsa","Qasa Dirri","Qado Dirri","Liiqen","Waysu","Diteli","Ximoli","Kaxxa Garablu"],"short_days":["Nab","San","Sal","Rab","Cam","Jum","Qun"],"short_months":["Qun","Nah","Cig","Agd","Cax","Qas","Qad","Leq","Way","Dit","Xim","Kax"]},"st":{"am_pm":["",""],"days":["Sontaha","Mantaha","Labobedi","Laboraro","Labone","Labohlano","Moqebelo"],"months":["Pherekgong","Hlakola","Tlhakubele","Mmese","Motsheanong","Phupjane","Phupu","Phato","Leotse","Mphalane","Pudungwana","Tshitwe"],"short_days":["Son","Mma","Bed","Rar","Ne","Hla","Moq"],"short_months":["Phe","Hla","TlH","Mme","Mot","Jan","Upu","Pha","Leo","Mph","Pud","Tsh"]},"su":{"am_pm":["",""],"days":["Minggu","Senén","Salasa","Rebo","Kemis","Jumaah","Saptu"],"months":["Januari","Fébruari","Maret","April","Méi","Juni","Juli","Agustus","Séptémber","Oktober","Novémber","Désémber"],"short_days":["Min","Sen","Sal","Reb","Kem","Jum","Sab"],"short_months":["Jan","Féb","Mar","Apr","Méi","Jun","Jul","Agu","Sép","Okt","Nov","Dés"]},"sv":{"am_pm":["",""],"days":["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],"months":["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],"short_days":["sön","mån","tis","ons","tor","fre","lör"],"short_months":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"]},"sw":{"am_pm":["asubuhi","alasiri"],"days":["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],"months":["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"],"short_days":["J2","J3","J4","J5","Alh","Ij","J1"],"short_months":["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"]},"szl":{"am_pm":["",""],"days":["niydziela","pyńdziałek","wtorek","strzoda","sztwortek","piōntek","sobota"],"months":["stycznia","lutego","marca","kwietnia","moja","czyrwca","lipca","sierpnia","września","października","listopada","grudnia"],"short_days":["niy","pyń","wto","str","szt","piō","sob"],"short_months":["sty","lut","mar","kwi","moj","czy","lip","sie","wrz","paź","lis","gru"]},"ta_IN":{"am_pm":["காலை","மாலை"],"days":["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],"months":["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"],"short_days":["ஞா","தி","செ","பு","வி","வெ","ச"],"short_months":["ஜன.","பிப்.","மார்.","ஏப்.","மே","ஜூன்","ஜூலை","ஆக.","செப்.","அக்.","நவ.","டிச."]},"ta_LK":{"am_pm":["காலை","மாலை"],"days":["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],"months":["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"],"short_days":["ஞா","தி","செ","பு","வி","வெ","ச"],"short_months":["ஜன","பிப்","மார்","ஏப்","மே","ஜூன்","ஜூலை","ஆக","செப்","அக்","நவ","டிச"]},"tcy":{"am_pm":["ಕಾಂಡೆ","ಬಯ್ಯ"],"days":["ಐಥಾರ","ಸೋಮಾರ","ಅಂಗರೆ","ಬುಧಾರ","ಗುರುವಾರ","ಶುಕ್ರರ","ಶನಿವಾರ"],"months":["ಜನವರಿ","ಫೆಬ್ರುವರಿ","ಮಾರ್ಚ್","ಏಪ್ರಿಲ್‌‌","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟೆಂಬರ್‌","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್"],"short_days":["ಐ","ಸೋ","ಅಂ","ಬು","ಗು","ಶು","ಶ"],"short_months":["ಜ","ಫೆ","ಮಾ","ಏ","ಮೇ","ಜೂ","ಜು","ಆ","ಸೆ","ಅ","ನ","ಡಿ"]},"te":{"am_pm":["ఉ.","సా."],"days":["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],"months":["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జులై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్"],"short_days":["ఆది","సోమ","మంగళ","బుధ","గురు","శుక్ర","శని"],"short_months":["జన","ఫిబ్ర","మార్చి","ఏప్రి","మే","జూన్","జులై","ఆగ","సెప్టెం","అక్టో","నవం","డిసెం"]},"tg":{"am_pm":["",""],"days":["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],"months":["Января","Февраля","Марта","Апреля","Мая","Июня","Июля","Августа","Сентября","Октября","Ноября","Декабря"],"short_days":["Вск","Пнд","Втр","Срд","Чтв","Птн","Сбт"],"short_months":["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"]},"th":{"am_pm":["AM","PM"],"days":["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],"months":["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],"short_days":["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],"short_months":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."]},"the":{"am_pm":["पूर्वाह्न","अपराह्न"],"days":["आइतबार","सोमबार","मंगलबार","बुधबार","बिहिबार","शुक्रबार","शनिबार"],"months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],"short_days":["आइत","सोम","मंगल","बुध","बिहि","शुक्र","शनि"],"short_months":["जनवरी","फ़रवरी","मार्च","अप्रेल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"]},"ti_ER":{"am_pm":["ንጉሆ ሰዓተ","ድሕር ሰዓት"],"days":["ሰንበት","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"months":["ጥሪ","ለካቲት","መጋቢት","ሚያዝያ","ግንቦት","ሰነ","ሓምለ","ነሓሰ","መስከረም","ጥቅምቲ","ሕዳር","ታሕሳስ"],"short_days":["ሰንበ","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"short_months":["ጥሪ ","ለካቲ","መጋቢ","ሚያዝ","ግንቦ","ሰነ ","ሓምለ","ነሓሰ","መስከ","ጥቅም","ሕዳር","ታሕሳ"]},"ti_ET":{"am_pm":["ንጉሆ ሰዓተ","ድሕር ሰዓት"],"days":["ሰንበት","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"months":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር"],"short_days":["ሰንበ","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],"short_months":["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ ","ጁን ","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም"]},"tig":{"am_pm":["ቀደም ሰር ምዕል","ሓቆ ሰር ምዕል"],"days":["ሰንበት ዓባይ","ሰኖ","ታላሸኖ","ኣረርባዓ","ከሚሽ","ጅምዓት","ሰንበት ንኢሽ"],"months":["ጥሪ","ለካቲት","መጋቢት","ሚያዝያ","ግንቦት","ሰነ","ሓምለ","ነሓሰ","መስከረም","ጥቅምቲ","ሕዳር","ታሕሳስ"],"short_days":["ሰ/ዓ","ሰኖ ","ታላሸ","ኣረር","ከሚሽ","ጅምዓ","ሰ/ን"],"short_months":["ጥሪ ","ለካቲ","መጋቢ","ሚያዝ","ግንቦ","ሰነ ","ሓምለ","ነሓሰ","መስከ","ጥቅም","ሕዳር","ታሕሳ"]},"tk":{"am_pm":["",""],"days":["Duşenbe","Sişenbe","Çarşenbe","Penşenbe","Anna","Şenbe","Ýekşenbe"],"months":["Ýanwar","Fewral","Mart","Aprel","Maý","Iýun","Iýul","Awgust","Sentýabr","Oktýabr","Noýabr","Dekabr"],"short_days":["Duş","Siş","Çar","Pen","Ann","Şen","Ýek"],"short_months":["Ýan","Few","Mar","Apr","Maý","Iýn","Iýl","Awg","Sen","Okt","Noý","Dek"]},"tl":{"am_pm":["AM","PM"],"days":["Linggo","Lunes","Martes","Miyerkoles","Huwebes","Biyernes","Sabado"],"months":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Septiyembre","Oktubre","Nobiyembre","Disyembre"],"short_days":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"short_months":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Sep","Okt","Nob","Dis"]},"tn":{"am_pm":["",""],"days":["laTshipi","Mosupologo","Labobedi","Laboraro","Labone","Labotlhano","Lamatlhatso"],"months":["Ferikgong","Tlhakole","Mopitlwe","Moranang","Motsheganong","Seetebosigo","Phukwi","Phatwe","Lwetse","Diphalane","Ngwanatsele","Sedimonthole"],"short_days":["Tsh","Mos","Bed","Rar","Ne","Tlh","Mat"],"short_months":["Fer","Tlh","Mop","Mor","Mot","See","Phu","Pha","Lwe","Dip","Ngw","Sed"]},"to":{"am_pm":["hengihengi","efiafi"],"days":["Sāpate","Mōnite","Tūsite","Pulelulu","Tuʻapulelulu","Falaite","Tokonaki"],"months":["Sānuali","Fēpueli","Maʻasi","ʻEpeleli","Mē","Sune","Siulai","ʻAokosi","Sepitema","ʻOkatopa","Nōvema","Tīsema"],"short_days":["Sāp","Mōn","Tūs","Pul","Tuʻa","Fal","Tok"],"short_months":["Sān","Fēp","Maʻa","ʻEpe","Mē","Sun","Siu","ʻAok","Sep","ʻOka","Nōv","Tīs"]},"tpi":{"am_pm":["biknait","apinun"],"days":["Sande","Mande","Tunde","Trinde","Fonde","Fraide","Sarere"],"months":["Janueri","Februeri","Mas","Epril","Me","Jun","Julai","Ogas","Septemba","Oktoba","Novemba","Desemba"],"short_days":["San","Man","Tun","Tri","Fon","Fra","Sar"],"short_months":["Jan","Feb","Mas","Epr","Me","Jun","Jul","Oga","Sep","Okt","Nov","Des"]},"tr":{"am_pm":["ÖÖ","ÖS"],"days":["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],"months":["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],"short_days":["Paz","Pzt","Sal","Çrş","Prş","Cum","Cts"],"short_months":["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"]},"ts":{"am_pm":["",""],"days":["Sonto","Musumbhunuku","Ravumbirhi","Ravunharhu","Ravumune","Ravuntlhanu","Mugqivela"],"months":["Sunguti","Nyenyenyani","Nyenyankulu","Dzivamisoko","Mudyaxihi","Khotavuxika","Mawuwani","Mhawuri","Ndzhati","Nhlangula","Hukuri","N'wendzamhala"],"short_days":["Son","Mus","Bir","Har","Ne","Tlh","Mug"],"short_months":["Sun","Yan","Kul","Dzi","Mud","Kho","Maw","Mha","Ndz","Nhl","Huk","N'w"]},"tt":{"am_pm":["",""],"days":["якшәмбе","дүшәмбе","сишәмбе","чәршәмбе","пәнҗешәмбе","җомга","шимбә"],"months":["гыйнвар","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"],"short_days":["якш","дүш","сиш","чәр","пәнҗ","җом","шим"],"short_months":["гыйн","фев","мар","апр","май","июнь","июль","авг","сент","окт","нояб","дек"]},"ug":{"am_pm":["",""],"days":["يەكشەنبە","دۈشەنبە","سەيشەنبە","چارشەنبە","پەيشەنبە","جۈمە","شەنبە"],"months":["يانۋار","فېۋرال","مارت","ئاپرېل","ماي","ئىيۇن","ئىيۇل","ئاۋغۇست","سېنتەبىر","ئۆكتەبىر","نويابىر","دېكابىر"],"short_days":["ي","د","س","چ","پ","ج","ش"],"short_months":["يانۋار","فېۋرال","مارت","ئاپرېل","ماي","ئىيۇن","ئىيۇل","ئاۋغۇست","سېنتەبىر","ئۆكتەبىر","نويابىر","دېكابىر"]},"uk":{"am_pm":["",""],"days":["неділя","понеділок","вівторок","середа","четвер","п'ятниця","субота"],"months":["січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня"],"short_days":["нд","пн","вт","ср","чт","пт","сб"],"short_months":["січ","лют","бер","кві","тра","чер","лип","сер","вер","жов","лис","гру"]},"unm":{"am_pm":["",""],"days":["kentuwei","manteke","tusteke","lelai","tasteke","pelaiteke","sateteke"],"months":["enikwsi","chkwali","xamokhwite","kwetayoxe","tainipen","kichinipen","lainipen","winaminke","kichitahkok","puksit","wini","muxkotae"],"short_days":["ken","man","tus","lel","tas","pel","sat"],"short_months":["eni","chk","xam","kwe","tai","nip","lai","win","tah","puk","kun","mux"]},"ur_IN":{"am_pm":["AM","PM"],"days":["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","سنیچر"],"months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"short_days":["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","سنیچر"],"short_months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"]},"ur_PK":{"am_pm":["ص","ش"],"days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"short_days":["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],"short_months":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"]},"uz":{"am_pm":["",""],"days":["Yakshanba","Dushanba","Seshanba","Chorshanba","Payshanba","Juma","Shanba"],"months":["Yanvar","Fevral","Mart","Aprel","May","Iyun","Iyul","Avgust","Sentabr","Oktabr","Noyabr","Dekabr"],"short_days":["Yak","Du","Se","Cho","Pay","Ju","Sha"],"short_months":["Yan","Fev","Mar","Apr","May","Iyn","Iyl","Avg","Sen","Okt","Noy","Dek"]},"ve":{"am_pm":["",""],"days":["Swondaha","Musumbuluwo","Ḽavhuvhili","Ḽavhuraru","Ḽavhuṋa","Ḽavhuṱanu","Mugivhela"],"months":["Phando","Luhuhi","Ṱhafamuhwe","Lambamai","Shundunthule","Fulwi","Fulwana","Ṱhangule","Khubvumedzi","Tshimedzi","Ḽara","Nyendavhusiku"],"short_days":["Swo","Mus","Vhi","Rar","ṋa","Ṱan","Mug"],"short_months":["Pha","Luh","Fam","Lam","Shu","Lwi","Lwa","Ngu","Khu","Tsh","Ḽar","Nye"]},"vi":{"am_pm":["AM","PM"],"days":["Chủ nhật","Thứ hai","Thứ ba","Thứ tư","Thứ năm","Thứ sáu","Thứ bảy"],"months":["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],"short_days":["CN","T2","T3","T4","T5","T6","T7"],"short_months":["Thg 1","Thg 2","Thg 3","Thg 4","Thg 5","Thg 6","Thg 7","Thg 8","Thg 9","Thg 10","Thg 11","Thg 12"]},"wa":{"am_pm":["AM","PM"],"days":["dimegne","londi","mårdi","mierkidi","djudi","vénrdi","semdi"],"months":["di djanvî","di fevrî","di måss","d’ avri","di may","di djun","di djulete","d’ awousse","di setimbe","d’ octôbe","di nôvimbe","di decimbe"],"short_days":["dim","lon","mår","mie","dju","vén","sem"],"short_months":["dja","fev","mås","avr","may","djn","djl","awo","set","oct","nôv","dec"]},"wae":{"am_pm":["",""],"days":["Suntag","Mäntag","Zischtag","Mittwuch","Frontag","Fritag","Samschtag"],"months":["Jenner","Hornig","Märze","Abrille","Meije","Bráčet","Heiwet","Öigšte","Herbštmánet","Wímánet","Wintermánet","Chrištmánet"],"short_days":["Sun","Män","Zis","Mit","Fro","Fri","Sam"],"short_months":["Jen","Hor","Mär","Abr","Mei","Brá","Hei","Öig","Her","Wím","Win","Chr"]},"wal":{"am_pm":["ማለዶ","ቃማ"],"days":["ወጋ","ሳይኖ","ማቆሳኛ","አሩዋ","ሃሙሳ","አርባ","ቄራ"],"months":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር"],"short_days":["ወጋ ","ሳይኖ","ማቆሳ","አሩዋ","ሃሙሳ","አርባ","ቄራ "],"short_months":["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ ","ጁን ","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም"]},"wo":{"am_pm":["",""],"days":["dib'eer","altine","talaata","allarba","alxames","ajjuma","gaawu"],"months":["sanwiy'e","feebriy'e","mars","awril","me","suwen","sulet","uut","septaambar","oktoobar","nowaambar","desaambar"],"short_days":["dib","alt","tal","all","alx","ajj","gaa"],"short_months":["san","fee","mar","awr","me ","suw","sul","uut","sep","okt","now","des"]},"xh":{"am_pm":["",""],"days":["iCawa","uMvulo","lwesiBini","lwesiThathu","ulweSine","lwesiHlanu","uMgqibelo"],"months":["eyoMqungu","eyoMdumba","eyoKwindla","uTshazimpuzi","uCanzibe","eyeSilimela","eyeKhala","eyeThupa","eyoMsintsi","eyeDwarha","eyeNkanga","eyoMnga"],"short_days":["Caw","Mvu","Bin","Tha","Sin","Hla","Mgq"],"short_months":["Mqu","Mdu","Kwi","Tsh","Can","Sil","Kha","Thu","Msi","Dwa","Nka","Mng"]},"yi":{"am_pm":["AM","PM"],"days":["זונטיק","מאָנטיק","דינסטיק","מיטװאָך","דאָנערשטיק","פֿרײַטיק","שבת"],"months":["יאַנואַר","פֿעברואַר","מערץ","אַפּריל","מיי","יוני","יולי","אויגוסט","סעפּטעמבער","אקטאבער","נאוועמבער","דעצעמבער"],"short_days":["זונ'","מאָנ'","דינ'","מיט'","דאָנ'","פֿרײַ'","שבת"],"short_months":["יאַנ","פֿעב","מאַר","אַפּר","מײַ ","יונ","יול","אױג","סעפּ","אָקט","נאָװ","דעצ"]},"yo":{"am_pm":["AM","PM"],"days":["Ọjọ́ Àìkú","Ọjọ́ Ajé","Ọjọ́ Ìsẹ́gun","Ọjọ́rú","Ọjọ́bọ","Ọjọ́ Ẹtì","Ọjọ́ Àbámẹ́ta"],"months":["Oṣù Ṣẹ́rẹ́","Oṣù Èrèlè","Oṣù Ẹrẹ̀nà","Oṣù Ìgbé","Oṣù Ẹ̀bibi","Oṣù Òkúdu","Oṣù Agẹmọ","Oṣù Ògún","Oṣù Owewe","Oṣù Ọ̀wàrà","Oṣù Bélú","Oṣù Ọ̀pẹ̀"],"short_days":["Àìkú","Ajé","Ìsẹ́gun","Ọjọ́rú","Ọjọ́bọ","Ẹtì","Àbámẹ́ta"],"short_months":["Ṣẹ́rẹ́","Èrèlè","Ẹrẹ̀nà","Ìgbé","Ẹ̀bibi","Òkúdu","Agẹmọ","Ògún","Owewe","Ọ̀wàrà","Bélú","Ọ̀pẹ̀"]},"yue":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"short_days":["日","一","二","三","四","五","六"],"short_months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]},"yuw":{"am_pm":["AM","PM"],"days":["sönda","mönda","sinda","mitiwö","sogipbono","nenggo","söndanggie"],"months":["jenuari","febuari","mas","epril","mei","jun","julai","ögus","septemba","öktoba","nöwemba","diksemba"],"short_days":["sön","mön","sin","mit","soi","nen","sab"],"short_months":["jen","feb","mas","epr","mei","jun","jul","ögu","sep","ökt","nöw","dis"]},"zgh":{"am_pm":["ⵏ ⵜⵉⴼⴰⵡⵜ","ⵏ ⵜⴷⴳⴳⵯⴰⵜ"],"days":["ⴰⵙⴰⵎⴰⵙ","ⴰⵢⵏⵏⴰⵙ","ⴰⵢⵙⵉⵏⴰⵙ","ⴰⴽⵕⴰⵙ","ⴰⴽⵡⴰⵙ","ⴰⵙⵉⵎⵡⴰⵙ","ⴰⵙⵉⴹⵢⴰⵙ"],"months":["ⵉⵏⵏⴰⵢⵔ","ⴱⵕⴰⵢⵕ","ⵎⴰⵕⵚ","ⵉⴱⵔⵉⵔ","ⵎⴰⵢⵢⵓ","ⵢⵓⵏⵢⵓ","ⵢⵓⵍⵢⵓⵣ","ⵖⵓⵛⵜ","ⵛⵓⵜⴰⵏⴱⵉⵔ","ⴽⵟⵓⴱⵕ","ⵏⵓⵡⴰⵏⴱⵉⵔ","ⴷⵓⵊⴰⵏⴱⵉⵔ"],"short_days":["ⴰⵙⴰ","ⴰⵢⵏ","ⴰⵙⵏ","ⴰⴽⵕ","ⴰⴽⵡ","ⴰⵙⵎ","ⴰⵙⴹ"],"short_months":["ⵉⵏⵏ","ⵉⴱⵔ","ⵎⵕⵚ","Apr","ⵎⴰⵢ","ⵢⵓⵏ","ⵢⵓⵍ","ⵖⵓⵛ","ⵛⵓⵜ","ⴽⵟⵓ","ⵏⵓⵡ","ⴷⵓⵊ"]},"zh_CN":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]},"zh_HK":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]},"zh_SG":{"am_pm":["上午","下午"],"days":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},"zh_TW":{"am_pm":["上午","下午"],"days":["週日","週一","週二","週三","週四","週五","週六"],"months":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"short_days":["日","一","二","三","四","五","六"],"short_months":[" 1月"," 2月"," 3月"," 4月"," 5月"," 6月"," 7月"," 8月"," 9月","10月","11月","12月"]},"zu":{"am_pm":["",""],"days":["iSonto","uMsombuluko","uLwesibili","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],"months":["Januwari","Februwari","Mashi","Ephreli","Meyi","Juni","Julayi","Agasti","Septhemba","Okthoba","Novemba","Disemba"],"short_days":["Son","Mso","Bil","Tha","Sin","Hla","Mgq"],"short_months":["Jan","Feb","Mas","Eph","Mey","Jun","Jul","Aga","Sep","Okt","Nov","Dis"]}} From 37b3131d559ab433272e44a66da5d9336ef2ec04 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 3 Jun 2024 09:43:14 -0500 Subject: [PATCH 133/141] Update CHANGELOG.md for v1.55.4 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba97eaf..b163972 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.55.4 (2024-06-03) +------------------------- + * Update date data from go-locales + v1.55.3 (2024-05-27) ------------------------- * Update deps From dd21546a9cca35fa9b7229ffb87460f56d41e455 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 3 Jun 2024 10:06:06 -0500 Subject: [PATCH 134/141] Fix test --- dates/format_test.go | 31 ++++++++++++++++--------------- dates/i18n_test.go | 2 +- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/dates/format_test.go b/dates/format_test.go index 8c8c650..b51d885 100644 --- a/dates/format_test.go +++ b/dates/format_test.go @@ -45,21 +45,22 @@ func TestFormat(t *testing.T) { {d1, "//YY--MM::DD..", "eng-US", "//06--01::02..", ""}, // localization - {d1, "EEE EEEE MMM MMMM AA aa", "eng-US", "Mon Monday Jan January PM pm", ""}, - {d1, "EEE EEEE MMM MMMM AA aa", "spa-EC", "lun lunes ene enero PM pm", ""}, - {d1, "EEE EEEE MMM MMMM AA aa", "ara-QA", "ن الاثنين ينا يناير م م", ""}, - {d1, "EEE EEEE MMM MMMM AA aa", "rus", "Пн Понедельник янв января PM pm", ""}, - {d1, "EEE EEEE MMM MMMM AA aa", "tir", "ሰኑይ ሰኑይ ጃንዩ ጃንዩወሪ ድሕር ሰዓት ድሕር ሰዓት", ""}, - {d2, "EEE EEEE MMM MMMM AA aa", "eng-US", "Sat Saturday Apr April AM am", ""}, - {d2, "EEE EEEE MMM MMMM AA aa", "spa-EC", "sáb sábado abr abril AM am", ""}, - {d2, "EEE EEEE MMM MMMM AA aa", "ara-QA", "س السبت أبر أبريل ص ص", ""}, - {d2, "EEE EEEE MMM MMMM AA aa", "rus", "Сб Суббота апр апреля AM am", ""}, - {d2, "EEE EEEE MMM MMMM AA aa", "tir", "ቀዳም ቀዳም ኤፕረ ኤፕረል ንጉሆ ሰዓተ ንጉሆ ሰዓተ", ""}, - {d3, "EEE EEEE MMM MMMM AA aa", "eng-US", "Tue Tuesday Dec December PM pm", ""}, - {d3, "EEE EEEE MMM MMMM AA aa", "spa-EC", "mar martes dic diciembre PM pm", ""}, - {d3, "EEE EEEE MMM MMMM AA aa", "ara-QA", "ث الثلاثاء ديس ديسمبر م م", ""}, - {d3, "EEE EEEE MMM MMMM AA aa", "rus", "Вт Вторник дек декабря PM pm", ""}, - {d3, "EEE EEEE MMM MMMM AA aa", "tir", "ሰሉስ ሰሉስ ዲሴም ዲሴምበር ድሕር ሰዓት ድሕር ሰዓት", ""}, + {d1, "EEE EEEE MMM MMMM AA aa", "eng-US", `Mon Monday Jan January PM pm`, ""}, + {d1, "EEE EEEE MMM MMMM AA aa", "spa-EC", `lun lunes ene enero PM pm`, ""}, + {d1, "EEE EEEE MMM MMMM AA aa", "spa", `lun lunes ene enero P. M. p. m.`, ""}, + {d1, "EEE EEEE MMM MMMM AA aa", "ara-QA", `ن الاثنين ينا يناير م م`, ""}, + {d1, "EEE EEEE MMM MMMM AA aa", "rus", `Пн Понедельник янв января PM pm`, ""}, + {d1, "EEE EEEE MMM MMMM AA aa", "tir", `ሰኑይ ሰኑይ ጃንዩ ጃንዩወሪ ድሕር ሰዓት ድሕር ሰዓት`, ""}, + {d2, "EEE EEEE MMM MMMM AA aa", "eng-US", `Sat Saturday Apr April AM am`, ""}, + {d2, "EEE EEEE MMM MMMM AA aa", "spa-EC", `sáb sábado abr abril AM am`, ""}, + {d2, "EEE EEEE MMM MMMM AA aa", "ara-QA", `س السبت أبر أبريل ص ص`, ""}, + {d2, "EEE EEEE MMM MMMM AA aa", "rus", `Сб Суббота апр апреля AM am`, ""}, + {d2, "EEE EEEE MMM MMMM AA aa", "tir", `ቀዳም ቀዳም ኤፕረ ኤፕረል ንጉሆ ሰዓተ ንጉሆ ሰዓተ`, ""}, + {d3, "EEE EEEE MMM MMMM AA aa", "eng-US", `Tue Tuesday Dec December PM pm`, ""}, + {d3, "EEE EEEE MMM MMMM AA aa", "spa-EC", `mar martes dic diciembre PM pm`, ""}, + {d3, "EEE EEEE MMM MMMM AA aa", "ara-QA", `ث الثلاثاء ديس ديسمبر م م`, ""}, + {d3, "EEE EEEE MMM MMMM AA aa", "rus", `Вт Вторник дек декабря PM pm`, ""}, + {d3, "EEE EEEE MMM MMMM AA aa", "tir", `ሰሉስ ሰሉስ ዲሴም ዲሴምበር ድሕር ሰዓት ድሕር ሰዓት`, ""}, // fractional seconds {d1, "tt:mm:ss.fff", "eng-US", "15:04:05.123", ""}, diff --git a/dates/i18n_test.go b/dates/i18n_test.go index be4233d..a7b382c 100644 --- a/dates/i18n_test.go +++ b/dates/i18n_test.go @@ -23,7 +23,7 @@ func TestGetTranslation(t *testing.T) { {"eng-GB", "Sun", "Sunday", "Jan", "January", "am"}, {"eng", "Sun", "Sunday", "Jan", "January", "AM"}, {"spa-EC", "dom", "domingo", "ene", "enero", "AM"}, - {"spa", "dom", "domingo", "ene", "enero", "AM"}, + {"spa", "dom", "domingo", `ene`, "enero", `a. m.`}, {"por-BR", "dom", "domingo", "jan", "janeiro", "AM"}, {"por-PT", "dom", "domingo", "jan", "janeiro", "AM"}, {"por", "dom", "domingo", "jan", "janeiro", "AM"}, From 2e431d40c8b58b47cf4f99b95451aaa239d0a1e0 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 3 Jun 2024 10:07:58 -0500 Subject: [PATCH 135/141] Update CHANGELOG.md for v1.55.5 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b163972..770ee95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.55.5 (2024-06-03) +------------------------- + * Fix test + v1.55.4 (2024-06-03) ------------------------- * Update date data from go-locales From 9209ea503c70e588c25f36b1f9bffdafe7d8a601 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 5 Jun 2024 16:17:24 -0500 Subject: [PATCH 136/141] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e2d5f61..16a09c6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# Gocommon [![Build Status](https://github.com/nyaruka/gocommon/workflows/CI/badge.svg)](https://github.com/nyaruka/gocommon/actions?query=workflow%3ACI) [![codecov](https://codecov.io/gh/nyaruka/gocommon/branch/main/graph/badge.svg)](https://codecov.io/gh/nyaruka/gocommon) [![Go Report Card](https://goreportcard.com/badge/github.com/nyaruka/gocommon)](https://goreportcard.com/report/github.com/nyaruka/gocommon) +# 🧰 Gocommon + +[![Build Status](https://github.com/nyaruka/gocommon/workflows/CI/badge.svg)](https://github.com/nyaruka/gocommon/actions?query=workflow%3ACI) [![codecov](https://codecov.io/gh/nyaruka/gocommon/branch/main/graph/badge.svg)](https://codecov.io/gh/nyaruka/gocommon) [![Go Report Card](https://goreportcard.com/badge/github.com/nyaruka/gocommon)](https://goreportcard.com/report/github.com/nyaruka/gocommon) Common functionality in [mailroom](https://github.com/nyaruka/mailroom), [goflow](https://github.com/nyaruka/goflow) and [courier](https://github.com/nyaruka/courier). From 240efe2a39ebbd66f0d6ff30e1d485ae0a43e460 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 1 Jul 2024 16:42:43 -0500 Subject: [PATCH 137/141] Update deps --- go.mod | 20 ++++++++++---------- go.sum | 40 ++++++++++++++++++++-------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index 77239bd..7b565f5 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,12 @@ module github.com/nyaruka/gocommon go 1.21 require ( - github.com/aws/aws-sdk-go v1.53.10 + github.com/aws/aws-sdk-go v1.54.12 github.com/gabriel-vasile/mimetype v1.4.4 - github.com/go-chi/chi/v5 v5.0.12 - github.com/go-playground/validator/v10 v10.20.0 + github.com/go-chi/chi/v5 v5.1.0 + github.com/go-playground/validator/v10 v10.22.0 github.com/gofrs/uuid v4.4.0+incompatible - github.com/gorilla/websocket v1.5.1 + github.com/gorilla/websocket v1.5.3 github.com/jellydator/ttlcache/v3 v3.2.0 github.com/jmoiron/sqlx v1.4.0 github.com/lib/pq v1.10.9 @@ -17,10 +17,10 @@ require ( github.com/nyaruka/phonenumbers v1.3.6 github.com/shopspring/decimal v1.4.0 github.com/stretchr/testify v1.9.0 - golang.org/x/exp v0.0.0-20240525044651-4c93da0ed11d - golang.org/x/net v0.25.0 + golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 + golang.org/x/net v0.26.0 golang.org/x/sync v0.7.0 - golang.org/x/text v0.15.0 + golang.org/x/text v0.16.0 ) require ( @@ -30,8 +30,8 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/crypto v0.24.0 // indirect + golang.org/x/sys v0.21.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 84e35d9..ffa95f5 100644 --- a/go.sum +++ b/go.sum @@ -1,30 +1,30 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/aws/aws-sdk-go v1.53.10 h1:3enP5l5WtezT9Ql+XZqs56JBf5YUd/FEzTCg///OIGY= -github.com/aws/aws-sdk-go v1.53.10/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.54.12 h1:xPDB+GSBZq0rJbmDZF+EyfMbnWRyfEPcn7PZ7bJjXSw= +github.com/aws/aws-sdk-go v1.54.12/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I= github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s= -github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= -github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= -github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= +github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/jellydator/ttlcache/v3 v3.2.0 h1:6lqVJ8X3ZaUwvzENqPAobDsXNExfUJd61u++uW8a3LE= github.com/jellydator/ttlcache/v3 v3.2.0/go.mod h1:hi7MGFdMAwZna5n2tuvh63DvFLzVKySzCVW6+0gA2n4= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -54,20 +54,20 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/exp v0.0.0-20240525044651-4c93da0ed11d h1:N0hmiNbwsSNwHBAvR3QB5w25pUwH4tK0Y/RltD1j1h4= -golang.org/x/exp v0.0.0-20240525044651-4c93da0ed11d/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= From df20f62e9ef31c70dce1c8bc203ca95ec3e79e27 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 1 Jul 2024 16:43:10 -0500 Subject: [PATCH 138/141] Update CHANGELOG.md for v1.55.6 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 770ee95..b210990 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.55.6 (2024-07-01) +------------------------- + * Update deps + v1.55.5 (2024-06-03) ------------------------- * Fix test From e669474622f888a9c3085b3662d3e45a1046cfe5 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 3 Jul 2024 10:21:43 -0500 Subject: [PATCH 139/141] Tweak dbutil.ScanJSON to work with sql.Row as well as sql.Rows --- dbutil/scan.go | 20 ++++++++++++-------- dbutil/scan_test.go | 6 ++++++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/dbutil/scan.go b/dbutil/scan.go index 3683a97..312a616 100644 --- a/dbutil/scan.go +++ b/dbutil/scan.go @@ -10,16 +10,20 @@ import ( var validate = validator.New() +// Scanable is an interface to allow scanning of sql.Row or sql.Rows +type Scannable interface { + Scan(dest ...any) error +} + // ScanJSON scans a row which is JSON into a destination struct -func ScanJSON(rows *sql.Rows, destination any) error { +func ScanJSON(src Scannable, dest any) error { var raw json.RawMessage - err := rows.Scan(&raw) - if err != nil { + + if err := src.Scan(&raw); err != nil { return fmt.Errorf("error scanning row JSON: %w", err) } - err = json.Unmarshal(raw, destination) - if err != nil { + if err := json.Unmarshal(raw, dest); err != nil { return fmt.Errorf("error unmarshalling row JSON: %w", err) } @@ -27,12 +31,12 @@ func ScanJSON(rows *sql.Rows, destination any) error { } // ScanAndValidateJSON scans a row which is JSON into a destination struct and validates it -func ScanAndValidateJSON(rows *sql.Rows, destination any) error { - if err := ScanJSON(rows, destination); err != nil { +func ScanAndValidateJSON(src Scannable, dest any) error { + if err := ScanJSON(src, dest); err != nil { return err } - err := validate.Struct(destination) + err := validate.Struct(dest) if err != nil { return fmt.Errorf("error validating unmarsalled JSON: %w", err) } diff --git a/dbutil/scan_test.go b/dbutil/scan_test.go index 7907a31..de4a96d 100644 --- a/dbutil/scan_test.go +++ b/dbutil/scan_test.go @@ -96,6 +96,12 @@ func TestScanJSON(t *testing.T) { rows.Close() + // can also scan as a single row + row := db.QueryRowContext(ctx, `SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid, f.name, f.age FROM foo f WHERE id = 3) r`) + err = dbutil.ScanJSON(row, f) + assert.NoError(t, err) + assert.Equal(t, "a5850c89-dd29-46f6-9de1-d068b3c2db94", f.UUID) + // can all scan all rows with ScanAllJSON rows = queryRows(`SELECT ROW_TO_JSON(r) FROM (SELECT f.uuid, f.name, f.age FROM foo f) r`) From 250851bebf305509a1f6ab40a219da8c73aa6e23 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 3 Jul 2024 10:28:08 -0500 Subject: [PATCH 140/141] Update CHANGELOG.md for v1.55.7 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b210990..7ce8bfd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v1.55.7 (2024-07-03) +------------------------- + * Tweak dbutil.ScanJSON to work with sql.Row as well as sql.Rows + v1.55.6 (2024-07-01) ------------------------- * Update deps From b9108a38f00ea2543ffe88b548206239583870a2 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 3 Jul 2024 15:59:52 -0500 Subject: [PATCH 141/141] Fix misuses of json.RawMessage --- jsonx/json.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jsonx/json.go b/jsonx/json.go index 5828142..9ec7056 100644 --- a/jsonx/json.go +++ b/jsonx/json.go @@ -57,12 +57,12 @@ func marshal(v any, indent string) ([]byte, error) { } // Unmarshal is just a shortcut for json.Unmarshal so all calls can be made via the jsonx package -func Unmarshal(data json.RawMessage, v any) error { +func Unmarshal(data []byte, v any) error { return json.Unmarshal(data, v) } // UnmarshalArray unmarshals an array of objects from the given JSON -func UnmarshalArray(data json.RawMessage) ([]json.RawMessage, error) { +func UnmarshalArray(data []byte) ([]json.RawMessage, error) { var items []json.RawMessage err := Unmarshal(data, &items) return items, err @@ -81,7 +81,7 @@ func UnmarshalWithLimit(reader io.ReadCloser, s any, limit int64) error { } // MustUnmarshal unmarshals the given JSON, panicking on an error -func MustUnmarshal(data json.RawMessage, v any) { +func MustUnmarshal(data []byte, v any) { if err := json.Unmarshal(data, v); err != nil { panic(err) }