From 0e2e1187192cb782e0b03ff45f8a1df93e855496 Mon Sep 17 00:00:00 2001
From: Imantas <11162236+giesmininkas@users.noreply.github.com>
Date: Fri, 17 Jul 2026 19:09:44 +0300
Subject: [PATCH 1/5] Add COBS encoding/decoding operations (#2185)
---
src/core/config/Categories.json | 4 +-
src/core/lib/COBS.mjs | 86 ++++++
src/core/operations/FromCOBS.mjs | 38 +++
src/core/operations/ToCOBS.mjs | 38 +++
tests/operations/tests/COBS.mjs | 476 +++++++++++++++++++++++++++++++
5 files changed, 641 insertions(+), 1 deletion(-)
create mode 100644 src/core/lib/COBS.mjs
create mode 100644 src/core/operations/FromCOBS.mjs
create mode 100644 src/core/operations/ToCOBS.mjs
create mode 100644 tests/operations/tests/COBS.mjs
diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json
index c652ed480d..6cf7e107da 100644
--- a/src/core/config/Categories.json
+++ b/src/core/config/Categories.json
@@ -83,7 +83,9 @@
"Rison Decode",
"To Modhex",
"From Modhex",
- "MIME Decoding"
+ "MIME Decoding",
+ "To COBS",
+ "From COBS"
]
},
{
diff --git a/src/core/lib/COBS.mjs b/src/core/lib/COBS.mjs
new file mode 100644
index 0000000000..e480fbcfe3
--- /dev/null
+++ b/src/core/lib/COBS.mjs
@@ -0,0 +1,86 @@
+/**
+ * @author Imantas Lukenskas [imantas@lukenskas.dev]
+ * @copyright Imantas Lukenskas 2026
+ * @license Apache-2.0
+ */
+
+import OperationError from "../errors/OperationError.mjs";
+
+/**
+ * COBS-encode a byte array
+ * @param {Uint8Array} data
+ * @return {Uint8Array}
+ */
+export function toCobs(data) {
+ if (!data || data.length === 0) {
+ return new Uint8Array();
+ }
+
+ const output = [];
+ data = [0, ...data];
+
+ while (data.length > 0) {
+ const endIndex = data.findIndex((value, index) => value === 0 && index > 0);
+
+ if ((endIndex < 0 || endIndex > 254) && data.length > 254) {
+ output.push(255);
+ output.push(...data.slice(1, 255));
+ data = data.slice(255);
+ if (data.length !== 0) {
+ data = [0, ...data];
+ }
+ } else if (endIndex < 0) {
+ output.push(data.length);
+ output.push(...data.slice(1));
+ data = [];
+ } else {
+ output.push(endIndex);
+ output.push(...data.slice(1, endIndex));
+ data = data.slice(endIndex);
+ }
+ }
+
+ return output;
+}
+
+/**
+ * COBS-decode a byte array
+ * @param {Uint8Array} data
+ * @return {Uint8Array}
+ */
+export function fromCobs(data) {
+ if (!data || data.length === 0) {
+ return new Uint8Array();
+ }
+
+ if (data.findIndex((value) => value === 0) >= 0) {
+ throw new OperationError("Could not decode from COBS: payload must not contain a 0x00 byte");
+ }
+
+ const output = [];
+
+ while (data.length > 0) {
+ if (data[0] === 0xFF) {
+ output.push(...data.slice(1, 255));
+ data = data.slice(255);
+ } else {
+ const nextZeroIndex = data[0];
+ output.push(...data.slice(1, nextZeroIndex));
+ data = data.slice(nextZeroIndex);
+
+ let blockSize = data[0];
+ while (data.length > 0) {
+ output.push(0, ...data.slice(1, blockSize));
+ data = data.slice(blockSize);
+
+ if (blockSize === 0xFF) {
+ break;
+ }
+
+ blockSize = data[0];
+ }
+ }
+ }
+
+ return output;
+}
diff --git a/src/core/operations/FromCOBS.mjs b/src/core/operations/FromCOBS.mjs
new file mode 100644
index 0000000000..7347a72dff
--- /dev/null
+++ b/src/core/operations/FromCOBS.mjs
@@ -0,0 +1,38 @@
+/**
+ * @author Imantas Lukenskas [imantas@lukenskas.dev]
+ * @copyright Imantas Lukenskas 2026
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation.mjs";
+import {fromCobs} from "../lib/COBS.mjs";
+
+/**
+ * From COBS operation
+ */
+class FromCOBS extends Operation {
+ /**
+ * FromCOBS constructor
+ */
+ constructor() {
+ super();
+
+ this.name = "From COBS";
+ this.module = "Default";
+ this.description = "Decodes COBS encoded bytes";
+ this.infoURL = "https://wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing";
+ this.inputType = "byteArray";
+ this.outputType = "byteArray";
+ }
+
+ /**
+ * @param {byteArray} input
+ * @param {Object[]} args
+ * @returns {byteArray}
+ */
+ run(input, args) {
+ return fromCobs(input);
+ }
+}
+
+export default FromCOBS;
diff --git a/src/core/operations/ToCOBS.mjs b/src/core/operations/ToCOBS.mjs
new file mode 100644
index 0000000000..9d1b5f3695
--- /dev/null
+++ b/src/core/operations/ToCOBS.mjs
@@ -0,0 +1,38 @@
+/**
+ * @author Imantas Lukenskas [imantas@lukenskas.dev]
+ * @copyright Imantas Lukenskas 2026
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation.mjs";
+import {toCobs} from "../lib/COBS.mjs";
+
+/**
+ * To COBS operation
+ */
+class ToCOBS extends Operation {
+ /**
+ * ToCOBS constructor
+ */
+ constructor() {
+ super();
+
+ this.name = "To COBS";
+ this.module = "Default";
+ this.description = "Encodes bytes in COBS format";
+ this.infoURL = "https://wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing";
+ this.inputType = "byteArray";
+ this.outputType = "byteArray";
+ }
+
+ /**
+ * @param {byteArray} input
+ * @param {Object[]} args
+ * @returns {byteArray}
+ */
+ run(input, args) {
+ return toCobs(input);
+ }
+}
+
+export default ToCOBS;
diff --git a/tests/operations/tests/COBS.mjs b/tests/operations/tests/COBS.mjs
new file mode 100644
index 0000000000..a8c37c5f58
--- /dev/null
+++ b/tests/operations/tests/COBS.mjs
@@ -0,0 +1,476 @@
+/**
+ * @author Imantas Lukenskas [imantas@lukenskas.dev]
+ * @copyright Imantas Lukenskas 2026
+ * @license Apache-2.0
+ */
+
+import TestRegister from "../../lib/TestRegister.mjs";
+
+// values in "COBS" testcases are taken from here:
+// https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing
+
+TestRegister.addTests([
+ {
+ "name": "To COBS Example #1",
+ "input": "00",
+ "expectedOutput": "01 01",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "To COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "To COBS Example #2",
+ "input": "00 00",
+ "expectedOutput": "01 01 01",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "To COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "To COBS Example #3",
+ "input": "00 11 00",
+ "expectedOutput": "01 02 11 01",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "To COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "To COBS Example #4",
+ "input": "11 22 00 33",
+ "expectedOutput": "03 11 22 02 33",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "To COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "To COBS Example #5",
+ "input": "11 22 33 44",
+ "expectedOutput": "05 11 22 33 44",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "To COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "To COBS Example #6",
+ "input": "11 00 00 00",
+ "expectedOutput": "02 11 01 01 01",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "To COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "To COBS Example #7",
+ "input": "01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe",
+ "expectedOutput": "ff 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "To COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "To COBS Example #8",
+ "input": "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe",
+ "expectedOutput": "01 ff 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "To COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "To COBS Example #9",
+ "input": "01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff",
+ "expectedOutput": "ff 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe 02 ff",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "To COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "To COBS Example #10",
+ "input": "02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 00",
+ "expectedOutput": "ff 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 01 01",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "To COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "To COBS Example #11",
+ "input": "03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 00 01",
+ "expectedOutput": "fe 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 02 01",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "To COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "From COBS Example #1",
+ "input": "01 01",
+ "expectedOutput": "00",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "From COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "From COBS Example #2",
+ "input": "01 01 01",
+ "expectedOutput": "00 00",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "From COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "From COBS Example #3",
+ "input": "01 02 11 01",
+ "expectedOutput": "00 11 00",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "From COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "From COBS Example #4",
+ "input": "03 11 22 02 33",
+ "expectedOutput": "11 22 00 33",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "From COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "From COBS Example #5",
+ "input": "05 11 22 33 44",
+ "expectedOutput": "11 22 33 44",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "From COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "From COBS Example #6",
+ "input": "02 11 01 01 01",
+ "expectedOutput": "11 00 00 00",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "From COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "From COBS Example #7",
+ "input": "ff 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe",
+ "expectedOutput": "01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "From COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "From COBS Example #8",
+ "input": "01 ff 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe",
+ "expectedOutput": "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "From COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "From COBS Example #9",
+ "input": "ff 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe 02 ff",
+ "expectedOutput": "01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "From COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "From COBS Example #10",
+ "input": "ff 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 01 01",
+ "expectedOutput": "02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 00",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "From COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "From COBS Example #11",
+ "input": "fe 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 02 01",
+ "expectedOutput": "03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 00 01",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "From COBS",
+ "args": []
+ },
+ {
+ "op": "To Hex",
+ "args": ["Space"]
+ }
+ ]
+ },
+ {
+ "name": "From COBS Invalid input #1",
+ "input": "00 48 45 4C 4C 4F",
+ "expectedOutput": "Could not decode from COBS: payload must not contain a 0x00 byte",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "From COBS",
+ "args": []
+ }
+ ],
+ },
+ {
+ "name": "From COBS Invalid input #2",
+ "input": "48 45 00 4C 4C 4F",
+ "expectedOutput": "Could not decode from COBS: payload must not contain a 0x00 byte",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "From COBS",
+ "args": []
+ }
+ ],
+ },
+ {
+ "name": "From COBS Invalid input #3",
+ "input": "48 45 4C 4C 4F 00",
+ "expectedOutput": "Could not decode from COBS: payload must not contain a 0x00 byte",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["Auto"]
+ },
+ {
+ "op": "From COBS",
+ "args": []
+ }
+ ],
+ },
+]);
From e5ee170e8d7c155f1f1afa2e12239fd9ece53612 Mon Sep 17 00:00:00 2001
From: p-leriche <7701190+p-leriche@users.noreply.github.com>
Date: Fri, 17 Jul 2026 17:24:44 +0100
Subject: [PATCH 2/5] Add Extended GCD operation (#2206)
---
src/core/config/Categories.json | 2 -
src/core/lib/BigIntUtils.mjs | 1 -
src/core/operations/ExtendedGCD.mjs | 101 +++++++++++++++++++++++++
tests/operations/tests/ExtendedGCD.mjs | 78 +++++++++++++++++++
4 files changed, 179 insertions(+), 3 deletions(-)
create mode 100644 src/core/operations/ExtendedGCD.mjs
create mode 100644 tests/operations/tests/ExtendedGCD.mjs
diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json
index 6cf7e107da..20846692cc 100644
--- a/src/core/config/Categories.json
+++ b/src/core/config/Categories.json
@@ -243,8 +243,6 @@
"Subtract",
"Multiply",
"Divide",
- "Modular Exponentiation",
- "Modular Inverse",
"Extended GCD",
"Mean",
"Median",
diff --git a/src/core/lib/BigIntUtils.mjs b/src/core/lib/BigIntUtils.mjs
index 5ddd8786f4..a7187e9084 100644
--- a/src/core/lib/BigIntUtils.mjs
+++ b/src/core/lib/BigIntUtils.mjs
@@ -70,4 +70,3 @@ export function modPow(base, exponent, modulus) {
return result;
}
-
diff --git a/src/core/operations/ExtendedGCD.mjs b/src/core/operations/ExtendedGCD.mjs
new file mode 100644
index 0000000000..88069c7459
--- /dev/null
+++ b/src/core/operations/ExtendedGCD.mjs
@@ -0,0 +1,101 @@
+/**
+ * @author p-leriche [philip.leriche@cantab.net]
+ * @copyright Crown Copyright 2025
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation.mjs";
+import OperationError from "../errors/OperationError.mjs";
+import { parseBigInt, egcd } from "../lib/BigIntUtils.mjs";
+
+/* ---------- operation class ---------- */
+
+/**
+ * Extended GCD operation
+ */
+class ExtendedGCD extends Operation {
+ /**
+ * ExtendedGCD constructor
+ */
+ constructor() {
+ super();
+
+ this.name = "Extended GCD";
+ this.module = "Crypto";
+ this.description =
+ "Computes the Extended Euclidean Algorithm for integers a and b.
" +
+ "Finds integers x and y (Bezout coefficients) such that:
" +
+ "a*x + b*y = gcd(a, b)
" +
+ "This is fundamental to many number theory algorithms including modular inverse, " +
+ "solving linear Diophantine equations, and cryptographic operations.
" +
+ "Input handling: If either a or b is left blank, " +
+ "its value is taken from the Input field.";
+ this.infoURL = "https://wikipedia.org/wiki/Extended_Euclidean_algorithm";
+ this.inputType = "string";
+ this.outputType = "string";
+ this.args = [
+ {
+ name: "Value a",
+ type: "string",
+ value: ""
+ },
+ {
+ name: "Value b",
+ type: "string",
+ value: ""
+ }
+ ];
+ }
+
+ /**
+ * @param {string} input
+ * @param {Object[]} args
+ * @returns {string}
+ */
+ run(input, args) {
+ const [aStr, bStr] = args;
+
+ // Trim everything so "" and " " count as empty
+ const aParam = aStr?.trim();
+ const bParam = bStr?.trim();
+ const inputVal = input?.trim();
+
+ let a, b;
+
+ if (aParam && bParam) {
+ // Case 1: both values given as parameters
+ a = aParam;
+ b = bParam;
+ } else if (!aParam && bParam) {
+ // Case 2: a missing - take from input
+ a = inputVal;
+ b = bParam;
+ if (!a) throw new OperationError("Value a must be defined");
+ } else if (aParam && !bParam) {
+ // Case 3: b missing - take from input
+ a = aParam;
+ b = inputVal;
+ if (!b) throw new OperationError("Value b must be defined");
+ } else if (!aParam && !bParam) {
+ // Case 4: both values missing
+ throw new OperationError("Values a and b must be defined");
+ }
+
+ const aBI = parseBigInt(a, "Value a");
+ const bBI = parseBigInt(b, "Value b");
+
+ const [g, x, y] = egcd(aBI, bBI);
+ const gcd = g < 0n ? -g : g;
+
+ // Format output string bearing in mind that crypto-grade numbers
+ // may greatly exceed the line length.
+ let output = "gcd: " + gcd.toString() + "\n\n";
+ output += "Bezout coefficients:\n";
+ output += "x = " + x.toString() + "\n";
+ output += "y = " + y.toString() + "\n\n";
+
+ return output;
+ }
+}
+
+export default ExtendedGCD;
diff --git a/tests/operations/tests/ExtendedGCD.mjs b/tests/operations/tests/ExtendedGCD.mjs
new file mode 100644
index 0000000000..fcc195ca01
--- /dev/null
+++ b/tests/operations/tests/ExtendedGCD.mjs
@@ -0,0 +1,78 @@
+/**
+ * Extended GCD tests.
+ *
+ * @author p-leriche [philip.leriche@cantab.net]
+ *
+ * @copyright Crown Copyright 2025
+ * @license Apache-2.0
+ */
+import TestRegister from "../../lib/TestRegister.mjs";
+
+TestRegister.addTests([
+ {
+ name: "Extended GCD: coprime numbers (3, 11)",
+ input: "",
+ expectedOutput: "gcd: 1\n\nBezout coefficients:\nx = 4\ny = -1\n\n",
+ recipeConfig: [
+ {
+ op: "Extended GCD",
+ args: ["3", "11"],
+ },
+ ],
+ },
+ {
+ name: "Extended GCD: non-coprime numbers (240, 46)",
+ input: "",
+ expectedOutput: "gcd: 2\n\nBezout coefficients:\nx = -9\ny = 47\n\n",
+ recipeConfig: [
+ {
+ op: "Extended GCD",
+ args: ["240", "46"],
+ },
+ ],
+ },
+ {
+ name: "Extended GCD: with zero (17, 0)",
+ input: "",
+ expectedOutput: "gcd: 17\n\nBezout coefficients:\nx = 1\ny = 0\n\n",
+ recipeConfig: [
+ {
+ op: "Extended GCD",
+ args: ["17", "0"],
+ },
+ ],
+ },
+ {
+ name: "Extended GCD: hexadecimal input (0xFF, 0x11)",
+ input: "",
+ expectedOutput: "gcd: 17\n\nBezout coefficients:\nx = 0\ny = 1\n\n",
+ recipeConfig: [
+ {
+ op: "Extended GCD",
+ args: ["0xFF", "0x11"],
+ },
+ ],
+ },
+ {
+ name: "Extended GCD: using input field for value a",
+ input: "42",
+ expectedOutput: "gcd: 7\n\nBezout coefficients:\nx = 1\ny = -1\n\n",
+ recipeConfig: [
+ {
+ op: "Extended GCD",
+ args: ["", "35"],
+ },
+ ],
+ },
+ {
+ name: "Extended GCD: large numbers",
+ input: "",
+ expectedOutput: "gcd: 2\n\nBezout coefficients:\nx = 12703973750415151\ny = -1577756566311408967124629843\n\n",
+ recipeConfig: [
+ {
+ op: "Extended GCD",
+ args: ["123456789012345678901234567890", "994064509324197316"],
+ },
+ ],
+ },
+]);
From d771ea2cc008c3a17d5032f04bf46da497b49636 Mon Sep 17 00:00:00 2001
From: Michael Roberson
Date: Fri, 17 Jul 2026 12:36:55 -0400
Subject: [PATCH 3/5] Consolidate HTML entity tables into a single
spec-generated source (#2645) (#2671)
---
.gitignore | 1 +
Gruntfile.js | 1 +
.../config/scripts/generateHTMLEntities.mjs | 139 +
.../config/scripts/htmlEntityOverrides.mjs | 86 +
src/core/operations/FromHTMLEntity.mjs | 1460 +----------
src/core/operations/ToHTMLEntity.mjs | 1437 +----------
src/core/vendor/htmlEntities/entity.json | 2233 +++++++++++++++++
src/core/vendor/htmlEntities/entity.txt | 14 +
tests/node/tests/ToHTMLEntity.mjs | 49 +
tests/operations/tests/HTMLEntity.mjs | 126 +
10 files changed, 2658 insertions(+), 2888 deletions(-)
create mode 100644 src/core/config/scripts/generateHTMLEntities.mjs
create mode 100644 src/core/config/scripts/htmlEntityOverrides.mjs
create mode 100644 src/core/vendor/htmlEntities/entity.json
create mode 100644 src/core/vendor/htmlEntities/entity.txt
create mode 100644 tests/operations/tests/HTMLEntity.mjs
diff --git a/.gitignore b/.gitignore
index a1e9dab6de..45aee9aa5f 100755
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,7 @@ build
src/core/config/modules/*
src/core/config/OperationConfig.json
src/core/operations/index.mjs
+src/core/lib/HTMLEntities.mjs
src/node/config/OperationConfig.json
src/node/index.mjs
tests/operations/index.mjs
diff --git a/Gruntfile.js b/Gruntfile.js
index d379ba7152..a963d1a3f7 100755
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -367,6 +367,7 @@ module.exports = function (grunt) {
command: chainCommands([
"echo '\n--- Regenerating config files. ---'",
"echo [] > src/core/config/OperationConfig.json",
+ `node ${nodeFlags} src/core/config/scripts/generateHTMLEntities.mjs`,
`node ${nodeFlags} src/core/config/scripts/generateOpsIndex.mjs`,
`node ${nodeFlags} src/core/config/scripts/generateConfig.mjs`,
"echo '--- Config scripts finished. ---\n'"
diff --git a/src/core/config/scripts/generateHTMLEntities.mjs b/src/core/config/scripts/generateHTMLEntities.mjs
new file mode 100644
index 0000000000..6ff2bdbbef
--- /dev/null
+++ b/src/core/config/scripts/generateHTMLEntities.mjs
@@ -0,0 +1,139 @@
+/**
+ * This script automatically generates src/core/lib/HTMLEntities.mjs, the shared
+ * HTML entity lookup tables used by the "To HTML Entity" and "From HTML Entity"
+ * operations.
+ *
+ * The data is derived from the vendored WHATWG named character reference set
+ * (src/core/vendor/htmlEntities/entity.json, from
+ * https://html.spec.whatwg.org/entities.json) so the
+ * two operations cannot drift apart and every entity is spec-conformant:
+ *
+ * - HTML_ENTITY_REVERSE_LOOKUP (decode) is every single-code-point spec name.
+ * - HTML_ENTITY_LOOKUP (encode) picks one canonical name per code point via a
+ * deterministic tiebreak, overridden by htmlEntityOverrides.mjs where a
+ * specific historical name is preferred.
+ *
+ * @author roberson-io [michaelroberson@gmail.com]
+ * @copyright Crown Copyright 2026
+ * @license Apache-2.0
+ */
+
+/* eslint no-console: ["off"] */
+
+import path from "path";
+import fs from "fs";
+import process from "process";
+import { fileURLToPath } from "url";
+import { HTML_ENTITY_CANONICAL_OVERRIDES } from "./htmlEntityOverrides.mjs";
+
+const scriptDir = path.dirname(fileURLToPath(import.meta.url));
+
+if (!fs.existsSync(path.join(process.cwd(), "src/core/lib"))) {
+ console.log("\nCWD: " + process.cwd());
+ console.log("Error: generateHTMLEntities.mjs should be run from the project root");
+ console.log("Example> node src/core/config/scripts/generateHTMLEntities.mjs");
+ process.exit(1);
+}
+
+const SPEC = JSON.parse(fs.readFileSync(
+ path.join(scriptDir, "..", "..", "vendor", "htmlEntities", "entity.json"), "utf8"));
+
+// Build code point -> [spec names] for single-code-point, semicolon-terminated
+// references (the representable subset; multi-code-point entities are skipped).
+const codePointNames = {};
+for (const [key, val] of Object.entries(SPEC)) {
+ if (!key.endsWith(";") || val.codepoints.length !== 1) continue;
+ const name = key.slice(1, -1); // strip leading "&" and trailing ";"
+ (codePointNames[val.codepoints[0]] ??= []).push(name);
+}
+
+// Deterministic canonical-name tiebreak: prefer a lower-case name, then the
+// shortest, then alphabetical. Overridden per code point where a specific
+// historical name is preferred.
+const isAllUpper = s => s === s.toUpperCase() && s !== s.toLowerCase();
+
+/**
+ * Choose the single canonical entity name for a code point.
+ *
+ * @param {number} codePoint - the Unicode code point being encoded
+ * @param {string[]} names - all valid WHATWG names for that code point
+ * @returns {string} the canonical name to emit when encoding
+ */
+function canonicalName(codePoint, names) {
+ const override = HTML_ENTITY_CANONICAL_OVERRIDES[codePoint];
+ if (override !== undefined) {
+ if (!names.includes(override))
+ throw new Error(`Override &${override}; is not a spec name for code point ${codePoint} (spec: ${names})`);
+ return override;
+ }
+ return [...names].sort((a, b) =>
+ (isAllUpper(a) - isAllUpper(b)) ||
+ (a.length - b.length) ||
+ (a < b ? -1 : a > b ? 1 : 0)
+ )[0];
+}
+
+const forward = {}; // code point -> canonical name (encode)
+const reverse = {}; // name -> code point (decode, every spec name)
+for (const [cpStr, names] of Object.entries(codePointNames)) {
+ const cp = Number(cpStr);
+ forward[cp] = canonicalName(cp, names);
+ for (const name of names) reverse[name] = cp;
+}
+
+// Decode-only aliases = spec names that are not the canonical encode name.
+const aliases = {};
+for (const [name, cp] of Object.entries(reverse)) {
+ if (forward[cp] !== name) aliases[name] = cp;
+}
+
+// --- emit -----------------------------------------------------------------
+const fwdEntries = Object.keys(forward).map(Number).sort((a, b) => a - b)
+ .map(cp => ` ${cp}: "${forward[cp]}",`).join("\n").replace(/,$/, "");
+const aliasEntries = Object.keys(aliases).sort()
+ .map(n => ` ${JSON.stringify(n)}: ${aliases[n]},`).join("\n").replace(/,$/, "");
+
+const code = `/**
+ * THIS FILE IS AUTOMATICALLY GENERATED BY src/core/config/scripts/generateHTMLEntities.mjs
+ *
+ * HTML entity lookup tables shared by the "To HTML Entity" and "From HTML Entity"
+ * operations, derived from the WHATWG named character reference set
+ * (https://html.spec.whatwg.org/entities.json). Do not edit by hand — change the
+ * vendored src/core/vendor/htmlEntities/entity.json or htmlEntityOverrides.mjs
+ * and regenerate.
+ *
+ * @author roberson-io [michaelroberson@gmail.com]
+ * @copyright Crown Copyright ${new Date().getUTCFullYear()}
+ * @license Apache-2.0
+ */
+
+/**
+ * Canonical lookup: Unicode code point -> entity name (without "&" and ";"),
+ * used for ENCODING. One canonical name per code point.
+ */
+export const HTML_ENTITY_LOOKUP = {
+${fwdEntries}
+};
+
+/**
+ * Legacy / alias names that only DECODE (spelling variants, deprecated names,
+ * box-drawing aliases, etc.); not used for encoding.
+ */
+export const HTML_ENTITY_DECODE_ALIASES = {
+${aliasEntries}
+};
+
+/**
+ * Derived reverse lookup: entity name -> code point, used for DECODING. Built
+ * from the canonical lookup plus the legacy aliases.
+ */
+export const HTML_ENTITY_REVERSE_LOOKUP = {...HTML_ENTITY_DECODE_ALIASES};
+for (const codePoint in HTML_ENTITY_LOOKUP) {
+ HTML_ENTITY_REVERSE_LOOKUP[HTML_ENTITY_LOOKUP[codePoint]] = Number(codePoint);
+}
+`;
+
+fs.writeFileSync(path.join(process.cwd(), "src/core/lib/HTMLEntities.mjs"), code);
+console.log(`generateHTMLEntities: ${Object.keys(forward).length} encode names, ` +
+ `${Object.keys(reverse).length} decode names, ${Object.keys(aliases).length} aliases, ` +
+ `${Object.keys(HTML_ENTITY_CANONICAL_OVERRIDES).length} overrides applied.`);
diff --git a/src/core/config/scripts/htmlEntityOverrides.mjs b/src/core/config/scripts/htmlEntityOverrides.mjs
new file mode 100644
index 0000000000..367f3e7da5
--- /dev/null
+++ b/src/core/config/scripts/htmlEntityOverrides.mjs
@@ -0,0 +1,86 @@
+/**
+ * Canonical entity-name overrides for generateHTMLEntities.mjs.
+ *
+ * The WHATWG named character reference set assigns MANY names to some code
+ * points (e.g. U+2211 is both ∑ and ∑), but does not designate a
+ * canonical one. The generator therefore needs a rule to pick a single name per
+ * code point for ENCODING. It uses a deterministic tiebreak (prefer a
+ * lower-case name, then the shortest, then alphabetical), which reproduces the
+ * historically-emitted name for ~1355 of the ~1414 encodable code points.
+ *
+ * This file pins the canonical name for the code points where the tiebreak
+ * would otherwise change the emitted entity. Every value here is still a valid
+ * WHATWG name for that code point (the generator asserts this) — these are
+ * editorial choices, not correctness fixes, kept so "To HTML Entity" output
+ * stays stable. Trim an entry to let the tiebreak decide instead.
+ *
+ * @author roberson-io [michaelroberson@gmail.com]
+ * @copyright Crown Copyright 2026
+ * @license Apache-2.0
+ */
+
+/**
+ * @constant
+ * @type {Object.}
+ */
+export const HTML_ENTITY_CANONICAL_OVERRIDES = {
+ 124: "verbar",
+ 168: "uml",
+ 177: "plusmn",
+ 189: "frac12",
+ 247: "divide",
+ 711: "caron",
+ 728: "breve",
+ 937: "Omega",
+ 949: "epsilon",
+ 965: "upsilon",
+ 977: "thetasym",
+ 978: "upsih",
+ 981: "straightphi",
+ 8208: "hyphen",
+ 8214: "Verbar",
+ 8230: "hellip",
+ 8289: "ApplyFunction",
+ 8290: "InvisibleTimes",
+ 8291: "InvisibleComma",
+ 8459: "hamilt",
+ 8461: "quaternions",
+ 8463: "planck",
+ 8465: "image",
+ 8472: "weierp",
+ 8474: "rationals",
+ 8476: "real",
+ 8477: "reals",
+ 8484: "integers",
+ 8492: "bernou",
+ 8499: "phmmat",
+ 8500: "order",
+ 8501: "alefsym",
+ 8518: "DifferentialD",
+ 8519: "ExponentialE",
+ 8520: "ImaginaryI",
+ 8612: "LeftTeeArrow",
+ 8613: "UpTeeArrow",
+ 8615: "DownTeeArrow",
+ 8624: "lsh",
+ 8625: "rsh",
+ 8660: "hArr",
+ 8704: "forall",
+ 8711: "nabla",
+ 8712: "isin",
+ 8721: "sum",
+ 8723: "mnplus",
+ 8730: "radic",
+ 8750: "conint",
+ 8768: "wreath",
+ 8776: "asymp",
+ 8781: "asympeq",
+ 8784: "esdot",
+ 8788: "colone",
+ 8869: "perp",
+ 8896: "xwedge",
+ 8897: "xvee",
+ 8902: "sstarf",
+ 10536: "nesear",
+ 10537: "seswar"
+};
diff --git a/src/core/operations/FromHTMLEntity.mjs b/src/core/operations/FromHTMLEntity.mjs
index 4d09876d8f..e528b6a065 100644
--- a/src/core/operations/FromHTMLEntity.mjs
+++ b/src/core/operations/FromHTMLEntity.mjs
@@ -6,6 +6,7 @@
import Operation from "../Operation.mjs";
import Utils from "../Utils.mjs";
+import { HTML_ENTITY_REVERSE_LOOKUP } from "../lib/HTMLEntities.mjs";
/**
* From HTML Entity operation
@@ -51,7 +52,7 @@ class FromHTMLEntity extends Operation {
output += input[i++];
// Add match
- const bite = entityToByte[m[1]];
+ const bite = HTML_ENTITY_REVERSE_LOOKUP[m[1]];
if (bite) {
output += Utils.chr(bite);
} else if (!bite && m[1][0] === "#" && m[1].length > 1 && /^#\d{1,6}$/.test(m[1])) {
@@ -79,1461 +80,4 @@ class FromHTMLEntity extends Operation {
}
-
-/**
- * Lookup table to translate HTML entity codes to their byte values.
- */
-const entityToByte = {
- "Tab": 9,
- "NewLine": 10,
- "excl": 33,
- "quot": 34,
- "num": 35,
- "dollar": 36,
- "percnt": 37,
- "amp": 38,
- "apos": 39,
- "lpar": 40,
- "rpar": 41,
- "ast": 42,
- "plus": 43,
- "comma": 44,
- "period": 46,
- "sol": 47,
- "colon": 58,
- "semi": 59,
- "lt": 60,
- "equals": 61,
- "gt": 62,
- "quest": 63,
- "commat": 64,
- "lsqb": 91,
- "bsol": 92,
- "rsqb": 93,
- "Hat": 94,
- "lowbar": 95,
- "grave": 96,
- "lcub": 123,
- "verbar": 124,
- "rcub": 125,
- "nbsp": 160,
- "iexcl": 161,
- "cent": 162,
- "pound": 163,
- "curren": 164,
- "yen": 165,
- "brvbar": 166,
- "sect": 167,
- "uml": 168,
- "copy": 169,
- "ordf": 170,
- "laquo": 171,
- "not": 172,
- "shy": 173,
- "reg": 174,
- "macr": 175,
- "deg": 176,
- "plusmn": 177,
- "sup2": 178,
- "sup3": 179,
- "acute": 180,
- "micro": 181,
- "para": 182,
- "middot": 183,
- "cedil": 184,
- "sup1": 185,
- "ordm": 186,
- "raquo": 187,
- "frac14": 188,
- "frac12": 189,
- "frac34": 190,
- "iquest": 191,
- "Agrave": 192,
- "Aacute": 193,
- "Acirc": 194,
- "Atilde": 195,
- "Auml": 196,
- "Aring": 197,
- "AElig": 198,
- "Ccedil": 199,
- "Egrave": 200,
- "Eacute": 201,
- "Ecirc": 202,
- "Euml": 203,
- "Igrave": 204,
- "Iacute": 205,
- "Icirc": 206,
- "Iuml": 207,
- "ETH": 208,
- "Ntilde": 209,
- "Ograve": 210,
- "Oacute": 211,
- "Ocirc": 212,
- "Otilde": 213,
- "Ouml": 214,
- "times": 215,
- "Oslash": 216,
- "Ugrave": 217,
- "Uacute": 218,
- "Ucirc": 219,
- "Uuml": 220,
- "Yacute": 221,
- "THORN": 222,
- "szlig": 223,
- "agrave": 224,
- "aacute": 225,
- "acirc": 226,
- "atilde": 227,
- "auml": 228,
- "aring": 229,
- "aelig": 230,
- "ccedil": 231,
- "egrave": 232,
- "eacute": 233,
- "ecirc": 234,
- "euml": 235,
- "igrave": 236,
- "iacute": 237,
- "icirc": 238,
- "iuml": 239,
- "eth": 240,
- "ntilde": 241,
- "ograve": 242,
- "oacute": 243,
- "ocirc": 244,
- "otilde": 245,
- "ouml": 246,
- "divide": 247,
- "oslash": 248,
- "ugrave": 249,
- "uacute": 250,
- "ucirc": 251,
- "uuml": 252,
- "yacute": 253,
- "thorn": 254,
- "yuml": 255,
- "Amacr": 256,
- "amacr": 257,
- "Abreve": 258,
- "abreve": 259,
- "Aogon": 260,
- "aogon": 261,
- "Cacute": 262,
- "cacute": 263,
- "Ccirc": 264,
- "ccirc": 265,
- "Cdot": 266,
- "cdot": 267,
- "Ccaron": 268,
- "ccaron": 269,
- "Dcaron": 270,
- "dcaron": 271,
- "Dstrok": 272,
- "dstrok": 273,
- "Emacr": 274,
- "emacr": 275,
- "Edot": 278,
- "edot": 279,
- "Eogon": 280,
- "eogon": 281,
- "Ecaron": 282,
- "ecaron": 283,
- "Gcirc": 284,
- "gcirc": 285,
- "Gbreve": 286,
- "gbreve": 287,
- "Gdot": 288,
- "gdot": 289,
- "Gcedil": 290,
- "Hcirc": 292,
- "hcirc": 293,
- "Hstrok": 294,
- "hstrok": 295,
- "Itilde": 296,
- "itilde": 297,
- "Imacr": 298,
- "imacr": 299,
- "Iogon": 302,
- "iogon": 303,
- "Idot": 304,
- "imath": 305,
- "IJlig": 306,
- "ijlig": 307,
- "Jcirc": 308,
- "jcirc": 309,
- "Kcedil": 310,
- "kcedil": 311,
- "kgreen": 312,
- "Lacute": 313,
- "lacute": 314,
- "Lcedil": 315,
- "lcedil": 316,
- "Lcaron": 317,
- "lcaron": 318,
- "Lmidot": 319,
- "lmidot": 320,
- "Lstrok": 321,
- "lstrok": 322,
- "Nacute": 323,
- "nacute": 324,
- "Ncedil": 325,
- "ncedil": 326,
- "Ncaron": 327,
- "ncaron": 328,
- "napos": 329,
- "ENG": 330,
- "eng": 331,
- "Omacr": 332,
- "omacr": 333,
- "Odblac": 336,
- "odblac": 337,
- "OElig": 338,
- "oelig": 339,
- "Racute": 340,
- "racute": 341,
- "Rcedil": 342,
- "rcedil": 343,
- "Rcaron": 344,
- "rcaron": 345,
- "Sacute": 346,
- "sacute": 347,
- "Scirc": 348,
- "scirc": 349,
- "Scedil": 350,
- "scedil": 351,
- "Scaron": 352,
- "scaron": 353,
- "Tcedil": 354,
- "tcedil": 355,
- "Tcaron": 356,
- "tcaron": 357,
- "Tstrok": 358,
- "tstrok": 359,
- "Utilde": 360,
- "utilde": 361,
- "Umacr": 362,
- "umacr": 363,
- "Ubreve": 364,
- "ubreve": 365,
- "Uring": 366,
- "uring": 367,
- "Udblac": 368,
- "udblac": 369,
- "Uogon": 370,
- "uogon": 371,
- "Wcirc": 372,
- "wcirc": 373,
- "Ycirc": 374,
- "ycirc": 375,
- "Yuml": 376,
- "Zacute": 377,
- "zacute": 378,
- "Zdot": 379,
- "zdot": 380,
- "Zcaron": 381,
- "zcaron": 382,
- "fnof": 402,
- "imped": 437,
- "gacute": 501,
- "jmath": 567,
- "circ": 710,
- "caron": 711,
- "breve": 728,
- "dot": 729,
- "ring": 730,
- "ogon": 731,
- "tilde": 732,
- "dblac": 733,
- "DownBreve": 785,
- "UnderBar": 818,
- "Alpha": 913,
- "Beta": 914,
- "Gamma": 915,
- "Delta": 916,
- "Epsilon": 917,
- "Zeta": 918,
- "Eta": 919,
- "Theta": 920,
- "Iota": 921,
- "Kappa": 922,
- "Lambda": 923,
- "Mu": 924,
- "Nu": 925,
- "Xi": 926,
- "Omicron": 927,
- "Pi": 928,
- "Rho": 929,
- "Sigma": 931,
- "Tau": 932,
- "Upsilon": 933,
- "Phi": 934,
- "Chi": 935,
- "Psi": 936,
- "Omega": 937,
- "alpha": 945,
- "beta": 946,
- "gamma": 947,
- "delta": 948,
- "epsilon": 949,
- "zeta": 950,
- "eta": 951,
- "theta": 952,
- "iota": 953,
- "kappa": 954,
- "lambda": 955,
- "mu": 956,
- "nu": 957,
- "xi": 958,
- "omicron": 959,
- "pi": 960,
- "rho": 961,
- "sigmaf": 962,
- "sigma": 963,
- "tau": 964,
- "upsilon": 965,
- "phi": 966,
- "chi": 967,
- "psi": 968,
- "omega": 969,
- "thetasym": 977,
- "upsih": 978,
- "straightphi": 981,
- "piv": 982,
- "Gammad": 988,
- "gammad": 989,
- "kappav": 1008,
- "rhov": 1009,
- "epsi": 1013,
- "bepsi": 1014,
- "IOcy": 1025,
- "DJcy": 1026,
- "GJcy": 1027,
- "Jukcy": 1028,
- "DScy": 1029,
- "Iukcy": 1030,
- "YIcy": 1031,
- "Jsercy": 1032,
- "LJcy": 1033,
- "NJcy": 1034,
- "TSHcy": 1035,
- "KJcy": 1036,
- "Ubrcy": 1038,
- "DZcy": 1039,
- "Acy": 1040,
- "Bcy": 1041,
- "Vcy": 1042,
- "Gcy": 1043,
- "Dcy": 1044,
- "IEcy": 1045,
- "ZHcy": 1046,
- "Zcy": 1047,
- "Icy": 1048,
- "Jcy": 1049,
- "Kcy": 1050,
- "Lcy": 1051,
- "Mcy": 1052,
- "Ncy": 1053,
- "Ocy": 1054,
- "Pcy": 1055,
- "Rcy": 1056,
- "Scy": 1057,
- "Tcy": 1058,
- "Ucy": 1059,
- "Fcy": 1060,
- "KHcy": 1061,
- "TScy": 1062,
- "CHcy": 1063,
- "SHcy": 1064,
- "SHCHcy": 1065,
- "HARDcy": 1066,
- "Ycy": 1067,
- "SOFTcy": 1068,
- "Ecy": 1069,
- "YUcy": 1070,
- "YAcy": 1071,
- "acy": 1072,
- "bcy": 1073,
- "vcy": 1074,
- "gcy": 1075,
- "dcy": 1076,
- "iecy": 1077,
- "zhcy": 1078,
- "zcy": 1079,
- "icy": 1080,
- "jcy": 1081,
- "kcy": 1082,
- "lcy": 1083,
- "mcy": 1084,
- "ncy": 1085,
- "ocy": 1086,
- "pcy": 1087,
- "rcy": 1088,
- "scy": 1089,
- "tcy": 1090,
- "ucy": 1091,
- "fcy": 1092,
- "khcy": 1093,
- "tscy": 1094,
- "chcy": 1095,
- "shcy": 1096,
- "shchcy": 1097,
- "hardcy": 1098,
- "ycy": 1099,
- "softcy": 1100,
- "ecy": 1101,
- "yucy": 1102,
- "yacy": 1103,
- "iocy": 1105,
- "djcy": 1106,
- "gjcy": 1107,
- "jukcy": 1108,
- "dscy": 1109,
- "iukcy": 1110,
- "yicy": 1111,
- "jsercy": 1112,
- "ljcy": 1113,
- "njcy": 1114,
- "tshcy": 1115,
- "kjcy": 1116,
- "ubrcy": 1118,
- "dzcy": 1119,
- "ensp": 8194,
- "emsp": 8195,
- "emsp13": 8196,
- "emsp14": 8197,
- "numsp": 8199,
- "puncsp": 8200,
- "thinsp": 8201,
- "hairsp": 8202,
- "ZeroWidthSpace": 8203,
- "zwnj": 8204,
- "zwj": 8205,
- "lrm": 8206,
- "rlm": 8207,
- "hyphen": 8208,
- "ndash": 8211,
- "mdash": 8212,
- "horbar": 8213,
- "Verbar": 8214,
- "lsquo": 8216,
- "rsquo": 8217,
- "sbquo": 8218,
- "ldquo": 8220,
- "rdquo": 8221,
- "bdquo": 8222,
- "dagger": 8224,
- "Dagger": 8225,
- "bull": 8226,
- "nldr": 8229,
- "hellip": 8230,
- "permil": 8240,
- "pertenk": 8241,
- "prime": 8242,
- "Prime": 8243,
- "tprime": 8244,
- "bprime": 8245,
- "lsaquo": 8249,
- "rsaquo": 8250,
- "oline": 8254,
- "caret": 8257,
- "hybull": 8259,
- "frasl": 8260,
- "bsemi": 8271,
- "qprime": 8279,
- "MediumSpace": 8287,
- "NoBreak": 8288,
- "ApplyFunction": 8289,
- "InvisibleTimes": 8290,
- "InvisibleComma": 8291,
- "euro": 8364,
- "tdot": 8411,
- "TripleDot": 8411,
- "DotDot": 8412,
- "Copf": 8450,
- "incare": 8453,
- "gscr": 8458,
- "hamilt": 8459,
- "Hfr": 8460,
- "quaternions": 8461,
- "planckh": 8462,
- "planck": 8463,
- "Iscr": 8464,
- "image": 8465,
- "Lscr": 8466,
- "ell": 8467,
- "Nopf": 8469,
- "numero": 8470,
- "copysr": 8471,
- "weierp": 8472,
- "Popf": 8473,
- "rationals": 8474,
- "Rscr": 8475,
- "real": 8476,
- "reals": 8477,
- "rx": 8478,
- "trade": 8482,
- "integers": 8484,
- "ohm": 8486,
- "mho": 8487,
- "Zfr": 8488,
- "iiota": 8489,
- "angst": 8491,
- "bernou": 8492,
- "Cfr": 8493,
- "escr": 8495,
- "Escr": 8496,
- "Fscr": 8497,
- "phmmat": 8499,
- "order": 8500,
- "alefsym": 8501,
- "beth": 8502,
- "gimel": 8503,
- "daleth": 8504,
- "CapitalDifferentialD": 8517,
- "DifferentialD": 8518,
- "ExponentialE": 8519,
- "ImaginaryI": 8520,
- "frac13": 8531,
- "frac23": 8532,
- "frac15": 8533,
- "frac25": 8534,
- "frac35": 8535,
- "frac45": 8536,
- "frac16": 8537,
- "frac56": 8538,
- "frac18": 8539,
- "frac38": 8540,
- "frac58": 8541,
- "frac78": 8542,
- "larr": 8592,
- "uarr": 8593,
- "rarr": 8594,
- "darr": 8595,
- "harr": 8596,
- "varr": 8597,
- "nwarr": 8598,
- "nearr": 8599,
- "searr": 8600,
- "swarr": 8601,
- "nlarr": 8602,
- "nrarr": 8603,
- "rarrw": 8605,
- "Larr": 8606,
- "Uarr": 8607,
- "Rarr": 8608,
- "Darr": 8609,
- "larrtl": 8610,
- "rarrtl": 8611,
- "LeftTeeArrow": 8612,
- "UpTeeArrow": 8613,
- "map": 8614,
- "DownTeeArrow": 8615,
- "larrhk": 8617,
- "rarrhk": 8618,
- "larrlp": 8619,
- "rarrlp": 8620,
- "harrw": 8621,
- "nharr": 8622,
- "lsh": 8624,
- "rsh": 8625,
- "ldsh": 8626,
- "rdsh": 8627,
- "crarr": 8629,
- "cularr": 8630,
- "curarr": 8631,
- "olarr": 8634,
- "orarr": 8635,
- "lharu": 8636,
- "lhard": 8637,
- "uharr": 8638,
- "uharl": 8639,
- "rharu": 8640,
- "rhard": 8641,
- "dharr": 8642,
- "dharl": 8643,
- "rlarr": 8644,
- "udarr": 8645,
- "lrarr": 8646,
- "llarr": 8647,
- "uuarr": 8648,
- "rrarr": 8649,
- "ddarr": 8650,
- "lrhar": 8651,
- "rlhar": 8652,
- "nlArr": 8653,
- "nhArr": 8654,
- "nrArr": 8655,
- "lArr": 8656,
- "uArr": 8657,
- "rArr": 8658,
- "dArr": 8659,
- "hArr": 8660,
- "vArr": 8661,
- "nwArr": 8662,
- "neArr": 8663,
- "seArr": 8664,
- "swArr": 8665,
- "lAarr": 8666,
- "rAarr": 8667,
- "zigrarr": 8669,
- "larrb": 8676,
- "rarrb": 8677,
- "duarr": 8693,
- "loarr": 8701,
- "roarr": 8702,
- "hoarr": 8703,
- "forall": 8704,
- "comp": 8705,
- "part": 8706,
- "exist": 8707,
- "nexist": 8708,
- "empty": 8709,
- "nabla": 8711,
- "isin": 8712,
- "notin": 8713,
- "ni": 8715,
- "notni": 8716,
- "prod": 8719,
- "coprod": 8720,
- "sum": 8721,
- "minus": 8722,
- "mnplus": 8723,
- "plusdo": 8724,
- "setmn": 8726,
- "lowast": 8727,
- "compfn": 8728,
- "radic": 8730,
- "prop": 8733,
- "infin": 8734,
- "angrt": 8735,
- "ang": 8736,
- "angmsd": 8737,
- "angsph": 8738,
- "mid": 8739,
- "nmid": 8740,
- "par": 8741,
- "npar": 8742,
- "and": 8743,
- "or": 8744,
- "cap": 8745,
- "cup": 8746,
- "int": 8747,
- "Int": 8748,
- "tint": 8749,
- "conint": 8750,
- "Conint": 8751,
- "Cconint": 8752,
- "cwint": 8753,
- "cwconint": 8754,
- "awconint": 8755,
- "there4": 8756,
- "becaus": 8757,
- "ratio": 8758,
- "Colon": 8759,
- "minusd": 8760,
- "mDDot": 8762,
- "homtht": 8763,
- "sim": 8764,
- "bsim": 8765,
- "ac": 8766,
- "acd": 8767,
- "wreath": 8768,
- "nsim": 8769,
- "esim": 8770,
- "sime": 8771,
- "nsime": 8772,
- "cong": 8773,
- "simne": 8774,
- "ncong": 8775,
- "asymp": 8776,
- "nap": 8777,
- "ape": 8778,
- "apid": 8779,
- "bcong": 8780,
- "asympeq": 8781,
- "bump": 8782,
- "bumpe": 8783,
- "esdot": 8784,
- "eDot": 8785,
- "efDot": 8786,
- "erDot": 8787,
- "colone": 8788,
- "ecolon": 8789,
- "ecir": 8790,
- "cire": 8791,
- "wedgeq": 8793,
- "veeeq": 8794,
- "trie": 8796,
- "equest": 8799,
- "ne": 8800,
- "equiv": 8801,
- "nequiv": 8802,
- "le": 8804,
- "ge": 8805,
- "lE": 8806,
- "gE": 8807,
- "lnE": 8808,
- "gnE": 8809,
- "Lt": 8810,
- "Gt": 8811,
- "twixt": 8812,
- "NotCupCap": 8813,
- "nlt": 8814,
- "ngt": 8815,
- "nle": 8816,
- "nge": 8817,
- "lsim": 8818,
- "gsim": 8819,
- "nlsim": 8820,
- "ngsim": 8821,
- "lg": 8822,
- "gl": 8823,
- "ntlg": 8824,
- "ntgl": 8825,
- "pr": 8826,
- "sc": 8827,
- "prcue": 8828,
- "sccue": 8829,
- "prsim": 8830,
- "scsim": 8831,
- "npr": 8832,
- "nsc": 8833,
- "sub": 8834,
- "sup": 8835,
- "nsub": 8836,
- "nsup": 8837,
- "sube": 8838,
- "supe": 8839,
- "nsube": 8840,
- "nsupe": 8841,
- "subne": 8842,
- "supne": 8843,
- "cupdot": 8845,
- "uplus": 8846,
- "sqsub": 8847,
- "sqsup": 8848,
- "sqsube": 8849,
- "sqsupe": 8850,
- "sqcap": 8851,
- "sqcup": 8852,
- "oplus": 8853,
- "ominus": 8854,
- "otimes": 8855,
- "osol": 8856,
- "odot": 8857,
- "ocir": 8858,
- "oast": 8859,
- "odash": 8861,
- "plusb": 8862,
- "minusb": 8863,
- "timesb": 8864,
- "sdotb": 8865,
- "vdash": 8866,
- "dashv": 8867,
- "top": 8868,
- "perp": 8869,
- "models": 8871,
- "vDash": 8872,
- "Vdash": 8873,
- "Vvdash": 8874,
- "VDash": 8875,
- "nvdash": 8876,
- "nvDash": 8877,
- "nVdash": 8878,
- "nVDash": 8879,
- "prurel": 8880,
- "vltri": 8882,
- "vrtri": 8883,
- "ltrie": 8884,
- "rtrie": 8885,
- "origof": 8886,
- "imof": 8887,
- "mumap": 8888,
- "hercon": 8889,
- "intcal": 8890,
- "veebar": 8891,
- "barvee": 8893,
- "angrtvb": 8894,
- "lrtri": 8895,
- "xwedge": 8896,
- "xvee": 8897,
- "xcap": 8898,
- "xcup": 8899,
- "diam": 8900,
- "sdot": 8901,
- "sstarf": 8902,
- "divonx": 8903,
- "bowtie": 8904,
- "ltimes": 8905,
- "rtimes": 8906,
- "lthree": 8907,
- "rthree": 8908,
- "bsime": 8909,
- "cuvee": 8910,
- "cuwed": 8911,
- "Sub": 8912,
- "Sup": 8913,
- "Cap": 8914,
- "Cup": 8915,
- "fork": 8916,
- "epar": 8917,
- "ltdot": 8918,
- "gtdot": 8919,
- "Ll": 8920,
- "Gg": 8921,
- "leg": 8922,
- "gel": 8923,
- "cuepr": 8926,
- "cuesc": 8927,
- "nprcue": 8928,
- "nsccue": 8929,
- "nsqsube": 8930,
- "nsqsupe": 8931,
- "lnsim": 8934,
- "gnsim": 8935,
- "prnsim": 8936,
- "scnsim": 8937,
- "nltri": 8938,
- "nrtri": 8939,
- "nltrie": 8940,
- "nrtrie": 8941,
- "vellip": 8942,
- "ctdot": 8943,
- "utdot": 8944,
- "dtdot": 8945,
- "disin": 8946,
- "isinsv": 8947,
- "isins": 8948,
- "isindot": 8949,
- "notinvc": 8950,
- "notinvb": 8951,
- "isinE": 8953,
- "nisd": 8954,
- "xnis": 8955,
- "nis": 8956,
- "notnivc": 8957,
- "notnivb": 8958,
- "barwed": 8965,
- "Barwed": 8966,
- "lceil": 8968,
- "rceil": 8969,
- "lfloor": 8970,
- "rfloor": 8971,
- "drcrop": 8972,
- "dlcrop": 8973,
- "urcrop": 8974,
- "ulcrop": 8975,
- "bnot": 8976,
- "profline": 8978,
- "profsurf": 8979,
- "telrec": 8981,
- "target": 8982,
- "ulcorn": 8988,
- "urcorn": 8989,
- "dlcorn": 8990,
- "drcorn": 8991,
- "frown": 8994,
- "smile": 8995,
- "lang": 9001,
- "rang": 9002,
- "cylcty": 9005,
- "profalar": 9006,
- "topbot": 9014,
- "ovbar": 9021,
- "solbar": 9023,
- "angzarr": 9084,
- "lmoust": 9136,
- "rmoust": 9137,
- "tbrk": 9140,
- "bbrk": 9141,
- "bbrktbrk": 9142,
- "OverParenthesis": 9180,
- "UnderParenthesis": 9181,
- "OverBrace": 9182,
- "UnderBrace": 9183,
- "trpezium": 9186,
- "elinters": 9191,
- "blank": 9251,
- "oS": 9416,
- "boxh": 9472,
- "boxv": 9474,
- "boxdr": 9484,
- "boxdl": 9488,
- "boxur": 9492,
- "boxul": 9496,
- "boxvr": 9500,
- "boxvl": 9508,
- "boxhd": 9516,
- "boxhu": 9524,
- "boxvh": 9532,
- "boxH": 9552,
- "boxV": 9553,
- "boxdR": 9554,
- "boxDr": 9555,
- "boxDR": 9556,
- "boxdL": 9557,
- "boxDl": 9558,
- "boxDL": 9559,
- "boxuR": 9560,
- "boxUr": 9561,
- "boxUR": 9562,
- "boxuL": 9563,
- "boxUl": 9564,
- "boxUL": 9565,
- "boxvR": 9566,
- "boxVr": 9567,
- "boxVR": 9568,
- "boxvL": 9569,
- "boxVl": 9570,
- "boxVL": 9571,
- "boxHd": 9572,
- "boxhD": 9573,
- "boxHD": 9574,
- "boxHu": 9575,
- "boxhU": 9576,
- "boxHU": 9577,
- "boxvH": 9578,
- "boxVh": 9579,
- "boxVH": 9580,
- "uhblk": 9600,
- "lhblk": 9604,
- "block": 9608,
- "blk14": 9617,
- "blk12": 9618,
- "blk34": 9619,
- "squ": 9633,
- "squf": 9642,
- "EmptyVerySmallSquare": 9643,
- "rect": 9645,
- "marker": 9646,
- "fltns": 9649,
- "xutri": 9651,
- "utrif": 9652,
- "utri": 9653,
- "rtrif": 9656,
- "rtri": 9657,
- "xdtri": 9661,
- "dtrif": 9662,
- "dtri": 9663,
- "ltrif": 9666,
- "ltri": 9667,
- "loz": 9674,
- "cir": 9675,
- "tridot": 9708,
- "xcirc": 9711,
- "ultri": 9720,
- "urtri": 9721,
- "lltri": 9722,
- "EmptySmallSquare": 9723,
- "FilledSmallSquare": 9724,
- "starf": 9733,
- "bigstar": 9733,
- "star": 9734,
- "phone": 9742,
- "female": 9792,
- "male": 9794,
- "spades": 9824,
- "clubs": 9827,
- "hearts": 9829,
- "diams": 9830,
- "sung": 9834,
- "flat": 9837,
- "natur": 9838,
- "sharp": 9839,
- "check": 10003,
- "cross": 10007,
- "malt": 10016,
- "sext": 10038,
- "VerticalSeparator": 10072,
- "lbbrk": 10098,
- "rbbrk": 10099,
- "lobrk": 10214,
- "robrk": 10215,
- "Lang": 10218,
- "Rang": 10219,
- "loang": 10220,
- "roang": 10221,
- "xlarr": 10229,
- "xrarr": 10230,
- "xharr": 10231,
- "xlArr": 10232,
- "xrArr": 10233,
- "xhArr": 10234,
- "xmap": 10236,
- "dzigrarr": 10239,
- "nvlArr": 10498,
- "nvrArr": 10499,
- "nvHarr": 10500,
- "Map": 10501,
- "lbarr": 10508,
- "rbarr": 10509,
- "lBarr": 10510,
- "rBarr": 10511,
- "RBarr": 10512,
- "DDotrahd": 10513,
- "UpArrowBar": 10514,
- "DownArrowBar": 10515,
- "Rarrtl": 10518,
- "latail": 10521,
- "ratail": 10522,
- "lAtail": 10523,
- "rAtail": 10524,
- "larrfs": 10525,
- "rarrfs": 10526,
- "larrbfs": 10527,
- "rarrbfs": 10528,
- "nwarhk": 10531,
- "nearhk": 10532,
- "searhk": 10533,
- "swarhk": 10534,
- "nwnear": 10535,
- "nesear": 10536,
- "seswar": 10537,
- "swnwar": 10538,
- "rarrc": 10547,
- "cudarrr": 10549,
- "ldca": 10550,
- "rdca": 10551,
- "cudarrl": 10552,
- "larrpl": 10553,
- "curarrm": 10556,
- "cularrp": 10557,
- "rarrpl": 10565,
- "harrcir": 10568,
- "Uarrocir": 10569,
- "lurdshar": 10570,
- "ldrushar": 10571,
- "LeftRightVector": 10574,
- "RightUpDownVector": 10575,
- "DownLeftRightVector": 10576,
- "LeftUpDownVector": 10577,
- "LeftVectorBar": 10578,
- "RightVectorBar": 10579,
- "RightUpVectorBar": 10580,
- "RightDownVectorBar": 10581,
- "DownLeftVectorBar": 10582,
- "DownRightVectorBar": 10583,
- "LeftUpVectorBar": 10584,
- "LeftDownVectorBar": 10585,
- "LeftTeeVector": 10586,
- "RightTeeVector": 10587,
- "RightUpTeeVector": 10588,
- "RightDownTeeVector": 10589,
- "DownLeftTeeVector": 10590,
- "DownRightTeeVector": 10591,
- "LeftUpTeeVector": 10592,
- "LeftDownTeeVector": 10593,
- "lHar": 10594,
- "uHar": 10595,
- "rHar": 10596,
- "dHar": 10597,
- "luruhar": 10598,
- "ldrdhar": 10599,
- "ruluhar": 10600,
- "rdldhar": 10601,
- "lharul": 10602,
- "llhard": 10603,
- "rharul": 10604,
- "lrhard": 10605,
- "udhar": 10606,
- "duhar": 10607,
- "RoundImplies": 10608,
- "erarr": 10609,
- "simrarr": 10610,
- "larrsim": 10611,
- "rarrsim": 10612,
- "rarrap": 10613,
- "ltlarr": 10614,
- "gtrarr": 10616,
- "subrarr": 10617,
- "suplarr": 10619,
- "lfisht": 10620,
- "rfisht": 10621,
- "ufisht": 10622,
- "dfisht": 10623,
- "lopar": 10629,
- "ropar": 10630,
- "lbrke": 10635,
- "rbrke": 10636,
- "lbrkslu": 10637,
- "rbrksld": 10638,
- "lbrksld": 10639,
- "rbrkslu": 10640,
- "langd": 10641,
- "rangd": 10642,
- "lparlt": 10643,
- "rpargt": 10644,
- "gtlPar": 10645,
- "ltrPar": 10646,
- "vzigzag": 10650,
- "vangrt": 10652,
- "angrtvbd": 10653,
- "ange": 10660,
- "range": 10661,
- "dwangle": 10662,
- "uwangle": 10663,
- "angmsdaa": 10664,
- "angmsdab": 10665,
- "angmsdac": 10666,
- "angmsdad": 10667,
- "angmsdae": 10668,
- "angmsdaf": 10669,
- "angmsdag": 10670,
- "angmsdah": 10671,
- "bemptyv": 10672,
- "demptyv": 10673,
- "cemptyv": 10674,
- "raemptyv": 10675,
- "laemptyv": 10676,
- "ohbar": 10677,
- "omid": 10678,
- "opar": 10679,
- "operp": 10681,
- "olcross": 10683,
- "odsold": 10684,
- "olcir": 10686,
- "ofcir": 10687,
- "olt": 10688,
- "ogt": 10689,
- "cirscir": 10690,
- "cirE": 10691,
- "solb": 10692,
- "bsolb": 10693,
- "boxbox": 10697,
- "trisb": 10701,
- "rtriltri": 10702,
- "LeftTriangleBar": 10703,
- "RightTriangleBar": 10704,
- "race": 10714,
- "iinfin": 10716,
- "infintie": 10717,
- "nvinfin": 10718,
- "eparsl": 10723,
- "smeparsl": 10724,
- "eqvparsl": 10725,
- "lozf": 10731,
- "RuleDelayed": 10740,
- "dsol": 10742,
- "xodot": 10752,
- "xoplus": 10753,
- "xotime": 10754,
- "xuplus": 10756,
- "xsqcup": 10758,
- "qint": 10764,
- "fpartint": 10765,
- "cirfnint": 10768,
- "awint": 10769,
- "rppolint": 10770,
- "scpolint": 10771,
- "npolint": 10772,
- "pointint": 10773,
- "quatint": 10774,
- "intlarhk": 10775,
- "pluscir": 10786,
- "plusacir": 10787,
- "simplus": 10788,
- "plusdu": 10789,
- "plussim": 10790,
- "plustwo": 10791,
- "mcomma": 10793,
- "minusdu": 10794,
- "loplus": 10797,
- "roplus": 10798,
- "Cross": 10799,
- "timesd": 10800,
- "timesbar": 10801,
- "smashp": 10803,
- "lotimes": 10804,
- "rotimes": 10805,
- "otimesas": 10806,
- "Otimes": 10807,
- "odiv": 10808,
- "triplus": 10809,
- "triminus": 10810,
- "tritime": 10811,
- "iprod": 10812,
- "amalg": 10815,
- "capdot": 10816,
- "ncup": 10818,
- "ncap": 10819,
- "capand": 10820,
- "cupor": 10821,
- "cupcap": 10822,
- "capcup": 10823,
- "cupbrcap": 10824,
- "capbrcup": 10825,
- "cupcup": 10826,
- "capcap": 10827,
- "ccups": 10828,
- "ccaps": 10829,
- "ccupssm": 10832,
- "And": 10835,
- "Or": 10836,
- "andand": 10837,
- "oror": 10838,
- "orslope": 10839,
- "andslope": 10840,
- "andv": 10842,
- "orv": 10843,
- "andd": 10844,
- "ord": 10845,
- "wedbar": 10847,
- "sdote": 10854,
- "simdot": 10858,
- "congdot": 10861,
- "easter": 10862,
- "apacir": 10863,
- "apE": 10864,
- "eplus": 10865,
- "pluse": 10866,
- "Esim": 10867,
- "Colone": 10868,
- "Equal": 10869,
- "eDDot": 10871,
- "equivDD": 10872,
- "ltcir": 10873,
- "gtcir": 10874,
- "ltquest": 10875,
- "gtquest": 10876,
- "les": 10877,
- "ges": 10878,
- "lesdot": 10879,
- "gesdot": 10880,
- "lesdoto": 10881,
- "gesdoto": 10882,
- "lesdotor": 10883,
- "gesdotol": 10884,
- "lap": 10885,
- "gap": 10886,
- "lne": 10887,
- "gne": 10888,
- "lnap": 10889,
- "gnap": 10890,
- "lEg": 10891,
- "gEl": 10892,
- "lsime": 10893,
- "gsime": 10894,
- "lsimg": 10895,
- "gsiml": 10896,
- "lgE": 10897,
- "glE": 10898,
- "lesges": 10899,
- "gesles": 10900,
- "els": 10901,
- "egs": 10902,
- "elsdot": 10903,
- "egsdot": 10904,
- "el": 10905,
- "eg": 10906,
- "siml": 10909,
- "simg": 10910,
- "simlE": 10911,
- "simgE": 10912,
- "LessLess": 10913,
- "GreaterGreater": 10914,
- "glj": 10916,
- "gla": 10917,
- "ltcc": 10918,
- "gtcc": 10919,
- "lescc": 10920,
- "gescc": 10921,
- "smt": 10922,
- "lat": 10923,
- "smte": 10924,
- "late": 10925,
- "bumpE": 10926,
- "pre": 10927,
- "sce": 10928,
- "prE": 10931,
- "scE": 10932,
- "prnE": 10933,
- "scnE": 10934,
- "prap": 10935,
- "scap": 10936,
- "prnap": 10937,
- "scnap": 10938,
- "Pr": 10939,
- "Sc": 10940,
- "subdot": 10941,
- "supdot": 10942,
- "subplus": 10943,
- "supplus": 10944,
- "submult": 10945,
- "supmult": 10946,
- "subedot": 10947,
- "supedot": 10948,
- "subE": 10949,
- "supE": 10950,
- "subsim": 10951,
- "supsim": 10952,
- "subnE": 10955,
- "supnE": 10956,
- "csub": 10959,
- "csup": 10960,
- "csube": 10961,
- "csupe": 10962,
- "subsup": 10963,
- "supsub": 10964,
- "subsub": 10965,
- "supsup": 10966,
- "suphsub": 10967,
- "supdsub": 10968,
- "forkv": 10969,
- "topfork": 10970,
- "mlcp": 10971,
- "Dashv": 10980,
- "Vdashl": 10982,
- "Barv": 10983,
- "vBar": 10984,
- "vBarv": 10985,
- "Vbar": 10987,
- "Not": 10988,
- "bNot": 10989,
- "rnmid": 10990,
- "cirmid": 10991,
- "midcir": 10992,
- "topcir": 10993,
- "nhpar": 10994,
- "parsim": 10995,
- "parsl": 11005,
- "fflig": 64256,
- "filig": 64257,
- "fllig": 64258,
- "ffilig": 64259,
- "ffllig": 64260,
- "Ascr": 119964,
- "Cscr": 119966,
- "Dscr": 119967,
- "Gscr": 119970,
- "Jscr": 119973,
- "Kscr": 119974,
- "Nscr": 119977,
- "Oscr": 119978,
- "Pscr": 119979,
- "Qscr": 119980,
- "Sscr": 119982,
- "Tscr": 119983,
- "Uscr": 119984,
- "Vscr": 119985,
- "Wscr": 119986,
- "Xscr": 119987,
- "Yscr": 119988,
- "Zscr": 119989,
- "ascr": 119990,
- "bscr": 119991,
- "cscr": 119992,
- "dscr": 119993,
- "fscr": 119995,
- "hscr": 119997,
- "iscr": 119998,
- "jscr": 119999,
- "kscr": 120000,
- "lscr": 120001,
- "mscr": 120002,
- "nscr": 120003,
- "pscr": 120005,
- "qscr": 120006,
- "rscr": 120007,
- "sscr": 120008,
- "tscr": 120009,
- "uscr": 120010,
- "vscr": 120011,
- "wscr": 120012,
- "xscr": 120013,
- "yscr": 120014,
- "zscr": 120015,
- "Afr": 120068,
- "Bfr": 120069,
- "Dfr": 120071,
- "Efr": 120072,
- "Ffr": 120073,
- "Gfr": 120074,
- "Jfr": 120077,
- "Kfr": 120078,
- "Lfr": 120079,
- "Mfr": 120080,
- "Nfr": 120081,
- "Ofr": 120082,
- "Pfr": 120083,
- "Qfr": 120084,
- "Sfr": 120086,
- "Tfr": 120087,
- "Ufr": 120088,
- "Vfr": 120089,
- "Wfr": 120090,
- "Xfr": 120091,
- "Yfr": 120092,
- "afr": 120094,
- "bfr": 120095,
- "cfr": 120096,
- "dfr": 120097,
- "efr": 120098,
- "ffr": 120099,
- "gfr": 120100,
- "hfr": 120101,
- "ifr": 120102,
- "jfr": 120103,
- "kfr": 120104,
- "lfr": 120105,
- "mfr": 120106,
- "nfr": 120107,
- "ofr": 120108,
- "pfr": 120109,
- "qfr": 120110,
- "rfr": 120111,
- "sfr": 120112,
- "tfr": 120113,
- "ufr": 120114,
- "vfr": 120115,
- "wfr": 120116,
- "xfr": 120117,
- "yfr": 120118,
- "zfr": 120119,
- "Aopf": 120120,
- "Bopf": 120121,
- "Dopf": 120123,
- "Eopf": 120124,
- "Fopf": 120125,
- "Gopf": 120126,
- "Iopf": 120128,
- "Jopf": 120129,
- "Kopf": 120130,
- "Lopf": 120131,
- "Mopf": 120132,
- "Oopf": 120134,
- "Sopf": 120138,
- "Topf": 120139,
- "Uopf": 120140,
- "Vopf": 120141,
- "Wopf": 120142,
- "Xopf": 120143,
- "Yopf": 120144,
- "aopf": 120146,
- "bopf": 120147,
- "copf": 120148,
- "dopf": 120149,
- "eopf": 120150,
- "fopf": 120151,
- "gopf": 120152,
- "hopf": 120153,
- "iopf": 120154,
- "jopf": 120155,
- "kopf": 120156,
- "lopf": 120157,
- "mopf": 120158,
- "nopf": 120159,
- "oopf": 120160,
- "popf": 120161,
- "qopf": 120162,
- "ropf": 120163,
- "sopf": 120164,
- "topf": 120165,
- "uopf": 120166,
- "vopf": 120167,
- "wopf": 120168,
- "xopf": 120169,
- "yopf": 120170,
- "zopf": 120171
-};
-
export default FromHTMLEntity;
diff --git a/src/core/operations/ToHTMLEntity.mjs b/src/core/operations/ToHTMLEntity.mjs
index 75a82018f6..c9a2d9ba65 100644
--- a/src/core/operations/ToHTMLEntity.mjs
+++ b/src/core/operations/ToHTMLEntity.mjs
@@ -6,6 +6,7 @@
import Operation from "../Operation.mjs";
import Utils from "../Utils.mjs";
+import { HTML_ENTITY_LOOKUP } from "../lib/HTMLEntities.mjs";
/**
* To HTML Entity operation
@@ -52,26 +53,28 @@ class ToHTMLEntity extends Operation {
let output = "";
for (let i = 0; i < charcodes.length; i++) {
+ const named = charcodes[i] in HTML_ENTITY_LOOKUP ?
+ "&" + HTML_ENTITY_LOOKUP[charcodes[i]] + ";" : null;
if (convertAll && numeric) {
output += "" + charcodes[i] + ";";
} else if (convertAll && hexa) {
output += "" + Utils.hex(charcodes[i]) + ";";
} else if (convertAll) {
- output += byteToEntity[charcodes[i]] || "" + charcodes[i] + ";";
+ output += named || "" + charcodes[i] + ";";
} else if (numeric) {
- if (charcodes[i] > 255 || charcodes[i] in byteToEntity) {
+ if (charcodes[i] > 255 || named) {
output += "" + charcodes[i] + ";";
} else {
output += Utils.chr(charcodes[i]);
}
} else if (hexa) {
- if (charcodes[i] > 255 || charcodes[i] in byteToEntity) {
+ if (charcodes[i] > 255 || named) {
output += "" + Utils.hex(charcodes[i]) + ";";
} else {
output += Utils.chr(charcodes[i]);
}
} else {
- output += byteToEntity[charcodes[i]] || (
+ output += named || (
charcodes[i] > 255 ?
"" + charcodes[i] + ";" :
Utils.chr(charcodes[i])
@@ -83,1430 +86,4 @@ class ToHTMLEntity extends Operation {
}
-/**
- * Lookup table to translate byte values to their HTML entity codes.
- */
-const byteToEntity = {
- 9: "	",
- 10: "
",
- 33: "!",
- 34: """,
- 35: "#",
- 36: "$",
- 37: "%",
- 38: "&",
- 39: "'",
- 40: "(",
- 41: ")",
- 42: "*",
- 43: "+",
- 44: ",",
- 46: ".",
- 47: "/",
- 58: ":",
- 59: ";",
- 60: "<",
- 61: "=",
- 62: ">",
- 63: "?",
- 64: "@",
- 91: "[",
- 92: "\",
- 93: "]",
- 94: "^",
- 95: "_",
- 96: "`",
- 123: "{",
- 124: "|",
- 125: "}",
- 160: " ",
- 161: "¡",
- 162: "¢",
- 163: "£",
- 164: "¤",
- 165: "¥",
- 166: "¦",
- 167: "§",
- 168: "¨",
- 169: "©",
- 170: "ª",
- 171: "«",
- 172: "¬",
- 173: "",
- 174: "®",
- 175: "¯",
- 176: "°",
- 177: "±",
- 178: "²",
- 179: "³",
- 180: "´",
- 181: "µ",
- 182: "¶",
- 183: "·",
- 184: "¸",
- 185: "¹",
- 186: "º",
- 187: "»",
- 188: "¼",
- 189: "½",
- 190: "¾",
- 191: "¿",
- 192: "À",
- 193: "Á",
- 194: "Â",
- 195: "Ã",
- 196: "Ä",
- 197: "Å",
- 198: "Æ",
- 199: "Ç",
- 200: "È",
- 201: "É",
- 202: "Ê",
- 203: "Ë",
- 204: "Ì",
- 205: "Í",
- 206: "Î",
- 207: "Ï",
- 208: "Ð",
- 209: "Ñ",
- 210: "Ò",
- 211: "Ó",
- 212: "Ô",
- 213: "Õ",
- 214: "Ö",
- 215: "×",
- 216: "Ø",
- 217: "Ù",
- 218: "Ú",
- 219: "Û",
- 220: "Ü",
- 221: "Ý",
- 222: "Þ",
- 223: "ß",
- 224: "à",
- 225: "á",
- 226: "â",
- 227: "ã",
- 228: "ä",
- 229: "å",
- 230: "æ",
- 231: "ç",
- 232: "è",
- 233: "é",
- 234: "ê",
- 235: "ë",
- 236: "ì",
- 237: "í",
- 238: "î",
- 239: "ï",
- 240: "ð",
- 241: "ñ",
- 242: "ò",
- 243: "ó",
- 244: "ô",
- 245: "õ",
- 246: "ö",
- 247: "÷",
- 248: "ø",
- 249: "ù",
- 250: "ú",
- 251: "û",
- 252: "ü",
- 253: "ý",
- 254: "þ",
- 255: "ÿ",
- 256: "Ā",
- 257: "ā",
- 258: "Ă",
- 259: "ă",
- 260: "Ą",
- 261: "ą",
- 262: "Ć",
- 263: "ć",
- 264: "Ĉ",
- 265: "ĉ",
- 266: "Ċ",
- 267: "ċ",
- 268: "Č",
- 269: "č",
- 270: "Ď",
- 271: "ď",
- 272: "Đ",
- 273: "đ",
- 274: "Ē",
- 275: "ē",
- 278: "Ė",
- 279: "ė",
- 280: "Ę",
- 281: "ę",
- 282: "Ě",
- 283: "ě",
- 284: "Ĝ",
- 285: "ĝ",
- 286: "Ğ",
- 287: "ğ",
- 288: "Ġ",
- 289: "ġ",
- 290: "Ģ",
- 292: "Ĥ",
- 293: "ĥ",
- 294: "Ħ",
- 295: "ħ",
- 296: "Ĩ",
- 297: "ĩ",
- 298: "Ī",
- 299: "ī",
- 302: "Į",
- 303: "į",
- 304: "İ",
- 305: "ı",
- 306: "IJ",
- 307: "ij",
- 308: "Ĵ",
- 309: "ĵ",
- 310: "Ķ",
- 311: "ķ",
- 312: "ĸ",
- 313: "Ĺ",
- 314: "ĺ",
- 315: "Ļ",
- 316: "ļ",
- 317: "Ľ",
- 318: "ľ",
- 319: "Ŀ",
- 320: "ŀ",
- 321: "Ł",
- 322: "ł",
- 323: "Ń",
- 324: "ń",
- 325: "Ņ",
- 326: "ņ",
- 327: "Ň",
- 328: "ň",
- 329: "ʼn",
- 330: "Ŋ",
- 331: "ŋ",
- 332: "Ō",
- 333: "ō",
- 336: "Ő",
- 337: "ő",
- 338: "Œ",
- 339: "œ",
- 340: "Ŕ",
- 341: "ŕ",
- 342: "Ŗ",
- 343: "ŗ",
- 344: "Ř",
- 345: "ř",
- 346: "Ś",
- 347: "ś",
- 348: "Ŝ",
- 349: "ŝ",
- 350: "Ş",
- 351: "ş",
- 352: "Š",
- 353: "š",
- 354: "Ţ",
- 355: "ţ",
- 356: "Ť",
- 357: "ť",
- 358: "Ŧ",
- 359: "ŧ",
- 360: "Ũ",
- 361: "ũ",
- 362: "Ū",
- 363: "ū",
- 364: "Ŭ",
- 365: "ŭ",
- 366: "Ů",
- 367: "ů",
- 368: "Ű",
- 369: "ű",
- 370: "Ų",
- 371: "ų",
- 372: "Ŵ",
- 373: "ŵ",
- 374: "Ŷ",
- 375: "ŷ",
- 376: "Ÿ",
- 377: "Ź",
- 378: "ź",
- 379: "Ż",
- 380: "ż",
- 381: "Ž",
- 382: "ž",
- 402: "ƒ",
- 437: "Ƶ",
- 501: "ǵ",
- 567: "ȷ",
- 710: "ˆ",
- 711: "ˇ",
- 728: "˘",
- 729: "˙",
- 730: "˚",
- 731: "˛",
- 732: "˜",
- 785: "̑",
- 818: "_",
- 913: "Α",
- 914: "Β",
- 915: "Γ",
- 916: "Δ",
- 917: "Ε",
- 918: "Ζ",
- 919: "Η",
- 920: "Θ",
- 921: "Ι",
- 922: "Κ",
- 923: "Λ",
- 924: "Μ",
- 925: "Ν",
- 926: "Ξ",
- 927: "Ο",
- 928: "Π",
- 929: "Ρ",
- 931: "Σ",
- 932: "Τ",
- 933: "Υ",
- 934: "Φ",
- 935: "Χ",
- 936: "Ψ",
- 937: "Ω",
- 945: "α",
- 946: "β",
- 947: "γ",
- 948: "δ",
- 949: "ε",
- 950: "ζ",
- 951: "η",
- 952: "θ",
- 953: "ι",
- 954: "κ",
- 955: "λ",
- 956: "μ",
- 957: "ν",
- 958: "ξ",
- 959: "ο",
- 960: "π",
- 961: "ρ",
- 962: "ς",
- 963: "σ",
- 964: "τ",
- 965: "υ",
- 966: "φ",
- 967: "χ",
- 968: "ψ",
- 969: "ω",
- 977: "ϑ",
- 978: "ϒ",
- 981: "ϕ",
- 982: "ϖ",
- 988: "Ϝ",
- 989: "ϝ",
- 1008: "ϰ",
- 1009: "ϱ",
- 1013: "ε",
- 1014: "϶",
- 1025: "Ё",
- 1026: "Ђ",
- 1027: "Ѓ",
- 1028: "Є",
- 1029: "Ѕ",
- 1030: "І",
- 1031: "Ї",
- 1032: "Ј",
- 1033: "Љ",
- 1034: "Њ",
- 1035: "Ћ",
- 1036: "Ќ",
- 1038: "Ў",
- 1039: "Џ",
- 1040: "А",
- 1041: "Б",
- 1042: "В",
- 1043: "Г",
- 1044: "Д",
- 1045: "Е",
- 1046: "Ж",
- 1047: "З",
- 1048: "И",
- 1049: "Й",
- 1050: "К",
- 1051: "Л",
- 1052: "М",
- 1053: "Н",
- 1054: "О",
- 1055: "П",
- 1056: "Р",
- 1057: "С",
- 1058: "Т",
- 1059: "У",
- 1060: "Ф",
- 1061: "Х",
- 1062: "Ц",
- 1063: "Ч",
- 1064: "Ш",
- 1065: "Щ",
- 1066: "Ъ",
- 1067: "Ы",
- 1068: "Ь",
- 1069: "Э",
- 1070: "Ю",
- 1071: "Я",
- 1072: "а",
- 1073: "б",
- 1074: "в",
- 1075: "г",
- 1076: "д",
- 1077: "е",
- 1078: "ж",
- 1079: "з",
- 1080: "и",
- 1081: "й",
- 1082: "к",
- 1083: "л",
- 1084: "м",
- 1085: "н",
- 1086: "о",
- 1087: "п",
- 1088: "р",
- 1089: "с",
- 1090: "т",
- 1091: "у",
- 1092: "ф",
- 1093: "х",
- 1094: "ц",
- 1095: "ч",
- 1096: "ш",
- 1097: "щ",
- 1098: "ъ",
- 1099: "ы",
- 1100: "ь",
- 1101: "э",
- 1102: "ю",
- 1103: "я",
- 1105: "ё",
- 1106: "ђ",
- 1107: "ѓ",
- 1108: "є",
- 1109: "ѕ",
- 1110: "і",
- 1111: "ї",
- 1112: "ј",
- 1113: "љ",
- 1114: "њ",
- 1115: "ћ",
- 1116: "ќ",
- 1118: "ў",
- 1119: "џ",
- 8194: " ",
- 8195: " ",
- 8196: " ",
- 8197: " ",
- 8199: " ",
- 8200: " ",
- 8201: " ",
- 8202: " ",
- 8203: "​",
- 8204: "",
- 8205: "",
- 8206: "",
- 8207: "",
- 8208: "‐",
- 8211: "–",
- 8212: "—",
- 8213: "―",
- 8214: "‖",
- 8216: "‘",
- 8217: "’",
- 8218: "‚",
- 8220: "“",
- 8221: "”",
- 8222: "„",
- 8224: "†",
- 8225: "‡",
- 8226: "•",
- 8229: "‥",
- 8230: "…",
- 8240: "‰",
- 8241: "‱",
- 8242: "′",
- 8243: "″",
- 8244: "‴",
- 8245: "‵",
- 8249: "‹",
- 8250: "›",
- 8254: "‾",
- 8257: "⁁",
- 8259: "⁃",
- 8260: "⁄",
- 8271: "⁏",
- 8279: "⁗",
- 8287: " ",
- 8288: "⁠",
- 8289: "⁡",
- 8290: "⁢",
- 8291: "⁣",
- 8364: "€",
- 8411: "⃛",
- 8412: "⃜",
- 8450: "ℂ",
- 8453: "℅",
- 8458: "ℊ",
- 8459: "ℋ",
- 8460: "ℌ",
- 8461: "ℍ",
- 8462: "ℎ",
- 8463: "ℏ",
- 8464: "ℐ",
- 8465: "ℑ",
- 8466: "ℒ",
- 8467: "ℓ",
- 8469: "ℕ",
- 8470: "№",
- 8471: "℗",
- 8472: "℘",
- 8473: "ℙ",
- 8474: "ℚ",
- 8475: "ℛ",
- 8476: "ℜ",
- 8477: "ℝ",
- 8478: "℞",
- 8482: "™",
- 8484: "ℤ",
- 8486: "Ω",
- 8487: "℧",
- 8488: "ℨ",
- 8489: "℩",
- 8491: "Å",
- 8492: "ℬ",
- 8493: "ℭ",
- 8495: "ℯ",
- 8496: "ℰ",
- 8497: "ℱ",
- 8499: "ℳ",
- 8500: "ℴ",
- 8501: "ℵ",
- 8502: "ℶ",
- 8503: "ℷ",
- 8504: "ℸ",
- 8517: "ⅅ",
- 8518: "ⅆ",
- 8519: "ⅇ",
- 8520: "ⅈ",
- 8531: "⅓",
- 8532: "⅔",
- 8533: "⅕",
- 8534: "⅖",
- 8535: "⅗",
- 8536: "⅘",
- 8537: "⅙",
- 8538: "⅚",
- 8539: "⅛",
- 8540: "⅜",
- 8541: "⅝",
- 8542: "⅞",
- 8592: "←",
- 8593: "↑",
- 8594: "→",
- 8595: "↓",
- 8596: "↔",
- 8597: "↕",
- 8598: "↖",
- 8599: "↗",
- 8600: "↘",
- 8601: "↙",
- 8602: "↚",
- 8603: "↛",
- 8605: "↝",
- 8606: "↞",
- 8607: "↟",
- 8608: "↠",
- 8609: "↡",
- 8610: "↢",
- 8611: "↣",
- 8612: "↤",
- 8613: "↥",
- 8614: "↦",
- 8615: "↧",
- 8617: "↩",
- 8618: "↪",
- 8619: "↫",
- 8620: "↬",
- 8621: "↭",
- 8622: "↮",
- 8624: "↰",
- 8625: "↱",
- 8626: "↲",
- 8627: "↳",
- 8629: "↵",
- 8630: "↶",
- 8631: "↷",
- 8634: "↺",
- 8635: "↻",
- 8636: "↼",
- 8637: "↽",
- 8638: "↾",
- 8639: "↿",
- 8640: "⇀",
- 8641: "⇁",
- 8642: "⇂",
- 8643: "⇃",
- 8644: "⇄",
- 8645: "⇅",
- 8646: "⇆",
- 8647: "⇇",
- 8648: "⇈",
- 8649: "⇉",
- 8650: "⇊",
- 8651: "⇋",
- 8652: "⇌",
- 8653: "⇍",
- 8654: "⇎",
- 8655: "⇏",
- 8656: "⇐",
- 8657: "⇑",
- 8658: "⇒",
- 8659: "⇓",
- 8660: "⇔",
- 8661: "⇕",
- 8662: "⇖",
- 8663: "⇗",
- 8664: "⇘",
- 8665: "⇙",
- 8666: "⇚",
- 8667: "⇛",
- 8669: "⇝",
- 8676: "⇤",
- 8677: "⇥",
- 8693: "⇵",
- 8701: "⇽",
- 8702: "⇾",
- 8703: "⇿",
- 8704: "∀",
- 8705: "∁",
- 8706: "∂",
- 8707: "∃",
- 8708: "∄",
- 8709: "∅",
- 8711: "∇",
- 8712: "∈",
- 8713: "∉",
- 8715: "∋",
- 8716: "∌",
- 8719: "∏",
- 8720: "∐",
- 8721: "∑",
- 8722: "−",
- 8723: "∓",
- 8724: "∔",
- 8726: "∖",
- 8727: "∗",
- 8728: "∘",
- 8730: "√",
- 8733: "∝",
- 8734: "∞",
- 8735: "∟",
- 8736: "∠",
- 8737: "∡",
- 8738: "∢",
- 8739: "∣",
- 8740: "∤",
- 8741: "∥",
- 8742: "∦",
- 8743: "∧",
- 8744: "∨",
- 8745: "∩",
- 8746: "∪",
- 8747: "∫",
- 8748: "∬",
- 8749: "∭",
- 8750: "∮",
- 8751: "∯",
- 8752: "∰",
- 8753: "∱",
- 8754: "∲",
- 8755: "∳",
- 8756: "∴",
- 8757: "∵",
- 8758: "∶",
- 8759: "∷",
- 8760: "∸",
- 8762: "∺",
- 8763: "∻",
- 8764: "∼",
- 8765: "∽",
- 8766: "∾",
- 8767: "∿",
- 8768: "≀",
- 8769: "≁",
- 8770: "≂",
- 8771: "≃",
- 8772: "≄",
- 8773: "≅",
- 8774: "≆",
- 8775: "≇",
- 8776: "≈",
- 8777: "≉",
- 8778: "≊",
- 8779: "≋",
- 8780: "≌",
- 8781: "≍",
- 8782: "≎",
- 8783: "≏",
- 8784: "≐",
- 8785: "≑",
- 8786: "≒",
- 8787: "≓",
- 8788: "≔",
- 8789: "≕",
- 8790: "≖",
- 8791: "≗",
- 8793: "≙",
- 8794: "≚",
- 8796: "≜",
- 8799: "≟",
- 8800: "≠",
- 8801: "≡",
- 8802: "≢",
- 8804: "≤",
- 8805: "≥",
- 8806: "≦",
- 8807: "≧",
- 8808: "≨",
- 8809: "≩",
- 8810: "≪",
- 8811: "≫",
- 8812: "≬",
- 8813: "≭",
- 8814: "≮",
- 8815: "≯",
- 8816: "≰",
- 8817: "≱",
- 8818: "≲",
- 8819: "≳",
- 8820: "≴",
- 8821: "≵",
- 8822: "≶",
- 8823: "≷",
- 8824: "≸",
- 8825: "≹",
- 8826: "≺",
- 8827: "≻",
- 8828: "≼",
- 8829: "≽",
- 8830: "≾",
- 8831: "≿",
- 8832: "⊀",
- 8833: "⊁",
- 8834: "⊂",
- 8835: "⊃",
- 8836: "⊄",
- 8837: "⊅",
- 8838: "⊆",
- 8839: "⊇",
- 8840: "⊈",
- 8841: "⊉",
- 8842: "⊊",
- 8843: "⊋",
- 8845: "⊍",
- 8846: "⊎",
- 8847: "⊏",
- 8848: "⊐",
- 8849: "⊑",
- 8850: "⊒",
- 8851: "⊓",
- 8852: "⊔",
- 8853: "⊕",
- 8854: "⊖",
- 8855: "⊗",
- 8856: "⊘",
- 8857: "⊙",
- 8858: "⊚",
- 8859: "⊛",
- 8861: "⊝",
- 8862: "⊞",
- 8863: "⊟",
- 8864: "⊠",
- 8865: "⊡",
- 8866: "⊢",
- 8867: "⊣",
- 8868: "⊤",
- 8869: "⊥",
- 8871: "⊧",
- 8872: "⊨",
- 8873: "⊩",
- 8874: "⊪",
- 8875: "⊫",
- 8876: "⊬",
- 8877: "⊭",
- 8878: "⊮",
- 8879: "⊯",
- 8880: "⊰",
- 8882: "⊲",
- 8883: "⊳",
- 8884: "⊴",
- 8885: "⊵",
- 8886: "⊶",
- 8887: "⊷",
- 8888: "⊸",
- 8889: "⊹",
- 8890: "⊺",
- 8891: "⊻",
- 8893: "⊽",
- 8894: "⊾",
- 8895: "⊿",
- 8896: "⋀",
- 8897: "⋁",
- 8898: "⋂",
- 8899: "⋃",
- 8900: "⋄",
- 8901: "⋅",
- 8902: "⋆",
- 8903: "⋇",
- 8904: "⋈",
- 8905: "⋉",
- 8906: "⋊",
- 8907: "⋋",
- 8908: "⋌",
- 8909: "⋍",
- 8910: "⋎",
- 8911: "⋏",
- 8912: "⋐",
- 8913: "⋑",
- 8914: "⋒",
- 8915: "⋓",
- 8916: "⋔",
- 8917: "⋕",
- 8918: "⋖",
- 8919: "⋗",
- 8920: "⋘",
- 8921: "⋙",
- 8922: "⋚",
- 8923: "⋛",
- 8926: "⋞",
- 8927: "⋟",
- 8928: "⋠",
- 8929: "⋡",
- 8930: "⋢",
- 8931: "⋣",
- 8934: "⋦",
- 8935: "⋧",
- 8936: "⋨",
- 8937: "⋩",
- 8938: "⋪",
- 8939: "⋫",
- 8940: "⋬",
- 8941: "⋭",
- 8942: "⋮",
- 8943: "⋯",
- 8944: "⋰",
- 8945: "⋱",
- 8946: "⋲",
- 8947: "⋳",
- 8948: "⋴",
- 8949: "⋵",
- 8950: "⋶",
- 8951: "⋷",
- 8953: "⋹",
- 8954: "⋺",
- 8955: "⋻",
- 8956: "⋼",
- 8957: "⋽",
- 8958: "⋾",
- 8965: "⌅",
- 8966: "⌆",
- 8968: "⌈",
- 8969: "⌉",
- 8970: "⌊",
- 8971: "⌋",
- 8972: "⌌",
- 8973: "⌍",
- 8974: "⌎",
- 8975: "⌏",
- 8976: "⌐",
- 8978: "⌒",
- 8979: "⌓",
- 8981: "⌕",
- 8982: "⌖",
- 8988: "⌜",
- 8989: "⌝",
- 8990: "⌞",
- 8991: "⌟",
- 8994: "⌢",
- 8995: "⌣",
- 9001: "〈",
- 9002: "〉",
- 9005: "⌭",
- 9006: "⌮",
- 9014: "⌶",
- 9021: "⌽",
- 9023: "⌿",
- 9084: "⍼",
- 9136: "⎰",
- 9137: "⎱",
- 9140: "⎴",
- 9141: "⎵",
- 9142: "⎶",
- 9180: "⏜",
- 9181: "⏝",
- 9182: "⏞",
- 9183: "⏟",
- 9186: "⏢",
- 9191: "⏧",
- 9251: "␣",
- 9416: "Ⓢ",
- 9472: "─",
- 9474: "│",
- 9484: "┌",
- 9488: "┐",
- 9492: "└",
- 9496: "┘",
- 9500: "├",
- 9508: "┤",
- 9516: "┬",
- 9524: "┴",
- 9532: "┼",
- 9552: "═",
- 9553: "║",
- 9554: "╒",
- 9555: "╓",
- 9556: "╔",
- 9557: "╕",
- 9558: "╖",
- 9559: "╗",
- 9560: "╘",
- 9561: "╙",
- 9562: "╚",
- 9563: "╛",
- 9564: "╜",
- 9565: "╝",
- 9566: "╞",
- 9567: "╟",
- 9568: "╠",
- 9569: "╡",
- 9570: "╢",
- 9571: "╣",
- 9572: "╤",
- 9573: "╥",
- 9674: "◊",
- 9675: "○",
- 9708: "◬",
- 9711: "◯",
- 9720: "◸",
- 9721: "◹",
- 9722: "◺",
- 9723: "◻",
- 9724: "◼",
- 9733: "★",
- 9734: "☆",
- 9742: "☎",
- 9792: "♀",
- 9794: "♂",
- 9824: "♠",
- 9827: "♣",
- 9829: "♥",
- 9830: "♦",
- 9834: "♪",
- 9837: "♭",
- 9838: "♮",
- 9839: "♯",
- 10003: "✓",
- 10007: "✗",
- 10016: "✠",
- 10038: "✶",
- 10072: "❘",
- 10098: "❲",
- 10099: "❳",
- 10214: "⟦",
- 10215: "⟧",
- 10216: "〈",
- 10217: "〉",
- 10218: "⟪",
- 10219: "⟫",
- 10220: "⟬",
- 10221: "⟭",
- 10229: "⟵",
- 10230: "⟶",
- 10231: "⟷",
- 10232: "⟸",
- 10233: "⟹",
- 10234: "⟺",
- 10236: "⟼",
- 10239: "⟿",
- 10498: "⤂",
- 10499: "⤃",
- 10500: "⤄",
- 10501: "⤅",
- 10508: "⤌",
- 10509: "⤍",
- 10510: "⤎",
- 10511: "⤏",
- 10512: "⤐",
- 10513: "⤑",
- 10514: "⤒",
- 10515: "⤓",
- 10518: "⤖",
- 10521: "⤙",
- 10522: "⤚",
- 10523: "⤛",
- 10524: "⤜",
- 10525: "⤝",
- 10526: "⤞",
- 10527: "⤟",
- 10528: "⤠",
- 10531: "⤣",
- 10532: "⤤",
- 10533: "⤥",
- 10534: "⤦",
- 10535: "⤧",
- 10536: "⤨",
- 10537: "⤩",
- 10538: "⤪",
- 10547: "⤳",
- 10549: "⤵",
- 10550: "⤶",
- 10551: "⤷",
- 10552: "⤸",
- 10553: "⤹",
- 10556: "⤼",
- 10557: "⤽",
- 10565: "⥅",
- 10568: "⥈",
- 10569: "⥉",
- 10570: "⥊",
- 10571: "⥋",
- 10574: "⥎",
- 10575: "⥏",
- 10576: "⥐",
- 10577: "⥑",
- 10578: "⥒",
- 10579: "⥓",
- 10580: "⥔",
- 10581: "⥕",
- 10582: "⥖",
- 10583: "⥗",
- 10584: "⥘",
- 10585: "⥙",
- 10586: "⥚",
- 10587: "⥛",
- 10588: "⥜",
- 10589: "⥝",
- 10590: "⥞",
- 10591: "⥟",
- 10592: "⥠",
- 10593: "⥡",
- 10594: "⥢",
- 10595: "⥣",
- 10596: "⥤",
- 10597: "⥥",
- 10598: "⥦",
- 10599: "⥧",
- 10600: "⥨",
- 10601: "⥩",
- 10602: "⥪",
- 10603: "⥫",
- 10604: "⥬",
- 10605: "⥭",
- 10606: "⥮",
- 10607: "⥯",
- 10608: "⥰",
- 10609: "⥱",
- 10610: "⥲",
- 10611: "⥳",
- 10612: "⥴",
- 10613: "⥵",
- 10614: "⥶",
- 10616: "⥸",
- 10617: "⥹",
- 10619: "⥻",
- 10620: "⥼",
- 10621: "⥽",
- 10622: "⥾",
- 10623: "⥿",
- 10629: "⦅",
- 10630: "⦆",
- 10635: "⦋",
- 10636: "⦌",
- 10637: "⦍",
- 10638: "⦎",
- 10639: "⦏",
- 10640: "⦐",
- 10641: "⦑",
- 10642: "⦒",
- 10643: "⦓",
- 10644: "⦔",
- 10645: "⦕",
- 10646: "⦖",
- 10650: "⦚",
- 10652: "⦜",
- 10653: "⦝",
- 10660: "⦤",
- 10661: "⦥",
- 10662: "⦦",
- 10663: "⦧",
- 10664: "⦨",
- 10665: "⦩",
- 10666: "⦪",
- 10667: "⦫",
- 10668: "⦬",
- 10669: "⦭",
- 10670: "⦮",
- 10671: "⦯",
- 10672: "⦰",
- 10673: "⦱",
- 10674: "⦲",
- 10675: "⦳",
- 10676: "⦴",
- 10677: "⦵",
- 10678: "⦶",
- 10679: "⦷",
- 10681: "⦹",
- 10683: "⦻",
- 10684: "⦼",
- 10686: "⦾",
- 10687: "⦿",
- 10688: "⧀",
- 10689: "⧁",
- 10690: "⧂",
- 10691: "⧃",
- 10692: "⧄",
- 10693: "⧅",
- 10697: "⧉",
- 10701: "⧍",
- 10702: "⧎",
- 10703: "⧏",
- 10704: "⧐",
- 10714: "∽̱",
- 10716: "⧜",
- 10717: "⧝",
- 10718: "⧞",
- 10723: "⧣",
- 10724: "⧤",
- 10725: "⧥",
- 10731: "⧫",
- 10740: "⧴",
- 10742: "⧶",
- 10752: "⨀",
- 10753: "⨁",
- 10754: "⨂",
- 10756: "⨄",
- 10758: "⨆",
- 10764: "⨌",
- 10765: "⨍",
- 10768: "⨐",
- 10769: "⨑",
- 10770: "⨒",
- 10771: "⨓",
- 10772: "⨔",
- 10773: "⨕",
- 10774: "⨖",
- 10775: "⨗",
- 10786: "⨢",
- 10787: "⨣",
- 10788: "⨤",
- 10789: "⨥",
- 10790: "⨦",
- 10791: "⨧",
- 10793: "⨩",
- 10794: "⨪",
- 10797: "⨭",
- 10798: "⨮",
- 10799: "⨯",
- 10800: "⨰",
- 10801: "⨱",
- 10803: "⨳",
- 10804: "⨴",
- 10805: "⨵",
- 10806: "⨶",
- 10807: "⨷",
- 10808: "⨸",
- 10809: "⨹",
- 10810: "⨺",
- 10811: "⨻",
- 10812: "⨼",
- 10815: "⨿",
- 10816: "⩀",
- 10818: "⩂",
- 10819: "⩃",
- 10820: "⩄",
- 10821: "⩅",
- 10822: "⩆",
- 10823: "⩇",
- 10824: "⩈",
- 10825: "⩉",
- 10826: "⩊",
- 10827: "⩋",
- 10828: "⩌",
- 10829: "⩍",
- 10832: "⩐",
- 10835: "⩓",
- 10836: "⩔",
- 10837: "⩕",
- 10838: "⩖",
- 10839: "⩗",
- 10840: "⩘",
- 10842: "⩚",
- 10843: "⩛",
- 10844: "⩜",
- 10845: "⩝",
- 10847: "⩟",
- 10854: "⩦",
- 10858: "⩪",
- 10861: "⩭",
- 10862: "⩮",
- 10863: "⩯",
- 10864: "⩰",
- 10865: "⩱",
- 10866: "⩲",
- 10867: "⩳",
- 10868: "⩴",
- 10869: "⩵",
- 10871: "⩷",
- 10872: "⩸",
- 10873: "⩹",
- 10874: "⩺",
- 10875: "⩻",
- 10876: "⩼",
- 10877: "⩽",
- 10878: "⩾",
- 10879: "⩿",
- 10880: "⪀",
- 10881: "⪁",
- 10882: "⪂",
- 10883: "⪃",
- 10884: "⪄",
- 10885: "⪅",
- 10886: "⪆",
- 10887: "⪇",
- 10888: "⪈",
- 10889: "⪉",
- 10890: "⪊",
- 10891: "⪋",
- 10892: "⪌",
- 10893: "⪍",
- 10894: "⪎",
- 10895: "⪏",
- 10896: "⪐",
- 10897: "⪑",
- 10898: "⪒",
- 10899: "⪓",
- 10900: "⪔",
- 10901: "⪕",
- 10902: "⪖",
- 10903: "⪗",
- 10904: "⪘",
- 10905: "⪙",
- 10906: "⪚",
- 10909: "⪝",
- 10910: "⪞",
- 10911: "⪟",
- 10912: "⪠",
- 10913: "⪡",
- 10914: "⪢",
- 10916: "⪤",
- 10917: "⪥",
- 10918: "⪦",
- 10919: "⪧",
- 10920: "⪨",
- 10921: "⪩",
- 10922: "⪪",
- 10923: "⪫",
- 10924: "⪬",
- 10925: "⪭",
- 10926: "⪮",
- 10927: "⪯",
- 10928: "⪰",
- 10931: "⪳",
- 10932: "⪴",
- 10933: "⪵",
- 10934: "⪶",
- 10935: "⪷",
- 10936: "⪸",
- 10937: "⪹",
- 10938: "⪺",
- 10939: "⪻",
- 10940: "⪼",
- 10941: "⪽",
- 10942: "⪾",
- 10943: "⪿",
- 10944: "⫀",
- 10945: "⫁",
- 10946: "⫂",
- 10947: "⫃",
- 10948: "⫄",
- 10949: "⫅",
- 10950: "⫆",
- 10951: "⫇",
- 10952: "⫈",
- 10955: "⫋",
- 10956: "⫌",
- 10959: "⫏",
- 10960: "⫐",
- 10961: "⫑",
- 10962: "⫒",
- 10963: "⫓",
- 10964: "⫔",
- 10965: "⫕",
- 10966: "⫖",
- 10967: "⫗",
- 10968: "⫘",
- 10969: "⫙",
- 10970: "⫚",
- 10971: "⫛",
- 10980: "⫤",
- 10982: "⫦",
- 10983: "⫧",
- 10984: "⫨",
- 10985: "⫩",
- 10987: "⫫",
- 10988: "⫬",
- 10989: "⫭",
- 10990: "⫮",
- 10991: "⫯",
- 10992: "⫰",
- 10993: "⫱",
- 10994: "⫲",
- 10995: "⫳",
- 11005: "⫽",
- 64256: "ff",
- 64257: "fi",
- 64258: "fl",
- 64259: "ffi",
- 64260: "ffl",
- 119964: "𝒜",
- 119966: "𝒞",
- 119967: "𝒟",
- 119970: "𝒢",
- 119973: "𝒥",
- 119974: "𝒦",
- 119977: "𝒩",
- 119978: "𝒪",
- 119979: "𝒫",
- 119980: "𝒬",
- 119982: "𝒮",
- 119983: "𝒯",
- 119984: "𝒰",
- 119985: "𝒱",
- 119986: "𝒲",
- 119987: "𝒳",
- 119988: "𝒴",
- 119989: "𝒵",
- 119990: "𝒶",
- 119991: "𝒷",
- 119992: "𝒸",
- 119993: "𝒹",
- 119995: "𝒻",
- 119997: "𝒽",
- 119998: "𝒾",
- 119999: "𝒿",
- 120000: "𝓀",
- 120001: "𝓁",
- 120002: "𝓂",
- 120003: "𝓃",
- 120005: "𝓅",
- 120006: "𝓆",
- 120007: "𝓇",
- 120008: "𝓈",
- 120009: "𝓉",
- 120010: "𝓊",
- 120011: "𝓋",
- 120012: "𝓌",
- 120013: "𝓍",
- 120014: "𝓎",
- 120015: "𝓏",
- 120068: "𝔄",
- 120069: "𝔅",
- 120071: "𝔇",
- 120072: "𝔈",
- 120073: "𝔉",
- 120074: "𝔊",
- 120077: "𝔍",
- 120078: "𝔎",
- 120079: "𝔏",
- 120080: "𝔐",
- 120081: "𝔑",
- 120082: "𝔒",
- 120083: "𝔓",
- 120084: "𝔔",
- 120086: "𝔖",
- 120087: "𝔗",
- 120088: "𝔘",
- 120089: "𝔙",
- 120090: "𝔚",
- 120091: "𝔛",
- 120092: "𝔜",
- 120094: "𝔞",
- 120095: "𝔟",
- 120096: "𝔠",
- 120097: "𝔡",
- 120098: "𝔢",
- 120099: "𝔣",
- 120100: "𝔤",
- 120101: "𝔥",
- 120102: "𝔦",
- 120103: "𝔧",
- 120104: "𝔨",
- 120105: "𝔩",
- 120106: "𝔪",
- 120107: "𝔫",
- 120108: "𝔬",
- 120109: "𝔭",
- 120110: "𝔮",
- 120111: "𝔯",
- 120112: "𝔰",
- 120113: "𝔱",
- 120114: "𝔲",
- 120115: "𝔳",
- 120116: "𝔴",
- 120117: "𝔵",
- 120118: "𝔶",
- 120119: "𝔷",
- 120120: "𝔸",
- 120121: "𝔹",
- 120123: "𝔻",
- 120124: "𝔼",
- 120125: "𝔽",
- 120126: "𝔾",
- 120128: "𝕀",
- 120129: "𝕁",
- 120130: "𝕂",
- 120131: "𝕃",
- 120132: "𝕄",
- 120134: "𝕆",
- 120138: "𝕊",
- 120139: "𝕋",
- 120140: "𝕌",
- 120141: "𝕍",
- 120142: "𝕎",
- 120143: "𝕏",
- 120144: "𝕐",
- 120146: "𝕒",
- 120147: "𝕓",
- 120148: "𝕔",
- 120149: "𝕕",
- 120150: "𝕖",
- 120151: "𝕗",
- 120152: "𝕘",
- 120153: "𝕙",
- 120154: "𝕚",
- 120155: "𝕛",
- 120156: "𝕜",
- 120157: "𝕝",
- 120158: "𝕞",
- 120159: "𝕟",
- 120160: "𝕠",
- 120161: "𝕡",
- 120162: "𝕢",
- 120163: "𝕣",
- 120164: "𝕤",
- 120165: "𝕥",
- 120166: "𝕦",
- 120167: "𝕧",
- 120168: "𝕨",
- 120169: "𝕩",
- 120170: "𝕪",
- 120171: "𝕫"
-};
-
export default ToHTMLEntity;
diff --git a/src/core/vendor/htmlEntities/entity.json b/src/core/vendor/htmlEntities/entity.json
new file mode 100644
index 0000000000..557170b41f
--- /dev/null
+++ b/src/core/vendor/htmlEntities/entity.json
@@ -0,0 +1,2233 @@
+{
+ "Æ": { "codepoints": [198], "characters": "\u00C6" },
+ "Æ": { "codepoints": [198], "characters": "\u00C6" },
+ "&": { "codepoints": [38], "characters": "\u0026" },
+ "&": { "codepoints": [38], "characters": "\u0026" },
+ "Á": { "codepoints": [193], "characters": "\u00C1" },
+ "Á": { "codepoints": [193], "characters": "\u00C1" },
+ "Ă": { "codepoints": [258], "characters": "\u0102" },
+ "Â": { "codepoints": [194], "characters": "\u00C2" },
+ "Â": { "codepoints": [194], "characters": "\u00C2" },
+ "А": { "codepoints": [1040], "characters": "\u0410" },
+ "𝔄": { "codepoints": [120068], "characters": "\uD835\uDD04" },
+ "À": { "codepoints": [192], "characters": "\u00C0" },
+ "À": { "codepoints": [192], "characters": "\u00C0" },
+ "Α": { "codepoints": [913], "characters": "\u0391" },
+ "Ā": { "codepoints": [256], "characters": "\u0100" },
+ "⩓": { "codepoints": [10835], "characters": "\u2A53" },
+ "Ą": { "codepoints": [260], "characters": "\u0104" },
+ "𝔸": { "codepoints": [120120], "characters": "\uD835\uDD38" },
+ "⁡": { "codepoints": [8289], "characters": "\u2061" },
+ "Å": { "codepoints": [197], "characters": "\u00C5" },
+ "Å": { "codepoints": [197], "characters": "\u00C5" },
+ "𝒜": { "codepoints": [119964], "characters": "\uD835\uDC9C" },
+ "≔": { "codepoints": [8788], "characters": "\u2254" },
+ "Ã": { "codepoints": [195], "characters": "\u00C3" },
+ "Ã": { "codepoints": [195], "characters": "\u00C3" },
+ "Ä": { "codepoints": [196], "characters": "\u00C4" },
+ "Ä": { "codepoints": [196], "characters": "\u00C4" },
+ "∖": { "codepoints": [8726], "characters": "\u2216" },
+ "⫧": { "codepoints": [10983], "characters": "\u2AE7" },
+ "⌆": { "codepoints": [8966], "characters": "\u2306" },
+ "Б": { "codepoints": [1041], "characters": "\u0411" },
+ "∵": { "codepoints": [8757], "characters": "\u2235" },
+ "ℬ": { "codepoints": [8492], "characters": "\u212C" },
+ "Β": { "codepoints": [914], "characters": "\u0392" },
+ "𝔅": { "codepoints": [120069], "characters": "\uD835\uDD05" },
+ "𝔹": { "codepoints": [120121], "characters": "\uD835\uDD39" },
+ "˘": { "codepoints": [728], "characters": "\u02D8" },
+ "ℬ": { "codepoints": [8492], "characters": "\u212C" },
+ "≎": { "codepoints": [8782], "characters": "\u224E" },
+ "Ч": { "codepoints": [1063], "characters": "\u0427" },
+ "©": { "codepoints": [169], "characters": "\u00A9" },
+ "©": { "codepoints": [169], "characters": "\u00A9" },
+ "Ć": { "codepoints": [262], "characters": "\u0106" },
+ "⋒": { "codepoints": [8914], "characters": "\u22D2" },
+ "ⅅ": { "codepoints": [8517], "characters": "\u2145" },
+ "ℭ": { "codepoints": [8493], "characters": "\u212D" },
+ "Č": { "codepoints": [268], "characters": "\u010C" },
+ "Ç": { "codepoints": [199], "characters": "\u00C7" },
+ "Ç": { "codepoints": [199], "characters": "\u00C7" },
+ "Ĉ": { "codepoints": [264], "characters": "\u0108" },
+ "∰": { "codepoints": [8752], "characters": "\u2230" },
+ "Ċ": { "codepoints": [266], "characters": "\u010A" },
+ "¸": { "codepoints": [184], "characters": "\u00B8" },
+ "·": { "codepoints": [183], "characters": "\u00B7" },
+ "ℭ": { "codepoints": [8493], "characters": "\u212D" },
+ "Χ": { "codepoints": [935], "characters": "\u03A7" },
+ "⊙": { "codepoints": [8857], "characters": "\u2299" },
+ "⊖": { "codepoints": [8854], "characters": "\u2296" },
+ "⊕": { "codepoints": [8853], "characters": "\u2295" },
+ "⊗": { "codepoints": [8855], "characters": "\u2297" },
+ "∲": { "codepoints": [8754], "characters": "\u2232" },
+ "”": { "codepoints": [8221], "characters": "\u201D" },
+ "’": { "codepoints": [8217], "characters": "\u2019" },
+ "∷": { "codepoints": [8759], "characters": "\u2237" },
+ "⩴": { "codepoints": [10868], "characters": "\u2A74" },
+ "≡": { "codepoints": [8801], "characters": "\u2261" },
+ "∯": { "codepoints": [8751], "characters": "\u222F" },
+ "∮": { "codepoints": [8750], "characters": "\u222E" },
+ "ℂ": { "codepoints": [8450], "characters": "\u2102" },
+ "∐": { "codepoints": [8720], "characters": "\u2210" },
+ "∳": { "codepoints": [8755], "characters": "\u2233" },
+ "⨯": { "codepoints": [10799], "characters": "\u2A2F" },
+ "𝒞": { "codepoints": [119966], "characters": "\uD835\uDC9E" },
+ "⋓": { "codepoints": [8915], "characters": "\u22D3" },
+ "≍": { "codepoints": [8781], "characters": "\u224D" },
+ "ⅅ": { "codepoints": [8517], "characters": "\u2145" },
+ "⤑": { "codepoints": [10513], "characters": "\u2911" },
+ "Ђ": { "codepoints": [1026], "characters": "\u0402" },
+ "Ѕ": { "codepoints": [1029], "characters": "\u0405" },
+ "Џ": { "codepoints": [1039], "characters": "\u040F" },
+ "‡": { "codepoints": [8225], "characters": "\u2021" },
+ "↡": { "codepoints": [8609], "characters": "\u21A1" },
+ "⫤": { "codepoints": [10980], "characters": "\u2AE4" },
+ "Ď": { "codepoints": [270], "characters": "\u010E" },
+ "Д": { "codepoints": [1044], "characters": "\u0414" },
+ "∇": { "codepoints": [8711], "characters": "\u2207" },
+ "Δ": { "codepoints": [916], "characters": "\u0394" },
+ "𝔇": { "codepoints": [120071], "characters": "\uD835\uDD07" },
+ "´": { "codepoints": [180], "characters": "\u00B4" },
+ "˙": { "codepoints": [729], "characters": "\u02D9" },
+ "˝": { "codepoints": [733], "characters": "\u02DD" },
+ "`": { "codepoints": [96], "characters": "\u0060" },
+ "˜": { "codepoints": [732], "characters": "\u02DC" },
+ "⋄": { "codepoints": [8900], "characters": "\u22C4" },
+ "ⅆ": { "codepoints": [8518], "characters": "\u2146" },
+ "𝔻": { "codepoints": [120123], "characters": "\uD835\uDD3B" },
+ "¨": { "codepoints": [168], "characters": "\u00A8" },
+ "⃜": { "codepoints": [8412], "characters": "\u20DC" },
+ "≐": { "codepoints": [8784], "characters": "\u2250" },
+ "∯": { "codepoints": [8751], "characters": "\u222F" },
+ "¨": { "codepoints": [168], "characters": "\u00A8" },
+ "⇓": { "codepoints": [8659], "characters": "\u21D3" },
+ "⇐": { "codepoints": [8656], "characters": "\u21D0" },
+ "⇔": { "codepoints": [8660], "characters": "\u21D4" },
+ "⫤": { "codepoints": [10980], "characters": "\u2AE4" },
+ "⟸": { "codepoints": [10232], "characters": "\u27F8" },
+ "⟺": { "codepoints": [10234], "characters": "\u27FA" },
+ "⟹": { "codepoints": [10233], "characters": "\u27F9" },
+ "⇒": { "codepoints": [8658], "characters": "\u21D2" },
+ "⊨": { "codepoints": [8872], "characters": "\u22A8" },
+ "⇑": { "codepoints": [8657], "characters": "\u21D1" },
+ "⇕": { "codepoints": [8661], "characters": "\u21D5" },
+ "∥": { "codepoints": [8741], "characters": "\u2225" },
+ "↓": { "codepoints": [8595], "characters": "\u2193" },
+ "⤓": { "codepoints": [10515], "characters": "\u2913" },
+ "⇵": { "codepoints": [8693], "characters": "\u21F5" },
+ "̑": { "codepoints": [785], "characters": "\u0311" },
+ "⥐": { "codepoints": [10576], "characters": "\u2950" },
+ "⥞": { "codepoints": [10590], "characters": "\u295E" },
+ "↽": { "codepoints": [8637], "characters": "\u21BD" },
+ "⥖": { "codepoints": [10582], "characters": "\u2956" },
+ "⥟": { "codepoints": [10591], "characters": "\u295F" },
+ "⇁": { "codepoints": [8641], "characters": "\u21C1" },
+ "⥗": { "codepoints": [10583], "characters": "\u2957" },
+ "⊤": { "codepoints": [8868], "characters": "\u22A4" },
+ "↧": { "codepoints": [8615], "characters": "\u21A7" },
+ "⇓": { "codepoints": [8659], "characters": "\u21D3" },
+ "𝒟": { "codepoints": [119967], "characters": "\uD835\uDC9F" },
+ "Đ": { "codepoints": [272], "characters": "\u0110" },
+ "Ŋ": { "codepoints": [330], "characters": "\u014A" },
+ "Ð": { "codepoints": [208], "characters": "\u00D0" },
+ "Ð": { "codepoints": [208], "characters": "\u00D0" },
+ "É": { "codepoints": [201], "characters": "\u00C9" },
+ "É": { "codepoints": [201], "characters": "\u00C9" },
+ "Ě": { "codepoints": [282], "characters": "\u011A" },
+ "Ê": { "codepoints": [202], "characters": "\u00CA" },
+ "Ê": { "codepoints": [202], "characters": "\u00CA" },
+ "Э": { "codepoints": [1069], "characters": "\u042D" },
+ "Ė": { "codepoints": [278], "characters": "\u0116" },
+ "𝔈": { "codepoints": [120072], "characters": "\uD835\uDD08" },
+ "È": { "codepoints": [200], "characters": "\u00C8" },
+ "È": { "codepoints": [200], "characters": "\u00C8" },
+ "∈": { "codepoints": [8712], "characters": "\u2208" },
+ "Ē": { "codepoints": [274], "characters": "\u0112" },
+ "◻": { "codepoints": [9723], "characters": "\u25FB" },
+ "▫": { "codepoints": [9643], "characters": "\u25AB" },
+ "Ę": { "codepoints": [280], "characters": "\u0118" },
+ "𝔼": { "codepoints": [120124], "characters": "\uD835\uDD3C" },
+ "Ε": { "codepoints": [917], "characters": "\u0395" },
+ "⩵": { "codepoints": [10869], "characters": "\u2A75" },
+ "≂": { "codepoints": [8770], "characters": "\u2242" },
+ "⇌": { "codepoints": [8652], "characters": "\u21CC" },
+ "ℰ": { "codepoints": [8496], "characters": "\u2130" },
+ "⩳": { "codepoints": [10867], "characters": "\u2A73" },
+ "Η": { "codepoints": [919], "characters": "\u0397" },
+ "Ë": { "codepoints": [203], "characters": "\u00CB" },
+ "Ë": { "codepoints": [203], "characters": "\u00CB" },
+ "∃": { "codepoints": [8707], "characters": "\u2203" },
+ "ⅇ": { "codepoints": [8519], "characters": "\u2147" },
+ "Ф": { "codepoints": [1060], "characters": "\u0424" },
+ "𝔉": { "codepoints": [120073], "characters": "\uD835\uDD09" },
+ "◼": { "codepoints": [9724], "characters": "\u25FC" },
+ "▪": { "codepoints": [9642], "characters": "\u25AA" },
+ "𝔽": { "codepoints": [120125], "characters": "\uD835\uDD3D" },
+ "∀": { "codepoints": [8704], "characters": "\u2200" },
+ "ℱ": { "codepoints": [8497], "characters": "\u2131" },
+ "ℱ": { "codepoints": [8497], "characters": "\u2131" },
+ "Ѓ": { "codepoints": [1027], "characters": "\u0403" },
+ ">": { "codepoints": [62], "characters": "\u003E" },
+ ">": { "codepoints": [62], "characters": "\u003E" },
+ "Γ": { "codepoints": [915], "characters": "\u0393" },
+ "Ϝ": { "codepoints": [988], "characters": "\u03DC" },
+ "Ğ": { "codepoints": [286], "characters": "\u011E" },
+ "Ģ": { "codepoints": [290], "characters": "\u0122" },
+ "Ĝ": { "codepoints": [284], "characters": "\u011C" },
+ "Г": { "codepoints": [1043], "characters": "\u0413" },
+ "Ġ": { "codepoints": [288], "characters": "\u0120" },
+ "𝔊": { "codepoints": [120074], "characters": "\uD835\uDD0A" },
+ "⋙": { "codepoints": [8921], "characters": "\u22D9" },
+ "𝔾": { "codepoints": [120126], "characters": "\uD835\uDD3E" },
+ "≥": { "codepoints": [8805], "characters": "\u2265" },
+ "⋛": { "codepoints": [8923], "characters": "\u22DB" },
+ "≧": { "codepoints": [8807], "characters": "\u2267" },
+ "⪢": { "codepoints": [10914], "characters": "\u2AA2" },
+ "≷": { "codepoints": [8823], "characters": "\u2277" },
+ "⩾": { "codepoints": [10878], "characters": "\u2A7E" },
+ "≳": { "codepoints": [8819], "characters": "\u2273" },
+ "𝒢": { "codepoints": [119970], "characters": "\uD835\uDCA2" },
+ "≫": { "codepoints": [8811], "characters": "\u226B" },
+ "Ъ": { "codepoints": [1066], "characters": "\u042A" },
+ "ˇ": { "codepoints": [711], "characters": "\u02C7" },
+ "^": { "codepoints": [94], "characters": "\u005E" },
+ "Ĥ": { "codepoints": [292], "characters": "\u0124" },
+ "ℌ": { "codepoints": [8460], "characters": "\u210C" },
+ "ℋ": { "codepoints": [8459], "characters": "\u210B" },
+ "ℍ": { "codepoints": [8461], "characters": "\u210D" },
+ "─": { "codepoints": [9472], "characters": "\u2500" },
+ "ℋ": { "codepoints": [8459], "characters": "\u210B" },
+ "Ħ": { "codepoints": [294], "characters": "\u0126" },
+ "≎": { "codepoints": [8782], "characters": "\u224E" },
+ "≏": { "codepoints": [8783], "characters": "\u224F" },
+ "Е": { "codepoints": [1045], "characters": "\u0415" },
+ "IJ": { "codepoints": [306], "characters": "\u0132" },
+ "Ё": { "codepoints": [1025], "characters": "\u0401" },
+ "Í": { "codepoints": [205], "characters": "\u00CD" },
+ "Í": { "codepoints": [205], "characters": "\u00CD" },
+ "Î": { "codepoints": [206], "characters": "\u00CE" },
+ "Î": { "codepoints": [206], "characters": "\u00CE" },
+ "И": { "codepoints": [1048], "characters": "\u0418" },
+ "İ": { "codepoints": [304], "characters": "\u0130" },
+ "ℑ": { "codepoints": [8465], "characters": "\u2111" },
+ "Ì": { "codepoints": [204], "characters": "\u00CC" },
+ "Ì": { "codepoints": [204], "characters": "\u00CC" },
+ "ℑ": { "codepoints": [8465], "characters": "\u2111" },
+ "Ī": { "codepoints": [298], "characters": "\u012A" },
+ "ⅈ": { "codepoints": [8520], "characters": "\u2148" },
+ "⇒": { "codepoints": [8658], "characters": "\u21D2" },
+ "∬": { "codepoints": [8748], "characters": "\u222C" },
+ "∫": { "codepoints": [8747], "characters": "\u222B" },
+ "⋂": { "codepoints": [8898], "characters": "\u22C2" },
+ "⁣": { "codepoints": [8291], "characters": "\u2063" },
+ "⁢": { "codepoints": [8290], "characters": "\u2062" },
+ "Į": { "codepoints": [302], "characters": "\u012E" },
+ "𝕀": { "codepoints": [120128], "characters": "\uD835\uDD40" },
+ "Ι": { "codepoints": [921], "characters": "\u0399" },
+ "ℐ": { "codepoints": [8464], "characters": "\u2110" },
+ "Ĩ": { "codepoints": [296], "characters": "\u0128" },
+ "І": { "codepoints": [1030], "characters": "\u0406" },
+ "Ï": { "codepoints": [207], "characters": "\u00CF" },
+ "Ï": { "codepoints": [207], "characters": "\u00CF" },
+ "Ĵ": { "codepoints": [308], "characters": "\u0134" },
+ "Й": { "codepoints": [1049], "characters": "\u0419" },
+ "𝔍": { "codepoints": [120077], "characters": "\uD835\uDD0D" },
+ "𝕁": { "codepoints": [120129], "characters": "\uD835\uDD41" },
+ "𝒥": { "codepoints": [119973], "characters": "\uD835\uDCA5" },
+ "Ј": { "codepoints": [1032], "characters": "\u0408" },
+ "Є": { "codepoints": [1028], "characters": "\u0404" },
+ "Х": { "codepoints": [1061], "characters": "\u0425" },
+ "Ќ": { "codepoints": [1036], "characters": "\u040C" },
+ "Κ": { "codepoints": [922], "characters": "\u039A" },
+ "Ķ": { "codepoints": [310], "characters": "\u0136" },
+ "К": { "codepoints": [1050], "characters": "\u041A" },
+ "𝔎": { "codepoints": [120078], "characters": "\uD835\uDD0E" },
+ "𝕂": { "codepoints": [120130], "characters": "\uD835\uDD42" },
+ "𝒦": { "codepoints": [119974], "characters": "\uD835\uDCA6" },
+ "Љ": { "codepoints": [1033], "characters": "\u0409" },
+ "<": { "codepoints": [60], "characters": "\u003C" },
+ "<": { "codepoints": [60], "characters": "\u003C" },
+ "Ĺ": { "codepoints": [313], "characters": "\u0139" },
+ "Λ": { "codepoints": [923], "characters": "\u039B" },
+ "⟪": { "codepoints": [10218], "characters": "\u27EA" },
+ "ℒ": { "codepoints": [8466], "characters": "\u2112" },
+ "↞": { "codepoints": [8606], "characters": "\u219E" },
+ "Ľ": { "codepoints": [317], "characters": "\u013D" },
+ "Ļ": { "codepoints": [315], "characters": "\u013B" },
+ "Л": { "codepoints": [1051], "characters": "\u041B" },
+ "⟨": { "codepoints": [10216], "characters": "\u27E8" },
+ "←": { "codepoints": [8592], "characters": "\u2190" },
+ "⇤": { "codepoints": [8676], "characters": "\u21E4" },
+ "⇆": { "codepoints": [8646], "characters": "\u21C6" },
+ "⌈": { "codepoints": [8968], "characters": "\u2308" },
+ "⟦": { "codepoints": [10214], "characters": "\u27E6" },
+ "⥡": { "codepoints": [10593], "characters": "\u2961" },
+ "⇃": { "codepoints": [8643], "characters": "\u21C3" },
+ "⥙": { "codepoints": [10585], "characters": "\u2959" },
+ "⌊": { "codepoints": [8970], "characters": "\u230A" },
+ "↔": { "codepoints": [8596], "characters": "\u2194" },
+ "⥎": { "codepoints": [10574], "characters": "\u294E" },
+ "⊣": { "codepoints": [8867], "characters": "\u22A3" },
+ "↤": { "codepoints": [8612], "characters": "\u21A4" },
+ "⥚": { "codepoints": [10586], "characters": "\u295A" },
+ "⊲": { "codepoints": [8882], "characters": "\u22B2" },
+ "⧏": { "codepoints": [10703], "characters": "\u29CF" },
+ "⊴": { "codepoints": [8884], "characters": "\u22B4" },
+ "⥑": { "codepoints": [10577], "characters": "\u2951" },
+ "⥠": { "codepoints": [10592], "characters": "\u2960" },
+ "↿": { "codepoints": [8639], "characters": "\u21BF" },
+ "⥘": { "codepoints": [10584], "characters": "\u2958" },
+ "↼": { "codepoints": [8636], "characters": "\u21BC" },
+ "⥒": { "codepoints": [10578], "characters": "\u2952" },
+ "⇐": { "codepoints": [8656], "characters": "\u21D0" },
+ "⇔": { "codepoints": [8660], "characters": "\u21D4" },
+ "⋚": { "codepoints": [8922], "characters": "\u22DA" },
+ "≦": { "codepoints": [8806], "characters": "\u2266" },
+ "≶": { "codepoints": [8822], "characters": "\u2276" },
+ "⪡": { "codepoints": [10913], "characters": "\u2AA1" },
+ "⩽": { "codepoints": [10877], "characters": "\u2A7D" },
+ "≲": { "codepoints": [8818], "characters": "\u2272" },
+ "𝔏": { "codepoints": [120079], "characters": "\uD835\uDD0F" },
+ "⋘": { "codepoints": [8920], "characters": "\u22D8" },
+ "⇚": { "codepoints": [8666], "characters": "\u21DA" },
+ "Ŀ": { "codepoints": [319], "characters": "\u013F" },
+ "⟵": { "codepoints": [10229], "characters": "\u27F5" },
+ "⟷": { "codepoints": [10231], "characters": "\u27F7" },
+ "⟶": { "codepoints": [10230], "characters": "\u27F6" },
+ "⟸": { "codepoints": [10232], "characters": "\u27F8" },
+ "⟺": { "codepoints": [10234], "characters": "\u27FA" },
+ "⟹": { "codepoints": [10233], "characters": "\u27F9" },
+ "𝕃": { "codepoints": [120131], "characters": "\uD835\uDD43" },
+ "↙": { "codepoints": [8601], "characters": "\u2199" },
+ "↘": { "codepoints": [8600], "characters": "\u2198" },
+ "ℒ": { "codepoints": [8466], "characters": "\u2112" },
+ "↰": { "codepoints": [8624], "characters": "\u21B0" },
+ "Ł": { "codepoints": [321], "characters": "\u0141" },
+ "≪": { "codepoints": [8810], "characters": "\u226A" },
+ "⤅": { "codepoints": [10501], "characters": "\u2905" },
+ "М": { "codepoints": [1052], "characters": "\u041C" },
+ " ": { "codepoints": [8287], "characters": "\u205F" },
+ "ℳ": { "codepoints": [8499], "characters": "\u2133" },
+ "𝔐": { "codepoints": [120080], "characters": "\uD835\uDD10" },
+ "∓": { "codepoints": [8723], "characters": "\u2213" },
+ "𝕄": { "codepoints": [120132], "characters": "\uD835\uDD44" },
+ "ℳ": { "codepoints": [8499], "characters": "\u2133" },
+ "Μ": { "codepoints": [924], "characters": "\u039C" },
+ "Њ": { "codepoints": [1034], "characters": "\u040A" },
+ "Ń": { "codepoints": [323], "characters": "\u0143" },
+ "Ň": { "codepoints": [327], "characters": "\u0147" },
+ "Ņ": { "codepoints": [325], "characters": "\u0145" },
+ "Н": { "codepoints": [1053], "characters": "\u041D" },
+ "​": { "codepoints": [8203], "characters": "\u200B" },
+ "​": { "codepoints": [8203], "characters": "\u200B" },
+ "​": { "codepoints": [8203], "characters": "\u200B" },
+ "​": { "codepoints": [8203], "characters": "\u200B" },
+ "≫": { "codepoints": [8811], "characters": "\u226B" },
+ "≪": { "codepoints": [8810], "characters": "\u226A" },
+ "
": { "codepoints": [10], "characters": "\u000A" },
+ "𝔑": { "codepoints": [120081], "characters": "\uD835\uDD11" },
+ "⁠": { "codepoints": [8288], "characters": "\u2060" },
+ " ": { "codepoints": [160], "characters": "\u00A0" },
+ "ℕ": { "codepoints": [8469], "characters": "\u2115" },
+ "⫬": { "codepoints": [10988], "characters": "\u2AEC" },
+ "≢": { "codepoints": [8802], "characters": "\u2262" },
+ "≭": { "codepoints": [8813], "characters": "\u226D" },
+ "∦": { "codepoints": [8742], "characters": "\u2226" },
+ "∉": { "codepoints": [8713], "characters": "\u2209" },
+ "≠": { "codepoints": [8800], "characters": "\u2260" },
+ "≂̸": { "codepoints": [8770, 824], "characters": "\u2242\u0338" },
+ "∄": { "codepoints": [8708], "characters": "\u2204" },
+ "≯": { "codepoints": [8815], "characters": "\u226F" },
+ "≱": { "codepoints": [8817], "characters": "\u2271" },
+ "≧̸": { "codepoints": [8807, 824], "characters": "\u2267\u0338" },
+ "≫̸": { "codepoints": [8811, 824], "characters": "\u226B\u0338" },
+ "≹": { "codepoints": [8825], "characters": "\u2279" },
+ "⩾̸": { "codepoints": [10878, 824], "characters": "\u2A7E\u0338" },
+ "≵": { "codepoints": [8821], "characters": "\u2275" },
+ "≎̸": { "codepoints": [8782, 824], "characters": "\u224E\u0338" },
+ "≏̸": { "codepoints": [8783, 824], "characters": "\u224F\u0338" },
+ "⋪": { "codepoints": [8938], "characters": "\u22EA" },
+ "⧏̸": { "codepoints": [10703, 824], "characters": "\u29CF\u0338" },
+ "⋬": { "codepoints": [8940], "characters": "\u22EC" },
+ "≮": { "codepoints": [8814], "characters": "\u226E" },
+ "≰": { "codepoints": [8816], "characters": "\u2270" },
+ "≸": { "codepoints": [8824], "characters": "\u2278" },
+ "≪̸": { "codepoints": [8810, 824], "characters": "\u226A\u0338" },
+ "⩽̸": { "codepoints": [10877, 824], "characters": "\u2A7D\u0338" },
+ "≴": { "codepoints": [8820], "characters": "\u2274" },
+ "⪢̸": { "codepoints": [10914, 824], "characters": "\u2AA2\u0338" },
+ "⪡̸": { "codepoints": [10913, 824], "characters": "\u2AA1\u0338" },
+ "⊀": { "codepoints": [8832], "characters": "\u2280" },
+ "⪯̸": { "codepoints": [10927, 824], "characters": "\u2AAF\u0338" },
+ "⋠": { "codepoints": [8928], "characters": "\u22E0" },
+ "∌": { "codepoints": [8716], "characters": "\u220C" },
+ "⋫": { "codepoints": [8939], "characters": "\u22EB" },
+ "⧐̸": { "codepoints": [10704, 824], "characters": "\u29D0\u0338" },
+ "⋭": { "codepoints": [8941], "characters": "\u22ED" },
+ "⊏̸": { "codepoints": [8847, 824], "characters": "\u228F\u0338" },
+ "⋢": { "codepoints": [8930], "characters": "\u22E2" },
+ "⊐̸": { "codepoints": [8848, 824], "characters": "\u2290\u0338" },
+ "⋣": { "codepoints": [8931], "characters": "\u22E3" },
+ "⊂⃒": { "codepoints": [8834, 8402], "characters": "\u2282\u20D2" },
+ "⊈": { "codepoints": [8840], "characters": "\u2288" },
+ "⊁": { "codepoints": [8833], "characters": "\u2281" },
+ "⪰̸": { "codepoints": [10928, 824], "characters": "\u2AB0\u0338" },
+ "⋡": { "codepoints": [8929], "characters": "\u22E1" },
+ "≿̸": { "codepoints": [8831, 824], "characters": "\u227F\u0338" },
+ "⊃⃒": { "codepoints": [8835, 8402], "characters": "\u2283\u20D2" },
+ "⊉": { "codepoints": [8841], "characters": "\u2289" },
+ "≁": { "codepoints": [8769], "characters": "\u2241" },
+ "≄": { "codepoints": [8772], "characters": "\u2244" },
+ "≇": { "codepoints": [8775], "characters": "\u2247" },
+ "≉": { "codepoints": [8777], "characters": "\u2249" },
+ "∤": { "codepoints": [8740], "characters": "\u2224" },
+ "𝒩": { "codepoints": [119977], "characters": "\uD835\uDCA9" },
+ "Ñ": { "codepoints": [209], "characters": "\u00D1" },
+ "Ñ": { "codepoints": [209], "characters": "\u00D1" },
+ "Ν": { "codepoints": [925], "characters": "\u039D" },
+ "Œ": { "codepoints": [338], "characters": "\u0152" },
+ "Ó": { "codepoints": [211], "characters": "\u00D3" },
+ "Ó": { "codepoints": [211], "characters": "\u00D3" },
+ "Ô": { "codepoints": [212], "characters": "\u00D4" },
+ "Ô": { "codepoints": [212], "characters": "\u00D4" },
+ "О": { "codepoints": [1054], "characters": "\u041E" },
+ "Ő": { "codepoints": [336], "characters": "\u0150" },
+ "𝔒": { "codepoints": [120082], "characters": "\uD835\uDD12" },
+ "Ò": { "codepoints": [210], "characters": "\u00D2" },
+ "Ò": { "codepoints": [210], "characters": "\u00D2" },
+ "Ō": { "codepoints": [332], "characters": "\u014C" },
+ "Ω": { "codepoints": [937], "characters": "\u03A9" },
+ "Ο": { "codepoints": [927], "characters": "\u039F" },
+ "𝕆": { "codepoints": [120134], "characters": "\uD835\uDD46" },
+ "“": { "codepoints": [8220], "characters": "\u201C" },
+ "‘": { "codepoints": [8216], "characters": "\u2018" },
+ "⩔": { "codepoints": [10836], "characters": "\u2A54" },
+ "𝒪": { "codepoints": [119978], "characters": "\uD835\uDCAA" },
+ "Ø": { "codepoints": [216], "characters": "\u00D8" },
+ "Ø": { "codepoints": [216], "characters": "\u00D8" },
+ "Õ": { "codepoints": [213], "characters": "\u00D5" },
+ "Õ": { "codepoints": [213], "characters": "\u00D5" },
+ "⨷": { "codepoints": [10807], "characters": "\u2A37" },
+ "Ö": { "codepoints": [214], "characters": "\u00D6" },
+ "Ö": { "codepoints": [214], "characters": "\u00D6" },
+ "‾": { "codepoints": [8254], "characters": "\u203E" },
+ "⏞": { "codepoints": [9182], "characters": "\u23DE" },
+ "⎴": { "codepoints": [9140], "characters": "\u23B4" },
+ "⏜": { "codepoints": [9180], "characters": "\u23DC" },
+ "∂": { "codepoints": [8706], "characters": "\u2202" },
+ "П": { "codepoints": [1055], "characters": "\u041F" },
+ "𝔓": { "codepoints": [120083], "characters": "\uD835\uDD13" },
+ "Φ": { "codepoints": [934], "characters": "\u03A6" },
+ "Π": { "codepoints": [928], "characters": "\u03A0" },
+ "±": { "codepoints": [177], "characters": "\u00B1" },
+ "ℌ": { "codepoints": [8460], "characters": "\u210C" },
+ "ℙ": { "codepoints": [8473], "characters": "\u2119" },
+ "⪻": { "codepoints": [10939], "characters": "\u2ABB" },
+ "≺": { "codepoints": [8826], "characters": "\u227A" },
+ "⪯": { "codepoints": [10927], "characters": "\u2AAF" },
+ "≼": { "codepoints": [8828], "characters": "\u227C" },
+ "≾": { "codepoints": [8830], "characters": "\u227E" },
+ "″": { "codepoints": [8243], "characters": "\u2033" },
+ "∏": { "codepoints": [8719], "characters": "\u220F" },
+ "∷": { "codepoints": [8759], "characters": "\u2237" },
+ "∝": { "codepoints": [8733], "characters": "\u221D" },
+ "𝒫": { "codepoints": [119979], "characters": "\uD835\uDCAB" },
+ "Ψ": { "codepoints": [936], "characters": "\u03A8" },
+ """: { "codepoints": [34], "characters": "\u0022" },
+ """: { "codepoints": [34], "characters": "\u0022" },
+ "𝔔": { "codepoints": [120084], "characters": "\uD835\uDD14" },
+ "ℚ": { "codepoints": [8474], "characters": "\u211A" },
+ "𝒬": { "codepoints": [119980], "characters": "\uD835\uDCAC" },
+ "⤐": { "codepoints": [10512], "characters": "\u2910" },
+ "®": { "codepoints": [174], "characters": "\u00AE" },
+ "®": { "codepoints": [174], "characters": "\u00AE" },
+ "Ŕ": { "codepoints": [340], "characters": "\u0154" },
+ "⟫": { "codepoints": [10219], "characters": "\u27EB" },
+ "↠": { "codepoints": [8608], "characters": "\u21A0" },
+ "⤖": { "codepoints": [10518], "characters": "\u2916" },
+ "Ř": { "codepoints": [344], "characters": "\u0158" },
+ "Ŗ": { "codepoints": [342], "characters": "\u0156" },
+ "Р": { "codepoints": [1056], "characters": "\u0420" },
+ "ℜ": { "codepoints": [8476], "characters": "\u211C" },
+ "∋": { "codepoints": [8715], "characters": "\u220B" },
+ "⇋": { "codepoints": [8651], "characters": "\u21CB" },
+ "⥯": { "codepoints": [10607], "characters": "\u296F" },
+ "ℜ": { "codepoints": [8476], "characters": "\u211C" },
+ "Ρ": { "codepoints": [929], "characters": "\u03A1" },
+ "⟩": { "codepoints": [10217], "characters": "\u27E9" },
+ "→": { "codepoints": [8594], "characters": "\u2192" },
+ "⇥": { "codepoints": [8677], "characters": "\u21E5" },
+ "⇄": { "codepoints": [8644], "characters": "\u21C4" },
+ "⌉": { "codepoints": [8969], "characters": "\u2309" },
+ "⟧": { "codepoints": [10215], "characters": "\u27E7" },
+ "⥝": { "codepoints": [10589], "characters": "\u295D" },
+ "⇂": { "codepoints": [8642], "characters": "\u21C2" },
+ "⥕": { "codepoints": [10581], "characters": "\u2955" },
+ "⌋": { "codepoints": [8971], "characters": "\u230B" },
+ "⊢": { "codepoints": [8866], "characters": "\u22A2" },
+ "↦": { "codepoints": [8614], "characters": "\u21A6" },
+ "⥛": { "codepoints": [10587], "characters": "\u295B" },
+ "⊳": { "codepoints": [8883], "characters": "\u22B3" },
+ "⧐": { "codepoints": [10704], "characters": "\u29D0" },
+ "⊵": { "codepoints": [8885], "characters": "\u22B5" },
+ "⥏": { "codepoints": [10575], "characters": "\u294F" },
+ "⥜": { "codepoints": [10588], "characters": "\u295C" },
+ "↾": { "codepoints": [8638], "characters": "\u21BE" },
+ "⥔": { "codepoints": [10580], "characters": "\u2954" },
+ "⇀": { "codepoints": [8640], "characters": "\u21C0" },
+ "⥓": { "codepoints": [10579], "characters": "\u2953" },
+ "⇒": { "codepoints": [8658], "characters": "\u21D2" },
+ "ℝ": { "codepoints": [8477], "characters": "\u211D" },
+ "⥰": { "codepoints": [10608], "characters": "\u2970" },
+ "⇛": { "codepoints": [8667], "characters": "\u21DB" },
+ "ℛ": { "codepoints": [8475], "characters": "\u211B" },
+ "↱": { "codepoints": [8625], "characters": "\u21B1" },
+ "⧴": { "codepoints": [10740], "characters": "\u29F4" },
+ "Щ": { "codepoints": [1065], "characters": "\u0429" },
+ "Ш": { "codepoints": [1064], "characters": "\u0428" },
+ "Ь": { "codepoints": [1068], "characters": "\u042C" },
+ "Ś": { "codepoints": [346], "characters": "\u015A" },
+ "⪼": { "codepoints": [10940], "characters": "\u2ABC" },
+ "Š": { "codepoints": [352], "characters": "\u0160" },
+ "Ş": { "codepoints": [350], "characters": "\u015E" },
+ "Ŝ": { "codepoints": [348], "characters": "\u015C" },
+ "С": { "codepoints": [1057], "characters": "\u0421" },
+ "𝔖": { "codepoints": [120086], "characters": "\uD835\uDD16" },
+ "↓": { "codepoints": [8595], "characters": "\u2193" },
+ "←": { "codepoints": [8592], "characters": "\u2190" },
+ "→": { "codepoints": [8594], "characters": "\u2192" },
+ "↑": { "codepoints": [8593], "characters": "\u2191" },
+ "Σ": { "codepoints": [931], "characters": "\u03A3" },
+ "∘": { "codepoints": [8728], "characters": "\u2218" },
+ "𝕊": { "codepoints": [120138], "characters": "\uD835\uDD4A" },
+ "√": { "codepoints": [8730], "characters": "\u221A" },
+ "□": { "codepoints": [9633], "characters": "\u25A1" },
+ "⊓": { "codepoints": [8851], "characters": "\u2293" },
+ "⊏": { "codepoints": [8847], "characters": "\u228F" },
+ "⊑": { "codepoints": [8849], "characters": "\u2291" },
+ "⊐": { "codepoints": [8848], "characters": "\u2290" },
+ "⊒": { "codepoints": [8850], "characters": "\u2292" },
+ "⊔": { "codepoints": [8852], "characters": "\u2294" },
+ "𝒮": { "codepoints": [119982], "characters": "\uD835\uDCAE" },
+ "⋆": { "codepoints": [8902], "characters": "\u22C6" },
+ "⋐": { "codepoints": [8912], "characters": "\u22D0" },
+ "⋐": { "codepoints": [8912], "characters": "\u22D0" },
+ "⊆": { "codepoints": [8838], "characters": "\u2286" },
+ "≻": { "codepoints": [8827], "characters": "\u227B" },
+ "⪰": { "codepoints": [10928], "characters": "\u2AB0" },
+ "≽": { "codepoints": [8829], "characters": "\u227D" },
+ "≿": { "codepoints": [8831], "characters": "\u227F" },
+ "∋": { "codepoints": [8715], "characters": "\u220B" },
+ "∑": { "codepoints": [8721], "characters": "\u2211" },
+ "⋑": { "codepoints": [8913], "characters": "\u22D1" },
+ "⊃": { "codepoints": [8835], "characters": "\u2283" },
+ "⊇": { "codepoints": [8839], "characters": "\u2287" },
+ "⋑": { "codepoints": [8913], "characters": "\u22D1" },
+ "Þ": { "codepoints": [222], "characters": "\u00DE" },
+ "Þ": { "codepoints": [222], "characters": "\u00DE" },
+ "™": { "codepoints": [8482], "characters": "\u2122" },
+ "Ћ": { "codepoints": [1035], "characters": "\u040B" },
+ "Ц": { "codepoints": [1062], "characters": "\u0426" },
+ "	": { "codepoints": [9], "characters": "\u0009" },
+ "Τ": { "codepoints": [932], "characters": "\u03A4" },
+ "Ť": { "codepoints": [356], "characters": "\u0164" },
+ "Ţ": { "codepoints": [354], "characters": "\u0162" },
+ "Т": { "codepoints": [1058], "characters": "\u0422" },
+ "𝔗": { "codepoints": [120087], "characters": "\uD835\uDD17" },
+ "∴": { "codepoints": [8756], "characters": "\u2234" },
+ "Θ": { "codepoints": [920], "characters": "\u0398" },
+ "  ": { "codepoints": [8287, 8202], "characters": "\u205F\u200A" },
+ " ": { "codepoints": [8201], "characters": "\u2009" },
+ "∼": { "codepoints": [8764], "characters": "\u223C" },
+ "≃": { "codepoints": [8771], "characters": "\u2243" },
+ "≅": { "codepoints": [8773], "characters": "\u2245" },
+ "≈": { "codepoints": [8776], "characters": "\u2248" },
+ "𝕋": { "codepoints": [120139], "characters": "\uD835\uDD4B" },
+ "⃛": { "codepoints": [8411], "characters": "\u20DB" },
+ "𝒯": { "codepoints": [119983], "characters": "\uD835\uDCAF" },
+ "Ŧ": { "codepoints": [358], "characters": "\u0166" },
+ "Ú": { "codepoints": [218], "characters": "\u00DA" },
+ "Ú": { "codepoints": [218], "characters": "\u00DA" },
+ "↟": { "codepoints": [8607], "characters": "\u219F" },
+ "⥉": { "codepoints": [10569], "characters": "\u2949" },
+ "Ў": { "codepoints": [1038], "characters": "\u040E" },
+ "Ŭ": { "codepoints": [364], "characters": "\u016C" },
+ "Û": { "codepoints": [219], "characters": "\u00DB" },
+ "Û": { "codepoints": [219], "characters": "\u00DB" },
+ "У": { "codepoints": [1059], "characters": "\u0423" },
+ "Ű": { "codepoints": [368], "characters": "\u0170" },
+ "𝔘": { "codepoints": [120088], "characters": "\uD835\uDD18" },
+ "Ù": { "codepoints": [217], "characters": "\u00D9" },
+ "Ù": { "codepoints": [217], "characters": "\u00D9" },
+ "Ū": { "codepoints": [362], "characters": "\u016A" },
+ "_": { "codepoints": [95], "characters": "\u005F" },
+ "⏟": { "codepoints": [9183], "characters": "\u23DF" },
+ "⎵": { "codepoints": [9141], "characters": "\u23B5" },
+ "⏝": { "codepoints": [9181], "characters": "\u23DD" },
+ "⋃": { "codepoints": [8899], "characters": "\u22C3" },
+ "⊎": { "codepoints": [8846], "characters": "\u228E" },
+ "Ų": { "codepoints": [370], "characters": "\u0172" },
+ "𝕌": { "codepoints": [120140], "characters": "\uD835\uDD4C" },
+ "↑": { "codepoints": [8593], "characters": "\u2191" },
+ "⤒": { "codepoints": [10514], "characters": "\u2912" },
+ "⇅": { "codepoints": [8645], "characters": "\u21C5" },
+ "↕": { "codepoints": [8597], "characters": "\u2195" },
+ "⥮": { "codepoints": [10606], "characters": "\u296E" },
+ "⊥": { "codepoints": [8869], "characters": "\u22A5" },
+ "↥": { "codepoints": [8613], "characters": "\u21A5" },
+ "⇑": { "codepoints": [8657], "characters": "\u21D1" },
+ "⇕": { "codepoints": [8661], "characters": "\u21D5" },
+ "↖": { "codepoints": [8598], "characters": "\u2196" },
+ "↗": { "codepoints": [8599], "characters": "\u2197" },
+ "ϒ": { "codepoints": [978], "characters": "\u03D2" },
+ "Υ": { "codepoints": [933], "characters": "\u03A5" },
+ "Ů": { "codepoints": [366], "characters": "\u016E" },
+ "𝒰": { "codepoints": [119984], "characters": "\uD835\uDCB0" },
+ "Ũ": { "codepoints": [360], "characters": "\u0168" },
+ "Ü": { "codepoints": [220], "characters": "\u00DC" },
+ "Ü": { "codepoints": [220], "characters": "\u00DC" },
+ "⊫": { "codepoints": [8875], "characters": "\u22AB" },
+ "⫫": { "codepoints": [10987], "characters": "\u2AEB" },
+ "В": { "codepoints": [1042], "characters": "\u0412" },
+ "⊩": { "codepoints": [8873], "characters": "\u22A9" },
+ "⫦": { "codepoints": [10982], "characters": "\u2AE6" },
+ "⋁": { "codepoints": [8897], "characters": "\u22C1" },
+ "‖": { "codepoints": [8214], "characters": "\u2016" },
+ "‖": { "codepoints": [8214], "characters": "\u2016" },
+ "∣": { "codepoints": [8739], "characters": "\u2223" },
+ "|": { "codepoints": [124], "characters": "\u007C" },
+ "❘": { "codepoints": [10072], "characters": "\u2758" },
+ "≀": { "codepoints": [8768], "characters": "\u2240" },
+ " ": { "codepoints": [8202], "characters": "\u200A" },
+ "𝔙": { "codepoints": [120089], "characters": "\uD835\uDD19" },
+ "𝕍": { "codepoints": [120141], "characters": "\uD835\uDD4D" },
+ "𝒱": { "codepoints": [119985], "characters": "\uD835\uDCB1" },
+ "⊪": { "codepoints": [8874], "characters": "\u22AA" },
+ "Ŵ": { "codepoints": [372], "characters": "\u0174" },
+ "⋀": { "codepoints": [8896], "characters": "\u22C0" },
+ "𝔚": { "codepoints": [120090], "characters": "\uD835\uDD1A" },
+ "𝕎": { "codepoints": [120142], "characters": "\uD835\uDD4E" },
+ "𝒲": { "codepoints": [119986], "characters": "\uD835\uDCB2" },
+ "𝔛": { "codepoints": [120091], "characters": "\uD835\uDD1B" },
+ "Ξ": { "codepoints": [926], "characters": "\u039E" },
+ "𝕏": { "codepoints": [120143], "characters": "\uD835\uDD4F" },
+ "𝒳": { "codepoints": [119987], "characters": "\uD835\uDCB3" },
+ "Я": { "codepoints": [1071], "characters": "\u042F" },
+ "Ї": { "codepoints": [1031], "characters": "\u0407" },
+ "Ю": { "codepoints": [1070], "characters": "\u042E" },
+ "Ý": { "codepoints": [221], "characters": "\u00DD" },
+ "Ý": { "codepoints": [221], "characters": "\u00DD" },
+ "Ŷ": { "codepoints": [374], "characters": "\u0176" },
+ "Ы": { "codepoints": [1067], "characters": "\u042B" },
+ "𝔜": { "codepoints": [120092], "characters": "\uD835\uDD1C" },
+ "𝕐": { "codepoints": [120144], "characters": "\uD835\uDD50" },
+ "𝒴": { "codepoints": [119988], "characters": "\uD835\uDCB4" },
+ "Ÿ": { "codepoints": [376], "characters": "\u0178" },
+ "Ж": { "codepoints": [1046], "characters": "\u0416" },
+ "Ź": { "codepoints": [377], "characters": "\u0179" },
+ "Ž": { "codepoints": [381], "characters": "\u017D" },
+ "З": { "codepoints": [1047], "characters": "\u0417" },
+ "Ż": { "codepoints": [379], "characters": "\u017B" },
+ "​": { "codepoints": [8203], "characters": "\u200B" },
+ "Ζ": { "codepoints": [918], "characters": "\u0396" },
+ "ℨ": { "codepoints": [8488], "characters": "\u2128" },
+ "ℤ": { "codepoints": [8484], "characters": "\u2124" },
+ "𝒵": { "codepoints": [119989], "characters": "\uD835\uDCB5" },
+ "á": { "codepoints": [225], "characters": "\u00E1" },
+ "á": { "codepoints": [225], "characters": "\u00E1" },
+ "ă": { "codepoints": [259], "characters": "\u0103" },
+ "∾": { "codepoints": [8766], "characters": "\u223E" },
+ "∾̳": { "codepoints": [8766, 819], "characters": "\u223E\u0333" },
+ "∿": { "codepoints": [8767], "characters": "\u223F" },
+ "â": { "codepoints": [226], "characters": "\u00E2" },
+ "â": { "codepoints": [226], "characters": "\u00E2" },
+ "´": { "codepoints": [180], "characters": "\u00B4" },
+ "´": { "codepoints": [180], "characters": "\u00B4" },
+ "а": { "codepoints": [1072], "characters": "\u0430" },
+ "æ": { "codepoints": [230], "characters": "\u00E6" },
+ "æ": { "codepoints": [230], "characters": "\u00E6" },
+ "⁡": { "codepoints": [8289], "characters": "\u2061" },
+ "𝔞": { "codepoints": [120094], "characters": "\uD835\uDD1E" },
+ "à": { "codepoints": [224], "characters": "\u00E0" },
+ "à": { "codepoints": [224], "characters": "\u00E0" },
+ "ℵ": { "codepoints": [8501], "characters": "\u2135" },
+ "ℵ": { "codepoints": [8501], "characters": "\u2135" },
+ "α": { "codepoints": [945], "characters": "\u03B1" },
+ "ā": { "codepoints": [257], "characters": "\u0101" },
+ "⨿": { "codepoints": [10815], "characters": "\u2A3F" },
+ "&": { "codepoints": [38], "characters": "\u0026" },
+ "&": { "codepoints": [38], "characters": "\u0026" },
+ "∧": { "codepoints": [8743], "characters": "\u2227" },
+ "⩕": { "codepoints": [10837], "characters": "\u2A55" },
+ "⩜": { "codepoints": [10844], "characters": "\u2A5C" },
+ "⩘": { "codepoints": [10840], "characters": "\u2A58" },
+ "⩚": { "codepoints": [10842], "characters": "\u2A5A" },
+ "∠": { "codepoints": [8736], "characters": "\u2220" },
+ "⦤": { "codepoints": [10660], "characters": "\u29A4" },
+ "∠": { "codepoints": [8736], "characters": "\u2220" },
+ "∡": { "codepoints": [8737], "characters": "\u2221" },
+ "⦨": { "codepoints": [10664], "characters": "\u29A8" },
+ "⦩": { "codepoints": [10665], "characters": "\u29A9" },
+ "⦪": { "codepoints": [10666], "characters": "\u29AA" },
+ "⦫": { "codepoints": [10667], "characters": "\u29AB" },
+ "⦬": { "codepoints": [10668], "characters": "\u29AC" },
+ "⦭": { "codepoints": [10669], "characters": "\u29AD" },
+ "⦮": { "codepoints": [10670], "characters": "\u29AE" },
+ "⦯": { "codepoints": [10671], "characters": "\u29AF" },
+ "∟": { "codepoints": [8735], "characters": "\u221F" },
+ "⊾": { "codepoints": [8894], "characters": "\u22BE" },
+ "⦝": { "codepoints": [10653], "characters": "\u299D" },
+ "∢": { "codepoints": [8738], "characters": "\u2222" },
+ "Å": { "codepoints": [197], "characters": "\u00C5" },
+ "⍼": { "codepoints": [9084], "characters": "\u237C" },
+ "ą": { "codepoints": [261], "characters": "\u0105" },
+ "𝕒": { "codepoints": [120146], "characters": "\uD835\uDD52" },
+ "≈": { "codepoints": [8776], "characters": "\u2248" },
+ "⩰": { "codepoints": [10864], "characters": "\u2A70" },
+ "⩯": { "codepoints": [10863], "characters": "\u2A6F" },
+ "≊": { "codepoints": [8778], "characters": "\u224A" },
+ "≋": { "codepoints": [8779], "characters": "\u224B" },
+ "'": { "codepoints": [39], "characters": "\u0027" },
+ "≈": { "codepoints": [8776], "characters": "\u2248" },
+ "≊": { "codepoints": [8778], "characters": "\u224A" },
+ "å": { "codepoints": [229], "characters": "\u00E5" },
+ "å": { "codepoints": [229], "characters": "\u00E5" },
+ "𝒶": { "codepoints": [119990], "characters": "\uD835\uDCB6" },
+ "*": { "codepoints": [42], "characters": "\u002A" },
+ "≈": { "codepoints": [8776], "characters": "\u2248" },
+ "≍": { "codepoints": [8781], "characters": "\u224D" },
+ "ã": { "codepoints": [227], "characters": "\u00E3" },
+ "ã": { "codepoints": [227], "characters": "\u00E3" },
+ "ä": { "codepoints": [228], "characters": "\u00E4" },
+ "ä": { "codepoints": [228], "characters": "\u00E4" },
+ "∳": { "codepoints": [8755], "characters": "\u2233" },
+ "⨑": { "codepoints": [10769], "characters": "\u2A11" },
+ "⫭": { "codepoints": [10989], "characters": "\u2AED" },
+ "≌": { "codepoints": [8780], "characters": "\u224C" },
+ "϶": { "codepoints": [1014], "characters": "\u03F6" },
+ "‵": { "codepoints": [8245], "characters": "\u2035" },
+ "∽": { "codepoints": [8765], "characters": "\u223D" },
+ "⋍": { "codepoints": [8909], "characters": "\u22CD" },
+ "⊽": { "codepoints": [8893], "characters": "\u22BD" },
+ "⌅": { "codepoints": [8965], "characters": "\u2305" },
+ "⌅": { "codepoints": [8965], "characters": "\u2305" },
+ "⎵": { "codepoints": [9141], "characters": "\u23B5" },
+ "⎶": { "codepoints": [9142], "characters": "\u23B6" },
+ "≌": { "codepoints": [8780], "characters": "\u224C" },
+ "б": { "codepoints": [1073], "characters": "\u0431" },
+ "„": { "codepoints": [8222], "characters": "\u201E" },
+ "∵": { "codepoints": [8757], "characters": "\u2235" },
+ "∵": { "codepoints": [8757], "characters": "\u2235" },
+ "⦰": { "codepoints": [10672], "characters": "\u29B0" },
+ "϶": { "codepoints": [1014], "characters": "\u03F6" },
+ "ℬ": { "codepoints": [8492], "characters": "\u212C" },
+ "β": { "codepoints": [946], "characters": "\u03B2" },
+ "ℶ": { "codepoints": [8502], "characters": "\u2136" },
+ "≬": { "codepoints": [8812], "characters": "\u226C" },
+ "𝔟": { "codepoints": [120095], "characters": "\uD835\uDD1F" },
+ "⋂": { "codepoints": [8898], "characters": "\u22C2" },
+ "◯": { "codepoints": [9711], "characters": "\u25EF" },
+ "⋃": { "codepoints": [8899], "characters": "\u22C3" },
+ "⨀": { "codepoints": [10752], "characters": "\u2A00" },
+ "⨁": { "codepoints": [10753], "characters": "\u2A01" },
+ "⨂": { "codepoints": [10754], "characters": "\u2A02" },
+ "⨆": { "codepoints": [10758], "characters": "\u2A06" },
+ "★": { "codepoints": [9733], "characters": "\u2605" },
+ "▽": { "codepoints": [9661], "characters": "\u25BD" },
+ "△": { "codepoints": [9651], "characters": "\u25B3" },
+ "⨄": { "codepoints": [10756], "characters": "\u2A04" },
+ "⋁": { "codepoints": [8897], "characters": "\u22C1" },
+ "⋀": { "codepoints": [8896], "characters": "\u22C0" },
+ "⤍": { "codepoints": [10509], "characters": "\u290D" },
+ "⧫": { "codepoints": [10731], "characters": "\u29EB" },
+ "▪": { "codepoints": [9642], "characters": "\u25AA" },
+ "▴": { "codepoints": [9652], "characters": "\u25B4" },
+ "▾": { "codepoints": [9662], "characters": "\u25BE" },
+ "◂": { "codepoints": [9666], "characters": "\u25C2" },
+ "▸": { "codepoints": [9656], "characters": "\u25B8" },
+ "␣": { "codepoints": [9251], "characters": "\u2423" },
+ "▒": { "codepoints": [9618], "characters": "\u2592" },
+ "░": { "codepoints": [9617], "characters": "\u2591" },
+ "▓": { "codepoints": [9619], "characters": "\u2593" },
+ "█": { "codepoints": [9608], "characters": "\u2588" },
+ "=⃥": { "codepoints": [61, 8421], "characters": "\u003D\u20E5" },
+ "≡⃥": { "codepoints": [8801, 8421], "characters": "\u2261\u20E5" },
+ "⌐": { "codepoints": [8976], "characters": "\u2310" },
+ "𝕓": { "codepoints": [120147], "characters": "\uD835\uDD53" },
+ "⊥": { "codepoints": [8869], "characters": "\u22A5" },
+ "⊥": { "codepoints": [8869], "characters": "\u22A5" },
+ "⋈": { "codepoints": [8904], "characters": "\u22C8" },
+ "╗": { "codepoints": [9559], "characters": "\u2557" },
+ "╔": { "codepoints": [9556], "characters": "\u2554" },
+ "╖": { "codepoints": [9558], "characters": "\u2556" },
+ "╓": { "codepoints": [9555], "characters": "\u2553" },
+ "═": { "codepoints": [9552], "characters": "\u2550" },
+ "╦": { "codepoints": [9574], "characters": "\u2566" },
+ "╩": { "codepoints": [9577], "characters": "\u2569" },
+ "╤": { "codepoints": [9572], "characters": "\u2564" },
+ "╧": { "codepoints": [9575], "characters": "\u2567" },
+ "╝": { "codepoints": [9565], "characters": "\u255D" },
+ "╚": { "codepoints": [9562], "characters": "\u255A" },
+ "╜": { "codepoints": [9564], "characters": "\u255C" },
+ "╙": { "codepoints": [9561], "characters": "\u2559" },
+ "║": { "codepoints": [9553], "characters": "\u2551" },
+ "╬": { "codepoints": [9580], "characters": "\u256C" },
+ "╣": { "codepoints": [9571], "characters": "\u2563" },
+ "╠": { "codepoints": [9568], "characters": "\u2560" },
+ "╫": { "codepoints": [9579], "characters": "\u256B" },
+ "╢": { "codepoints": [9570], "characters": "\u2562" },
+ "╟": { "codepoints": [9567], "characters": "\u255F" },
+ "⧉": { "codepoints": [10697], "characters": "\u29C9" },
+ "╕": { "codepoints": [9557], "characters": "\u2555" },
+ "╒": { "codepoints": [9554], "characters": "\u2552" },
+ "┐": { "codepoints": [9488], "characters": "\u2510" },
+ "┌": { "codepoints": [9484], "characters": "\u250C" },
+ "─": { "codepoints": [9472], "characters": "\u2500" },
+ "╥": { "codepoints": [9573], "characters": "\u2565" },
+ "╨": { "codepoints": [9576], "characters": "\u2568" },
+ "┬": { "codepoints": [9516], "characters": "\u252C" },
+ "┴": { "codepoints": [9524], "characters": "\u2534" },
+ "⊟": { "codepoints": [8863], "characters": "\u229F" },
+ "⊞": { "codepoints": [8862], "characters": "\u229E" },
+ "⊠": { "codepoints": [8864], "characters": "\u22A0" },
+ "╛": { "codepoints": [9563], "characters": "\u255B" },
+ "╘": { "codepoints": [9560], "characters": "\u2558" },
+ "┘": { "codepoints": [9496], "characters": "\u2518" },
+ "└": { "codepoints": [9492], "characters": "\u2514" },
+ "│": { "codepoints": [9474], "characters": "\u2502" },
+ "╪": { "codepoints": [9578], "characters": "\u256A" },
+ "╡": { "codepoints": [9569], "characters": "\u2561" },
+ "╞": { "codepoints": [9566], "characters": "\u255E" },
+ "┼": { "codepoints": [9532], "characters": "\u253C" },
+ "┤": { "codepoints": [9508], "characters": "\u2524" },
+ "├": { "codepoints": [9500], "characters": "\u251C" },
+ "‵": { "codepoints": [8245], "characters": "\u2035" },
+ "˘": { "codepoints": [728], "characters": "\u02D8" },
+ "¦": { "codepoints": [166], "characters": "\u00A6" },
+ "¦": { "codepoints": [166], "characters": "\u00A6" },
+ "𝒷": { "codepoints": [119991], "characters": "\uD835\uDCB7" },
+ "⁏": { "codepoints": [8271], "characters": "\u204F" },
+ "∽": { "codepoints": [8765], "characters": "\u223D" },
+ "⋍": { "codepoints": [8909], "characters": "\u22CD" },
+ "\": { "codepoints": [92], "characters": "\u005C" },
+ "⧅": { "codepoints": [10693], "characters": "\u29C5" },
+ "⟈": { "codepoints": [10184], "characters": "\u27C8" },
+ "•": { "codepoints": [8226], "characters": "\u2022" },
+ "•": { "codepoints": [8226], "characters": "\u2022" },
+ "≎": { "codepoints": [8782], "characters": "\u224E" },
+ "⪮": { "codepoints": [10926], "characters": "\u2AAE" },
+ "≏": { "codepoints": [8783], "characters": "\u224F" },
+ "≏": { "codepoints": [8783], "characters": "\u224F" },
+ "ć": { "codepoints": [263], "characters": "\u0107" },
+ "∩": { "codepoints": [8745], "characters": "\u2229" },
+ "⩄": { "codepoints": [10820], "characters": "\u2A44" },
+ "⩉": { "codepoints": [10825], "characters": "\u2A49" },
+ "⩋": { "codepoints": [10827], "characters": "\u2A4B" },
+ "⩇": { "codepoints": [10823], "characters": "\u2A47" },
+ "⩀": { "codepoints": [10816], "characters": "\u2A40" },
+ "∩︀": { "codepoints": [8745, 65024], "characters": "\u2229\uFE00" },
+ "⁁": { "codepoints": [8257], "characters": "\u2041" },
+ "ˇ": { "codepoints": [711], "characters": "\u02C7" },
+ "⩍": { "codepoints": [10829], "characters": "\u2A4D" },
+ "č": { "codepoints": [269], "characters": "\u010D" },
+ "ç": { "codepoints": [231], "characters": "\u00E7" },
+ "ç": { "codepoints": [231], "characters": "\u00E7" },
+ "ĉ": { "codepoints": [265], "characters": "\u0109" },
+ "⩌": { "codepoints": [10828], "characters": "\u2A4C" },
+ "⩐": { "codepoints": [10832], "characters": "\u2A50" },
+ "ċ": { "codepoints": [267], "characters": "\u010B" },
+ "¸": { "codepoints": [184], "characters": "\u00B8" },
+ "¸": { "codepoints": [184], "characters": "\u00B8" },
+ "⦲": { "codepoints": [10674], "characters": "\u29B2" },
+ "¢": { "codepoints": [162], "characters": "\u00A2" },
+ "¢": { "codepoints": [162], "characters": "\u00A2" },
+ "·": { "codepoints": [183], "characters": "\u00B7" },
+ "𝔠": { "codepoints": [120096], "characters": "\uD835\uDD20" },
+ "ч": { "codepoints": [1095], "characters": "\u0447" },
+ "✓": { "codepoints": [10003], "characters": "\u2713" },
+ "✓": { "codepoints": [10003], "characters": "\u2713" },
+ "χ": { "codepoints": [967], "characters": "\u03C7" },
+ "○": { "codepoints": [9675], "characters": "\u25CB" },
+ "⧃": { "codepoints": [10691], "characters": "\u29C3" },
+ "ˆ": { "codepoints": [710], "characters": "\u02C6" },
+ "≗": { "codepoints": [8791], "characters": "\u2257" },
+ "↺": { "codepoints": [8634], "characters": "\u21BA" },
+ "↻": { "codepoints": [8635], "characters": "\u21BB" },
+ "®": { "codepoints": [174], "characters": "\u00AE" },
+ "Ⓢ": { "codepoints": [9416], "characters": "\u24C8" },
+ "⊛": { "codepoints": [8859], "characters": "\u229B" },
+ "⊚": { "codepoints": [8858], "characters": "\u229A" },
+ "⊝": { "codepoints": [8861], "characters": "\u229D" },
+ "≗": { "codepoints": [8791], "characters": "\u2257" },
+ "⨐": { "codepoints": [10768], "characters": "\u2A10" },
+ "⫯": { "codepoints": [10991], "characters": "\u2AEF" },
+ "⧂": { "codepoints": [10690], "characters": "\u29C2" },
+ "♣": { "codepoints": [9827], "characters": "\u2663" },
+ "♣": { "codepoints": [9827], "characters": "\u2663" },
+ ":": { "codepoints": [58], "characters": "\u003A" },
+ "≔": { "codepoints": [8788], "characters": "\u2254" },
+ "≔": { "codepoints": [8788], "characters": "\u2254" },
+ ",": { "codepoints": [44], "characters": "\u002C" },
+ "@": { "codepoints": [64], "characters": "\u0040" },
+ "∁": { "codepoints": [8705], "characters": "\u2201" },
+ "∘": { "codepoints": [8728], "characters": "\u2218" },
+ "∁": { "codepoints": [8705], "characters": "\u2201" },
+ "ℂ": { "codepoints": [8450], "characters": "\u2102" },
+ "≅": { "codepoints": [8773], "characters": "\u2245" },
+ "⩭": { "codepoints": [10861], "characters": "\u2A6D" },
+ "∮": { "codepoints": [8750], "characters": "\u222E" },
+ "𝕔": { "codepoints": [120148], "characters": "\uD835\uDD54" },
+ "∐": { "codepoints": [8720], "characters": "\u2210" },
+ "©": { "codepoints": [169], "characters": "\u00A9" },
+ "©": { "codepoints": [169], "characters": "\u00A9" },
+ "℗": { "codepoints": [8471], "characters": "\u2117" },
+ "↵": { "codepoints": [8629], "characters": "\u21B5" },
+ "✗": { "codepoints": [10007], "characters": "\u2717" },
+ "𝒸": { "codepoints": [119992], "characters": "\uD835\uDCB8" },
+ "⫏": { "codepoints": [10959], "characters": "\u2ACF" },
+ "⫑": { "codepoints": [10961], "characters": "\u2AD1" },
+ "⫐": { "codepoints": [10960], "characters": "\u2AD0" },
+ "⫒": { "codepoints": [10962], "characters": "\u2AD2" },
+ "⋯": { "codepoints": [8943], "characters": "\u22EF" },
+ "⤸": { "codepoints": [10552], "characters": "\u2938" },
+ "⤵": { "codepoints": [10549], "characters": "\u2935" },
+ "⋞": { "codepoints": [8926], "characters": "\u22DE" },
+ "⋟": { "codepoints": [8927], "characters": "\u22DF" },
+ "↶": { "codepoints": [8630], "characters": "\u21B6" },
+ "⤽": { "codepoints": [10557], "characters": "\u293D" },
+ "∪": { "codepoints": [8746], "characters": "\u222A" },
+ "⩈": { "codepoints": [10824], "characters": "\u2A48" },
+ "⩆": { "codepoints": [10822], "characters": "\u2A46" },
+ "⩊": { "codepoints": [10826], "characters": "\u2A4A" },
+ "⊍": { "codepoints": [8845], "characters": "\u228D" },
+ "⩅": { "codepoints": [10821], "characters": "\u2A45" },
+ "∪︀": { "codepoints": [8746, 65024], "characters": "\u222A\uFE00" },
+ "↷": { "codepoints": [8631], "characters": "\u21B7" },
+ "⤼": { "codepoints": [10556], "characters": "\u293C" },
+ "⋞": { "codepoints": [8926], "characters": "\u22DE" },
+ "⋟": { "codepoints": [8927], "characters": "\u22DF" },
+ "⋎": { "codepoints": [8910], "characters": "\u22CE" },
+ "⋏": { "codepoints": [8911], "characters": "\u22CF" },
+ "¤": { "codepoints": [164], "characters": "\u00A4" },
+ "¤": { "codepoints": [164], "characters": "\u00A4" },
+ "↶": { "codepoints": [8630], "characters": "\u21B6" },
+ "↷": { "codepoints": [8631], "characters": "\u21B7" },
+ "⋎": { "codepoints": [8910], "characters": "\u22CE" },
+ "⋏": { "codepoints": [8911], "characters": "\u22CF" },
+ "∲": { "codepoints": [8754], "characters": "\u2232" },
+ "∱": { "codepoints": [8753], "characters": "\u2231" },
+ "⌭": { "codepoints": [9005], "characters": "\u232D" },
+ "⇓": { "codepoints": [8659], "characters": "\u21D3" },
+ "⥥": { "codepoints": [10597], "characters": "\u2965" },
+ "†": { "codepoints": [8224], "characters": "\u2020" },
+ "ℸ": { "codepoints": [8504], "characters": "\u2138" },
+ "↓": { "codepoints": [8595], "characters": "\u2193" },
+ "‐": { "codepoints": [8208], "characters": "\u2010" },
+ "⊣": { "codepoints": [8867], "characters": "\u22A3" },
+ "⤏": { "codepoints": [10511], "characters": "\u290F" },
+ "˝": { "codepoints": [733], "characters": "\u02DD" },
+ "ď": { "codepoints": [271], "characters": "\u010F" },
+ "д": { "codepoints": [1076], "characters": "\u0434" },
+ "ⅆ": { "codepoints": [8518], "characters": "\u2146" },
+ "‡": { "codepoints": [8225], "characters": "\u2021" },
+ "⇊": { "codepoints": [8650], "characters": "\u21CA" },
+ "⩷": { "codepoints": [10871], "characters": "\u2A77" },
+ "°": { "codepoints": [176], "characters": "\u00B0" },
+ "°": { "codepoints": [176], "characters": "\u00B0" },
+ "δ": { "codepoints": [948], "characters": "\u03B4" },
+ "⦱": { "codepoints": [10673], "characters": "\u29B1" },
+ "⥿": { "codepoints": [10623], "characters": "\u297F" },
+ "𝔡": { "codepoints": [120097], "characters": "\uD835\uDD21" },
+ "⇃": { "codepoints": [8643], "characters": "\u21C3" },
+ "⇂": { "codepoints": [8642], "characters": "\u21C2" },
+ "⋄": { "codepoints": [8900], "characters": "\u22C4" },
+ "⋄": { "codepoints": [8900], "characters": "\u22C4" },
+ "♦": { "codepoints": [9830], "characters": "\u2666" },
+ "♦": { "codepoints": [9830], "characters": "\u2666" },
+ "¨": { "codepoints": [168], "characters": "\u00A8" },
+ "ϝ": { "codepoints": [989], "characters": "\u03DD" },
+ "⋲": { "codepoints": [8946], "characters": "\u22F2" },
+ "÷": { "codepoints": [247], "characters": "\u00F7" },
+ "÷": { "codepoints": [247], "characters": "\u00F7" },
+ "÷": { "codepoints": [247], "characters": "\u00F7" },
+ "⋇": { "codepoints": [8903], "characters": "\u22C7" },
+ "⋇": { "codepoints": [8903], "characters": "\u22C7" },
+ "ђ": { "codepoints": [1106], "characters": "\u0452" },
+ "⌞": { "codepoints": [8990], "characters": "\u231E" },
+ "⌍": { "codepoints": [8973], "characters": "\u230D" },
+ "$": { "codepoints": [36], "characters": "\u0024" },
+ "𝕕": { "codepoints": [120149], "characters": "\uD835\uDD55" },
+ "˙": { "codepoints": [729], "characters": "\u02D9" },
+ "≐": { "codepoints": [8784], "characters": "\u2250" },
+ "≑": { "codepoints": [8785], "characters": "\u2251" },
+ "∸": { "codepoints": [8760], "characters": "\u2238" },
+ "∔": { "codepoints": [8724], "characters": "\u2214" },
+ "⊡": { "codepoints": [8865], "characters": "\u22A1" },
+ "⌆": { "codepoints": [8966], "characters": "\u2306" },
+ "↓": { "codepoints": [8595], "characters": "\u2193" },
+ "⇊": { "codepoints": [8650], "characters": "\u21CA" },
+ "⇃": { "codepoints": [8643], "characters": "\u21C3" },
+ "⇂": { "codepoints": [8642], "characters": "\u21C2" },
+ "⤐": { "codepoints": [10512], "characters": "\u2910" },
+ "⌟": { "codepoints": [8991], "characters": "\u231F" },
+ "⌌": { "codepoints": [8972], "characters": "\u230C" },
+ "𝒹": { "codepoints": [119993], "characters": "\uD835\uDCB9" },
+ "ѕ": { "codepoints": [1109], "characters": "\u0455" },
+ "⧶": { "codepoints": [10742], "characters": "\u29F6" },
+ "đ": { "codepoints": [273], "characters": "\u0111" },
+ "⋱": { "codepoints": [8945], "characters": "\u22F1" },
+ "▿": { "codepoints": [9663], "characters": "\u25BF" },
+ "▾": { "codepoints": [9662], "characters": "\u25BE" },
+ "⇵": { "codepoints": [8693], "characters": "\u21F5" },
+ "⥯": { "codepoints": [10607], "characters": "\u296F" },
+ "⦦": { "codepoints": [10662], "characters": "\u29A6" },
+ "џ": { "codepoints": [1119], "characters": "\u045F" },
+ "⟿": { "codepoints": [10239], "characters": "\u27FF" },
+ "⩷": { "codepoints": [10871], "characters": "\u2A77" },
+ "≑": { "codepoints": [8785], "characters": "\u2251" },
+ "é": { "codepoints": [233], "characters": "\u00E9" },
+ "é": { "codepoints": [233], "characters": "\u00E9" },
+ "⩮": { "codepoints": [10862], "characters": "\u2A6E" },
+ "ě": { "codepoints": [283], "characters": "\u011B" },
+ "≖": { "codepoints": [8790], "characters": "\u2256" },
+ "ê": { "codepoints": [234], "characters": "\u00EA" },
+ "ê": { "codepoints": [234], "characters": "\u00EA" },
+ "≕": { "codepoints": [8789], "characters": "\u2255" },
+ "э": { "codepoints": [1101], "characters": "\u044D" },
+ "ė": { "codepoints": [279], "characters": "\u0117" },
+ "ⅇ": { "codepoints": [8519], "characters": "\u2147" },
+ "≒": { "codepoints": [8786], "characters": "\u2252" },
+ "𝔢": { "codepoints": [120098], "characters": "\uD835\uDD22" },
+ "⪚": { "codepoints": [10906], "characters": "\u2A9A" },
+ "è": { "codepoints": [232], "characters": "\u00E8" },
+ "è": { "codepoints": [232], "characters": "\u00E8" },
+ "⪖": { "codepoints": [10902], "characters": "\u2A96" },
+ "⪘": { "codepoints": [10904], "characters": "\u2A98" },
+ "⪙": { "codepoints": [10905], "characters": "\u2A99" },
+ "⏧": { "codepoints": [9191], "characters": "\u23E7" },
+ "ℓ": { "codepoints": [8467], "characters": "\u2113" },
+ "⪕": { "codepoints": [10901], "characters": "\u2A95" },
+ "⪗": { "codepoints": [10903], "characters": "\u2A97" },
+ "ē": { "codepoints": [275], "characters": "\u0113" },
+ "∅": { "codepoints": [8709], "characters": "\u2205" },
+ "∅": { "codepoints": [8709], "characters": "\u2205" },
+ "∅": { "codepoints": [8709], "characters": "\u2205" },
+ " ": { "codepoints": [8196], "characters": "\u2004" },
+ " ": { "codepoints": [8197], "characters": "\u2005" },
+ " ": { "codepoints": [8195], "characters": "\u2003" },
+ "ŋ": { "codepoints": [331], "characters": "\u014B" },
+ " ": { "codepoints": [8194], "characters": "\u2002" },
+ "ę": { "codepoints": [281], "characters": "\u0119" },
+ "𝕖": { "codepoints": [120150], "characters": "\uD835\uDD56" },
+ "⋕": { "codepoints": [8917], "characters": "\u22D5" },
+ "⧣": { "codepoints": [10723], "characters": "\u29E3" },
+ "⩱": { "codepoints": [10865], "characters": "\u2A71" },
+ "ε": { "codepoints": [949], "characters": "\u03B5" },
+ "ε": { "codepoints": [949], "characters": "\u03B5" },
+ "ϵ": { "codepoints": [1013], "characters": "\u03F5" },
+ "≖": { "codepoints": [8790], "characters": "\u2256" },
+ "≕": { "codepoints": [8789], "characters": "\u2255" },
+ "≂": { "codepoints": [8770], "characters": "\u2242" },
+ "⪖": { "codepoints": [10902], "characters": "\u2A96" },
+ "⪕": { "codepoints": [10901], "characters": "\u2A95" },
+ "=": { "codepoints": [61], "characters": "\u003D" },
+ "≟": { "codepoints": [8799], "characters": "\u225F" },
+ "≡": { "codepoints": [8801], "characters": "\u2261" },
+ "⩸": { "codepoints": [10872], "characters": "\u2A78" },
+ "⧥": { "codepoints": [10725], "characters": "\u29E5" },
+ "≓": { "codepoints": [8787], "characters": "\u2253" },
+ "⥱": { "codepoints": [10609], "characters": "\u2971" },
+ "ℯ": { "codepoints": [8495], "characters": "\u212F" },
+ "≐": { "codepoints": [8784], "characters": "\u2250" },
+ "≂": { "codepoints": [8770], "characters": "\u2242" },
+ "η": { "codepoints": [951], "characters": "\u03B7" },
+ "ð": { "codepoints": [240], "characters": "\u00F0" },
+ "ð": { "codepoints": [240], "characters": "\u00F0" },
+ "ë": { "codepoints": [235], "characters": "\u00EB" },
+ "ë": { "codepoints": [235], "characters": "\u00EB" },
+ "€": { "codepoints": [8364], "characters": "\u20AC" },
+ "!": { "codepoints": [33], "characters": "\u0021" },
+ "∃": { "codepoints": [8707], "characters": "\u2203" },
+ "ℰ": { "codepoints": [8496], "characters": "\u2130" },
+ "ⅇ": { "codepoints": [8519], "characters": "\u2147" },
+ "≒": { "codepoints": [8786], "characters": "\u2252" },
+ "ф": { "codepoints": [1092], "characters": "\u0444" },
+ "♀": { "codepoints": [9792], "characters": "\u2640" },
+ "ffi": { "codepoints": [64259], "characters": "\uFB03" },
+ "ff": { "codepoints": [64256], "characters": "\uFB00" },
+ "ffl": { "codepoints": [64260], "characters": "\uFB04" },
+ "𝔣": { "codepoints": [120099], "characters": "\uD835\uDD23" },
+ "fi": { "codepoints": [64257], "characters": "\uFB01" },
+ "fj": { "codepoints": [102, 106], "characters": "\u0066\u006A" },
+ "♭": { "codepoints": [9837], "characters": "\u266D" },
+ "fl": { "codepoints": [64258], "characters": "\uFB02" },
+ "▱": { "codepoints": [9649], "characters": "\u25B1" },
+ "ƒ": { "codepoints": [402], "characters": "\u0192" },
+ "𝕗": { "codepoints": [120151], "characters": "\uD835\uDD57" },
+ "∀": { "codepoints": [8704], "characters": "\u2200" },
+ "⋔": { "codepoints": [8916], "characters": "\u22D4" },
+ "⫙": { "codepoints": [10969], "characters": "\u2AD9" },
+ "⨍": { "codepoints": [10765], "characters": "\u2A0D" },
+ "½": { "codepoints": [189], "characters": "\u00BD" },
+ "½": { "codepoints": [189], "characters": "\u00BD" },
+ "⅓": { "codepoints": [8531], "characters": "\u2153" },
+ "¼": { "codepoints": [188], "characters": "\u00BC" },
+ "¼": { "codepoints": [188], "characters": "\u00BC" },
+ "⅕": { "codepoints": [8533], "characters": "\u2155" },
+ "⅙": { "codepoints": [8537], "characters": "\u2159" },
+ "⅛": { "codepoints": [8539], "characters": "\u215B" },
+ "⅔": { "codepoints": [8532], "characters": "\u2154" },
+ "⅖": { "codepoints": [8534], "characters": "\u2156" },
+ "¾": { "codepoints": [190], "characters": "\u00BE" },
+ "¾": { "codepoints": [190], "characters": "\u00BE" },
+ "⅗": { "codepoints": [8535], "characters": "\u2157" },
+ "⅜": { "codepoints": [8540], "characters": "\u215C" },
+ "⅘": { "codepoints": [8536], "characters": "\u2158" },
+ "⅚": { "codepoints": [8538], "characters": "\u215A" },
+ "⅝": { "codepoints": [8541], "characters": "\u215D" },
+ "⅞": { "codepoints": [8542], "characters": "\u215E" },
+ "⁄": { "codepoints": [8260], "characters": "\u2044" },
+ "⌢": { "codepoints": [8994], "characters": "\u2322" },
+ "𝒻": { "codepoints": [119995], "characters": "\uD835\uDCBB" },
+ "≧": { "codepoints": [8807], "characters": "\u2267" },
+ "⪌": { "codepoints": [10892], "characters": "\u2A8C" },
+ "ǵ": { "codepoints": [501], "characters": "\u01F5" },
+ "γ": { "codepoints": [947], "characters": "\u03B3" },
+ "ϝ": { "codepoints": [989], "characters": "\u03DD" },
+ "⪆": { "codepoints": [10886], "characters": "\u2A86" },
+ "ğ": { "codepoints": [287], "characters": "\u011F" },
+ "ĝ": { "codepoints": [285], "characters": "\u011D" },
+ "г": { "codepoints": [1075], "characters": "\u0433" },
+ "ġ": { "codepoints": [289], "characters": "\u0121" },
+ "≥": { "codepoints": [8805], "characters": "\u2265" },
+ "⋛": { "codepoints": [8923], "characters": "\u22DB" },
+ "≥": { "codepoints": [8805], "characters": "\u2265" },
+ "≧": { "codepoints": [8807], "characters": "\u2267" },
+ "⩾": { "codepoints": [10878], "characters": "\u2A7E" },
+ "⩾": { "codepoints": [10878], "characters": "\u2A7E" },
+ "⪩": { "codepoints": [10921], "characters": "\u2AA9" },
+ "⪀": { "codepoints": [10880], "characters": "\u2A80" },
+ "⪂": { "codepoints": [10882], "characters": "\u2A82" },
+ "⪄": { "codepoints": [10884], "characters": "\u2A84" },
+ "⋛︀": { "codepoints": [8923, 65024], "characters": "\u22DB\uFE00" },
+ "⪔": { "codepoints": [10900], "characters": "\u2A94" },
+ "𝔤": { "codepoints": [120100], "characters": "\uD835\uDD24" },
+ "≫": { "codepoints": [8811], "characters": "\u226B" },
+ "⋙": { "codepoints": [8921], "characters": "\u22D9" },
+ "ℷ": { "codepoints": [8503], "characters": "\u2137" },
+ "ѓ": { "codepoints": [1107], "characters": "\u0453" },
+ "≷": { "codepoints": [8823], "characters": "\u2277" },
+ "⪒": { "codepoints": [10898], "characters": "\u2A92" },
+ "⪥": { "codepoints": [10917], "characters": "\u2AA5" },
+ "⪤": { "codepoints": [10916], "characters": "\u2AA4" },
+ "≩": { "codepoints": [8809], "characters": "\u2269" },
+ "⪊": { "codepoints": [10890], "characters": "\u2A8A" },
+ "⪊": { "codepoints": [10890], "characters": "\u2A8A" },
+ "⪈": { "codepoints": [10888], "characters": "\u2A88" },
+ "⪈": { "codepoints": [10888], "characters": "\u2A88" },
+ "≩": { "codepoints": [8809], "characters": "\u2269" },
+ "⋧": { "codepoints": [8935], "characters": "\u22E7" },
+ "𝕘": { "codepoints": [120152], "characters": "\uD835\uDD58" },
+ "`": { "codepoints": [96], "characters": "\u0060" },
+ "ℊ": { "codepoints": [8458], "characters": "\u210A" },
+ "≳": { "codepoints": [8819], "characters": "\u2273" },
+ "⪎": { "codepoints": [10894], "characters": "\u2A8E" },
+ "⪐": { "codepoints": [10896], "characters": "\u2A90" },
+ ">": { "codepoints": [62], "characters": "\u003E" },
+ ">": { "codepoints": [62], "characters": "\u003E" },
+ "⪧": { "codepoints": [10919], "characters": "\u2AA7" },
+ "⩺": { "codepoints": [10874], "characters": "\u2A7A" },
+ "⋗": { "codepoints": [8919], "characters": "\u22D7" },
+ "⦕": { "codepoints": [10645], "characters": "\u2995" },
+ "⩼": { "codepoints": [10876], "characters": "\u2A7C" },
+ "⪆": { "codepoints": [10886], "characters": "\u2A86" },
+ "⥸": { "codepoints": [10616], "characters": "\u2978" },
+ "⋗": { "codepoints": [8919], "characters": "\u22D7" },
+ "⋛": { "codepoints": [8923], "characters": "\u22DB" },
+ "⪌": { "codepoints": [10892], "characters": "\u2A8C" },
+ "≷": { "codepoints": [8823], "characters": "\u2277" },
+ "≳": { "codepoints": [8819], "characters": "\u2273" },
+ "≩︀": { "codepoints": [8809, 65024], "characters": "\u2269\uFE00" },
+ "≩︀": { "codepoints": [8809, 65024], "characters": "\u2269\uFE00" },
+ "⇔": { "codepoints": [8660], "characters": "\u21D4" },
+ " ": { "codepoints": [8202], "characters": "\u200A" },
+ "½": { "codepoints": [189], "characters": "\u00BD" },
+ "ℋ": { "codepoints": [8459], "characters": "\u210B" },
+ "ъ": { "codepoints": [1098], "characters": "\u044A" },
+ "↔": { "codepoints": [8596], "characters": "\u2194" },
+ "⥈": { "codepoints": [10568], "characters": "\u2948" },
+ "↭": { "codepoints": [8621], "characters": "\u21AD" },
+ "ℏ": { "codepoints": [8463], "characters": "\u210F" },
+ "ĥ": { "codepoints": [293], "characters": "\u0125" },
+ "♥": { "codepoints": [9829], "characters": "\u2665" },
+ "♥": { "codepoints": [9829], "characters": "\u2665" },
+ "…": { "codepoints": [8230], "characters": "\u2026" },
+ "⊹": { "codepoints": [8889], "characters": "\u22B9" },
+ "𝔥": { "codepoints": [120101], "characters": "\uD835\uDD25" },
+ "⤥": { "codepoints": [10533], "characters": "\u2925" },
+ "⤦": { "codepoints": [10534], "characters": "\u2926" },
+ "⇿": { "codepoints": [8703], "characters": "\u21FF" },
+ "∻": { "codepoints": [8763], "characters": "\u223B" },
+ "↩": { "codepoints": [8617], "characters": "\u21A9" },
+ "↪": { "codepoints": [8618], "characters": "\u21AA" },
+ "𝕙": { "codepoints": [120153], "characters": "\uD835\uDD59" },
+ "―": { "codepoints": [8213], "characters": "\u2015" },
+ "𝒽": { "codepoints": [119997], "characters": "\uD835\uDCBD" },
+ "ℏ": { "codepoints": [8463], "characters": "\u210F" },
+ "ħ": { "codepoints": [295], "characters": "\u0127" },
+ "⁃": { "codepoints": [8259], "characters": "\u2043" },
+ "‐": { "codepoints": [8208], "characters": "\u2010" },
+ "í": { "codepoints": [237], "characters": "\u00ED" },
+ "í": { "codepoints": [237], "characters": "\u00ED" },
+ "⁣": { "codepoints": [8291], "characters": "\u2063" },
+ "î": { "codepoints": [238], "characters": "\u00EE" },
+ "î": { "codepoints": [238], "characters": "\u00EE" },
+ "и": { "codepoints": [1080], "characters": "\u0438" },
+ "е": { "codepoints": [1077], "characters": "\u0435" },
+ "¡": { "codepoints": [161], "characters": "\u00A1" },
+ "¡": { "codepoints": [161], "characters": "\u00A1" },
+ "⇔": { "codepoints": [8660], "characters": "\u21D4" },
+ "𝔦": { "codepoints": [120102], "characters": "\uD835\uDD26" },
+ "ì": { "codepoints": [236], "characters": "\u00EC" },
+ "ì": { "codepoints": [236], "characters": "\u00EC" },
+ "ⅈ": { "codepoints": [8520], "characters": "\u2148" },
+ "⨌": { "codepoints": [10764], "characters": "\u2A0C" },
+ "∭": { "codepoints": [8749], "characters": "\u222D" },
+ "⧜": { "codepoints": [10716], "characters": "\u29DC" },
+ "℩": { "codepoints": [8489], "characters": "\u2129" },
+ "ij": { "codepoints": [307], "characters": "\u0133" },
+ "ī": { "codepoints": [299], "characters": "\u012B" },
+ "ℑ": { "codepoints": [8465], "characters": "\u2111" },
+ "ℐ": { "codepoints": [8464], "characters": "\u2110" },
+ "ℑ": { "codepoints": [8465], "characters": "\u2111" },
+ "ı": { "codepoints": [305], "characters": "\u0131" },
+ "⊷": { "codepoints": [8887], "characters": "\u22B7" },
+ "Ƶ": { "codepoints": [437], "characters": "\u01B5" },
+ "∈": { "codepoints": [8712], "characters": "\u2208" },
+ "℅": { "codepoints": [8453], "characters": "\u2105" },
+ "∞": { "codepoints": [8734], "characters": "\u221E" },
+ "⧝": { "codepoints": [10717], "characters": "\u29DD" },
+ "ı": { "codepoints": [305], "characters": "\u0131" },
+ "∫": { "codepoints": [8747], "characters": "\u222B" },
+ "⊺": { "codepoints": [8890], "characters": "\u22BA" },
+ "ℤ": { "codepoints": [8484], "characters": "\u2124" },
+ "⊺": { "codepoints": [8890], "characters": "\u22BA" },
+ "⨗": { "codepoints": [10775], "characters": "\u2A17" },
+ "⨼": { "codepoints": [10812], "characters": "\u2A3C" },
+ "ё": { "codepoints": [1105], "characters": "\u0451" },
+ "į": { "codepoints": [303], "characters": "\u012F" },
+ "𝕚": { "codepoints": [120154], "characters": "\uD835\uDD5A" },
+ "ι": { "codepoints": [953], "characters": "\u03B9" },
+ "⨼": { "codepoints": [10812], "characters": "\u2A3C" },
+ "¿": { "codepoints": [191], "characters": "\u00BF" },
+ "¿": { "codepoints": [191], "characters": "\u00BF" },
+ "𝒾": { "codepoints": [119998], "characters": "\uD835\uDCBE" },
+ "∈": { "codepoints": [8712], "characters": "\u2208" },
+ "⋹": { "codepoints": [8953], "characters": "\u22F9" },
+ "⋵": { "codepoints": [8949], "characters": "\u22F5" },
+ "⋴": { "codepoints": [8948], "characters": "\u22F4" },
+ "⋳": { "codepoints": [8947], "characters": "\u22F3" },
+ "∈": { "codepoints": [8712], "characters": "\u2208" },
+ "⁢": { "codepoints": [8290], "characters": "\u2062" },
+ "ĩ": { "codepoints": [297], "characters": "\u0129" },
+ "і": { "codepoints": [1110], "characters": "\u0456" },
+ "ï": { "codepoints": [239], "characters": "\u00EF" },
+ "ï": { "codepoints": [239], "characters": "\u00EF" },
+ "ĵ": { "codepoints": [309], "characters": "\u0135" },
+ "й": { "codepoints": [1081], "characters": "\u0439" },
+ "𝔧": { "codepoints": [120103], "characters": "\uD835\uDD27" },
+ "ȷ": { "codepoints": [567], "characters": "\u0237" },
+ "𝕛": { "codepoints": [120155], "characters": "\uD835\uDD5B" },
+ "𝒿": { "codepoints": [119999], "characters": "\uD835\uDCBF" },
+ "ј": { "codepoints": [1112], "characters": "\u0458" },
+ "є": { "codepoints": [1108], "characters": "\u0454" },
+ "κ": { "codepoints": [954], "characters": "\u03BA" },
+ "ϰ": { "codepoints": [1008], "characters": "\u03F0" },
+ "ķ": { "codepoints": [311], "characters": "\u0137" },
+ "к": { "codepoints": [1082], "characters": "\u043A" },
+ "𝔨": { "codepoints": [120104], "characters": "\uD835\uDD28" },
+ "ĸ": { "codepoints": [312], "characters": "\u0138" },
+ "х": { "codepoints": [1093], "characters": "\u0445" },
+ "ќ": { "codepoints": [1116], "characters": "\u045C" },
+ "𝕜": { "codepoints": [120156], "characters": "\uD835\uDD5C" },
+ "𝓀": { "codepoints": [120000], "characters": "\uD835\uDCC0" },
+ "⇚": { "codepoints": [8666], "characters": "\u21DA" },
+ "⇐": { "codepoints": [8656], "characters": "\u21D0" },
+ "⤛": { "codepoints": [10523], "characters": "\u291B" },
+ "⤎": { "codepoints": [10510], "characters": "\u290E" },
+ "≦": { "codepoints": [8806], "characters": "\u2266" },
+ "⪋": { "codepoints": [10891], "characters": "\u2A8B" },
+ "⥢": { "codepoints": [10594], "characters": "\u2962" },
+ "ĺ": { "codepoints": [314], "characters": "\u013A" },
+ "⦴": { "codepoints": [10676], "characters": "\u29B4" },
+ "ℒ": { "codepoints": [8466], "characters": "\u2112" },
+ "λ": { "codepoints": [955], "characters": "\u03BB" },
+ "〈": { "codepoints": [10216], "characters": "\u27E8" },
+ "⦑": { "codepoints": [10641], "characters": "\u2991" },
+ "⟨": { "codepoints": [10216], "characters": "\u27E8" },
+ "⪅": { "codepoints": [10885], "characters": "\u2A85" },
+ "«": { "codepoints": [171], "characters": "\u00AB" },
+ "«": { "codepoints": [171], "characters": "\u00AB" },
+ "←": { "codepoints": [8592], "characters": "\u2190" },
+ "⇤": { "codepoints": [8676], "characters": "\u21E4" },
+ "⤟": { "codepoints": [10527], "characters": "\u291F" },
+ "⤝": { "codepoints": [10525], "characters": "\u291D" },
+ "↩": { "codepoints": [8617], "characters": "\u21A9" },
+ "↫": { "codepoints": [8619], "characters": "\u21AB" },
+ "⤹": { "codepoints": [10553], "characters": "\u2939" },
+ "⥳": { "codepoints": [10611], "characters": "\u2973" },
+ "↢": { "codepoints": [8610], "characters": "\u21A2" },
+ "⪫": { "codepoints": [10923], "characters": "\u2AAB" },
+ "⤙": { "codepoints": [10521], "characters": "\u2919" },
+ "⪭": { "codepoints": [10925], "characters": "\u2AAD" },
+ "⪭︀": { "codepoints": [10925, 65024], "characters": "\u2AAD\uFE00" },
+ "⤌": { "codepoints": [10508], "characters": "\u290C" },
+ "❲": { "codepoints": [10098], "characters": "\u2772" },
+ "{": { "codepoints": [123], "characters": "\u007B" },
+ "[": { "codepoints": [91], "characters": "\u005B" },
+ "⦋": { "codepoints": [10635], "characters": "\u298B" },
+ "⦏": { "codepoints": [10639], "characters": "\u298F" },
+ "⦍": { "codepoints": [10637], "characters": "\u298D" },
+ "ľ": { "codepoints": [318], "characters": "\u013E" },
+ "ļ": { "codepoints": [316], "characters": "\u013C" },
+ "⌈": { "codepoints": [8968], "characters": "\u2308" },
+ "{": { "codepoints": [123], "characters": "\u007B" },
+ "л": { "codepoints": [1083], "characters": "\u043B" },
+ "⤶": { "codepoints": [10550], "characters": "\u2936" },
+ "“": { "codepoints": [8220], "characters": "\u201C" },
+ "„": { "codepoints": [8222], "characters": "\u201E" },
+ "⥧": { "codepoints": [10599], "characters": "\u2967" },
+ "⥋": { "codepoints": [10571], "characters": "\u294B" },
+ "↲": { "codepoints": [8626], "characters": "\u21B2" },
+ "≤": { "codepoints": [8804], "characters": "\u2264" },
+ "←": { "codepoints": [8592], "characters": "\u2190" },
+ "↢": { "codepoints": [8610], "characters": "\u21A2" },
+ "↽": { "codepoints": [8637], "characters": "\u21BD" },
+ "↼": { "codepoints": [8636], "characters": "\u21BC" },
+ "⇇": { "codepoints": [8647], "characters": "\u21C7" },
+ "↔": { "codepoints": [8596], "characters": "\u2194" },
+ "⇆": { "codepoints": [8646], "characters": "\u21C6" },
+ "⇋": { "codepoints": [8651], "characters": "\u21CB" },
+ "↭": { "codepoints": [8621], "characters": "\u21AD" },
+ "⋋": { "codepoints": [8907], "characters": "\u22CB" },
+ "⋚": { "codepoints": [8922], "characters": "\u22DA" },
+ "≤": { "codepoints": [8804], "characters": "\u2264" },
+ "≦": { "codepoints": [8806], "characters": "\u2266" },
+ "⩽": { "codepoints": [10877], "characters": "\u2A7D" },
+ "⩽": { "codepoints": [10877], "characters": "\u2A7D" },
+ "⪨": { "codepoints": [10920], "characters": "\u2AA8" },
+ "⩿": { "codepoints": [10879], "characters": "\u2A7F" },
+ "⪁": { "codepoints": [10881], "characters": "\u2A81" },
+ "⪃": { "codepoints": [10883], "characters": "\u2A83" },
+ "⋚︀": { "codepoints": [8922, 65024], "characters": "\u22DA\uFE00" },
+ "⪓": { "codepoints": [10899], "characters": "\u2A93" },
+ "⪅": { "codepoints": [10885], "characters": "\u2A85" },
+ "⋖": { "codepoints": [8918], "characters": "\u22D6" },
+ "⋚": { "codepoints": [8922], "characters": "\u22DA" },
+ "⪋": { "codepoints": [10891], "characters": "\u2A8B" },
+ "≶": { "codepoints": [8822], "characters": "\u2276" },
+ "≲": { "codepoints": [8818], "characters": "\u2272" },
+ "⥼": { "codepoints": [10620], "characters": "\u297C" },
+ "⌊": { "codepoints": [8970], "characters": "\u230A" },
+ "𝔩": { "codepoints": [120105], "characters": "\uD835\uDD29" },
+ "≶": { "codepoints": [8822], "characters": "\u2276" },
+ "⪑": { "codepoints": [10897], "characters": "\u2A91" },
+ "↽": { "codepoints": [8637], "characters": "\u21BD" },
+ "↼": { "codepoints": [8636], "characters": "\u21BC" },
+ "⥪": { "codepoints": [10602], "characters": "\u296A" },
+ "▄": { "codepoints": [9604], "characters": "\u2584" },
+ "љ": { "codepoints": [1113], "characters": "\u0459" },
+ "≪": { "codepoints": [8810], "characters": "\u226A" },
+ "⇇": { "codepoints": [8647], "characters": "\u21C7" },
+ "⌞": { "codepoints": [8990], "characters": "\u231E" },
+ "⥫": { "codepoints": [10603], "characters": "\u296B" },
+ "◺": { "codepoints": [9722], "characters": "\u25FA" },
+ "ŀ": { "codepoints": [320], "characters": "\u0140" },
+ "⎰": { "codepoints": [9136], "characters": "\u23B0" },
+ "⎰": { "codepoints": [9136], "characters": "\u23B0" },
+ "≨": { "codepoints": [8808], "characters": "\u2268" },
+ "⪉": { "codepoints": [10889], "characters": "\u2A89" },
+ "⪉": { "codepoints": [10889], "characters": "\u2A89" },
+ "⪇": { "codepoints": [10887], "characters": "\u2A87" },
+ "⪇": { "codepoints": [10887], "characters": "\u2A87" },
+ "≨": { "codepoints": [8808], "characters": "\u2268" },
+ "⋦": { "codepoints": [8934], "characters": "\u22E6" },
+ "⟬": { "codepoints": [10220], "characters": "\u27EC" },
+ "⇽": { "codepoints": [8701], "characters": "\u21FD" },
+ "⟦": { "codepoints": [10214], "characters": "\u27E6" },
+ "⟵": { "codepoints": [10229], "characters": "\u27F5" },
+ "⟷": { "codepoints": [10231], "characters": "\u27F7" },
+ "⟼": { "codepoints": [10236], "characters": "\u27FC" },
+ "⟶": { "codepoints": [10230], "characters": "\u27F6" },
+ "↫": { "codepoints": [8619], "characters": "\u21AB" },
+ "↬": { "codepoints": [8620], "characters": "\u21AC" },
+ "⦅": { "codepoints": [10629], "characters": "\u2985" },
+ "𝕝": { "codepoints": [120157], "characters": "\uD835\uDD5D" },
+ "⨭": { "codepoints": [10797], "characters": "\u2A2D" },
+ "⨴": { "codepoints": [10804], "characters": "\u2A34" },
+ "∗": { "codepoints": [8727], "characters": "\u2217" },
+ "_": { "codepoints": [95], "characters": "\u005F" },
+ "◊": { "codepoints": [9674], "characters": "\u25CA" },
+ "◊": { "codepoints": [9674], "characters": "\u25CA" },
+ "⧫": { "codepoints": [10731], "characters": "\u29EB" },
+ "(": { "codepoints": [40], "characters": "\u0028" },
+ "⦓": { "codepoints": [10643], "characters": "\u2993" },
+ "⇆": { "codepoints": [8646], "characters": "\u21C6" },
+ "⌟": { "codepoints": [8991], "characters": "\u231F" },
+ "⇋": { "codepoints": [8651], "characters": "\u21CB" },
+ "⥭": { "codepoints": [10605], "characters": "\u296D" },
+ "": { "codepoints": [8206], "characters": "\u200E" },
+ "⊿": { "codepoints": [8895], "characters": "\u22BF" },
+ "‹": { "codepoints": [8249], "characters": "\u2039" },
+ "𝓁": { "codepoints": [120001], "characters": "\uD835\uDCC1" },
+ "↰": { "codepoints": [8624], "characters": "\u21B0" },
+ "≲": { "codepoints": [8818], "characters": "\u2272" },
+ "⪍": { "codepoints": [10893], "characters": "\u2A8D" },
+ "⪏": { "codepoints": [10895], "characters": "\u2A8F" },
+ "[": { "codepoints": [91], "characters": "\u005B" },
+ "‘": { "codepoints": [8216], "characters": "\u2018" },
+ "‚": { "codepoints": [8218], "characters": "\u201A" },
+ "ł": { "codepoints": [322], "characters": "\u0142" },
+ "<": { "codepoints": [60], "characters": "\u003C" },
+ "<": { "codepoints": [60], "characters": "\u003C" },
+ "⪦": { "codepoints": [10918], "characters": "\u2AA6" },
+ "⩹": { "codepoints": [10873], "characters": "\u2A79" },
+ "⋖": { "codepoints": [8918], "characters": "\u22D6" },
+ "⋋": { "codepoints": [8907], "characters": "\u22CB" },
+ "⋉": { "codepoints": [8905], "characters": "\u22C9" },
+ "⥶": { "codepoints": [10614], "characters": "\u2976" },
+ "⩻": { "codepoints": [10875], "characters": "\u2A7B" },
+ "⦖": { "codepoints": [10646], "characters": "\u2996" },
+ "◃": { "codepoints": [9667], "characters": "\u25C3" },
+ "⊴": { "codepoints": [8884], "characters": "\u22B4" },
+ "◂": { "codepoints": [9666], "characters": "\u25C2" },
+ "⥊": { "codepoints": [10570], "characters": "\u294A" },
+ "⥦": { "codepoints": [10598], "characters": "\u2966" },
+ "≨︀": { "codepoints": [8808, 65024], "characters": "\u2268\uFE00" },
+ "≨︀": { "codepoints": [8808, 65024], "characters": "\u2268\uFE00" },
+ "∺": { "codepoints": [8762], "characters": "\u223A" },
+ "¯": { "codepoints": [175], "characters": "\u00AF" },
+ "¯": { "codepoints": [175], "characters": "\u00AF" },
+ "♂": { "codepoints": [9794], "characters": "\u2642" },
+ "✠": { "codepoints": [10016], "characters": "\u2720" },
+ "✠": { "codepoints": [10016], "characters": "\u2720" },
+ "↦": { "codepoints": [8614], "characters": "\u21A6" },
+ "↦": { "codepoints": [8614], "characters": "\u21A6" },
+ "↧": { "codepoints": [8615], "characters": "\u21A7" },
+ "↤": { "codepoints": [8612], "characters": "\u21A4" },
+ "↥": { "codepoints": [8613], "characters": "\u21A5" },
+ "▮": { "codepoints": [9646], "characters": "\u25AE" },
+ "⨩": { "codepoints": [10793], "characters": "\u2A29" },
+ "м": { "codepoints": [1084], "characters": "\u043C" },
+ "—": { "codepoints": [8212], "characters": "\u2014" },
+ "∡": { "codepoints": [8737], "characters": "\u2221" },
+ "𝔪": { "codepoints": [120106], "characters": "\uD835\uDD2A" },
+ "℧": { "codepoints": [8487], "characters": "\u2127" },
+ "µ": { "codepoints": [181], "characters": "\u00B5" },
+ "µ": { "codepoints": [181], "characters": "\u00B5" },
+ "∣": { "codepoints": [8739], "characters": "\u2223" },
+ "*": { "codepoints": [42], "characters": "\u002A" },
+ "⫰": { "codepoints": [10992], "characters": "\u2AF0" },
+ "·": { "codepoints": [183], "characters": "\u00B7" },
+ "·": { "codepoints": [183], "characters": "\u00B7" },
+ "−": { "codepoints": [8722], "characters": "\u2212" },
+ "⊟": { "codepoints": [8863], "characters": "\u229F" },
+ "∸": { "codepoints": [8760], "characters": "\u2238" },
+ "⨪": { "codepoints": [10794], "characters": "\u2A2A" },
+ "⫛": { "codepoints": [10971], "characters": "\u2ADB" },
+ "…": { "codepoints": [8230], "characters": "\u2026" },
+ "∓": { "codepoints": [8723], "characters": "\u2213" },
+ "⊧": { "codepoints": [8871], "characters": "\u22A7" },
+ "𝕞": { "codepoints": [120158], "characters": "\uD835\uDD5E" },
+ "∓": { "codepoints": [8723], "characters": "\u2213" },
+ "𝓂": { "codepoints": [120002], "characters": "\uD835\uDCC2" },
+ "∾": { "codepoints": [8766], "characters": "\u223E" },
+ "μ": { "codepoints": [956], "characters": "\u03BC" },
+ "⊸": { "codepoints": [8888], "characters": "\u22B8" },
+ "⊸": { "codepoints": [8888], "characters": "\u22B8" },
+ "⋙̸": { "codepoints": [8921, 824], "characters": "\u22D9\u0338" },
+ "≫⃒": { "codepoints": [8811, 8402], "characters": "\u226B\u20D2" },
+ "≫̸": { "codepoints": [8811, 824], "characters": "\u226B\u0338" },
+ "⇍": { "codepoints": [8653], "characters": "\u21CD" },
+ "⇎": { "codepoints": [8654], "characters": "\u21CE" },
+ "⋘̸": { "codepoints": [8920, 824], "characters": "\u22D8\u0338" },
+ "≪⃒": { "codepoints": [8810, 8402], "characters": "\u226A\u20D2" },
+ "≪̸": { "codepoints": [8810, 824], "characters": "\u226A\u0338" },
+ "⇏": { "codepoints": [8655], "characters": "\u21CF" },
+ "⊯": { "codepoints": [8879], "characters": "\u22AF" },
+ "⊮": { "codepoints": [8878], "characters": "\u22AE" },
+ "∇": { "codepoints": [8711], "characters": "\u2207" },
+ "ń": { "codepoints": [324], "characters": "\u0144" },
+ "∠⃒": { "codepoints": [8736, 8402], "characters": "\u2220\u20D2" },
+ "≉": { "codepoints": [8777], "characters": "\u2249" },
+ "⩰̸": { "codepoints": [10864, 824], "characters": "\u2A70\u0338" },
+ "≋̸": { "codepoints": [8779, 824], "characters": "\u224B\u0338" },
+ "ʼn": { "codepoints": [329], "characters": "\u0149" },
+ "≉": { "codepoints": [8777], "characters": "\u2249" },
+ "♮": { "codepoints": [9838], "characters": "\u266E" },
+ "♮": { "codepoints": [9838], "characters": "\u266E" },
+ "ℕ": { "codepoints": [8469], "characters": "\u2115" },
+ " ": { "codepoints": [160], "characters": "\u00A0" },
+ " ": { "codepoints": [160], "characters": "\u00A0" },
+ "≎̸": { "codepoints": [8782, 824], "characters": "\u224E\u0338" },
+ "≏̸": { "codepoints": [8783, 824], "characters": "\u224F\u0338" },
+ "⩃": { "codepoints": [10819], "characters": "\u2A43" },
+ "ň": { "codepoints": [328], "characters": "\u0148" },
+ "ņ": { "codepoints": [326], "characters": "\u0146" },
+ "≇": { "codepoints": [8775], "characters": "\u2247" },
+ "⩭̸": { "codepoints": [10861, 824], "characters": "\u2A6D\u0338" },
+ "⩂": { "codepoints": [10818], "characters": "\u2A42" },
+ "н": { "codepoints": [1085], "characters": "\u043D" },
+ "–": { "codepoints": [8211], "characters": "\u2013" },
+ "≠": { "codepoints": [8800], "characters": "\u2260" },
+ "⇗": { "codepoints": [8663], "characters": "\u21D7" },
+ "⤤": { "codepoints": [10532], "characters": "\u2924" },
+ "↗": { "codepoints": [8599], "characters": "\u2197" },
+ "↗": { "codepoints": [8599], "characters": "\u2197" },
+ "≐̸": { "codepoints": [8784, 824], "characters": "\u2250\u0338" },
+ "≢": { "codepoints": [8802], "characters": "\u2262" },
+ "⤨": { "codepoints": [10536], "characters": "\u2928" },
+ "≂̸": { "codepoints": [8770, 824], "characters": "\u2242\u0338" },
+ "∄": { "codepoints": [8708], "characters": "\u2204" },
+ "∄": { "codepoints": [8708], "characters": "\u2204" },
+ "𝔫": { "codepoints": [120107], "characters": "\uD835\uDD2B" },
+ "≧̸": { "codepoints": [8807, 824], "characters": "\u2267\u0338" },
+ "≱": { "codepoints": [8817], "characters": "\u2271" },
+ "≱": { "codepoints": [8817], "characters": "\u2271" },
+ "≧̸": { "codepoints": [8807, 824], "characters": "\u2267\u0338" },
+ "⩾̸": { "codepoints": [10878, 824], "characters": "\u2A7E\u0338" },
+ "⩾̸": { "codepoints": [10878, 824], "characters": "\u2A7E\u0338" },
+ "≵": { "codepoints": [8821], "characters": "\u2275" },
+ "≯": { "codepoints": [8815], "characters": "\u226F" },
+ "≯": { "codepoints": [8815], "characters": "\u226F" },
+ "⇎": { "codepoints": [8654], "characters": "\u21CE" },
+ "↮": { "codepoints": [8622], "characters": "\u21AE" },
+ "⫲": { "codepoints": [10994], "characters": "\u2AF2" },
+ "∋": { "codepoints": [8715], "characters": "\u220B" },
+ "⋼": { "codepoints": [8956], "characters": "\u22FC" },
+ "⋺": { "codepoints": [8954], "characters": "\u22FA" },
+ "∋": { "codepoints": [8715], "characters": "\u220B" },
+ "њ": { "codepoints": [1114], "characters": "\u045A" },
+ "⇍": { "codepoints": [8653], "characters": "\u21CD" },
+ "≦̸": { "codepoints": [8806, 824], "characters": "\u2266\u0338" },
+ "↚": { "codepoints": [8602], "characters": "\u219A" },
+ "‥": { "codepoints": [8229], "characters": "\u2025" },
+ "≰": { "codepoints": [8816], "characters": "\u2270" },
+ "↚": { "codepoints": [8602], "characters": "\u219A" },
+ "↮": { "codepoints": [8622], "characters": "\u21AE" },
+ "≰": { "codepoints": [8816], "characters": "\u2270" },
+ "≦̸": { "codepoints": [8806, 824], "characters": "\u2266\u0338" },
+ "⩽̸": { "codepoints": [10877, 824], "characters": "\u2A7D\u0338" },
+ "⩽̸": { "codepoints": [10877, 824], "characters": "\u2A7D\u0338" },
+ "≮": { "codepoints": [8814], "characters": "\u226E" },
+ "≴": { "codepoints": [8820], "characters": "\u2274" },
+ "≮": { "codepoints": [8814], "characters": "\u226E" },
+ "⋪": { "codepoints": [8938], "characters": "\u22EA" },
+ "⋬": { "codepoints": [8940], "characters": "\u22EC" },
+ "∤": { "codepoints": [8740], "characters": "\u2224" },
+ "𝕟": { "codepoints": [120159], "characters": "\uD835\uDD5F" },
+ "¬": { "codepoints": [172], "characters": "\u00AC" },
+ "¬": { "codepoints": [172], "characters": "\u00AC" },
+ "∉": { "codepoints": [8713], "characters": "\u2209" },
+ "⋹̸": { "codepoints": [8953, 824], "characters": "\u22F9\u0338" },
+ "⋵̸": { "codepoints": [8949, 824], "characters": "\u22F5\u0338" },
+ "∉": { "codepoints": [8713], "characters": "\u2209" },
+ "⋷": { "codepoints": [8951], "characters": "\u22F7" },
+ "⋶": { "codepoints": [8950], "characters": "\u22F6" },
+ "∌": { "codepoints": [8716], "characters": "\u220C" },
+ "∌": { "codepoints": [8716], "characters": "\u220C" },
+ "⋾": { "codepoints": [8958], "characters": "\u22FE" },
+ "⋽": { "codepoints": [8957], "characters": "\u22FD" },
+ "∦": { "codepoints": [8742], "characters": "\u2226" },
+ "∦": { "codepoints": [8742], "characters": "\u2226" },
+ "⫽⃥": { "codepoints": [11005, 8421], "characters": "\u2AFD\u20E5" },
+ "∂̸": { "codepoints": [8706, 824], "characters": "\u2202\u0338" },
+ "⨔": { "codepoints": [10772], "characters": "\u2A14" },
+ "⊀": { "codepoints": [8832], "characters": "\u2280" },
+ "⋠": { "codepoints": [8928], "characters": "\u22E0" },
+ "⪯̸": { "codepoints": [10927, 824], "characters": "\u2AAF\u0338" },
+ "⊀": { "codepoints": [8832], "characters": "\u2280" },
+ "⪯̸": { "codepoints": [10927, 824], "characters": "\u2AAF\u0338" },
+ "⇏": { "codepoints": [8655], "characters": "\u21CF" },
+ "↛": { "codepoints": [8603], "characters": "\u219B" },
+ "⤳̸": { "codepoints": [10547, 824], "characters": "\u2933\u0338" },
+ "↝̸": { "codepoints": [8605, 824], "characters": "\u219D\u0338" },
+ "↛": { "codepoints": [8603], "characters": "\u219B" },
+ "⋫": { "codepoints": [8939], "characters": "\u22EB" },
+ "⋭": { "codepoints": [8941], "characters": "\u22ED" },
+ "⊁": { "codepoints": [8833], "characters": "\u2281" },
+ "⋡": { "codepoints": [8929], "characters": "\u22E1" },
+ "⪰̸": { "codepoints": [10928, 824], "characters": "\u2AB0\u0338" },
+ "𝓃": { "codepoints": [120003], "characters": "\uD835\uDCC3" },
+ "∤": { "codepoints": [8740], "characters": "\u2224" },
+ "∦": { "codepoints": [8742], "characters": "\u2226" },
+ "≁": { "codepoints": [8769], "characters": "\u2241" },
+ "≄": { "codepoints": [8772], "characters": "\u2244" },
+ "≄": { "codepoints": [8772], "characters": "\u2244" },
+ "∤": { "codepoints": [8740], "characters": "\u2224" },
+ "∦": { "codepoints": [8742], "characters": "\u2226" },
+ "⋢": { "codepoints": [8930], "characters": "\u22E2" },
+ "⋣": { "codepoints": [8931], "characters": "\u22E3" },
+ "⊄": { "codepoints": [8836], "characters": "\u2284" },
+ "⫅̸": { "codepoints": [10949, 824], "characters": "\u2AC5\u0338" },
+ "⊈": { "codepoints": [8840], "characters": "\u2288" },
+ "⊂⃒": { "codepoints": [8834, 8402], "characters": "\u2282\u20D2" },
+ "⊈": { "codepoints": [8840], "characters": "\u2288" },
+ "⫅̸": { "codepoints": [10949, 824], "characters": "\u2AC5\u0338" },
+ "⊁": { "codepoints": [8833], "characters": "\u2281" },
+ "⪰̸": { "codepoints": [10928, 824], "characters": "\u2AB0\u0338" },
+ "⊅": { "codepoints": [8837], "characters": "\u2285" },
+ "⫆̸": { "codepoints": [10950, 824], "characters": "\u2AC6\u0338" },
+ "⊉": { "codepoints": [8841], "characters": "\u2289" },
+ "⊃⃒": { "codepoints": [8835, 8402], "characters": "\u2283\u20D2" },
+ "⊉": { "codepoints": [8841], "characters": "\u2289" },
+ "⫆̸": { "codepoints": [10950, 824], "characters": "\u2AC6\u0338" },
+ "≹": { "codepoints": [8825], "characters": "\u2279" },
+ "ñ": { "codepoints": [241], "characters": "\u00F1" },
+ "ñ": { "codepoints": [241], "characters": "\u00F1" },
+ "≸": { "codepoints": [8824], "characters": "\u2278" },
+ "⋪": { "codepoints": [8938], "characters": "\u22EA" },
+ "⋬": { "codepoints": [8940], "characters": "\u22EC" },
+ "⋫": { "codepoints": [8939], "characters": "\u22EB" },
+ "⋭": { "codepoints": [8941], "characters": "\u22ED" },
+ "ν": { "codepoints": [957], "characters": "\u03BD" },
+ "#": { "codepoints": [35], "characters": "\u0023" },
+ "№": { "codepoints": [8470], "characters": "\u2116" },
+ " ": { "codepoints": [8199], "characters": "\u2007" },
+ "⊭": { "codepoints": [8877], "characters": "\u22AD" },
+ "⤄": { "codepoints": [10500], "characters": "\u2904" },
+ "≍⃒": { "codepoints": [8781, 8402], "characters": "\u224D\u20D2" },
+ "⊬": { "codepoints": [8876], "characters": "\u22AC" },
+ "≥⃒": { "codepoints": [8805, 8402], "characters": "\u2265\u20D2" },
+ ">⃒": { "codepoints": [62, 8402], "characters": "\u003E\u20D2" },
+ "⧞": { "codepoints": [10718], "characters": "\u29DE" },
+ "⤂": { "codepoints": [10498], "characters": "\u2902" },
+ "≤⃒": { "codepoints": [8804, 8402], "characters": "\u2264\u20D2" },
+ "<⃒": { "codepoints": [60, 8402], "characters": "\u003C\u20D2" },
+ "⊴⃒": { "codepoints": [8884, 8402], "characters": "\u22B4\u20D2" },
+ "⤃": { "codepoints": [10499], "characters": "\u2903" },
+ "⊵⃒": { "codepoints": [8885, 8402], "characters": "\u22B5\u20D2" },
+ "∼⃒": { "codepoints": [8764, 8402], "characters": "\u223C\u20D2" },
+ "⇖": { "codepoints": [8662], "characters": "\u21D6" },
+ "⤣": { "codepoints": [10531], "characters": "\u2923" },
+ "↖": { "codepoints": [8598], "characters": "\u2196" },
+ "↖": { "codepoints": [8598], "characters": "\u2196" },
+ "⤧": { "codepoints": [10535], "characters": "\u2927" },
+ "Ⓢ": { "codepoints": [9416], "characters": "\u24C8" },
+ "ó": { "codepoints": [243], "characters": "\u00F3" },
+ "ó": { "codepoints": [243], "characters": "\u00F3" },
+ "⊛": { "codepoints": [8859], "characters": "\u229B" },
+ "⊚": { "codepoints": [8858], "characters": "\u229A" },
+ "ô": { "codepoints": [244], "characters": "\u00F4" },
+ "ô": { "codepoints": [244], "characters": "\u00F4" },
+ "о": { "codepoints": [1086], "characters": "\u043E" },
+ "⊝": { "codepoints": [8861], "characters": "\u229D" },
+ "ő": { "codepoints": [337], "characters": "\u0151" },
+ "⨸": { "codepoints": [10808], "characters": "\u2A38" },
+ "⊙": { "codepoints": [8857], "characters": "\u2299" },
+ "⦼": { "codepoints": [10684], "characters": "\u29BC" },
+ "œ": { "codepoints": [339], "characters": "\u0153" },
+ "⦿": { "codepoints": [10687], "characters": "\u29BF" },
+ "𝔬": { "codepoints": [120108], "characters": "\uD835\uDD2C" },
+ "˛": { "codepoints": [731], "characters": "\u02DB" },
+ "ò": { "codepoints": [242], "characters": "\u00F2" },
+ "ò": { "codepoints": [242], "characters": "\u00F2" },
+ "⧁": { "codepoints": [10689], "characters": "\u29C1" },
+ "⦵": { "codepoints": [10677], "characters": "\u29B5" },
+ "Ω": { "codepoints": [937], "characters": "\u03A9" },
+ "∮": { "codepoints": [8750], "characters": "\u222E" },
+ "↺": { "codepoints": [8634], "characters": "\u21BA" },
+ "⦾": { "codepoints": [10686], "characters": "\u29BE" },
+ "⦻": { "codepoints": [10683], "characters": "\u29BB" },
+ "‾": { "codepoints": [8254], "characters": "\u203E" },
+ "⧀": { "codepoints": [10688], "characters": "\u29C0" },
+ "ō": { "codepoints": [333], "characters": "\u014D" },
+ "ω": { "codepoints": [969], "characters": "\u03C9" },
+ "ο": { "codepoints": [959], "characters": "\u03BF" },
+ "⦶": { "codepoints": [10678], "characters": "\u29B6" },
+ "⊖": { "codepoints": [8854], "characters": "\u2296" },
+ "𝕠": { "codepoints": [120160], "characters": "\uD835\uDD60" },
+ "⦷": { "codepoints": [10679], "characters": "\u29B7" },
+ "⦹": { "codepoints": [10681], "characters": "\u29B9" },
+ "⊕": { "codepoints": [8853], "characters": "\u2295" },
+ "∨": { "codepoints": [8744], "characters": "\u2228" },
+ "↻": { "codepoints": [8635], "characters": "\u21BB" },
+ "⩝": { "codepoints": [10845], "characters": "\u2A5D" },
+ "ℴ": { "codepoints": [8500], "characters": "\u2134" },
+ "ℴ": { "codepoints": [8500], "characters": "\u2134" },
+ "ª": { "codepoints": [170], "characters": "\u00AA" },
+ "ª": { "codepoints": [170], "characters": "\u00AA" },
+ "º": { "codepoints": [186], "characters": "\u00BA" },
+ "º": { "codepoints": [186], "characters": "\u00BA" },
+ "⊶": { "codepoints": [8886], "characters": "\u22B6" },
+ "⩖": { "codepoints": [10838], "characters": "\u2A56" },
+ "⩗": { "codepoints": [10839], "characters": "\u2A57" },
+ "⩛": { "codepoints": [10843], "characters": "\u2A5B" },
+ "ℴ": { "codepoints": [8500], "characters": "\u2134" },
+ "ø": { "codepoints": [248], "characters": "\u00F8" },
+ "ø": { "codepoints": [248], "characters": "\u00F8" },
+ "⊘": { "codepoints": [8856], "characters": "\u2298" },
+ "õ": { "codepoints": [245], "characters": "\u00F5" },
+ "õ": { "codepoints": [245], "characters": "\u00F5" },
+ "⊗": { "codepoints": [8855], "characters": "\u2297" },
+ "⨶": { "codepoints": [10806], "characters": "\u2A36" },
+ "ö": { "codepoints": [246], "characters": "\u00F6" },
+ "ö": { "codepoints": [246], "characters": "\u00F6" },
+ "⌽": { "codepoints": [9021], "characters": "\u233D" },
+ "∥": { "codepoints": [8741], "characters": "\u2225" },
+ "¶": { "codepoints": [182], "characters": "\u00B6" },
+ "¶": { "codepoints": [182], "characters": "\u00B6" },
+ "∥": { "codepoints": [8741], "characters": "\u2225" },
+ "⫳": { "codepoints": [10995], "characters": "\u2AF3" },
+ "⫽": { "codepoints": [11005], "characters": "\u2AFD" },
+ "∂": { "codepoints": [8706], "characters": "\u2202" },
+ "п": { "codepoints": [1087], "characters": "\u043F" },
+ "%": { "codepoints": [37], "characters": "\u0025" },
+ ".": { "codepoints": [46], "characters": "\u002E" },
+ "‰": { "codepoints": [8240], "characters": "\u2030" },
+ "⊥": { "codepoints": [8869], "characters": "\u22A5" },
+ "‱": { "codepoints": [8241], "characters": "\u2031" },
+ "𝔭": { "codepoints": [120109], "characters": "\uD835\uDD2D" },
+ "φ": { "codepoints": [966], "characters": "\u03C6" },
+ "ϕ": { "codepoints": [981], "characters": "\u03D5" },
+ "ℳ": { "codepoints": [8499], "characters": "\u2133" },
+ "☎": { "codepoints": [9742], "characters": "\u260E" },
+ "π": { "codepoints": [960], "characters": "\u03C0" },
+ "⋔": { "codepoints": [8916], "characters": "\u22D4" },
+ "ϖ": { "codepoints": [982], "characters": "\u03D6" },
+ "ℏ": { "codepoints": [8463], "characters": "\u210F" },
+ "ℎ": { "codepoints": [8462], "characters": "\u210E" },
+ "ℏ": { "codepoints": [8463], "characters": "\u210F" },
+ "+": { "codepoints": [43], "characters": "\u002B" },
+ "⨣": { "codepoints": [10787], "characters": "\u2A23" },
+ "⊞": { "codepoints": [8862], "characters": "\u229E" },
+ "⨢": { "codepoints": [10786], "characters": "\u2A22" },
+ "∔": { "codepoints": [8724], "characters": "\u2214" },
+ "⨥": { "codepoints": [10789], "characters": "\u2A25" },
+ "⩲": { "codepoints": [10866], "characters": "\u2A72" },
+ "±": { "codepoints": [177], "characters": "\u00B1" },
+ "±": { "codepoints": [177], "characters": "\u00B1" },
+ "⨦": { "codepoints": [10790], "characters": "\u2A26" },
+ "⨧": { "codepoints": [10791], "characters": "\u2A27" },
+ "±": { "codepoints": [177], "characters": "\u00B1" },
+ "⨕": { "codepoints": [10773], "characters": "\u2A15" },
+ "𝕡": { "codepoints": [120161], "characters": "\uD835\uDD61" },
+ "£": { "codepoints": [163], "characters": "\u00A3" },
+ "£": { "codepoints": [163], "characters": "\u00A3" },
+ "≺": { "codepoints": [8826], "characters": "\u227A" },
+ "⪳": { "codepoints": [10931], "characters": "\u2AB3" },
+ "⪷": { "codepoints": [10935], "characters": "\u2AB7" },
+ "≼": { "codepoints": [8828], "characters": "\u227C" },
+ "⪯": { "codepoints": [10927], "characters": "\u2AAF" },
+ "≺": { "codepoints": [8826], "characters": "\u227A" },
+ "⪷": { "codepoints": [10935], "characters": "\u2AB7" },
+ "≼": { "codepoints": [8828], "characters": "\u227C" },
+ "⪯": { "codepoints": [10927], "characters": "\u2AAF" },
+ "⪹": { "codepoints": [10937], "characters": "\u2AB9" },
+ "⪵": { "codepoints": [10933], "characters": "\u2AB5" },
+ "⋨": { "codepoints": [8936], "characters": "\u22E8" },
+ "≾": { "codepoints": [8830], "characters": "\u227E" },
+ "′": { "codepoints": [8242], "characters": "\u2032" },
+ "ℙ": { "codepoints": [8473], "characters": "\u2119" },
+ "⪵": { "codepoints": [10933], "characters": "\u2AB5" },
+ "⪹": { "codepoints": [10937], "characters": "\u2AB9" },
+ "⋨": { "codepoints": [8936], "characters": "\u22E8" },
+ "∏": { "codepoints": [8719], "characters": "\u220F" },
+ "⌮": { "codepoints": [9006], "characters": "\u232E" },
+ "⌒": { "codepoints": [8978], "characters": "\u2312" },
+ "⌓": { "codepoints": [8979], "characters": "\u2313" },
+ "∝": { "codepoints": [8733], "characters": "\u221D" },
+ "∝": { "codepoints": [8733], "characters": "\u221D" },
+ "≾": { "codepoints": [8830], "characters": "\u227E" },
+ "⊰": { "codepoints": [8880], "characters": "\u22B0" },
+ "𝓅": { "codepoints": [120005], "characters": "\uD835\uDCC5" },
+ "ψ": { "codepoints": [968], "characters": "\u03C8" },
+ " ": { "codepoints": [8200], "characters": "\u2008" },
+ "𝔮": { "codepoints": [120110], "characters": "\uD835\uDD2E" },
+ "⨌": { "codepoints": [10764], "characters": "\u2A0C" },
+ "𝕢": { "codepoints": [120162], "characters": "\uD835\uDD62" },
+ "⁗": { "codepoints": [8279], "characters": "\u2057" },
+ "𝓆": { "codepoints": [120006], "characters": "\uD835\uDCC6" },
+ "ℍ": { "codepoints": [8461], "characters": "\u210D" },
+ "⨖": { "codepoints": [10774], "characters": "\u2A16" },
+ "?": { "codepoints": [63], "characters": "\u003F" },
+ "≟": { "codepoints": [8799], "characters": "\u225F" },
+ """: { "codepoints": [34], "characters": "\u0022" },
+ """: { "codepoints": [34], "characters": "\u0022" },
+ "⇛": { "codepoints": [8667], "characters": "\u21DB" },
+ "⇒": { "codepoints": [8658], "characters": "\u21D2" },
+ "⤜": { "codepoints": [10524], "characters": "\u291C" },
+ "⤏": { "codepoints": [10511], "characters": "\u290F" },
+ "⥤": { "codepoints": [10596], "characters": "\u2964" },
+ "∽̱": { "codepoints": [8765, 817], "characters": "\u223D\u0331" },
+ "ŕ": { "codepoints": [341], "characters": "\u0155" },
+ "√": { "codepoints": [8730], "characters": "\u221A" },
+ "⦳": { "codepoints": [10675], "characters": "\u29B3" },
+ "〉": { "codepoints": [10217], "characters": "\u27E9" },
+ "⦒": { "codepoints": [10642], "characters": "\u2992" },
+ "⦥": { "codepoints": [10661], "characters": "\u29A5" },
+ "⟩": { "codepoints": [10217], "characters": "\u27E9" },
+ "»": { "codepoints": [187], "characters": "\u00BB" },
+ "»": { "codepoints": [187], "characters": "\u00BB" },
+ "→": { "codepoints": [8594], "characters": "\u2192" },
+ "⥵": { "codepoints": [10613], "characters": "\u2975" },
+ "⇥": { "codepoints": [8677], "characters": "\u21E5" },
+ "⤠": { "codepoints": [10528], "characters": "\u2920" },
+ "⤳": { "codepoints": [10547], "characters": "\u2933" },
+ "⤞": { "codepoints": [10526], "characters": "\u291E" },
+ "↪": { "codepoints": [8618], "characters": "\u21AA" },
+ "↬": { "codepoints": [8620], "characters": "\u21AC" },
+ "⥅": { "codepoints": [10565], "characters": "\u2945" },
+ "⥴": { "codepoints": [10612], "characters": "\u2974" },
+ "↣": { "codepoints": [8611], "characters": "\u21A3" },
+ "↝": { "codepoints": [8605], "characters": "\u219D" },
+ "⤚": { "codepoints": [10522], "characters": "\u291A" },
+ "∶": { "codepoints": [8758], "characters": "\u2236" },
+ "ℚ": { "codepoints": [8474], "characters": "\u211A" },
+ "⤍": { "codepoints": [10509], "characters": "\u290D" },
+ "❳": { "codepoints": [10099], "characters": "\u2773" },
+ "}": { "codepoints": [125], "characters": "\u007D" },
+ "]": { "codepoints": [93], "characters": "\u005D" },
+ "⦌": { "codepoints": [10636], "characters": "\u298C" },
+ "⦎": { "codepoints": [10638], "characters": "\u298E" },
+ "⦐": { "codepoints": [10640], "characters": "\u2990" },
+ "ř": { "codepoints": [345], "characters": "\u0159" },
+ "ŗ": { "codepoints": [343], "characters": "\u0157" },
+ "⌉": { "codepoints": [8969], "characters": "\u2309" },
+ "}": { "codepoints": [125], "characters": "\u007D" },
+ "р": { "codepoints": [1088], "characters": "\u0440" },
+ "⤷": { "codepoints": [10551], "characters": "\u2937" },
+ "⥩": { "codepoints": [10601], "characters": "\u2969" },
+ "”": { "codepoints": [8221], "characters": "\u201D" },
+ "”": { "codepoints": [8221], "characters": "\u201D" },
+ "↳": { "codepoints": [8627], "characters": "\u21B3" },
+ "ℜ": { "codepoints": [8476], "characters": "\u211C" },
+ "ℛ": { "codepoints": [8475], "characters": "\u211B" },
+ "ℜ": { "codepoints": [8476], "characters": "\u211C" },
+ "ℝ": { "codepoints": [8477], "characters": "\u211D" },
+ "▭": { "codepoints": [9645], "characters": "\u25AD" },
+ "®": { "codepoints": [174], "characters": "\u00AE" },
+ "®": { "codepoints": [174], "characters": "\u00AE" },
+ "⥽": { "codepoints": [10621], "characters": "\u297D" },
+ "⌋": { "codepoints": [8971], "characters": "\u230B" },
+ "𝔯": { "codepoints": [120111], "characters": "\uD835\uDD2F" },
+ "⇁": { "codepoints": [8641], "characters": "\u21C1" },
+ "⇀": { "codepoints": [8640], "characters": "\u21C0" },
+ "⥬": { "codepoints": [10604], "characters": "\u296C" },
+ "ρ": { "codepoints": [961], "characters": "\u03C1" },
+ "ϱ": { "codepoints": [1009], "characters": "\u03F1" },
+ "→": { "codepoints": [8594], "characters": "\u2192" },
+ "↣": { "codepoints": [8611], "characters": "\u21A3" },
+ "⇁": { "codepoints": [8641], "characters": "\u21C1" },
+ "⇀": { "codepoints": [8640], "characters": "\u21C0" },
+ "⇄": { "codepoints": [8644], "characters": "\u21C4" },
+ "⇌": { "codepoints": [8652], "characters": "\u21CC" },
+ "⇉": { "codepoints": [8649], "characters": "\u21C9" },
+ "↝": { "codepoints": [8605], "characters": "\u219D" },
+ "⋌": { "codepoints": [8908], "characters": "\u22CC" },
+ "˚": { "codepoints": [730], "characters": "\u02DA" },
+ "≓": { "codepoints": [8787], "characters": "\u2253" },
+ "⇄": { "codepoints": [8644], "characters": "\u21C4" },
+ "⇌": { "codepoints": [8652], "characters": "\u21CC" },
+ "": { "codepoints": [8207], "characters": "\u200F" },
+ "⎱": { "codepoints": [9137], "characters": "\u23B1" },
+ "⎱": { "codepoints": [9137], "characters": "\u23B1" },
+ "⫮": { "codepoints": [10990], "characters": "\u2AEE" },
+ "⟭": { "codepoints": [10221], "characters": "\u27ED" },
+ "⇾": { "codepoints": [8702], "characters": "\u21FE" },
+ "⟧": { "codepoints": [10215], "characters": "\u27E7" },
+ "⦆": { "codepoints": [10630], "characters": "\u2986" },
+ "𝕣": { "codepoints": [120163], "characters": "\uD835\uDD63" },
+ "⨮": { "codepoints": [10798], "characters": "\u2A2E" },
+ "⨵": { "codepoints": [10805], "characters": "\u2A35" },
+ ")": { "codepoints": [41], "characters": "\u0029" },
+ "⦔": { "codepoints": [10644], "characters": "\u2994" },
+ "⨒": { "codepoints": [10770], "characters": "\u2A12" },
+ "⇉": { "codepoints": [8649], "characters": "\u21C9" },
+ "›": { "codepoints": [8250], "characters": "\u203A" },
+ "𝓇": { "codepoints": [120007], "characters": "\uD835\uDCC7" },
+ "↱": { "codepoints": [8625], "characters": "\u21B1" },
+ "]": { "codepoints": [93], "characters": "\u005D" },
+ "’": { "codepoints": [8217], "characters": "\u2019" },
+ "’": { "codepoints": [8217], "characters": "\u2019" },
+ "⋌": { "codepoints": [8908], "characters": "\u22CC" },
+ "⋊": { "codepoints": [8906], "characters": "\u22CA" },
+ "▹": { "codepoints": [9657], "characters": "\u25B9" },
+ "⊵": { "codepoints": [8885], "characters": "\u22B5" },
+ "▸": { "codepoints": [9656], "characters": "\u25B8" },
+ "⧎": { "codepoints": [10702], "characters": "\u29CE" },
+ "⥨": { "codepoints": [10600], "characters": "\u2968" },
+ "℞": { "codepoints": [8478], "characters": "\u211E" },
+ "ś": { "codepoints": [347], "characters": "\u015B" },
+ "‚": { "codepoints": [8218], "characters": "\u201A" },
+ "≻": { "codepoints": [8827], "characters": "\u227B" },
+ "⪴": { "codepoints": [10932], "characters": "\u2AB4" },
+ "⪸": { "codepoints": [10936], "characters": "\u2AB8" },
+ "š": { "codepoints": [353], "characters": "\u0161" },
+ "≽": { "codepoints": [8829], "characters": "\u227D" },
+ "⪰": { "codepoints": [10928], "characters": "\u2AB0" },
+ "ş": { "codepoints": [351], "characters": "\u015F" },
+ "ŝ": { "codepoints": [349], "characters": "\u015D" },
+ "⪶": { "codepoints": [10934], "characters": "\u2AB6" },
+ "⪺": { "codepoints": [10938], "characters": "\u2ABA" },
+ "⋩": { "codepoints": [8937], "characters": "\u22E9" },
+ "⨓": { "codepoints": [10771], "characters": "\u2A13" },
+ "≿": { "codepoints": [8831], "characters": "\u227F" },
+ "с": { "codepoints": [1089], "characters": "\u0441" },
+ "⋅": { "codepoints": [8901], "characters": "\u22C5" },
+ "⊡": { "codepoints": [8865], "characters": "\u22A1" },
+ "⩦": { "codepoints": [10854], "characters": "\u2A66" },
+ "⇘": { "codepoints": [8664], "characters": "\u21D8" },
+ "⤥": { "codepoints": [10533], "characters": "\u2925" },
+ "↘": { "codepoints": [8600], "characters": "\u2198" },
+ "↘": { "codepoints": [8600], "characters": "\u2198" },
+ "§": { "codepoints": [167], "characters": "\u00A7" },
+ "§": { "codepoints": [167], "characters": "\u00A7" },
+ ";": { "codepoints": [59], "characters": "\u003B" },
+ "⤩": { "codepoints": [10537], "characters": "\u2929" },
+ "∖": { "codepoints": [8726], "characters": "\u2216" },
+ "∖": { "codepoints": [8726], "characters": "\u2216" },
+ "✶": { "codepoints": [10038], "characters": "\u2736" },
+ "𝔰": { "codepoints": [120112], "characters": "\uD835\uDD30" },
+ "⌢": { "codepoints": [8994], "characters": "\u2322" },
+ "♯": { "codepoints": [9839], "characters": "\u266F" },
+ "щ": { "codepoints": [1097], "characters": "\u0449" },
+ "ш": { "codepoints": [1096], "characters": "\u0448" },
+ "∣": { "codepoints": [8739], "characters": "\u2223" },
+ "∥": { "codepoints": [8741], "characters": "\u2225" },
+ "­": { "codepoints": [173], "characters": "\u00AD" },
+ "": { "codepoints": [173], "characters": "\u00AD" },
+ "σ": { "codepoints": [963], "characters": "\u03C3" },
+ "ς": { "codepoints": [962], "characters": "\u03C2" },
+ "ς": { "codepoints": [962], "characters": "\u03C2" },
+ "∼": { "codepoints": [8764], "characters": "\u223C" },
+ "⩪": { "codepoints": [10858], "characters": "\u2A6A" },
+ "≃": { "codepoints": [8771], "characters": "\u2243" },
+ "≃": { "codepoints": [8771], "characters": "\u2243" },
+ "⪞": { "codepoints": [10910], "characters": "\u2A9E" },
+ "⪠": { "codepoints": [10912], "characters": "\u2AA0" },
+ "⪝": { "codepoints": [10909], "characters": "\u2A9D" },
+ "⪟": { "codepoints": [10911], "characters": "\u2A9F" },
+ "≆": { "codepoints": [8774], "characters": "\u2246" },
+ "⨤": { "codepoints": [10788], "characters": "\u2A24" },
+ "⥲": { "codepoints": [10610], "characters": "\u2972" },
+ "←": { "codepoints": [8592], "characters": "\u2190" },
+ "∖": { "codepoints": [8726], "characters": "\u2216" },
+ "⨳": { "codepoints": [10803], "characters": "\u2A33" },
+ "⧤": { "codepoints": [10724], "characters": "\u29E4" },
+ "∣": { "codepoints": [8739], "characters": "\u2223" },
+ "⌣": { "codepoints": [8995], "characters": "\u2323" },
+ "⪪": { "codepoints": [10922], "characters": "\u2AAA" },
+ "⪬": { "codepoints": [10924], "characters": "\u2AAC" },
+ "⪬︀": { "codepoints": [10924, 65024], "characters": "\u2AAC\uFE00" },
+ "ь": { "codepoints": [1100], "characters": "\u044C" },
+ "/": { "codepoints": [47], "characters": "\u002F" },
+ "⧄": { "codepoints": [10692], "characters": "\u29C4" },
+ "⌿": { "codepoints": [9023], "characters": "\u233F" },
+ "𝕤": { "codepoints": [120164], "characters": "\uD835\uDD64" },
+ "♠": { "codepoints": [9824], "characters": "\u2660" },
+ "♠": { "codepoints": [9824], "characters": "\u2660" },
+ "∥": { "codepoints": [8741], "characters": "\u2225" },
+ "⊓": { "codepoints": [8851], "characters": "\u2293" },
+ "⊓︀": { "codepoints": [8851, 65024], "characters": "\u2293\uFE00" },
+ "⊔": { "codepoints": [8852], "characters": "\u2294" },
+ "⊔︀": { "codepoints": [8852, 65024], "characters": "\u2294\uFE00" },
+ "⊏": { "codepoints": [8847], "characters": "\u228F" },
+ "⊑": { "codepoints": [8849], "characters": "\u2291" },
+ "⊏": { "codepoints": [8847], "characters": "\u228F" },
+ "⊑": { "codepoints": [8849], "characters": "\u2291" },
+ "⊐": { "codepoints": [8848], "characters": "\u2290" },
+ "⊒": { "codepoints": [8850], "characters": "\u2292" },
+ "⊐": { "codepoints": [8848], "characters": "\u2290" },
+ "⊒": { "codepoints": [8850], "characters": "\u2292" },
+ "□": { "codepoints": [9633], "characters": "\u25A1" },
+ "□": { "codepoints": [9633], "characters": "\u25A1" },
+ "▪": { "codepoints": [9642], "characters": "\u25AA" },
+ "▪": { "codepoints": [9642], "characters": "\u25AA" },
+ "→": { "codepoints": [8594], "characters": "\u2192" },
+ "𝓈": { "codepoints": [120008], "characters": "\uD835\uDCC8" },
+ "∖": { "codepoints": [8726], "characters": "\u2216" },
+ "⌣": { "codepoints": [8995], "characters": "\u2323" },
+ "⋆": { "codepoints": [8902], "characters": "\u22C6" },
+ "☆": { "codepoints": [9734], "characters": "\u2606" },
+ "★": { "codepoints": [9733], "characters": "\u2605" },
+ "ϵ": { "codepoints": [1013], "characters": "\u03F5" },
+ "ϕ": { "codepoints": [981], "characters": "\u03D5" },
+ "¯": { "codepoints": [175], "characters": "\u00AF" },
+ "⊂": { "codepoints": [8834], "characters": "\u2282" },
+ "⫅": { "codepoints": [10949], "characters": "\u2AC5" },
+ "⪽": { "codepoints": [10941], "characters": "\u2ABD" },
+ "⊆": { "codepoints": [8838], "characters": "\u2286" },
+ "⫃": { "codepoints": [10947], "characters": "\u2AC3" },
+ "⫁": { "codepoints": [10945], "characters": "\u2AC1" },
+ "⫋": { "codepoints": [10955], "characters": "\u2ACB" },
+ "⊊": { "codepoints": [8842], "characters": "\u228A" },
+ "⪿": { "codepoints": [10943], "characters": "\u2ABF" },
+ "⥹": { "codepoints": [10617], "characters": "\u2979" },
+ "⊂": { "codepoints": [8834], "characters": "\u2282" },
+ "⊆": { "codepoints": [8838], "characters": "\u2286" },
+ "⫅": { "codepoints": [10949], "characters": "\u2AC5" },
+ "⊊": { "codepoints": [8842], "characters": "\u228A" },
+ "⫋": { "codepoints": [10955], "characters": "\u2ACB" },
+ "⫇": { "codepoints": [10951], "characters": "\u2AC7" },
+ "⫕": { "codepoints": [10965], "characters": "\u2AD5" },
+ "⫓": { "codepoints": [10963], "characters": "\u2AD3" },
+ "≻": { "codepoints": [8827], "characters": "\u227B" },
+ "⪸": { "codepoints": [10936], "characters": "\u2AB8" },
+ "≽": { "codepoints": [8829], "characters": "\u227D" },
+ "⪰": { "codepoints": [10928], "characters": "\u2AB0" },
+ "⪺": { "codepoints": [10938], "characters": "\u2ABA" },
+ "⪶": { "codepoints": [10934], "characters": "\u2AB6" },
+ "⋩": { "codepoints": [8937], "characters": "\u22E9" },
+ "≿": { "codepoints": [8831], "characters": "\u227F" },
+ "∑": { "codepoints": [8721], "characters": "\u2211" },
+ "♪": { "codepoints": [9834], "characters": "\u266A" },
+ "¹": { "codepoints": [185], "characters": "\u00B9" },
+ "¹": { "codepoints": [185], "characters": "\u00B9" },
+ "²": { "codepoints": [178], "characters": "\u00B2" },
+ "²": { "codepoints": [178], "characters": "\u00B2" },
+ "³": { "codepoints": [179], "characters": "\u00B3" },
+ "³": { "codepoints": [179], "characters": "\u00B3" },
+ "⊃": { "codepoints": [8835], "characters": "\u2283" },
+ "⫆": { "codepoints": [10950], "characters": "\u2AC6" },
+ "⪾": { "codepoints": [10942], "characters": "\u2ABE" },
+ "⫘": { "codepoints": [10968], "characters": "\u2AD8" },
+ "⊇": { "codepoints": [8839], "characters": "\u2287" },
+ "⫄": { "codepoints": [10948], "characters": "\u2AC4" },
+ "⟉": { "codepoints": [10185], "characters": "\u27C9" },
+ "⫗": { "codepoints": [10967], "characters": "\u2AD7" },
+ "⥻": { "codepoints": [10619], "characters": "\u297B" },
+ "⫂": { "codepoints": [10946], "characters": "\u2AC2" },
+ "⫌": { "codepoints": [10956], "characters": "\u2ACC" },
+ "⊋": { "codepoints": [8843], "characters": "\u228B" },
+ "⫀": { "codepoints": [10944], "characters": "\u2AC0" },
+ "⊃": { "codepoints": [8835], "characters": "\u2283" },
+ "⊇": { "codepoints": [8839], "characters": "\u2287" },
+ "⫆": { "codepoints": [10950], "characters": "\u2AC6" },
+ "⊋": { "codepoints": [8843], "characters": "\u228B" },
+ "⫌": { "codepoints": [10956], "characters": "\u2ACC" },
+ "⫈": { "codepoints": [10952], "characters": "\u2AC8" },
+ "⫔": { "codepoints": [10964], "characters": "\u2AD4" },
+ "⫖": { "codepoints": [10966], "characters": "\u2AD6" },
+ "⇙": { "codepoints": [8665], "characters": "\u21D9" },
+ "⤦": { "codepoints": [10534], "characters": "\u2926" },
+ "↙": { "codepoints": [8601], "characters": "\u2199" },
+ "↙": { "codepoints": [8601], "characters": "\u2199" },
+ "⤪": { "codepoints": [10538], "characters": "\u292A" },
+ "ß": { "codepoints": [223], "characters": "\u00DF" },
+ "ß": { "codepoints": [223], "characters": "\u00DF" },
+ "⌖": { "codepoints": [8982], "characters": "\u2316" },
+ "τ": { "codepoints": [964], "characters": "\u03C4" },
+ "⎴": { "codepoints": [9140], "characters": "\u23B4" },
+ "ť": { "codepoints": [357], "characters": "\u0165" },
+ "ţ": { "codepoints": [355], "characters": "\u0163" },
+ "т": { "codepoints": [1090], "characters": "\u0442" },
+ "⃛": { "codepoints": [8411], "characters": "\u20DB" },
+ "⌕": { "codepoints": [8981], "characters": "\u2315" },
+ "𝔱": { "codepoints": [120113], "characters": "\uD835\uDD31" },
+ "∴": { "codepoints": [8756], "characters": "\u2234" },
+ "∴": { "codepoints": [8756], "characters": "\u2234" },
+ "θ": { "codepoints": [952], "characters": "\u03B8" },
+ "ϑ": { "codepoints": [977], "characters": "\u03D1" },
+ "ϑ": { "codepoints": [977], "characters": "\u03D1" },
+ "≈": { "codepoints": [8776], "characters": "\u2248" },
+ "∼": { "codepoints": [8764], "characters": "\u223C" },
+ " ": { "codepoints": [8201], "characters": "\u2009" },
+ "≈": { "codepoints": [8776], "characters": "\u2248" },
+ "∼": { "codepoints": [8764], "characters": "\u223C" },
+ "þ": { "codepoints": [254], "characters": "\u00FE" },
+ "þ": { "codepoints": [254], "characters": "\u00FE" },
+ "˜": { "codepoints": [732], "characters": "\u02DC" },
+ "×": { "codepoints": [215], "characters": "\u00D7" },
+ "×": { "codepoints": [215], "characters": "\u00D7" },
+ "⊠": { "codepoints": [8864], "characters": "\u22A0" },
+ "⨱": { "codepoints": [10801], "characters": "\u2A31" },
+ "⨰": { "codepoints": [10800], "characters": "\u2A30" },
+ "∭": { "codepoints": [8749], "characters": "\u222D" },
+ "⤨": { "codepoints": [10536], "characters": "\u2928" },
+ "⊤": { "codepoints": [8868], "characters": "\u22A4" },
+ "⌶": { "codepoints": [9014], "characters": "\u2336" },
+ "⫱": { "codepoints": [10993], "characters": "\u2AF1" },
+ "𝕥": { "codepoints": [120165], "characters": "\uD835\uDD65" },
+ "⫚": { "codepoints": [10970], "characters": "\u2ADA" },
+ "⤩": { "codepoints": [10537], "characters": "\u2929" },
+ "‴": { "codepoints": [8244], "characters": "\u2034" },
+ "™": { "codepoints": [8482], "characters": "\u2122" },
+ "▵": { "codepoints": [9653], "characters": "\u25B5" },
+ "▿": { "codepoints": [9663], "characters": "\u25BF" },
+ "◃": { "codepoints": [9667], "characters": "\u25C3" },
+ "⊴": { "codepoints": [8884], "characters": "\u22B4" },
+ "≜": { "codepoints": [8796], "characters": "\u225C" },
+ "▹": { "codepoints": [9657], "characters": "\u25B9" },
+ "⊵": { "codepoints": [8885], "characters": "\u22B5" },
+ "◬": { "codepoints": [9708], "characters": "\u25EC" },
+ "≜": { "codepoints": [8796], "characters": "\u225C" },
+ "⨺": { "codepoints": [10810], "characters": "\u2A3A" },
+ "⨹": { "codepoints": [10809], "characters": "\u2A39" },
+ "⧍": { "codepoints": [10701], "characters": "\u29CD" },
+ "⨻": { "codepoints": [10811], "characters": "\u2A3B" },
+ "⏢": { "codepoints": [9186], "characters": "\u23E2" },
+ "𝓉": { "codepoints": [120009], "characters": "\uD835\uDCC9" },
+ "ц": { "codepoints": [1094], "characters": "\u0446" },
+ "ћ": { "codepoints": [1115], "characters": "\u045B" },
+ "ŧ": { "codepoints": [359], "characters": "\u0167" },
+ "≬": { "codepoints": [8812], "characters": "\u226C" },
+ "↞": { "codepoints": [8606], "characters": "\u219E" },
+ "↠": { "codepoints": [8608], "characters": "\u21A0" },
+ "⇑": { "codepoints": [8657], "characters": "\u21D1" },
+ "⥣": { "codepoints": [10595], "characters": "\u2963" },
+ "ú": { "codepoints": [250], "characters": "\u00FA" },
+ "ú": { "codepoints": [250], "characters": "\u00FA" },
+ "↑": { "codepoints": [8593], "characters": "\u2191" },
+ "ў": { "codepoints": [1118], "characters": "\u045E" },
+ "ŭ": { "codepoints": [365], "characters": "\u016D" },
+ "û": { "codepoints": [251], "characters": "\u00FB" },
+ "û": { "codepoints": [251], "characters": "\u00FB" },
+ "у": { "codepoints": [1091], "characters": "\u0443" },
+ "⇅": { "codepoints": [8645], "characters": "\u21C5" },
+ "ű": { "codepoints": [369], "characters": "\u0171" },
+ "⥮": { "codepoints": [10606], "characters": "\u296E" },
+ "⥾": { "codepoints": [10622], "characters": "\u297E" },
+ "𝔲": { "codepoints": [120114], "characters": "\uD835\uDD32" },
+ "ù": { "codepoints": [249], "characters": "\u00F9" },
+ "ù": { "codepoints": [249], "characters": "\u00F9" },
+ "↿": { "codepoints": [8639], "characters": "\u21BF" },
+ "↾": { "codepoints": [8638], "characters": "\u21BE" },
+ "▀": { "codepoints": [9600], "characters": "\u2580" },
+ "⌜": { "codepoints": [8988], "characters": "\u231C" },
+ "⌜": { "codepoints": [8988], "characters": "\u231C" },
+ "⌏": { "codepoints": [8975], "characters": "\u230F" },
+ "◸": { "codepoints": [9720], "characters": "\u25F8" },
+ "ū": { "codepoints": [363], "characters": "\u016B" },
+ "¨": { "codepoints": [168], "characters": "\u00A8" },
+ "¨": { "codepoints": [168], "characters": "\u00A8" },
+ "ų": { "codepoints": [371], "characters": "\u0173" },
+ "𝕦": { "codepoints": [120166], "characters": "\uD835\uDD66" },
+ "↑": { "codepoints": [8593], "characters": "\u2191" },
+ "↕": { "codepoints": [8597], "characters": "\u2195" },
+ "↿": { "codepoints": [8639], "characters": "\u21BF" },
+ "↾": { "codepoints": [8638], "characters": "\u21BE" },
+ "⊎": { "codepoints": [8846], "characters": "\u228E" },
+ "υ": { "codepoints": [965], "characters": "\u03C5" },
+ "ϒ": { "codepoints": [978], "characters": "\u03D2" },
+ "υ": { "codepoints": [965], "characters": "\u03C5" },
+ "⇈": { "codepoints": [8648], "characters": "\u21C8" },
+ "⌝": { "codepoints": [8989], "characters": "\u231D" },
+ "⌝": { "codepoints": [8989], "characters": "\u231D" },
+ "⌎": { "codepoints": [8974], "characters": "\u230E" },
+ "ů": { "codepoints": [367], "characters": "\u016F" },
+ "◹": { "codepoints": [9721], "characters": "\u25F9" },
+ "𝓊": { "codepoints": [120010], "characters": "\uD835\uDCCA" },
+ "⋰": { "codepoints": [8944], "characters": "\u22F0" },
+ "ũ": { "codepoints": [361], "characters": "\u0169" },
+ "▵": { "codepoints": [9653], "characters": "\u25B5" },
+ "▴": { "codepoints": [9652], "characters": "\u25B4" },
+ "⇈": { "codepoints": [8648], "characters": "\u21C8" },
+ "ü": { "codepoints": [252], "characters": "\u00FC" },
+ "ü": { "codepoints": [252], "characters": "\u00FC" },
+ "⦧": { "codepoints": [10663], "characters": "\u29A7" },
+ "⇕": { "codepoints": [8661], "characters": "\u21D5" },
+ "⫨": { "codepoints": [10984], "characters": "\u2AE8" },
+ "⫩": { "codepoints": [10985], "characters": "\u2AE9" },
+ "⊨": { "codepoints": [8872], "characters": "\u22A8" },
+ "⦜": { "codepoints": [10652], "characters": "\u299C" },
+ "ϵ": { "codepoints": [1013], "characters": "\u03F5" },
+ "ϰ": { "codepoints": [1008], "characters": "\u03F0" },
+ "∅": { "codepoints": [8709], "characters": "\u2205" },
+ "ϕ": { "codepoints": [981], "characters": "\u03D5" },
+ "ϖ": { "codepoints": [982], "characters": "\u03D6" },
+ "∝": { "codepoints": [8733], "characters": "\u221D" },
+ "↕": { "codepoints": [8597], "characters": "\u2195" },
+ "ϱ": { "codepoints": [1009], "characters": "\u03F1" },
+ "ς": { "codepoints": [962], "characters": "\u03C2" },
+ "⊊︀": { "codepoints": [8842, 65024], "characters": "\u228A\uFE00" },
+ "⫋︀": { "codepoints": [10955, 65024], "characters": "\u2ACB\uFE00" },
+ "⊋︀": { "codepoints": [8843, 65024], "characters": "\u228B\uFE00" },
+ "⫌︀": { "codepoints": [10956, 65024], "characters": "\u2ACC\uFE00" },
+ "ϑ": { "codepoints": [977], "characters": "\u03D1" },
+ "⊲": { "codepoints": [8882], "characters": "\u22B2" },
+ "⊳": { "codepoints": [8883], "characters": "\u22B3" },
+ "в": { "codepoints": [1074], "characters": "\u0432" },
+ "⊢": { "codepoints": [8866], "characters": "\u22A2" },
+ "∨": { "codepoints": [8744], "characters": "\u2228" },
+ "⊻": { "codepoints": [8891], "characters": "\u22BB" },
+ "≚": { "codepoints": [8794], "characters": "\u225A" },
+ "⋮": { "codepoints": [8942], "characters": "\u22EE" },
+ "|": { "codepoints": [124], "characters": "\u007C" },
+ "|": { "codepoints": [124], "characters": "\u007C" },
+ "𝔳": { "codepoints": [120115], "characters": "\uD835\uDD33" },
+ "⊲": { "codepoints": [8882], "characters": "\u22B2" },
+ "⊂⃒": { "codepoints": [8834, 8402], "characters": "\u2282\u20D2" },
+ "⊃⃒": { "codepoints": [8835, 8402], "characters": "\u2283\u20D2" },
+ "𝕧": { "codepoints": [120167], "characters": "\uD835\uDD67" },
+ "∝": { "codepoints": [8733], "characters": "\u221D" },
+ "⊳": { "codepoints": [8883], "characters": "\u22B3" },
+ "𝓋": { "codepoints": [120011], "characters": "\uD835\uDCCB" },
+ "⫋︀": { "codepoints": [10955, 65024], "characters": "\u2ACB\uFE00" },
+ "⊊︀": { "codepoints": [8842, 65024], "characters": "\u228A\uFE00" },
+ "⫌︀": { "codepoints": [10956, 65024], "characters": "\u2ACC\uFE00" },
+ "⊋︀": { "codepoints": [8843, 65024], "characters": "\u228B\uFE00" },
+ "⦚": { "codepoints": [10650], "characters": "\u299A" },
+ "ŵ": { "codepoints": [373], "characters": "\u0175" },
+ "⩟": { "codepoints": [10847], "characters": "\u2A5F" },
+ "∧": { "codepoints": [8743], "characters": "\u2227" },
+ "≙": { "codepoints": [8793], "characters": "\u2259" },
+ "℘": { "codepoints": [8472], "characters": "\u2118" },
+ "𝔴": { "codepoints": [120116], "characters": "\uD835\uDD34" },
+ "𝕨": { "codepoints": [120168], "characters": "\uD835\uDD68" },
+ "℘": { "codepoints": [8472], "characters": "\u2118" },
+ "≀": { "codepoints": [8768], "characters": "\u2240" },
+ "≀": { "codepoints": [8768], "characters": "\u2240" },
+ "𝓌": { "codepoints": [120012], "characters": "\uD835\uDCCC" },
+ "⋂": { "codepoints": [8898], "characters": "\u22C2" },
+ "◯": { "codepoints": [9711], "characters": "\u25EF" },
+ "⋃": { "codepoints": [8899], "characters": "\u22C3" },
+ "▽": { "codepoints": [9661], "characters": "\u25BD" },
+ "𝔵": { "codepoints": [120117], "characters": "\uD835\uDD35" },
+ "⟺": { "codepoints": [10234], "characters": "\u27FA" },
+ "⟷": { "codepoints": [10231], "characters": "\u27F7" },
+ "ξ": { "codepoints": [958], "characters": "\u03BE" },
+ "⟸": { "codepoints": [10232], "characters": "\u27F8" },
+ "⟵": { "codepoints": [10229], "characters": "\u27F5" },
+ "⟼": { "codepoints": [10236], "characters": "\u27FC" },
+ "⋻": { "codepoints": [8955], "characters": "\u22FB" },
+ "⨀": { "codepoints": [10752], "characters": "\u2A00" },
+ "𝕩": { "codepoints": [120169], "characters": "\uD835\uDD69" },
+ "⨁": { "codepoints": [10753], "characters": "\u2A01" },
+ "⨂": { "codepoints": [10754], "characters": "\u2A02" },
+ "⟹": { "codepoints": [10233], "characters": "\u27F9" },
+ "⟶": { "codepoints": [10230], "characters": "\u27F6" },
+ "𝓍": { "codepoints": [120013], "characters": "\uD835\uDCCD" },
+ "⨆": { "codepoints": [10758], "characters": "\u2A06" },
+ "⨄": { "codepoints": [10756], "characters": "\u2A04" },
+ "△": { "codepoints": [9651], "characters": "\u25B3" },
+ "⋁": { "codepoints": [8897], "characters": "\u22C1" },
+ "⋀": { "codepoints": [8896], "characters": "\u22C0" },
+ "ý": { "codepoints": [253], "characters": "\u00FD" },
+ "ý": { "codepoints": [253], "characters": "\u00FD" },
+ "я": { "codepoints": [1103], "characters": "\u044F" },
+ "ŷ": { "codepoints": [375], "characters": "\u0177" },
+ "ы": { "codepoints": [1099], "characters": "\u044B" },
+ "¥": { "codepoints": [165], "characters": "\u00A5" },
+ "¥": { "codepoints": [165], "characters": "\u00A5" },
+ "𝔶": { "codepoints": [120118], "characters": "\uD835\uDD36" },
+ "ї": { "codepoints": [1111], "characters": "\u0457" },
+ "𝕪": { "codepoints": [120170], "characters": "\uD835\uDD6A" },
+ "𝓎": { "codepoints": [120014], "characters": "\uD835\uDCCE" },
+ "ю": { "codepoints": [1102], "characters": "\u044E" },
+ "ÿ": { "codepoints": [255], "characters": "\u00FF" },
+ "ÿ": { "codepoints": [255], "characters": "\u00FF" },
+ "ź": { "codepoints": [378], "characters": "\u017A" },
+ "ž": { "codepoints": [382], "characters": "\u017E" },
+ "з": { "codepoints": [1079], "characters": "\u0437" },
+ "ż": { "codepoints": [380], "characters": "\u017C" },
+ "ℨ": { "codepoints": [8488], "characters": "\u2128" },
+ "ζ": { "codepoints": [950], "characters": "\u03B6" },
+ "𝔷": { "codepoints": [120119], "characters": "\uD835\uDD37" },
+ "ж": { "codepoints": [1078], "characters": "\u0436" },
+ "⇝": { "codepoints": [8669], "characters": "\u21DD" },
+ "𝕫": { "codepoints": [120171], "characters": "\uD835\uDD6B" },
+ "𝓏": { "codepoints": [120015], "characters": "\uD835\uDCCF" },
+ "": { "codepoints": [8205], "characters": "\u200D" },
+ "": { "codepoints": [8204], "characters": "\u200C" }
+}
diff --git a/src/core/vendor/htmlEntities/entity.txt b/src/core/vendor/htmlEntities/entity.txt
new file mode 100644
index 0000000000..14696f8337
--- /dev/null
+++ b/src/core/vendor/htmlEntities/entity.txt
@@ -0,0 +1,14 @@
+entity.json is the WHATWG named character reference set, retrieved verbatim from:
+
+ https://html.spec.whatwg.org/entities.json
+
+It is used by src/core/config/scripts/generateHTMLEntities.mjs to generate the
+shared HTML entity lookup tables (src/core/lib/HTMLEntities.mjs) consumed by the
+"To HTML Entity" and "From HTML Entity" operations.
+
+Source: HTML Standard — 13.5 Named character references
+ https://html.spec.whatwg.org/multipage/named-characters.html
+
+Copyright and licence
+---------------------
+Copyright © WHATWG (Apple, Google, Mozilla, Microsoft). This work is licensed under a Creative Commons Attribution 4.0 International License. To the extent portions of it are incorporated into source code, such portions in the source code are licensed under the BSD 3-Clause License instead.
diff --git a/tests/node/tests/ToHTMLEntity.mjs b/tests/node/tests/ToHTMLEntity.mjs
index 43d8cb4935..2ac47f3d75 100644
--- a/tests/node/tests/ToHTMLEntity.mjs
+++ b/tests/node/tests/ToHTMLEntity.mjs
@@ -1,7 +1,20 @@
import TestRegister from "../../lib/TestRegister.mjs";
import ToHTMLEntity from "../../../src/core/operations/ToHTMLEntity.mjs";
+import FromHTMLEntity from "../../../src/core/operations/FromHTMLEntity.mjs";
+import { HTML_ENTITY_LOOKUP, HTML_ENTITY_REVERSE_LOOKUP } from "../../../src/core/lib/HTMLEntities.mjs";
import it from "../assertionHandler.mjs";
import assert from "assert";
+import { readFileSync } from "fs";
+import { fileURLToPath } from "url";
+import path from "path";
+
+// Vendored WHATWG named character reference set (https://html.spec.whatwg.org/entities.json).
+const SPEC = JSON.parse(readFileSync(path.join(
+ path.dirname(fileURLToPath(import.meta.url)),
+ "../../../src/core/vendor/htmlEntities/entity.json"), "utf8"));
+const specByName = {};
+for (const [key, val] of Object.entries(SPEC))
+ if (key.endsWith(";")) specByName[key.slice(1, -1)] = val.codepoints;
TestRegister.addApiTests([
it("To HTML Entity: every named entity in the table is well-formed", () => {
@@ -30,4 +43,40 @@ TestRegister.addApiTests([
}
assert.deepStrictEqual(malformed, [], `Malformed entity value(s) near: ${JSON.stringify(malformed)}`);
}),
+
+ it("HTML Entity: named encoding round-trips through From HTML Entity", () => {
+ // Because both operations share one lookup table, encoding a character to
+ // a named entity and decoding it must return the original character for
+ // every BMP code point: FromHTMLEntity(ToHTMLEntity(x)) === x.
+ const toOp = new ToHTMLEntity(),
+ fromOp = new FromHTMLEntity();
+ const mismatches = [];
+ for (let cp = 0; cp <= 0xFFFF; cp++) {
+ if (cp >= 0xD800 && cp <= 0xDFFF) continue; // skip surrogate range
+ const char = String.fromCodePoint(cp);
+ const encoded = toOp.run(char, [true, "Named entities"]);
+ const decoded = fromOp.run(encoded, []);
+ if (decoded !== char)
+ mismatches.push(`U+${cp.toString(16).toUpperCase().padStart(4, "0")} -> ${encoded} -> U+${decoded.codePointAt(0).toString(16).toUpperCase()}`);
+ }
+ assert.deepStrictEqual(mismatches, [], `Round-trip failed for: ${JSON.stringify(mismatches.slice(0, 20))}`);
+ }),
+
+ it("HTML Entity: every table entry is conformant with the WHATWG spec", () => {
+ // Both lookup tables must agree with entities.json: every encode name is a
+ // real spec name mapping to exactly that code point, and every decode name
+ // maps to the spec code point.
+ const violations = [];
+ for (const [cp, name] of Object.entries(HTML_ENTITY_LOOKUP)) {
+ const spec = specByName[name];
+ if (!spec || spec.length !== 1 || spec[0] !== Number(cp))
+ violations.push(`encode ${cp} -> &${name}; (spec: ${spec ? JSON.stringify(spec) : "none"})`);
+ }
+ for (const [name, cp] of Object.entries(HTML_ENTITY_REVERSE_LOOKUP)) {
+ const spec = specByName[name];
+ if (!spec || spec.length !== 1 || spec[0] !== cp)
+ violations.push(`decode &${name}; -> ${cp} (spec: ${spec ? JSON.stringify(spec) : "none"})`);
+ }
+ assert.deepStrictEqual(violations, [], `Spec violations: ${JSON.stringify(violations.slice(0, 20))}`);
+ }),
]);
diff --git a/tests/operations/tests/HTMLEntity.mjs b/tests/operations/tests/HTMLEntity.mjs
new file mode 100644
index 0000000000..e77433a856
--- /dev/null
+++ b/tests/operations/tests/HTMLEntity.mjs
@@ -0,0 +1,126 @@
+/**
+ * To/From HTML Entity tests.
+ *
+ * @author roberson-io [michaelroberson@gmail.com]
+ * @copyright Crown Copyright 2026
+ * @license Apache-2.0
+ */
+import TestRegister from "../../lib/TestRegister.mjs";
+
+TestRegister.addTests([
+ {
+ name: "To HTML Entity: named",
+ input: "\"&\"",
+ expectedOutput: "<a href='#'>"&"</a>",
+ recipeConfig: [
+ { op: "To HTML Entity", args: [false, "Named entities"] },
+ ],
+ },
+ {
+ // Regression: this value was "⇌;" (stray trailing semicolon) in the
+ // original byteToEntity table. See issue #2645.
+ name: "To HTML Entity: malformed value fixed (U+21CC)",
+ input: "⇌",
+ expectedOutput: "⇌",
+ recipeConfig: [
+ { op: "To HTML Entity", args: [false, "Named entities"] },
+ ],
+ },
+ {
+ // Regression: U+03F5 emitted "ε," before; the spec name is ϵ
+ // (ε is U+03B5). See issue #2645.
+ name: "To HTML Entity: spec-conformant name (U+03F5)",
+ input: "ϵ",
+ expectedOutput: "ϵ",
+ recipeConfig: [
+ { op: "To HTML Entity", args: [false, "Named entities"] },
+ ],
+ },
+ {
+ // Regression: the OHM SIGN previously emitted the non-conformant Ω
+ // (spec Ω is U+03A9). It now encodes numerically.
+ name: "To HTML Entity: non-conformant name dropped (U+2126 ohm sign)",
+ input: "Ω",
+ expectedOutput: "Ω",
+ recipeConfig: [
+ { op: "To HTML Entity", args: [false, "Named entities"] },
+ ],
+ },
+ {
+ // The FULL BLOCK previously decoded to █ but never encoded to it.
+ // Generating both tables from the spec fixes this asymmetry.
+ name: "To HTML Entity: encode/decode symmetry (U+2588 block)",
+ input: "█",
+ expectedOutput: "█",
+ recipeConfig: [
+ { op: "To HTML Entity", args: [false, "Named entities"] },
+ ],
+ },
+ {
+ name: "To HTML Entity: numeric, convert all",
+ input: "A<",
+ expectedOutput: "A<",
+ recipeConfig: [
+ { op: "To HTML Entity", args: [true, "Numeric entities"] },
+ ],
+ },
+ {
+ name: "To HTML Entity: hex, convert all",
+ input: "A<",
+ expectedOutput: "A<",
+ recipeConfig: [
+ { op: "To HTML Entity", args: [true, "Hex entities"] },
+ ],
+ },
+ {
+ name: "From HTML Entity: named",
+ input: "<a href='#'>"&"</a>",
+ expectedOutput: "\"&\"",
+ recipeConfig: [
+ { op: "From HTML Entity", args: [] },
+ ],
+ },
+ {
+ // Legacy/alias names still decode, now to the spec code point.
+ name: "From HTML Entity: alias to spec code point (Ω)",
+ input: "Ω",
+ expectedOutput: "Ω",
+ recipeConfig: [
+ { op: "From HTML Entity", args: [] },
+ ],
+ },
+ {
+ name: "From HTML Entity: decimal numeric entity",
+ input: "A",
+ expectedOutput: "A",
+ recipeConfig: [
+ { op: "From HTML Entity", args: [] },
+ ],
+ },
+ {
+ name: "From HTML Entity: hex numeric entity",
+ input: "A",
+ expectedOutput: "A",
+ recipeConfig: [
+ { op: "From HTML Entity", args: [] },
+ ],
+ },
+ {
+ // Unknown entities are passed through unchanged.
+ name: "From HTML Entity: invalid entity passed through",
+ input: "a ¬real; b",
+ expectedOutput: "a ¬real; b",
+ recipeConfig: [
+ { op: "From HTML Entity", args: [] },
+ ],
+ },
+ {
+ name: "HTML Entity: round-trips through both operations",
+ input: "Hello & \"friends\" — ⇌ █",
+ expectedOutput: "Hello & \"friends\" — ⇌ █",
+ recipeConfig: [
+ { op: "To HTML Entity", args: [true, "Named entities"] },
+ { op: "From HTML Entity", args: [] },
+ ],
+ },
+]);
From d1722827558fe02afd6ee6b83cb7f70c4eddb98b Mon Sep 17 00:00:00 2001
From: p-leriche <7701190+p-leriche@users.noreply.github.com>
Date: Fri, 17 Jul 2026 18:04:13 +0100
Subject: [PATCH 4/5] Add Modular Inverse operation (#2207)
---
src/core/config/Categories.json | 1 +
src/core/operations/ModularInverse.mjs | 107 ++++++++++++++++++++++
tests/operations/tests/ModularInverse.mjs | 78 ++++++++++++++++
3 files changed, 186 insertions(+)
create mode 100644 src/core/operations/ModularInverse.mjs
create mode 100644 tests/operations/tests/ModularInverse.mjs
diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json
index 20846692cc..a9d54d7bbd 100644
--- a/src/core/config/Categories.json
+++ b/src/core/config/Categories.json
@@ -244,6 +244,7 @@
"Multiply",
"Divide",
"Extended GCD",
+ "Modular Inverse",
"Mean",
"Median",
"Standard Deviation",
diff --git a/src/core/operations/ModularInverse.mjs b/src/core/operations/ModularInverse.mjs
new file mode 100644
index 0000000000..88f4bff769
--- /dev/null
+++ b/src/core/operations/ModularInverse.mjs
@@ -0,0 +1,107 @@
+/**
+ * @author p-leriche [philip.leriche@cantab.net]
+ * @copyright Crown Copyright 2025
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation.mjs";
+import OperationError from "../errors/OperationError.mjs";
+import { parseBigInt, egcd } from "../lib/BigIntUtils.mjs";
+
+
+/* ---------- operation class ---------- */
+
+/**
+ * Modular Inverse operation
+ */
+class ModularInverse extends Operation {
+
+ /**
+ * ModularInverse constructor
+ */
+ constructor() {
+ super();
+
+ this.name = "Modular Inverse";
+ this.module = "Crypto";
+ this.description =
+ "Computes the modular multiplicative inverse of a modulo m.
" +
+ "Finds x such that a*x = 1 (mod m).
" +
+ "Input handling: If either a or m is left blank, " +
+ "its value is taken from the Input field.";
+ this.infoURL = "https://wikipedia.org/wiki/Modular_multiplicative_inverse";
+ this.inputType = "string";
+ this.outputType = "string";
+ this.args = [
+ {
+ name: "Value (a)",
+ type: "string",
+ value: ""
+ },
+ {
+ name: "Modulus (m)",
+ type: "string",
+ value: ""
+ }
+ ];
+ }
+
+ /**
+ * @param {string} input
+ * @param {Object[]} args
+ * @returns {string}
+ */
+ run(input, args) {
+ const [aStr, mStr] = args;
+
+ // Trim everything so "" and " " count as empty
+ const aParam = aStr?.trim();
+ const mParam = mStr?.trim();
+ const inputVal = input?.trim();
+
+ let a, m;
+
+ if (aParam && mParam) {
+ // Case 1: value and modulus both given as parameters
+ a = aParam;
+ m = mParam;
+ } else if (!aParam && mParam) {
+ // Case 2: value missing - take from input
+ a = inputVal;
+ m = mParam;
+ if (!a) throw new OperationError("Value (a) must be defined");
+ } else if (aParam && !mParam) {
+ // Case 3: modulus missing - take from input
+ a = aParam;
+ m = inputVal;
+ if (!m) throw new OperationError("Modulus (m) must be defined");
+ } else if (!aParam && !mParam) {
+ // Case 4: value and modulus both missing
+ throw new OperationError("Value (a) and Modulus (m) must be defined");
+ }
+
+ const aBI = parseBigInt(a, "Value (a)");
+ const mBI = parseBigInt(m, "Modulus (m)");
+
+ if (mBI <= 0n) {
+ throw new OperationError("Modulus must be greater than zero");
+ }
+
+ const aNorm = ((aBI % mBI) + mBI) % mBI;
+ const [g, x] = egcd(aNorm, mBI);
+
+ if (g !== 1n && g !== -1n) {
+ throw new OperationError("Inverse does not exist because gcd(a, m) ≠ 1");
+ }
+
+ let inv = x;
+ if (g === -1n) inv = -inv;
+
+ inv = ((inv % mBI) + mBI) % mBI;
+
+
+ return inv.toString();
+ }
+}
+
+export default ModularInverse;
diff --git a/tests/operations/tests/ModularInverse.mjs b/tests/operations/tests/ModularInverse.mjs
new file mode 100644
index 0000000000..53cb46a0d7
--- /dev/null
+++ b/tests/operations/tests/ModularInverse.mjs
@@ -0,0 +1,78 @@
+/**
+ * Modular Inverse tests.
+ *
+ * @author p-leriche [philip.leriche@cantab.net]
+ *
+ * @copyright Crown Copyright 2025
+ * @license Apache-2.0
+ */
+import TestRegister from "../../lib/TestRegister.mjs";
+
+TestRegister.addTests([
+ {
+ name: "Modular Inverse: basic example (3 mod 11)",
+ input: "",
+ expectedOutput: "4",
+ recipeConfig: [
+ {
+ op: "Modular Inverse",
+ args: ["3", "11"],
+ },
+ ],
+ },
+ {
+ name: "Modular Inverse: another coprime pair (7 mod 26)",
+ input: "",
+ expectedOutput: "15",
+ recipeConfig: [
+ {
+ op: "Modular Inverse",
+ args: ["7", "26"],
+ },
+ ],
+ },
+ {
+ name: "Modular Inverse: hexadecimal input (0x10 mod 0x11)",
+ input: "",
+ expectedOutput: "16",
+ recipeConfig: [
+ {
+ op: "Modular Inverse",
+ args: ["0x10", "0x11"],
+ },
+ ],
+ },
+ {
+ name: "Modular Inverse: using input field for value",
+ input: "5",
+ expectedOutput: "21",
+ recipeConfig: [
+ {
+ op: "Modular Inverse",
+ args: ["", "26"],
+ },
+ ],
+ },
+ {
+ name: "Modular Inverse: using input field for modulus",
+ input: "17",
+ expectedOutput: "7",
+ recipeConfig: [
+ {
+ op: "Modular Inverse",
+ args: ["5", ""],
+ },
+ ],
+ },
+ {
+ name: "Modular Inverse: large number (RSA-like)",
+ input: "",
+ expectedOutput: "934281398294",
+ recipeConfig: [
+ {
+ op: "Modular Inverse",
+ args: ["65537", "9999999999999"],
+ },
+ ],
+ },
+]);
From c7898130e7e6a1afbfd00d3fce7b7fc6d9b1e2a7 Mon Sep 17 00:00:00 2001
From: p-leriche <7701190+p-leriche@users.noreply.github.com>
Date: Fri, 17 Jul 2026 18:09:06 +0100
Subject: [PATCH 5/5] Add Generate Prime Number operation (#2212)
---
src/core/config/Categories.json | 1 +
src/core/operations/GeneratePrime.mjs | 154 ++++++++++++++++++++++++++
src/core/operations/RandomPrime.mjs | 154 ++++++++++++++++++++++++++
3 files changed, 309 insertions(+)
create mode 100644 src/core/operations/GeneratePrime.mjs
create mode 100644 src/core/operations/RandomPrime.mjs
diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json
index a9d54d7bbd..bf2c311806 100644
--- a/src/core/config/Categories.json
+++ b/src/core/config/Categories.json
@@ -175,6 +175,7 @@
"AES Key Wrap",
"AES Key Unwrap",
"Pseudo-Random Number Generator",
+ "Pseudo-Random Prime Generator",
"Enigma",
"Bombe",
"Multiple Bombe",
diff --git a/src/core/operations/GeneratePrime.mjs b/src/core/operations/GeneratePrime.mjs
new file mode 100644
index 0000000000..3509045f00
--- /dev/null
+++ b/src/core/operations/GeneratePrime.mjs
@@ -0,0 +1,154 @@
+/**
+ * @author p-leriche [philip.leriche@cantab.net]
+ * @copyright Crown Copyright 2025
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation.mjs";
+import OperationError from "../errors/OperationError.mjs";
+import { modPow } from "../lib/BigIntUtils.mjs";
+
+/* ---------- helper functions ---------- */
+
+/**
+ * Generate random BigInt with specified bit length
+ */
+function randBigInt(bits) {
+ const bytes = Math.ceil(bits / 8);
+ const a = new Uint8Array(bytes);
+ crypto.getRandomValues(a);
+
+ // Set high bit to ensure correct bit length
+ a[0] |= 1 << (7 - ((8 * bytes - bits)));
+ // Set low bit to ensure odd (primes > 2 are odd)
+ a[bytes - 1] |= 1;
+
+ let h = "";
+ for (const b of a) h += b.toString(16).padStart(2, "0");
+ return BigInt("0x" + h);
+}
+
+/**
+ * Miller-Rabin primality test
+ */
+function isProbablePrime(n, rounds) {
+ if (n < 2n) return false;
+ if (n === 2n || n === 3n) return true;
+ if (n % 2n === 0n) return false;
+
+ // Write n-1 as 2^r * d
+ let d = n - 1n;
+ let r = 0n;
+ while (d % 2n === 0n) {
+ d /= 2n;
+ r++;
+ }
+
+ // Witness loop
+ for (let i = 0; i < rounds; i++) {
+ const a = randBigInt(n.toString(2).length - 1) % (n - 3n) + 2n;
+ let x = modPow(a, d, n);
+
+ if (x === 1n || x === n - 1n) continue;
+
+ let composite = true;
+ for (let j = 0n; j < r - 1n; j++) {
+ x = modPow(x, 2n, n);
+ if (x === n - 1n) {
+ composite = false;
+ break;
+ }
+ }
+
+ if (composite) return false;
+ }
+
+ return true;
+}
+
+/* ---------- operation class ---------- */
+
+/**
+ * Generate Prime Number operation
+ */
+class GeneratePrime extends Operation {
+ /**
+ * GeneratePrime constructor
+ */
+ constructor() {
+ super();
+
+ this.name = "Pseudo-Random Prime Generator";
+ this.module = "Crypto";
+ this.description =
+ "Generates a random probable prime number of specified bit length using the Miller-Rabin primality test.
" +
+ "Primality guarantee:
" +
+ "For numbers . 3,317, the result is guaranteed prime (deterministic test).
" +
+ "For larger numbers, uses probabilistic testing:
" +
+ "- Standard (7 rounds): Probability of composite approx 1 in 16,000)
" +
+ "- Crypto grade (40 rounds): Probability of composite(approx 1 in 10^24)
" +
+ "Crypto grade is recommended for cryptographic applications (RSA, Diffie-Hellman, etc.).
" ;
+ this.infoURL = "https://wikipedia.org/wiki/Miller-Rabin_primality_test";
+ this.inputType = "string";
+ this.outputType = "string";
+ this.args = [
+ {
+ name: "Bit length",
+ type: "number",
+ value: 512,
+ min: 2
+ },
+ {
+ name: "Crypto grade",
+ type: "boolean",
+ value: false
+ },
+ {
+ name: "Output format",
+ type: "option",
+ value: ["Decimal", "Hexadecimal"]
+ }
+ ];
+ }
+
+ /**
+ * @param {string} input
+ * @param {Object[]} args
+ * @returns {string}
+ */
+ run(input, args) {
+ const [bits, cryptoGrade, outputFormat] = args;
+
+ if (bits < 2) {
+ throw new OperationError("Bit length must be at least 2");
+ }
+
+ if (bits > 4096) {
+ throw new OperationError("Bit length limited to 4096 bits for performance reasons");
+ }
+
+ const rounds = cryptoGrade ? 40 : 7;
+ let attempts = 0;
+ const maxAttempts = 10000;
+
+ let n = randBigInt(bits);
+
+ while (!isProbablePrime(n, rounds)) {
+ n = randBigInt(bits);
+ attempts++;
+
+ if (attempts > maxAttempts) {
+ throw new OperationError(`Failed to generate prime after ${maxAttempts} attempts. Try a different bit length.`);
+ }
+ }
+
+ // Return only the prime for pipeability
+ if (outputFormat === "Hexadecimal") {
+ return "0x" + n.toString(16);
+ } else {
+ return n.toString();
+ }
+ }
+}
+
+export default GeneratePrime;
diff --git a/src/core/operations/RandomPrime.mjs b/src/core/operations/RandomPrime.mjs
new file mode 100644
index 0000000000..3509045f00
--- /dev/null
+++ b/src/core/operations/RandomPrime.mjs
@@ -0,0 +1,154 @@
+/**
+ * @author p-leriche [philip.leriche@cantab.net]
+ * @copyright Crown Copyright 2025
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation.mjs";
+import OperationError from "../errors/OperationError.mjs";
+import { modPow } from "../lib/BigIntUtils.mjs";
+
+/* ---------- helper functions ---------- */
+
+/**
+ * Generate random BigInt with specified bit length
+ */
+function randBigInt(bits) {
+ const bytes = Math.ceil(bits / 8);
+ const a = new Uint8Array(bytes);
+ crypto.getRandomValues(a);
+
+ // Set high bit to ensure correct bit length
+ a[0] |= 1 << (7 - ((8 * bytes - bits)));
+ // Set low bit to ensure odd (primes > 2 are odd)
+ a[bytes - 1] |= 1;
+
+ let h = "";
+ for (const b of a) h += b.toString(16).padStart(2, "0");
+ return BigInt("0x" + h);
+}
+
+/**
+ * Miller-Rabin primality test
+ */
+function isProbablePrime(n, rounds) {
+ if (n < 2n) return false;
+ if (n === 2n || n === 3n) return true;
+ if (n % 2n === 0n) return false;
+
+ // Write n-1 as 2^r * d
+ let d = n - 1n;
+ let r = 0n;
+ while (d % 2n === 0n) {
+ d /= 2n;
+ r++;
+ }
+
+ // Witness loop
+ for (let i = 0; i < rounds; i++) {
+ const a = randBigInt(n.toString(2).length - 1) % (n - 3n) + 2n;
+ let x = modPow(a, d, n);
+
+ if (x === 1n || x === n - 1n) continue;
+
+ let composite = true;
+ for (let j = 0n; j < r - 1n; j++) {
+ x = modPow(x, 2n, n);
+ if (x === n - 1n) {
+ composite = false;
+ break;
+ }
+ }
+
+ if (composite) return false;
+ }
+
+ return true;
+}
+
+/* ---------- operation class ---------- */
+
+/**
+ * Generate Prime Number operation
+ */
+class GeneratePrime extends Operation {
+ /**
+ * GeneratePrime constructor
+ */
+ constructor() {
+ super();
+
+ this.name = "Pseudo-Random Prime Generator";
+ this.module = "Crypto";
+ this.description =
+ "Generates a random probable prime number of specified bit length using the Miller-Rabin primality test.
" +
+ "Primality guarantee:
" +
+ "For numbers . 3,317, the result is guaranteed prime (deterministic test).
" +
+ "For larger numbers, uses probabilistic testing:
" +
+ "- Standard (7 rounds): Probability of composite approx 1 in 16,000)
" +
+ "- Crypto grade (40 rounds): Probability of composite(approx 1 in 10^24)
" +
+ "Crypto grade is recommended for cryptographic applications (RSA, Diffie-Hellman, etc.).
" ;
+ this.infoURL = "https://wikipedia.org/wiki/Miller-Rabin_primality_test";
+ this.inputType = "string";
+ this.outputType = "string";
+ this.args = [
+ {
+ name: "Bit length",
+ type: "number",
+ value: 512,
+ min: 2
+ },
+ {
+ name: "Crypto grade",
+ type: "boolean",
+ value: false
+ },
+ {
+ name: "Output format",
+ type: "option",
+ value: ["Decimal", "Hexadecimal"]
+ }
+ ];
+ }
+
+ /**
+ * @param {string} input
+ * @param {Object[]} args
+ * @returns {string}
+ */
+ run(input, args) {
+ const [bits, cryptoGrade, outputFormat] = args;
+
+ if (bits < 2) {
+ throw new OperationError("Bit length must be at least 2");
+ }
+
+ if (bits > 4096) {
+ throw new OperationError("Bit length limited to 4096 bits for performance reasons");
+ }
+
+ const rounds = cryptoGrade ? 40 : 7;
+ let attempts = 0;
+ const maxAttempts = 10000;
+
+ let n = randBigInt(bits);
+
+ while (!isProbablePrime(n, rounds)) {
+ n = randBigInt(bits);
+ attempts++;
+
+ if (attempts > maxAttempts) {
+ throw new OperationError(`Failed to generate prime after ${maxAttempts} attempts. Try a different bit length.`);
+ }
+ }
+
+ // Return only the prime for pipeability
+ if (outputFormat === "Hexadecimal") {
+ return "0x" + n.toString(16);
+ } else {
+ return n.toString();
+ }
+ }
+}
+
+export default GeneratePrime;