aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/compiler/doc/src/notes.xml17
-rw-r--r--lib/compiler/src/beam_jump.erl13
-rw-r--r--lib/compiler/src/erl_bifs.erl1
-rw-r--r--lib/compiler/test/beam_jump_SUITE.erl47
-rw-r--r--lib/compiler/test/bs_match_SUITE.erl17
-rw-r--r--lib/compiler/vsn.mk2
-rw-r--r--lib/crypto/c_src/crypto.c29
-rw-r--r--lib/crypto/doc/src/algorithm_details.xml92
-rw-r--r--lib/crypto/src/crypto.erl2
-rw-r--r--lib/crypto/test/crypto_SUITE.erl171
-rw-r--r--lib/crypto/test/engine_SUITE.erl15
-rw-r--r--lib/eldap/README2
-rw-r--r--lib/eldap/doc/src/notes.xml49
-rw-r--r--lib/eldap/src/eldap.erl15
-rw-r--r--lib/eldap/test/make_certs.erl4
-rw-r--r--lib/eldap/vsn.mk2
-rw-r--r--lib/erl_docgen/doc/src/doc-build.xml2
-rw-r--r--lib/erl_interface/src/README.internal8
-rw-r--r--lib/hipe/llvm/hipe_llvm_main.erl12
-rw-r--r--lib/hipe/main/hipe.erl151
-rw-r--r--lib/hipe/test/hipe_testsuite_driver.erl2
-rw-r--r--lib/kernel/doc/src/inet.xml194
-rw-r--r--lib/kernel/doc/src/logger.xml92
-rw-r--r--lib/kernel/doc/src/logger_chapter.xml30
-rw-r--r--lib/kernel/doc/src/logger_disk_log_h.xml10
-rw-r--r--lib/kernel/doc/src/logger_std_h.xml4
-rw-r--r--lib/kernel/src/inet.erl82
-rw-r--r--lib/kernel/src/inet_int.hrl1
-rw-r--r--lib/kernel/src/inet_tcp_dist.erl2
-rw-r--r--lib/kernel/src/logger.erl35
-rw-r--r--lib/kernel/src/logger_disk_log_h.erl81
-rw-r--r--lib/kernel/src/logger_h_common.erl5
-rw-r--r--lib/kernel/src/logger_server.erl146
-rw-r--r--lib/kernel/src/logger_std_h.erl67
-rw-r--r--lib/kernel/src/net_kernel.erl2
-rw-r--r--lib/kernel/test/code_SUITE.erl2
-rw-r--r--lib/kernel/test/file_SUITE.erl31
-rw-r--r--lib/kernel/test/gen_tcp_misc_SUITE.erl150
-rw-r--r--lib/kernel/test/inet_SUITE.erl172
-rw-r--r--lib/kernel/test/inet_sockopt_SUITE.erl9
-rw-r--r--lib/kernel/test/logger_SUITE.erl12
-rw-r--r--lib/kernel/test/logger_disk_log_h_SUITE.erl179
-rw-r--r--lib/kernel/test/logger_std_h_SUITE.erl175
-rw-r--r--lib/kernel/test/prim_file_SUITE.erl3
-rw-r--r--lib/kernel/test/seq_trace_SUITE.erl7
-rw-r--r--lib/mnesia/examples/bench/README4
-rw-r--r--lib/mnesia/test/README6
-rw-r--r--lib/observer/src/crashdump_viewer.erl155
-rw-r--r--lib/observer/test/crashdump_helper.erl21
-rw-r--r--lib/os_mon/c_src/cpu_sup.c50
-rw-r--r--lib/os_mon/src/cpu_sup.erl26
-rw-r--r--lib/public_key/asn1/OTP-PKIX.asn17
-rw-r--r--lib/public_key/src/public_key.erl4
-rw-r--r--lib/public_key/test/public_key_SUITE.erl11
-rw-r--r--lib/ssh/doc/src/Makefile3
-rw-r--r--lib/ssh/doc/src/ref_man.xml1
-rw-r--r--lib/ssh/doc/src/specs.xml1
-rw-r--r--lib/ssh/doc/src/ssh.xml72
-rw-r--r--lib/ssh/doc/src/ssh_app.xml7
-rw-r--r--lib/ssh/doc/src/ssh_file.xml275
-rw-r--r--lib/ssh/doc/src/ssh_sftp.xml1
-rw-r--r--lib/ssh/doc/src/terminology.xml185
-rw-r--r--lib/ssh/doc/src/usersguide.xml1
-rw-r--r--lib/ssh/doc/src/using_ssh.xml11
-rw-r--r--lib/ssh/src/ssh.hrl14
-rw-r--r--lib/ssh/src/ssh_file.erl17
-rw-r--r--lib/ssh/test/property_test/ssh_eqc_client_info_timing.erl20
-rw-r--r--lib/ssh/test/property_test/ssh_eqc_client_server.erl230
-rw-r--r--lib/ssh/test/ssh_property_test_SUITE.erl7
-rw-r--r--lib/ssl/doc/src/notes.xml29
-rw-r--r--lib/ssl/doc/src/ssl.xml40
-rw-r--r--lib/ssl/src/Makefile3
-rw-r--r--lib/ssl/src/dtls_handshake.erl2
-rw-r--r--lib/ssl/src/dtls_record.erl22
-rw-r--r--lib/ssl/src/inet_tls_dist.erl2
-rw-r--r--lib/ssl/src/ssl.app.src1
-rw-r--r--lib/ssl/src/ssl.erl38
-rw-r--r--lib/ssl/src/ssl_cipher.erl88
-rw-r--r--lib/ssl/src/ssl_cipher.hrl3
-rw-r--r--lib/ssl/src/ssl_connection.erl4
-rw-r--r--lib/ssl/src/ssl_handshake.erl274
-rw-r--r--lib/ssl/src/ssl_handshake.hrl2
-rw-r--r--lib/ssl/src/ssl_record.erl79
-rw-r--r--lib/ssl/src/ssl_record.hrl1
-rw-r--r--lib/ssl/src/tls_connection.erl3
-rw-r--r--lib/ssl/src/tls_handshake.erl7
-rw-r--r--lib/ssl/src/tls_record.erl40
-rw-r--r--lib/ssl/src/tls_record_1_3.erl260
-rw-r--r--lib/ssl/src/tls_record_1_3.hrl58
-rw-r--r--lib/ssl/src/tls_sender.erl23
-rw-r--r--lib/ssl/test/make_certs.erl6
-rw-r--r--lib/ssl/test/ssl_basic_SUITE.erl4
-rw-r--r--lib/ssl/test/ssl_handshake_SUITE.erl64
-rw-r--r--lib/ssl/test/ssl_packet_SUITE.erl52
-rw-r--r--lib/stdlib/doc/src/assert_hrl.xml2
-rw-r--r--lib/stdlib/doc/src/beam_lib.xml4
-rw-r--r--lib/stdlib/doc/src/gen_event.xml2
-rw-r--r--lib/stdlib/doc/src/rand.xml81
-rw-r--r--lib/stdlib/src/beam_lib.erl2
-rw-r--r--lib/stdlib/src/rand.erl148
-rw-r--r--lib/stdlib/test/gen_fsm_SUITE.erl2
-rw-r--r--lib/stdlib/test/rand_SUITE.erl71
-rw-r--r--lib/stdlib/test/sys_SUITE.erl17
-rw-r--r--lib/stdlib/test/unicode_util_SUITE_data/GraphemeBreakTest.txt1148
-rw-r--r--lib/stdlib/test/unicode_util_SUITE_data/LineBreakTest.txt246
-rw-r--r--lib/stdlib/test/unicode_util_SUITE_data/NormalizationTest.txt52
-rw-r--r--lib/stdlib/uc_spec/CaseFolding.txt85
-rw-r--r--lib/stdlib/uc_spec/CompositionExclusions.txt4
-rw-r--r--lib/stdlib/uc_spec/GraphemeBreakProperty.txt117
-rw-r--r--lib/stdlib/uc_spec/PropList.txt77
-rw-r--r--lib/stdlib/uc_spec/README-UPDATE.txt8
-rw-r--r--lib/stdlib/uc_spec/SpecialCasing.txt8
-rw-r--r--lib/stdlib/uc_spec/UnicodeData.txt778
-rw-r--r--lib/stdlib/uc_spec/emoji-data.txt714
-rwxr-xr-xlib/stdlib/uc_spec/gen_unicode_mod.escript149
-rw-r--r--lib/tools/emacs/Makefile1
-rw-r--r--lib/tools/emacs/erlang-edoc.el1
-rw-r--r--lib/tools/emacs/erlang-eunit.el10
-rw-r--r--lib/tools/emacs/erlang-pkg.el3
-rw-r--r--lib/tools/emacs/erlang-skels.el2
-rw-r--r--lib/tools/emacs/erlang-test.el77
-rw-r--r--lib/tools/emacs/erlang.el58
-rw-r--r--lib/tools/emacs/erlang_appwiz.el13
-rw-r--r--lib/tools/test/emacs_SUITE.erl175
124 files changed, 6214 insertions, 2219 deletions
diff --git a/lib/compiler/doc/src/notes.xml b/lib/compiler/doc/src/notes.xml
index b175669bd8..5024310788 100644
--- a/lib/compiler/doc/src/notes.xml
+++ b/lib/compiler/doc/src/notes.xml
@@ -32,6 +32,23 @@
<p>This document describes the changes made to the Compiler
application.</p>
+<section><title>Compiler 7.2.6</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>In rare circumstances, the matched out tail of a
+ binary could be the entire original binary. (There was
+ partial correction to this problem in version 7.2.5 of
+ the compiler application.)</p>
+ <p>
+ Own Id: OTP-15335 Aux Id: ERL-689, OTP-15219 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Compiler 7.2.5</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/compiler/src/beam_jump.erl b/lib/compiler/src/beam_jump.erl
index fbff4cfd79..d694bd2a5b 100644
--- a/lib/compiler/src/beam_jump.erl
+++ b/lib/compiler/src/beam_jump.erl
@@ -196,22 +196,19 @@ no_fallthrough([I|_]) ->
is_unreachable_after(I).
already_has_value(Lit, Lbl, Reg, D) ->
- Key = {Lbl,Reg},
case D of
- #{Lbl:=unsafe} ->
- false;
- #{Key:=Lit} ->
+ #{Lbl:={Reg,Lit}} ->
true;
#{} ->
false
end.
update_value_dict([Lit,{f,Lbl}|T], Reg, D0) ->
- Key = {Lbl,Reg},
D = case D0 of
- #{Key := inconsistent} -> D0;
- #{Key := _} -> D0#{Key := inconsistent};
- _ -> D0#{Key => Lit}
+ #{Lbl:=unsafe} -> D0;
+ #{Lbl:={Reg,Lit}} -> D0;
+ #{Lbl:=_} -> D0#{Lbl:=unsafe};
+ #{} -> D0#{Lbl=>{Reg,Lit}}
end,
update_value_dict(T, Reg, D);
update_value_dict([], _, D) -> D.
diff --git a/lib/compiler/src/erl_bifs.erl b/lib/compiler/src/erl_bifs.erl
index 71ab0e872a..ce9762899e 100644
--- a/lib/compiler/src/erl_bifs.erl
+++ b/lib/compiler/src/erl_bifs.erl
@@ -108,6 +108,7 @@ is_pure(erlang, list_to_atom, 1) -> true;
is_pure(erlang, list_to_binary, 1) -> true;
is_pure(erlang, list_to_float, 1) -> true;
is_pure(erlang, list_to_integer, 1) -> true;
+is_pure(erlang, list_to_integer, 2) -> true;
is_pure(erlang, list_to_pid, 1) -> true;
is_pure(erlang, list_to_tuple, 1) -> true;
is_pure(erlang, max, 2) -> true;
diff --git a/lib/compiler/test/beam_jump_SUITE.erl b/lib/compiler/test/beam_jump_SUITE.erl
index c61e4ab65c..f6cddbf1b1 100644
--- a/lib/compiler/test/beam_jump_SUITE.erl
+++ b/lib/compiler/test/beam_jump_SUITE.erl
@@ -21,7 +21,8 @@
-export([all/0,suite/0,groups/0,init_per_suite/1,end_per_suite/1,
init_per_group/2,end_per_group/2,
- undefined_label/1,ambiguous_catch_try_state/1]).
+ undefined_label/1,ambiguous_catch_try_state/1,
+ unsafe_move_elimination/1]).
suite() ->
[{ct_hooks,[ts_install_cth]}].
@@ -32,7 +33,8 @@ all() ->
groups() ->
[{p,[parallel],
[undefined_label,
- ambiguous_catch_try_state
+ ambiguous_catch_try_state,
+ unsafe_move_elimination
]}].
init_per_suite(Config) ->
@@ -72,3 +74,44 @@ river() -> song.
checks(Wanted) ->
%% Must be one line to cause the unsafe optimization.
{catch case river() of sheet -> begin +Wanted, if "da" -> Wanted end end end, catch case river() of sheet -> begin + Wanted, if "da" -> Wanted end end end}.
+
+unsafe_move_elimination(_Config) ->
+ {{left,right,false},false} = unsafe_move_elimination(left, right, false),
+ {{false,right,false},false} = unsafe_move_elimination(false, right, true),
+ {{true,right,right},right} = unsafe_move_elimination(true, right, true),
+ ok.
+
+unsafe_move_elimination(Left, Right, Simple0) ->
+ id(1),
+
+ %% The move at label 29 would be removed by beam_jump, which is unsafe because
+ %% the two select_val instructions have different source registers.
+ %%
+ %% {select_val,{y,0},{f,25},{list,[{atom,true},{f,27},{atom,false},{f,29}]}}.
+ %% ^^^^^ ^^^^^^^^^^^^^^^^^^^
+ %% {label,27}.
+ %% {kill,{y,0}}.
+ %% {move,{y,2},{x,0}}.
+ %% {line,...}.
+ %% {call,1,{f,31}}.
+ %% {select_val,{x,0},{f,33},{list,[{atom,true},{f,35},{atom,false},{f,29}]}}.
+ %% ^^^^^ ^^^^^^^^^^^^^^^^^^^
+ %% {label,29}.
+ %% {move,{atom,false},{y,0}}. <=== REMOVED (unsafely).
+ %% {jump,{f,37}}.
+
+ Simple = case case Simple0 of
+ false -> false;
+ true -> id(Left)
+ end
+ of
+ false ->
+ false;
+ true ->
+ id(Right)
+ end,
+ {id({Left,Right,Simple}),Simple}.
+
+
+id(I) ->
+ I.
diff --git a/lib/compiler/test/bs_match_SUITE.erl b/lib/compiler/test/bs_match_SUITE.erl
index 8e105c6244..0c6db96081 100644
--- a/lib/compiler/test/bs_match_SUITE.erl
+++ b/lib/compiler/test/bs_match_SUITE.erl
@@ -43,7 +43,7 @@
beam_bsm/1,guard/1,is_ascii/1,non_opt_eq/1,
expression_before_match/1,erl_689/1,restore_on_call/1,
restore_after_catch/1,matches_on_parameter/1,big_positions/1,
- matching_meets_apply/1]).
+ matching_meets_apply/1,bs_start_match2_defs/1]).
-export([coverage_id/1,coverage_external_ignore/2]).
@@ -78,7 +78,7 @@ groups() ->
beam_bsm,guard,is_ascii,non_opt_eq,
expression_before_match,erl_689,restore_on_call,
matches_on_parameter,big_positions,
- matching_meets_apply]}].
+ matching_meets_apply,bs_start_match2_defs]}].
init_per_suite(Config) ->
@@ -1799,6 +1799,19 @@ do_erl_689_2b(_, <<Length, Data/binary>>) ->
{{Y, M, D}, Rest}
end.
+%% ERL-753
+
+bs_start_match2_defs(_Config) ->
+ {<<"http://127.0.0.1:1234/vsaas/hello">>} = api_url(<<"hello">>, dummy),
+ {"https://127.0.0.1:4321/vsaas/hello"} = api_url({https, "hello"}, dummy).
+
+api_url(URL, Auth) ->
+ Header = [],
+ case URL of
+ <<_/binary>> -> {<<"http://127.0.0.1:1234/vsaas/",URL/binary>>};
+ {https, [_|_] = URL1} -> {"https://127.0.0.1:4321/vsaas/"++URL1}
+ end.
+
check(F, R) ->
R = F().
diff --git a/lib/compiler/vsn.mk b/lib/compiler/vsn.mk
index c7e7fb6754..ab707885f4 100644
--- a/lib/compiler/vsn.mk
+++ b/lib/compiler/vsn.mk
@@ -1 +1 @@
-COMPILER_VSN = 7.2.5
+COMPILER_VSN = 7.2.6
diff --git a/lib/crypto/c_src/crypto.c b/lib/crypto/c_src/crypto.c
index d40d285f86..b2d8123f00 100644
--- a/lib/crypto/c_src/crypto.c
+++ b/lib/crypto/c_src/crypto.c
@@ -189,6 +189,10 @@
# define HAVE_GCM
# define HAVE_CCM
# define HAVE_CMAC
+# if defined(RSA_PKCS1_OAEP_PADDING)
+# define HAVE_RSA_OAEP_PADDING
+# endif
+# define HAVE_RSA_MGF1_MD
# if OPENSSL_VERSION_NUMBER < PACKED_OPENSSL_VERSION(1,0,1,'d')
# define HAVE_GCM_EVP_DECRYPT_BUG
# endif
@@ -1340,7 +1344,7 @@ static ERL_NIF_TERM algo_mac[3]; /* increase when extending the list */
static int algo_curve_cnt, algo_curve_fips_cnt;
static ERL_NIF_TERM algo_curve[87]; /* increase when extending the list */
static int algo_rsa_opts_cnt, algo_rsa_opts_fips_cnt;
-static ERL_NIF_TERM algo_rsa_opts[10]; /* increase when extending the list */
+static ERL_NIF_TERM algo_rsa_opts[11]; /* increase when extending the list */
static void init_algorithms_types(ErlNifEnv* env)
{
@@ -1562,7 +1566,12 @@ static void init_algorithms_types(ErlNifEnv* env)
algo_rsa_opts[algo_rsa_opts_cnt++] = enif_make_atom(env,"rsa_pkcs1_pss_padding");
algo_rsa_opts[algo_rsa_opts_cnt++] = enif_make_atom(env,"rsa_pss_saltlen");
# endif
+# ifdef HAVE_RSA_MGF1_MD
algo_rsa_opts[algo_rsa_opts_cnt++] = enif_make_atom(env,"rsa_mgf1_md");
+# endif
+# ifdef HAVE_RSA_OAEP_PADDING
+ algo_rsa_opts[algo_rsa_opts_cnt++] = enif_make_atom(env,"rsa_pkcs1_oaep_padding");
+# endif
# ifdef HAVE_RSA_OAEP_MD
algo_rsa_opts[algo_rsa_opts_cnt++] = enif_make_atom(env,"rsa_oaep_label");
algo_rsa_opts[algo_rsa_opts_cnt++] = enif_make_atom(env,"rsa_oaep_md");
@@ -4693,16 +4702,16 @@ printf("\r\n");
if (argv[0] == atom_rsa) {
if (EVP_PKEY_CTX_set_rsa_padding(ctx, sig_opt.rsa_padding) <= 0) goto badarg;
-#ifdef HAVE_RSA_PKCS1_PSS_PADDING
+# ifdef HAVE_RSA_PKCS1_PSS_PADDING
if (sig_opt.rsa_padding == RSA_PKCS1_PSS_PADDING) {
if (sig_opt.rsa_mgf1_md != NULL) {
-#if OPENSSL_VERSION_NUMBER >= PACKED_OPENSSL_VERSION_PLAIN(1,0,1)
+# ifdef HAVE_RSA_MGF1_MD
if (EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, sig_opt.rsa_mgf1_md) <= 0) goto badarg;
-#else
+# else
EVP_PKEY_CTX_free(ctx);
EVP_PKEY_free(pkey);
return atom_notsup;
-#endif
+# endif
}
if (sig_opt.rsa_pss_saltlen > -2
&& EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, sig_opt.rsa_pss_saltlen) <= 0)
@@ -4833,13 +4842,13 @@ static ERL_NIF_TERM pkey_verify_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM
if (EVP_PKEY_CTX_set_rsa_padding(ctx, sig_opt.rsa_padding) <= 0) goto badarg;
if (sig_opt.rsa_padding == RSA_PKCS1_PSS_PADDING) {
if (sig_opt.rsa_mgf1_md != NULL) {
-#if OPENSSL_VERSION_NUMBER >= PACKED_OPENSSL_VERSION_PLAIN(1,0,1)
+# ifdef HAVE_RSA_MGF1_MD
if (EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, sig_opt.rsa_mgf1_md) <= 0) goto badarg;
-#else
+# else
EVP_PKEY_CTX_free(ctx);
EVP_PKEY_free(pkey);
return atom_notsup;
-#endif
+# endif
}
if (sig_opt.rsa_pss_saltlen > -2
&& EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, sig_opt.rsa_pss_saltlen) <= 0)
@@ -4932,8 +4941,10 @@ static int get_pkey_crypt_options(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NI
) {
if (tpl_terms[1] == atom_rsa_pkcs1_padding) {
opt->rsa_padding = RSA_PKCS1_PADDING;
+#ifdef HAVE_RSA_OAEP_PADDING
} else if (tpl_terms[1] == atom_rsa_pkcs1_oaep_padding) {
opt->rsa_padding = RSA_PKCS1_OAEP_PADDING;
+#endif
#ifdef HAVE_RSA_SSLV23_PADDING
} else if (tpl_terms[1] == atom_rsa_sslv23_padding) {
opt->rsa_padding = RSA_SSLV23_PADDING;
@@ -4952,7 +4963,7 @@ static int get_pkey_crypt_options(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NI
}
opt->signature_md = opt_md;
} else if (tpl_terms[0] == atom_rsa_mgf1_md && enif_is_atom(env, tpl_terms[1])) {
-#ifndef HAVE_RSA_OAEP_MD
+#ifndef HAVE_RSA_MGF1_MD
if (tpl_terms[1] != atom_sha)
return PKEY_NOTSUP;
#endif
diff --git a/lib/crypto/doc/src/algorithm_details.xml b/lib/crypto/doc/src/algorithm_details.xml
index 68ad264df7..4d58d26970 100644
--- a/lib/crypto/doc/src/algorithm_details.xml
+++ b/lib/crypto/doc/src/algorithm_details.xml
@@ -63,9 +63,9 @@
<row><cell><c>aes_ige256</c></cell><cell>16</cell><cell>32</cell><cell>16</cell></row>
<row><cell><c>blowfish_cbc</c></cell> <cell>4-56</cell> <cell>8</cell> <cell>8</cell></row>
- <row><cell><c>blowfish_cfb64</c></cell> <cell>1-</cell> <cell>8</cell> <cell>any</cell></row>
- <row><cell><c>blowfish_ecb</c></cell><cell>1-</cell><cell> </cell><cell>8</cell></row>
- <row><cell><c>blowfish_ofb64</c></cell><cell>1-</cell><cell>8</cell><cell>any</cell></row>
+ <row><cell><c>blowfish_cfb64</c></cell> <cell>&#8805;1</cell> <cell>8</cell> <cell>any</cell></row>
+ <row><cell><c>blowfish_ecb</c></cell><cell>&#8805;1</cell><cell> </cell><cell>8</cell></row>
+ <row><cell><c>blowfish_ofb64</c></cell><cell>&#8805;1</cell><cell>8</cell><cell>any</cell></row>
<row><cell><c>des3_cbc</c><br/><i>(=DES EDE3 CBC)</i></cell><cell>[8,8,8]</cell><cell>8</cell><cell>8</cell></row>
<row><cell><c>des3_cfb</c><br/><i>(=DES EDE3 CFB)</i></cell><cell>[8,8,8]</cell><cell>8</cell><cell>any</cell></row>
@@ -74,7 +74,7 @@
<row><cell><c>des_cfb</c></cell><cell>8</cell><cell>8</cell><cell>any</cell></row>
<row><cell><c>des_ecb</c></cell><cell>8</cell><cell> </cell><cell>8</cell></row>
<row><cell><c>des_ede3</c><br/><i>(=DES EDE3 CBC)</i></cell><cell>[8,8,8]</cell><cell>8</cell><cell>8</cell></row>
- <row><cell><c>rc2_cbc</c></cell><cell>1-</cell><cell>8</cell><cell>8</cell></row>
+ <row><cell><c>rc2_cbc</c></cell><cell>&#8805;1</cell><cell>8</cell><cell>8</cell></row>
<tcaption>Block cipher key lengths</tcaption>
</table>
</section>
@@ -90,9 +90,9 @@
</p>
<table>
<row><cell><strong>Cipher and Mode</strong></cell><cell><strong>Key length</strong><br/><strong>[bytes]</strong></cell><cell><strong>IV length</strong><br/><strong>[bytes]</strong></cell><cell><strong>AAD length</strong><br/><strong>[bytes]</strong></cell><cell><strong>Tag length</strong><br/><strong>[bytes]</strong></cell><cell><strong>Block size</strong><br/><strong>[bytes]</strong></cell><cell><strong>Supported with</strong><br/><strong>OpenSSL versions</strong></cell></row>
- <row><cell><c>aes_ccm</c></cell> <cell>16,24,32</cell> <cell>7-13</cell> <cell>any</cell> <cell>even 4-16<br/>default: 12</cell> <cell>any</cell><cell>1.1.0 -</cell></row>
- <row><cell><c>aes_gcm</c></cell> <cell>16,24,32</cell> <cell>1-</cell> <cell>any</cell> <cell>1-16<br/>default: 16</cell> <cell>any</cell><cell>1.1.0 -</cell></row>
- <row><cell><c>chacha20_poly1305</c></cell><cell>32</cell> <cell>1-16</cell> <cell>any</cell> <cell>16</cell> <cell>any</cell><cell>1.1.0 -</cell></row>
+ <row><cell><c>aes_ccm</c></cell> <cell>16,24,32</cell> <cell>7-13</cell> <cell>any</cell> <cell>even 4-16<br/>default: 12</cell> <cell>any</cell><cell>&#8805;1.1.0</cell></row>
+ <row><cell><c>aes_gcm</c></cell> <cell>16,24,32</cell> <cell>&#8805;1</cell> <cell>any</cell> <cell>1-16<br/>default: 16</cell> <cell>any</cell><cell>&#8805;1.1.0</cell></row>
+ <row><cell><c>chacha20_poly1305</c></cell><cell>32</cell> <cell>1-16</cell> <cell>any</cell> <cell>16</cell> <cell>any</cell><cell>&#8805;1.1.0</cell></row>
<tcaption>AEAD cipher key lengths</tcaption>
</table>
</section>
@@ -108,8 +108,8 @@
</p>
<table>
<row><cell><strong>Cipher and Mode</strong></cell><cell><strong>Key length</strong><br/><strong>[bytes]</strong></cell><cell><strong>IV length</strong><br/><strong>[bytes]</strong></cell><cell><strong>Supported with</strong><br/><strong>OpenSSL versions</strong></cell></row>
- <row><cell><c>aes_ctr</c></cell><cell>16, 24, 32</cell><cell>16</cell><cell>1.0.1 -</cell></row>
- <row><cell><c>rc4</c></cell><cell>1-</cell><cell> </cell> <cell>all</cell></row>
+ <row><cell><c>aes_ctr</c></cell><cell>16, 24, 32</cell><cell>16</cell><cell>&#8805;1.0.1</cell></row>
+ <row><cell><c>rc4</c></cell><cell>&#8805;1</cell><cell> </cell> <cell>all</cell></row>
<tcaption>Stream cipher key lengths</tcaption>
</table>
</section>
@@ -141,9 +141,9 @@
<row><cell><c>aes_cfb8</c></cell> <cell>16</cell><cell>1</cell></row>
<row><cell><c>blowfish_cbc</c></cell> <cell>4-56</cell> <cell>8</cell></row>
- <row><cell><c>blowfish_cfb64</c></cell> <cell>1-</cell> <cell>1</cell></row>
- <row><cell><c>blowfish_ecb</c></cell><cell>1-</cell> <cell>8</cell></row>
- <row><cell><c>blowfish_ofb64</c></cell><cell>1-</cell> <cell>1</cell></row>
+ <row><cell><c>blowfish_cfb64</c></cell> <cell>&#8805;1</cell> <cell>1</cell></row>
+ <row><cell><c>blowfish_ecb</c></cell><cell>&#8805;1</cell> <cell>8</cell></row>
+ <row><cell><c>blowfish_ofb64</c></cell><cell>&#8805;1</cell> <cell>1</cell></row>
<row><cell><c>des3_cbc</c><br/><i>(=DES EDE3 CBC)</i></cell><cell>[8,8,8]</cell><cell>8</cell></row>
<row><cell><c>des3_cfb</c><br/><i>(=DES EDE3 CFB)</i></cell><cell>[8,8,8]</cell><cell>1</cell></row>
@@ -152,7 +152,7 @@
<row><cell><c>des_cfb</c></cell><cell>8</cell><cell>1</cell></row>
<row><cell><c>des_ecb</c></cell><cell>8</cell><cell>1</cell></row>
- <row><cell><c>rc2_cbc</c></cell><cell>1-</cell><cell>8</cell></row>
+ <row><cell><c>rc2_cbc</c></cell><cell>&#8805;1</cell><cell>8</cell></row>
<tcaption>CMAC cipher key lengths</tcaption>
</table>
</section>
@@ -195,7 +195,7 @@
</row>
<row><cell>SHA1</cell><cell>sha</cell><cell>all</cell></row>
<row><cell>SHA2</cell><cell>sha224, sha256, sha384, sha512</cell><cell>all</cell></row>
- <row><cell>SHA3</cell><cell>sha3_224, sha3_256, sha3_384, sha3_512</cell><cell>1.1.1 -</cell></row>
+ <row><cell>SHA3</cell><cell>sha3_224, sha3_256, sha3_384, sha3_512</cell><cell>&#8805;1.1.1</cell></row>
<row><cell>MD4</cell><cell>md4</cell><cell>all</cell></row>
<row><cell>MD5</cell><cell>md5</cell><cell>all</cell></row>
<row><cell>RIPEMD</cell><cell>ripemd160</cell><cell>all</cell></row>
@@ -221,18 +221,62 @@
without prior notice.</p>
</warning>
<table>
- <row><cell><strong>Option</strong></cell> <cell><strong>sign/verify</strong></cell> <cell><strong>encrypt/decrypt</strong></cell> <cell><strong>Supported with</strong><br/><strong>OpenSSL versions</strong></cell> </row>
- <row><cell>{rsa_mgf1_md,atom()}</cell> <cell>x</cell> <cell>x</cell> <cell>1.0.1</cell></row>
- <row><cell>{rsa_oaep_label, binary()}</cell> <cell> </cell> <cell>x</cell> <cell></cell></row>
- <row><cell>{rsa_oaep_md, atom()}</cell> <cell> </cell> <cell>x</cell> <cell></cell></row>
- <row><cell>{rsa_padding,rsa_pkcs1_pss_padding}</cell> <cell>x</cell> <cell> </cell> <cell>1.0.0</cell></row>
- <row><cell>{rsa_pss_saltlen, -2..}</cell> <cell>x</cell> <cell> </cell> <cell>1.0.0</cell></row>
- <row><cell>{rsa_padding,rsa_no_padding}</cell> <cell>x</cell> <cell>x</cell> <cell></cell></row>
- <row><cell>{rsa_padding,rsa_pkcs1_padding}</cell> <cell>x</cell> <cell>x</cell> <cell></cell></row>
- <row><cell>{rsa_padding,rsa_sslv23_padding}</cell> <cell> </cell> <cell>x</cell> <cell></cell></row>
- <row><cell>{rsa_padding,rsa_x931_padding}</cell> <cell>x</cell> <cell> </cell> <cell></cell></row>
+ <row><cell><strong>Option</strong></cell>
+ <cell><strong>sign/verify</strong></cell>
+ <cell><strong>public encrypt</strong><br/><strong>private decrypt</strong></cell>
+ <cell><strong>private encrypt</strong><br/><strong>public decrypt</strong></cell>
+ </row>
+ <row><cell>{rsa_padding,rsa_x931_padding}</cell>
+ <cell>x</cell>
+ <cell></cell>
+ <cell>x</cell>
+ </row>
+ <row><cell>{rsa_padding,rsa_pkcs1_padding}</cell>
+ <cell>x</cell>
+ <cell>x</cell>
+ <cell>x</cell>
+ </row>
+ <row><cell>{rsa_padding,rsa_pkcs1_pss_padding}<br/>
+ {rsa_pss_saltlen, -2..}<br/>
+ {rsa_mgf1_md, atom()}
+ </cell>
+ <cell>x (2)<br/>
+ x (2)<br/>
+ x (2)</cell>
+ <cell></cell>
+ <cell></cell>
+ </row>
+ <row><cell>{rsa_padding,rsa_pkcs1_oaep_padding}<br/>
+ {rsa_mgf1_md, atom()}<br/>
+ {rsa_oaep_label, binary()}}<br/>
+ {rsa_oaep_md, atom()}
+ </cell>
+ <cell></cell>
+ <cell>x (2)<br/>
+ x (2)<br/>
+ x (3)<br/>
+ x (3)
+ </cell>
+ <cell></cell>
+ </row>
+ <row><cell>{rsa_padding,rsa_no_padding}</cell>
+ <cell>x (1)</cell>
+ <cell></cell>
+ <cell></cell>
+ </row>
+ <!-- row><cell>{rsa_padding,rsa_sslv23_padding}</cell>
+ <cell></cell>
+ <cell></cell>
+ <cell></cell>
+ </row -->
<tcaption></tcaption>
</table>
+ <p>Notes:</p>
+ <list type="ordered">
+ <item>(1) OpenSSL &#8804; 1.0.0</item>
+ <item>(2) OpenSSL &#8805; 1.0.1</item>
+ <item>(3) OpenSSL &#8805; 1.1.0</item>
+ </list>
</section>
<section>
diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl
index 68c0bcef5e..9915a5a6f3 100644
--- a/lib/crypto/src/crypto.erl
+++ b/lib/crypto/src/crypto.erl
@@ -2153,7 +2153,7 @@ check_otp_test_engine(LibDir) ->
case filelib:wildcard("otp_test_engine*", LibDir) of
[] ->
{error, notexist};
- [LibName] ->
+ [LibName|_] -> % In case of Valgrind there could be more than one
LibPath = filename:join(LibDir,LibName),
case filelib:is_file(LibPath) of
true ->
diff --git a/lib/crypto/test/crypto_SUITE.erl b/lib/crypto/test/crypto_SUITE.erl
index ba3901e5fc..0b878f2e5c 100644
--- a/lib/crypto/test/crypto_SUITE.erl
+++ b/lib/crypto/test/crypto_SUITE.erl
@@ -495,14 +495,14 @@ sign_verify(Config) when is_list(Config) ->
public_encrypt() ->
[{doc, "Test public_encrypt/decrypt "}].
public_encrypt(Config) when is_list(Config) ->
- Params = proplists:get_value(pub_priv_encrypt, Config),
+ Params = proplists:get_value(pub_pub_encrypt, Config, []),
lists:foreach(fun do_public_encrypt/1, Params).
%%--------------------------------------------------------------------
private_encrypt() ->
[{doc, "Test private_encrypt/decrypt functions. "}].
private_encrypt(Config) when is_list(Config) ->
- Params = proplists:get_value(pub_priv_encrypt, Config),
+ Params = proplists:get_value(pub_priv_encrypt, Config, []),
lists:foreach(fun do_private_encrypt/1, Params).
%%--------------------------------------------------------------------
@@ -943,30 +943,6 @@ negative_verify(Type, Hash, Msg, Signature, Public, Options) ->
ok
end.
--define(PUB_PRIV_ENC_DEC_CATCH(Type,Padding),
- CC:EE ->
- ct:log("~p:~p in ~p:~p/~p, line ~p.~n"
- "Type = ~p~nPadding = ~p",
- [CC,EE,?MODULE,?FUNCTION_NAME,?FUNCTION_ARITY,?LINE,(Type),(Padding)]),
- MaybeUnsupported =
- case crypto:info_lib() of
- [{<<"OpenSSL">>,_,_}] ->
- is_list(Padding) andalso
- lists:any(fun(P) -> lists:member(P,(Padding)) end,
- [{rsa_padding, rsa_pkcs1_oaep_padding},
- {rsa_padding, rsa_sslv23_padding},
- {rsa_padding, rsa_x931_padding}]);
- _ ->
- false
- end,
- case CC of
- error when MaybeUnsupported ->
- ct:comment("Padding unsupported?",[]);
- _ ->
- ct:fail({?FUNCTION_NAME,CC,EE,(Type),(Padding)})
- end
- ).
-
do_public_encrypt({Type, Public, Private, Msg, Padding}) ->
try
crypto:public_encrypt(Type, Msg, Public, Padding)
@@ -980,10 +956,12 @@ do_public_encrypt({Type, Public, Private, Msg, Padding}) ->
Other ->
ct:fail({{crypto, private_decrypt, [Type, PublicEcn, Private, Padding]}, {expected, Msg}, {got, Other}})
catch
- ?PUB_PRIV_ENC_DEC_CATCH(Type, Padding)
+ CC:EE ->
+ ct:fail({{crypto, private_decrypt, [Type, PublicEcn, Private, Padding]}, {expected, Msg}, {got, {CC,EE}}})
end
catch
- ?PUB_PRIV_ENC_DEC_CATCH(Type, Padding)
+ CC:EE ->
+ ct:fail({{crypto, public_encrypt, [Type, Msg, Public, Padding]}, {got, {CC,EE}}})
end.
@@ -1000,10 +978,12 @@ do_private_encrypt({Type, Public, Private, Msg, Padding}) ->
Other ->
ct:fail({{crypto, public_decrypt, [Type, PrivEcn, Public, Padding]}, {expected, Msg}, {got, Other}})
catch
- ?PUB_PRIV_ENC_DEC_CATCH(Type, Padding)
+ CC:EE ->
+ ct:fail({{crypto, public_decrypt, [Type, PrivEcn, Public, Padding]}, {expected, Msg}, {got, {CC,EE}}})
end
catch
- ?PUB_PRIV_ENC_DEC_CATCH(Type, Padding)
+ CC:EE ->
+ ct:fail({{crypto, private_encrypt, [Type, Msg, Private, Padding]}, {got, {CC,EE}}})
end.
do_generate_compute({srp = Type, UserPrivate, UserGenParams, UserComParams,
@@ -1395,36 +1375,42 @@ group_config(sha3_384 = Type, Config) ->
group_config(sha3_512 = Type, Config) ->
{Msgs,Digests} = sha3_test_vectors(Type),
[{hash, {Type, Msgs, Digests}}, {hmac, hmac_sha3(Type)} | Config];
-group_config(rsa = Type, Config) ->
+group_config(rsa, Config) ->
Msg = rsa_plain(),
Public = rsa_public(),
Private = rsa_private(),
PublicS = rsa_public_stronger(),
PrivateS = rsa_private_stronger(),
- SignVerify =
- case ?config(fips, Config) of
- true ->
- %% Use only the strong keys in FIPS mode
- sign_verify_tests(Type, Msg,
- PublicS, PrivateS,
- PublicS, PrivateS);
- false ->
- sign_verify_tests(Type, Msg,
- Public, Private,
- PublicS, PrivateS)
- end,
MsgPubEnc = <<"7896345786348 Asldi">>,
- PubPrivEnc = [{rsa, PublicS, PrivateS, MsgPubEnc, rsa_pkcs1_padding},
- {rsa, PublicS, PrivateS, MsgPubEnc, [{rsa_padding, rsa_pkcs1_padding}]},
- {rsa, PublicS, PrivateS, MsgPubEnc, [{rsa_padding, rsa_sslv23_padding}]},
- {rsa, PublicS, PrivateS, MsgPubEnc, [{rsa_padding, rsa_x931_padding}]},
- rsa_oaep(),
- %% rsa_oaep_label(),
- %% rsa_oaep256(),
- no_padding()
+ SignVerify_OptsToTry = [[{rsa_padding, rsa_x931_padding}],
+ [{rsa_padding, rsa_pkcs1_padding}],
+ [{rsa_padding, rsa_pkcs1_pss_padding}],
+ [{rsa_padding, rsa_pkcs1_pss_padding}, {rsa_pss_saltlen, -2}],
+ [{rsa_padding, rsa_pkcs1_pss_padding}, {rsa_pss_saltlen, 5}],
+ [{rsa_padding, rsa_pkcs1_pss_padding}, {rsa_mgf1_md,sha}],
+ [{rsa_padding, rsa_pkcs1_pss_padding}, {rsa_mgf1_md,sha}, {rsa_pss_saltlen, 5}]
+ ],
+ PrivEnc_OptsToTry = [rsa_pkcs1_padding, % Compatibility
+ [{rsa_pad, rsa_pkcs1_padding}], % Compatibility
+ [{rsa_padding, rsa_pkcs1_padding}],
+ [{rsa_padding,rsa_x931_padding}]
+ ],
+ PubEnc_OptsToTry = [rsa_pkcs1_padding, % Compatibility
+ [{rsa_pad, rsa_pkcs1_padding}], % Compatibility
+ [{rsa_padding, rsa_pkcs1_padding}],
+ [{rsa_padding,rsa_pkcs1_oaep_padding}],
+ [{rsa_padding,rsa_pkcs1_oaep_padding}, {rsa_oaep_label, <<"Hej hopp">>}],
+ [{rsa_padding,rsa_pkcs1_oaep_padding}, {rsa_oaep_md,sha}],
+ [{rsa_padding,rsa_pkcs1_oaep_padding}, {rsa_oaep_md,sha}, {rsa_oaep_label, <<"Hej hopp">>}],
+ [{rsa_padding,rsa_pkcs1_oaep_padding}, {rsa_mgf1_md,sha}],
+ [{rsa_padding,rsa_pkcs1_oaep_padding}, {rsa_mgf1_md,sha}, {rsa_oaep_label, <<"Hej hopp">>}],
+ [{rsa_padding,rsa_pkcs1_oaep_padding}, {rsa_mgf1_md,sha}, {rsa_oaep_md,sha}, {rsa_oaep_label, <<"Hej hopp">>}]
],
- Generate = [{rsa, 1024, 3}, {rsa, 2048, 17}, {rsa, 3072, 65537}],
- [{sign_verify, SignVerify}, {pub_priv_encrypt, PubPrivEnc}, {generate, Generate} | Config];
+ [{sign_verify, rsa_sign_verify_tests(Config, Msg, Public, Private, PublicS, PrivateS, SignVerify_OptsToTry)},
+ {pub_priv_encrypt, gen_rsa_pub_priv_tests(PublicS, PrivateS, MsgPubEnc, PrivEnc_OptsToTry)},
+ {pub_pub_encrypt, gen_rsa_pub_priv_tests(PublicS, PrivateS, MsgPubEnc, PubEnc_OptsToTry)},
+ {generate, [{rsa, 1024, 3}, {rsa, 2048, 17}, {rsa, 3072, 65537}]}
+ | Config];
group_config(dss = Type, Config) ->
Msg = dss_plain(),
Public = dss_params() ++ [dss_public()],
@@ -1553,40 +1539,74 @@ group_config(aes_cbc, Config) ->
group_config(_, Config) ->
Config.
-sign_verify_tests(Type, Msg, Public, Private, PublicS, PrivateS) ->
- gen_sign_verify_tests(Type, [md5, ripemd160, sha, sha224, sha256], Msg, Public, Private,
- [undefined,
- [{rsa_padding, rsa_pkcs1_pss_padding}],
- [{rsa_padding, rsa_pkcs1_pss_padding}, {rsa_pss_saltlen, 0}],
- [{rsa_padding, rsa_x931_padding}]
- ]) ++
- gen_sign_verify_tests(Type, [sha384, sha512], Msg, PublicS, PrivateS,
- [undefined,
- [{rsa_padding, rsa_pkcs1_pss_padding}],
- [{rsa_padding, rsa_pkcs1_pss_padding}, {rsa_pss_saltlen, 0}],
- [{rsa_padding, rsa_x931_padding}]
- ]).
-
-gen_sign_verify_tests(Type, Hashs, Msg, Public, Private, Opts) ->
+rsa_sign_verify_tests(Config, Msg, Public, Private, PublicS, PrivateS, OptsToTry) ->
+ case ?config(fips, Config) of
+ true ->
+ %% Use only the strong keys in FIPS mode
+ rsa_sign_verify_tests(Msg,
+ PublicS, PrivateS,
+ PublicS, PrivateS,
+ OptsToTry);
+ false ->
+ rsa_sign_verify_tests(Msg,
+ Public, Private,
+ PublicS, PrivateS,
+ OptsToTry)
+ end.
+
+rsa_sign_verify_tests(Msg, Public, Private, PublicS, PrivateS, OptsToTry) ->
+ gen_rsa_sign_verify_tests([md5, ripemd160, sha, sha224, sha256], Msg, Public, Private,
+ [undefined | OptsToTry]) ++
+ gen_rsa_sign_verify_tests([sha384, sha512], Msg, PublicS, PrivateS,
+ [undefined | OptsToTry]).
+
+gen_rsa_sign_verify_tests(Hashs, Msg, Public, Private, Opts) ->
+ SupOpts = proplists:get_value(rsa_opts, crypto:supports(), []),
lists:foldr(fun(Hash, Acc0) ->
case is_supported(Hash) of
true ->
lists:foldr(fun
(undefined, Acc1) ->
- [{Type, Hash, Public, Private, Msg} | Acc1];
+ [{rsa, Hash, Public, Private, Msg} | Acc1];
([{rsa_padding, rsa_x931_padding} | _], Acc1)
when Hash =:= md5
orelse Hash =:= ripemd160
orelse Hash =:= sha224 ->
Acc1;
(Opt, Acc1) ->
- [{Type, Hash, Public, Private, Msg, Opt} | Acc1]
+ case rsa_opt_is_supported(Opt, SupOpts) of
+ true ->
+ [{rsa, Hash, Public, Private, Msg, Opt} | Acc1];
+ false ->
+ Acc1
+ end
end, Acc0, Opts);
false ->
Acc0
end
end, [], Hashs).
+
+gen_rsa_pub_priv_tests(Public, Private, Msg, OptsToTry) ->
+ SupOpts = proplists:get_value(rsa_opts, crypto:supports(), []),
+ lists:foldr(fun(Opt, Acc) ->
+ case rsa_opt_is_supported(Opt, SupOpts) of
+ true ->
+ [{rsa, Public, Private, Msg, Opt} | Acc];
+ false ->
+ Acc
+ end
+ end, [], OptsToTry).
+
+
+rsa_opt_is_supported([_|_]=Opt, Sup) ->
+ lists:all(fun(O) -> rsa_opt_is_supported(O,Sup) end, Opt);
+rsa_opt_is_supported({A,B}, Sup) ->
+ rsa_opt_is_supported(A,Sup) orelse rsa_opt_is_supported(B,Sup);
+rsa_opt_is_supported(Opt, Sup) ->
+ lists:member(Opt, Sup).
+
+
rfc_1321_msgs() ->
[<<"">>,
<<"a">>,
@@ -2803,6 +2823,8 @@ ecdh() ->
dh() ->
{dh, 90970053988169282502023478715631717259407236400413906591937635666709823903223997309250405131675572047545403771567755831138144089197560332757755059848492919215391041119286178688014693040542889497092308638580104031455627238700168892909539193174537248629499995652186913900511641708112112482297874449292467498403, 2}.
+
+
rsa_oaep() ->
%% ftp://ftp.rsa.com/pub/rsalabs/tmp/pkcs1v15crypt-vectors.txt
Public = [hexstr2bin("010001"),
@@ -2877,13 +2899,6 @@ cmac_nist(Config, aes_cbc256 = Type) ->
read_rsp(Config, Type,
["CMACGenAES256.rsp", "CMACVerAES256.rsp"]).
-no_padding() ->
- Public = [_, Mod] = rsa_public_stronger(),
- Private = rsa_private_stronger(),
- MsgLen = erlang:byte_size(int_to_bin(Mod)),
- Msg = list_to_binary(lists:duplicate(MsgLen, $X)),
- {rsa, Public, Private, Msg, rsa_no_padding}.
-
int_to_bin(X) when X < 0 -> int_to_bin_neg(X, []);
int_to_bin(X) -> int_to_bin_pos(X, []).
@@ -3063,7 +3078,7 @@ parse_rsp(Type,
file := File,
alen := Alen,
plen := Plen,
- nlen := Nlen,
+ nlen := _Nlen,
tlen := Tlen,
key := Key,
nonce := IV,
diff --git a/lib/crypto/test/engine_SUITE.erl b/lib/crypto/test/engine_SUITE.erl
index 4b3ea10315..3f26493cd3 100644
--- a/lib/crypto/test/engine_SUITE.erl
+++ b/lib/crypto/test/engine_SUITE.erl
@@ -75,11 +75,18 @@ groups() ->
init_per_suite(Config) ->
- case crypto:info_lib() of
- [{_,_, <<"OpenSSL 1.0.1s-freebsd 1 Mar 2016">>}] ->
+ case {os:type(), crypto:info_lib()} of
+ {_, [{_,_, <<"OpenSSL 1.0.1s-freebsd 1 Mar 2016">>}]} ->
{skip, "Problem with engine on OpenSSL 1.0.1s-freebsd"};
- Res ->
- ct:log("crypto:info_lib() -> ~p\n", [Res]),
+
+ {{unix,darwin}, _} ->
+ {skip, "Engine unsupported on Darwin"};
+
+ {{win32,_}, _} ->
+ {skip, "Engine unsupported on Windows"};
+
+ {OS, Res} ->
+ ct:log("crypto:info_lib() -> ~p\nos:type() -> ~p", [Res,OS]),
try crypto:start() of
ok ->
Config;
diff --git a/lib/eldap/README b/lib/eldap/README
index e1bde9d658..238f140e93 100644
--- a/lib/eldap/README
+++ b/lib/eldap/README
@@ -23,7 +23,7 @@ system has been configured with SSL.
In the test directory there are some hints and examples
on how to test the code and how to setup and populate
an OpenLDAP server. The 'eldap' code has been tested
-agains OpenLDAP, IPlanet and ActiveDirectory servers.
+against OpenLDAP, IPlanet and ActiveDirectory servers.
If you plan to incorporate this code into your system
I suggest that you build a server/supervisor harnesk
diff --git a/lib/eldap/doc/src/notes.xml b/lib/eldap/doc/src/notes.xml
index 07c2b0a3e8..bf9358c4d1 100644
--- a/lib/eldap/doc/src/notes.xml
+++ b/lib/eldap/doc/src/notes.xml
@@ -31,6 +31,22 @@
</header>
<p>This document describes the changes made to the Eldap application.</p>
+<section><title>Eldap 1.2.6</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ A race condition at close could cause the eldap client to
+ exit with a badarg message as cause.</p>
+ <p>
+ Own Id: OTP-15342 Aux Id: ERIERL-242 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Eldap 1.2.5</title>
<section><title>Fixed Bugs and Malfunctions</title>
@@ -61,6 +77,22 @@
</section>
+<section><title>Eldap 1.2.3.1</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ A race condition at close could cause the eldap client to
+ exit with a badarg message as cause.</p>
+ <p>
+ Own Id: OTP-15342 Aux Id: ERIERL-242 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Eldap 1.2.3</title>
<section><title>Fixed Bugs and Malfunctions</title>
@@ -76,6 +108,22 @@
</section>
+<section><title>Eldap 1.2.2.1</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ A race condition at close could cause the eldap client to
+ exit with a badarg message as cause.</p>
+ <p>
+ Own Id: OTP-15342 Aux Id: ERIERL-242 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Eldap 1.2.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
@@ -352,4 +400,3 @@
<p>New application. </p>
</section>
</chapter>
-
diff --git a/lib/eldap/src/eldap.erl b/lib/eldap/src/eldap.erl
index 2b84872b92..6497922852 100644
--- a/lib/eldap/src/eldap.erl
+++ b/lib/eldap/src/eldap.erl
@@ -957,10 +957,19 @@ do_modify_dn_0(Data, Entry, NewRDN, DelOldRDN, NewSup, Controls) ->
do_unbind(Data) ->
Req = "",
log2(Data, "unbind request = ~p (has no reply)~n", [Req]),
- send_request(Data#eldap.fd, Data, Data#eldap.id, {unbindRequest, Req}),
case Data#eldap.using_tls of
- true -> ssl:close(Data#eldap.fd);
- false -> gen_tcp:close(Data#eldap.fd)
+ true ->
+ send_request(Data#eldap.fd, Data, Data#eldap.id, {unbindRequest, Req}),
+ ssl:close(Data#eldap.fd);
+ false ->
+ OldTrapExit = process_flag(trap_exit, true),
+ catch send_request(Data#eldap.fd, Data, Data#eldap.id, {unbindRequest, Req}),
+ catch gen_tcp:close(Data#eldap.fd),
+ receive
+ {'EXIT', _From, _Reason} -> ok
+ after 0 -> ok
+ end,
+ process_flag(trap_exit, OldTrapExit)
end,
{no_reply, Data#eldap{binddn = (#eldap{})#eldap.binddn,
passwd = (#eldap{})#eldap.passwd,
diff --git a/lib/eldap/test/make_certs.erl b/lib/eldap/test/make_certs.erl
index cfa43289e1..e8a13ae113 100644
--- a/lib/eldap/test/make_certs.erl
+++ b/lib/eldap/test/make_certs.erl
@@ -348,7 +348,7 @@ req_cnf(C) ->
"default_bits = ", integer_to_list(C#config.default_bits), "\n"
"RANDFILE = $ROOTDIR/RAND\n"
"encrypt_key = no\n"
- "default_md = md5\n"
+ "default_md = sha1\n"
"#string_mask = pkix\n"
"x509_extensions = ca_ext\n"
"prompt = no\n"
@@ -394,7 +394,7 @@ ca_cnf(C) ->
["crl_extensions = crl_ext\n" || C#config.v2_crls],
"unique_subject = no\n"
"default_days = 3600\n"
- "default_md = md5\n"
+ "default_md = sha1\n"
"preserve = no\n"
"policy = policy_match\n"
"\n"
diff --git a/lib/eldap/vsn.mk b/lib/eldap/vsn.mk
index 6e8951aba4..6d541e4689 100644
--- a/lib/eldap/vsn.mk
+++ b/lib/eldap/vsn.mk
@@ -1 +1 @@
-ELDAP_VSN = 1.2.5
+ELDAP_VSN = 1.2.6
diff --git a/lib/erl_docgen/doc/src/doc-build.xml b/lib/erl_docgen/doc/src/doc-build.xml
index 3ea8798639..17e13bff81 100644
--- a/lib/erl_docgen/doc/src/doc-build.xml
+++ b/lib/erl_docgen/doc/src/doc-build.xml
@@ -178,7 +178,7 @@
</section>
<section>
- <title>Upcomming changes</title>
+ <title>Upcoming changes</title>
<p>
The output from the <c>erl_docgen</c> documentation build process is now just the OTP style.
But in a near future we will for example add the possibility to change logo, color in the PDF and
diff --git a/lib/erl_interface/src/README.internal b/lib/erl_interface/src/README.internal
index c1f2d6863f..42c45b46a9 100644
--- a/lib/erl_interface/src/README.internal
+++ b/lib/erl_interface/src/README.internal
@@ -167,12 +167,12 @@ NOTE!!!! Sending a "char" to macros like isupper(), isalpha() where
the character is > 127 will cause serios problems on some
machines/OS. The reason is that
- 'char' may be unsigned, i.e. the Swedish char '๏ฟฝ' will
+ 'char' may be unsigned, i.e. the Swedish char 'รค' will
as a number be negativ.
The implementation of isupper() and others will on some
machines use an array that is indexed with the incoming
- character code. The Swedish '๏ฟฝ' will then create an access
+ character code. The Swedish 'รค' will then create an access
on memory outside the array!
This may give a random value as a result or a segmentation
@@ -219,7 +219,7 @@ There are some functions in the 'ei' library that uses the GCC and
VC++ "long long" type. Unfortunately this can lead to some trouble.
When user code is linked with the "libei.a" the linker will extract
-all objects files needed for resolving all symbol referenses
+all objects files needed for resolving all symbol references
found. This means that you want to follow the rule that
* To reduce executable code size we use resonably small C source
@@ -252,7 +252,7 @@ example is that in plain R9C the ei_x_encode_longlong() function is
located in the file "ei_x_encode.c". So if any "long long" ei_x
function is used we have an unessesary dependency on
"ei_encode_longlong.o" and then need to link with GNU ld on with the
-user code or explicitely link with "libgcc.a". The situation can be
+user code or explicitly link with "libgcc.a". The situation can be
visible in in plain R9C using
% nm -A erl_interface-3.4/lib/libei.a | \
diff --git a/lib/hipe/llvm/hipe_llvm_main.erl b/lib/hipe/llvm/hipe_llvm_main.erl
index 54c435c127..44f0566379 100644
--- a/lib/hipe/llvm/hipe_llvm_main.erl
+++ b/lib/hipe/llvm/hipe_llvm_main.erl
@@ -526,8 +526,8 @@ unique_folder(FunName, Arity, Options) ->
case proplists:get_bool(llvm_save_temps, Options) of
true -> %% Store folder in current directory
DirName;
- false -> %% Temporarily store folder in tempfs (/dev/shm/)
- "/dev/shm/" ++ DirName
+ false -> %% Temporarily store folder in tempfs or tmp dir
+ tmpfs_folder() ++ DirName
end,
%% Make sure it does not exist
case dir_exists(Dir) of
@@ -537,6 +537,14 @@ unique_folder(FunName, Arity, Options) ->
Dir
end.
+tmpfs_folder() ->
+ case os:type() of
+ {unix, linux} ->
+ "/dev/shm/";
+ {unix, _} -> %% Fallback to tmp dir. e.g. FreeBSD
+ "/tmp/"
+ end.
+
%% @doc Function that checks that a given Filename is an existing Directory
%% Name (from http://rosettacode.org/wiki/Ensure_that_a_file_exists#Erlang)
dir_exists(Filename) ->
diff --git a/lib/hipe/main/hipe.erl b/lib/hipe/main/hipe.erl
index ac2e6c1e3b..2348e9b1f6 100644
--- a/lib/hipe/main/hipe.erl
+++ b/lib/hipe/main/hipe.erl
@@ -196,7 +196,7 @@
file/1,
file/2,
get_llvm_version/0,
- llvm_support_available/0,
+ erllvm_is_supported/0,
load/1,
help/0,
help_hiper/0,
@@ -218,12 +218,11 @@
%% Basic type declaration for exported functions of the 'hipe' module
%%-------------------------------------------------------------------
--type mod() :: atom().
--type f_unit() :: mod() | binary().
+-type mod() :: module().
+-type file_or_bin() :: file:filename() | binary().
-type ret_rtl() :: [_].
-type c_ret() :: {'ok', mod()} | {'error', term()} |
{'ok', mod(), ret_rtl()}. %% The last for debugging only
--type compile_file() :: atom() | string() | binary().
-type compile_ret() :: {hipe_architecture(), binary()} | list().
%%-------------------------------------------------------------------
@@ -233,26 +232,26 @@
%%-------------------------------------------------------------------
-%% @spec load(Mod) -> {module, Mod} | {error, Reason}
-%% Mod = mod()
+%% @spec load(Module) -> {module, Module} | {error, Reason}
+%% Module = mod()
%% Reason = term()
%%
%% @doc Like load/2, but tries to locate a BEAM file automatically.
%%
%% @see load/2
--spec load(Mod) -> {'module', Mod} | {'error', term()} when Mod :: mod().
+-spec load(Module) -> {'module', Module} | {'error', Reason :: term()}
+ when Module :: mod().
-load(Mod) ->
- load(Mod, beam_file(Mod)).
+load(Module) ->
+ load(Module, beam_file(Module)).
-%% @spec load(Mod, BeamFileName) -> {module, Mod} | {error, Reason}
-%% Mod = mod()
+%% @spec load(Module, BeamFileName) -> {module, Module} | {error, Reason}
+%% Module = mod()
+%% BeamFileName = file:filename()
%% Reason = term()
-%% BeamFileName = string()
-%% filename() = term()
%%
-%% @type mod() = atom(). A module name.
+%% @type mod() = module(). A module name.
%%
%% @doc User interface for loading code into memory. The code can be
%% given as a native code binary or as the file name of a BEAM file
@@ -262,8 +261,8 @@ load(Mod) ->
%%
%% @see load/1
--spec load(Mod, string()) -> {'module', Mod} | {'error', term()}
- when Mod :: mod().
+-spec load(Module, file:filename()) -> {'module', Module} | {'error', term()}
+ when Module :: mod().
load(Mod, BeamFileName) when is_list(BeamFileName) ->
Architecture = erlang:system_info(hipe_architecture),
@@ -273,26 +272,22 @@ load(Mod, BeamFileName) when is_list(BeamFileName) ->
Error -> {error, Error}
end.
-%% @spec c(Name) -> {ok, Name} | {error, Reason}
-%% Name = mod()
+%% @spec c(Mod) -> {ok, Mod} | {error, Reason}
+%% Mod = mod()
%% Reason = term()
%%
-%% @equiv c(Name, [])
+%% @equiv c(Mod, [])
-spec c(mod()) -> c_ret().
-c(Name) ->
- c(Name, []).
+c(Mod) ->
+ c(Mod, []).
-%% @spec c(Name, options()) -> {ok, Name} | {error, Reason}
-%% Name = mod()
+%% @spec c(Module, options()) -> {ok, Module} | {error, Reason}
+%% Module = mod()
%% options() = [option()]
%% option() = term()
%% Reason = term()
-%%
-%% @type fun() = atom(). A function identifier.
-%%
-%% @type arity() = integer(). A function arity; always nonnegative.
%%
%% @doc User-friendly native code compiler interface. Reads BEAM code
%% from the corresponding "Module<code>.beam</code>" file in the
@@ -307,12 +302,12 @@ c(Name) ->
-spec c(mod(), comp_options()) -> c_ret().
-c(Name, Options) ->
- c(Name, beam_file(Name), Options).
+c(Module, Options) ->
+ c(Module, beam_file(Module), Options).
-%% @spec c(Name, File, options()) -> {ok, Name} | {error, Reason}
-%% Name = mod()
-%% File = filename() | binary()
+%% @spec c(Module, File, options()) -> {ok, Module} | {error, Reason}
+%% Module = mod()
+%% File = file:filename() | binary()
%% Reason = term()
%%
%% @doc Like <code>c/2</code>, but reads BEAM code from the specified
@@ -321,32 +316,32 @@ c(Name, Options) ->
%% @see c/2
%% @see f/2
-c(Name, File, Opts) ->
+c(Module, File, Opts) ->
Opts1 = user_compile_opts(Opts),
- case compile(Name, File, Opts1) of
+ case compile(Module, File, Opts1) of
{ok, Res} ->
case proplists:get_bool(to_rtl, Opts1) of
- true -> {ok, Name, Res};
- false -> {ok, Name}
+ true -> {ok, Module, Res};
+ false -> {ok, Module}
end;
Other ->
Other
end.
%% @spec f(File) -> {ok, Name} | {error, Reason}
-%% File = filename() | binary()
+%% File = file:filename() | binary()
%% Name = mod()
%% Reason = term()
%%
%% @equiv f(File, [])
--spec f(f_unit()) -> {'ok', mod()} | {'error', term()}.
+-spec f(file_or_bin()) -> {'ok', mod()} | {'error', term()}.
f(File) ->
f(File, []).
%% @spec f(File, options()) -> {ok, Name} | {error, Reason}
-%% File = filename() | binary()
+%% File = file:filename() | binary()
%% Name = mod()
%% Reason = term()
%%
@@ -355,7 +350,7 @@ f(File) ->
%%
%% @see c/3
--spec f(f_unit(), comp_options()) -> {'ok', mod()} | {'error', term()}.
+-spec f(file_or_bin(), comp_options()) -> {'ok', mod()} | {'error', term()}.
f(File, Opts) ->
case file(File, user_compile_opts(Opts)) of
@@ -371,20 +366,20 @@ user_compile_opts(Opts) ->
Opts ++ ?USER_DEFAULTS.
-%% @spec compile(Name) -> {ok, {Target,Binary}} | {error, Reason}
-%% Name = mod()
+%% @spec compile(Module) -> {ok, {Target,Binary}} | {error, Reason}
+%% Module = mod()
%% Binary = binary()
%% Reason = term()
%%
-%% @equiv compile(Name, [])
+%% @equiv compile(Module, [])
-spec compile(mod()) -> {'ok', compile_ret()} | {'error', term()}.
-compile(Name) ->
- compile(Name, []).
+compile(Module) ->
+ compile(Module, []).
-%% @spec compile(Name, options()) -> {ok, {Target,Binary}} | {error, Reason}
-%% Name = mod()
+%% @spec compile(Module, options()) -> {ok, {Target,Binary}} | {error, Reason}
+%% Module = mod()
%% Binary = binary()
%% Reason = term()
%%
@@ -403,26 +398,26 @@ compile(Name) ->
%% @see file/2
%% @see load/2
--spec compile(mod(), comp_options()) -> {'ok', compile_ret()} | {'error', _}.
+-spec compile(mod(), comp_options()) -> {'ok', compile_ret()} | {'error', term()}.
-compile(Name, Options) ->
- compile(Name, beam_file(Name), Options).
+compile(Module, Options) ->
+ compile(Module, beam_file(Module), Options).
--spec beam_file(mod()) -> string().
+-spec beam_file(mod()) -> file:filename().
beam_file(Module) when is_atom(Module) ->
case code:which(Module) of
non_existing ->
- ?error_msg("Cannot find ~w.beam file.",[Module]),
+ ?error_msg("Cannot find ~w.beam file.", [Module]),
?EXIT({cant_find_beam_file,Module});
- File -> % string()
+ File when is_list(File) ->
File
end.
%% @spec compile(Name, File, options()) ->
%% {ok, {Target, Binary}} | {error, Reason}
%% Name = mod()
-%% File = filename() | binary()
+%% File = file:filename() | binary()
%% Binary = binary()
%% Reason = term()
%%
@@ -431,7 +426,7 @@ beam_file(Module) when is_atom(Module) ->
%%
%% @see compile/2
--spec compile(mod(), compile_file(), comp_options()) ->
+-spec compile(mod(), file_or_bin(), comp_options()) ->
{'ok', compile_ret()} | {'error', term()}.
compile(Name, File, Opts0) when is_atom(Name) ->
@@ -475,18 +470,18 @@ compile(Name, File, Opts0) when is_atom(Name) ->
run_compiler(Name, DisasmFun, IcodeFun, Opts)
end.
--spec compile_core(mod(), cerl:c_module(), compile_file(), comp_options()) ->
+-spec compile_core(mod(), cerl:c_module(), file_or_bin(), comp_options()) ->
{'ok', compile_ret()} | {'error', term()}.
compile_core(Name, Core0, File, Opts) ->
Core = cerl:from_records(Core0),
compile(Name, Core, File, Opts).
-%% @spec compile(Name, Core, File, options()) ->
+%% @spec compile(Module, Core, File, options()) ->
%% {ok, {Target, Binary}} | {error, Reason}
-%% Name = mod()
+%% Module = mod()
%% Core = coreErlang() | []
-%% File = filename() | binary()
+%% File = file:filename() | binary()
%% Binary = binary()
%% Reason = term()
%%
@@ -499,7 +494,7 @@ compile_core(Name, Core0, File, Opts) ->
%%
%% @see compile/3
--spec compile(mod(), cerl:c_module() | [], compile_file(), comp_options()) ->
+-spec compile(mod(), cerl:c_module() | [], file_or_bin(), comp_options()) ->
{'ok', compile_ret()} | {'error', term()}.
compile(Name, [], File, Opts) ->
@@ -511,37 +506,35 @@ compile(Name, Core, File, Opts) when is_atom(Name) ->
end,
run_compiler(Name, DisasmFun, IcodeFun, Opts).
-%% @spec file(File) -> {ok, Name, {Target, Binary}} | {error, Reason}
-%% File = filename() | binary()
-%% Name = mod() | mfa()
+%% @spec file(File) -> {ok, Mod, {Target, Binary}} | {error, Reason}
+%% File = file:filename()
+%% Mod = mod()
%% Binary = binary()
%% Reason = term()
%%
%% @equiv file(File, [])
--spec file(Mod) -> {'ok', Mod, compile_ret()} | {'error', term()}
- when Mod :: mod().
+-spec file(file:filename()) -> {'ok', mod(), compile_ret()} | {'error', term()}.
file(File) ->
file(File, []).
-%% @spec file(File, options()) -> {ok, Name, {Target,Binary}} | {error, Reason}
-%% File = filename()
-%% Name = mod() | mfa()
+%% @spec file(File, options()) -> {ok, Mod, {Target, Binary}} | {error, Reason}
+%% File = file:filename()
+%% Mod = mod()
%% Binary = binary()
%% Reason = term()
%%
%% @doc Like <code>compile/2</code>, but takes the module name from the
-%% specified <code>File</code>. Returns both the name and the final
+%% specified <code>File</code>. Returns both the module name and the final
%% binary if successful.
%%
%% @see file/1
%% @see compile/2
--spec file(Mod, comp_options()) -> {'ok', Mod, compile_ret()}
- | {'error', term()}
- when Mod :: mod().
-file(File, Options) when is_atom(File) ->
+-spec file(file:filename(), comp_options()) -> {'ok', mod(), compile_ret()}
+ | {'error', Reason :: term()}.
+file(File, Options) when is_list(File) ->
case beam_lib:info(File) of
L when is_list(L) ->
{module, Mod} = lists:keyfind(module, 1, L),
@@ -653,7 +646,7 @@ run_compiler_1(Name, DisasmFun, IcodeFun, Options) ->
get(hipe_target_arch)),
Opts =
case proplists:get_bool(to_llvm, Opts0) andalso
- not llvm_support_available() of
+ not llvm_version_is_OK() of
true ->
?error_msg("No LLVM version 3.9 or greater "
"found in $PATH; aborting "
@@ -1607,9 +1600,15 @@ check_options(Opts) ->
ok
end.
--spec llvm_support_available() -> boolean().
+-spec erllvm_is_supported() -> boolean().
+erllvm_is_supported() ->
+ %% XXX: The test should really check the _target_ architecture,
+ %% (hipe_target_arch), but there's no guarantee it's set.
+ Arch = erlang:system_info(hipe_architecture),
+ lists:member(Arch, [amd64, x86]) andalso llvm_version_is_OK().
-llvm_support_available() ->
+-spec llvm_version_is_OK() -> boolean().
+llvm_version_is_OK() ->
get_llvm_version() >= {3,9}.
-type llvm_version() :: {Major :: integer(), Minor :: integer()}.
diff --git a/lib/hipe/test/hipe_testsuite_driver.erl b/lib/hipe/test/hipe_testsuite_driver.erl
index 8813af5dfc..c506dd5e1d 100644
--- a/lib/hipe/test/hipe_testsuite_driver.erl
+++ b/lib/hipe/test/hipe_testsuite_driver.erl
@@ -170,7 +170,7 @@ run(TestCase, Dir, _OutDir) ->
{ok, TestCase} = hipe:c(TestCase, [o0|HiPEOpts]),
ok = TestCase:test(),
ToLLVM = try TestCase:to_llvm() catch error:undef -> true end,
- case ToLLVM andalso hipe:llvm_support_available() of
+ case ToLLVM andalso hipe:erllvm_is_supported() of
true ->
{ok, TestCase} = hipe:c(TestCase, [to_llvm|HiPEOpts]),
ok = TestCase:test();
diff --git a/lib/kernel/doc/src/inet.xml b/lib/kernel/doc/src/inet.xml
index ed775d67eb..87b08e4e36 100644
--- a/lib/kernel/doc/src/inet.xml
+++ b/lib/kernel/doc/src/inet.xml
@@ -198,6 +198,79 @@ fe80::204:acff:fe17:bf38
</desc>
</datatype>
<datatype>
+ <name name="getifaddrs_ifopts"/>
+ <desc>
+ <p>
+ Interface address description list returned from
+ <seealso marker="#getifaddrs/0"><c>getifaddrs/0,1</c></seealso>
+ for a named interface, translated from the returned
+ data of the POSIX API function <c>getaddrinfo()</c>.
+ </p>
+ <p>
+ <c><anno>Hwaddr</anno></c> is hardware dependent,
+ for example, on Ethernet interfaces it is
+ the 6-byte Ethernet address (MAC address (EUI-48 address)).
+ </p>
+ <p>
+ The tuples <c>{addr,<anno>Addr</anno>}</c>,
+ <c>{netmask,<anno>Netmask</anno>}</c>, and possibly
+ <c>{broadaddr,<anno>Broadaddr</anno>}</c> or
+ <c>{dstaddr,<anno>Dstaddr</anno>}</c>
+ are repeated in the list
+ if the interface has got multiple addresses.
+ An interface may have multiple <c>{flag,_}</c> tuples
+ for example if it has different flags
+ for different address families.
+ Multiple <c>{hwaddr,<anno>Hwaddr</anno>}</c> tuples
+ is hard to say anything definite about, though.
+ The tuple <c>{flag,<anno>Flags</anno>}</c> is mandatory,
+ all others are optional.
+ </p>
+ <p>
+ Do not rely too much on the order
+ of <c><anno>Flags</anno></c> atoms
+ or the <c><anno>Ifopt</anno></c> tuples.
+ There are however some rules:
+ </p>
+ <list type="bulleted">
+ <item><p>
+ A <c>{flag,_}</c> tuple applies to all other tuples that follow.
+ </p></item>
+ <item><p>
+ Immediately after <c>{addr,_}</c> follows <c>{netmask,_}</c>.
+ </p></item>
+ <item><p>
+ Immediately thereafter may <c>{broadaddr,_}</c> follow
+ if <c>broadcast</c> is member of <c><anno>Flags</anno></c>,
+ or <c>{dstaddr,_}</c> if <c>pointtopoint</c>
+ is member of <c><anno>Flags</anno></c>.
+ Both <c>{dstaddr,_}</c> and <c>{broadaddr,_}</c>
+ does not occur for the same <c>{addr,_}</c>.
+ </p></item>
+ <item><p>
+ Any <c>{netmask,_}</c>, <c>{broadaddr,_}</c>, or
+ <c>{dstaddr,_}</c> tuples that follow an
+ <c>{addr,<anno>Addr</anno>}</c>
+ tuple concerns the address <c><anno>Addr</anno></c>.
+ </p></item>
+ </list>
+ <p>
+ The tuple <c>{hwaddr,_}</c> is not returned on Solaris, as the
+ hardware address historically belongs to the link layer
+ and it is not returned by the Solaris API function
+ <c>getaddrinfo()</c>.
+ </p>
+ <warning>
+ <p>
+ On Windows, the data is fetched from different
+ OS API functions, so the <c><anno>Netmask</anno></c>
+ and <c><anno>Broadaddr</anno></c> values may be calculated,
+ just as some <c><anno>Flags</anno></c> values.
+ </p>
+ </warning>
+ </desc>
+ </datatype>
+ <datatype>
<name name="posix"/>
<desc>
<p>An atom that is named from the POSIX error codes used in Unix,
@@ -324,38 +397,64 @@ fe80::204:acff:fe17:bf38
<name name="getifaddrs" arity="0"/>
<fsummary>Return a list of interfaces and their addresses.</fsummary>
<desc>
- <p>Returns a list of 2-tuples containing interface names and the
- interface addresses. <c><anno>Ifname</anno></c> is a Unicode string.
- <c><anno>Hwaddr</anno></c> is hardware dependent, for example, on
- Ethernet interfaces
- it is the 6-byte Ethernet address (MAC address (EUI-48 address)).</p>
- <p>The tuples <c>{addr,<anno>Addr</anno>}</c>, <c>{netmask,_}</c>, and
- <c>{broadaddr,_}</c> are repeated in the result list if the interface
- has multiple addresses. If you come across an interface with
- multiple <c>{flag,_}</c> or <c>{hwaddr,_}</c> tuples, you have
- a strange interface or possibly a bug in this function. The tuple
- <c>{flag,_}</c> is mandatory, all others are optional.</p>
- <p>Do not rely too much on the order of <c><anno>Flag</anno></c> atoms
- or <c><anno>Ifopt</anno></c> tuples. There are however some rules:</p>
- <list type="bulleted">
- <item><p>Immediately after
- <c>{addr,_}</c> follows <c>{netmask,_}</c>.</p></item>
- <item><p>Immediately thereafter follows <c>{broadaddr,_}</c> if flag
- <c>broadcast</c> is <em>not</em> set and flag
- <c>pointtopoint</c> <em>is</em> set.</p></item>
- <item><p>Any <c>{netmask,_}</c>, <c>{broadaddr,_}</c>, or
- <c>{dstaddr,_}</c> tuples that follow an <c>{addr,_}</c>
- tuple concerns that address.</p></item>
- </list>
- <p>The tuple <c>{hwaddr,_}</c> is not returned on Solaris, as the
- hardware address historically belongs to the link layer and only
- the superuser can read such addresses.</p>
- <warning>
- <p>On Windows, the data is fetched from different OS API functions,
- so the <c><anno>Netmask</anno></c> and <c><anno>Broadaddr</anno></c>
- values can be calculated, just as some <c><anno>Flag</anno></c>
- values. Report flagrant bugs.</p>
- </warning>
+ <p>
+ Returns a list of 2-tuples containing interface names and
+ the interfaces' addresses. <c><anno>Ifname</anno></c>
+ is a Unicode string and
+ <c><anno>Ifopts</anno></c> is a list of
+ interface address description tuples.
+ </p>
+ <p>
+ The interface address description tuples
+ are documented under the type of the
+ <seealso marker="#type-getifaddrs_ifopts">
+ <c><anno>Ifopts</anno></c>
+ </seealso>
+ value.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name>getifaddrs(Opts) ->
+ {ok, [{Ifname, Ifopts}]} | {error, Posix}
+ </name>
+ <fsummary>Return a list of interfaces and their addresses.</fsummary>
+ <type>
+ <v>
+ Opts = [{netns, Namespace}]
+ </v>
+ <v>
+ Namespace =
+ <seealso marker="file#type-filename_all">
+ file:filename_all()
+ </seealso>
+ </v>
+ <v>Ifname = string()</v>
+ <v>
+ Ifopts =
+ <seealso marker="#type-getifaddrs_ifopts">
+ getifaddrs_ifopts()
+ </seealso>
+ </v>
+ <v>Posix = <seealso marker="#type-posix">posix()</seealso></v>
+ </type>
+ <desc>
+ <p>
+ The same as
+ <seealso marker="#getifaddrs/0"><c>getifaddrs/0</c></seealso>
+ but the <c>Option</c>
+ <c>{netns, Namespace}</c> sets a network namespace
+ for the OS call, on platforms that supports that feature.
+ </p>
+ <p>
+ See the socket option
+ <seealso marker="#option-netns">
+ <c>{netns, Namespace}</c>
+ </seealso>
+ under
+ <seealso marker="#setopts/2"><c>setopts/2</c></seealso>.
+ </p>
</desc>
</func>
@@ -950,20 +1049,29 @@ get_tcpi_sacked(Sock) ->
</item>
<tag><c>{mode, Mode :: binary | list}</c></tag>
<item>
- <p>Received <c>Packet</c> is delivered as defined by <c>Mode</c>.
+ <p>
+ Received <c>Packet</c> is delivered as defined by <c>Mode</c>.
</p>
</item>
- <tag><c>{netns, Namespace :: file:filename_all()}</c></tag>
+ <tag>
+ <marker id="option-netns"/>
+ <c>{netns, Namespace :: file:filename_all()}</c>
+ </tag>
<item>
- <p>Sets a network namespace for the socket. Parameter
+ <p>
+ Sets a network namespace for the socket. Parameter
<c>Namespace</c> is a filename defining the namespace, for
example, <c>"/var/run/netns/example"</c>, typically created by
command <c>ip netns add example</c>. This option must be used in
a function call that creates a socket, that is,
<seealso marker="gen_tcp#connect/3"><c>gen_tcp:connect/3,4</c></seealso>,
<seealso marker="gen_tcp#listen/2"><c>gen_tcp:listen/2</c></seealso>,
- <seealso marker="gen_udp#open/1"><c>gen_udp:open/1,2</c></seealso>, or
- <seealso marker="gen_sctp#open/0"><c>gen_sctp:open/0,1,2</c></seealso>.</p>
+ <seealso marker="gen_udp#open/1"><c>gen_udp:open/1,2</c></seealso>
+ or
+ <seealso marker="gen_sctp#open/0"><c>gen_sctp:open/0,1,2</c></seealso>,
+ and also
+ <seealso marker="#getifaddrs/1"><c>getifaddrs/1</c></seealso>.
+ </p>
<p>This option uses the Linux-specific syscall
<c>setns()</c>, such as in Linux kernel 3.0 or later,
and therefore only exists when the runtime system
@@ -1039,6 +1147,18 @@ setcap cap_sys_admin,cap_sys_ptrace,cap_dac_read_search+epi beam.smp</code>
is turned on for the socket, which means that also small
amounts of data are sent immediately.</p>
</item>
+ <tag><c>{nopush, Boolean}</c>(TCP/IP sockets)</tag>
+ <item>
+ <p>This translates to <c>TCP_NOPUSH</c> on BSD and
+ to <c>TCP_CORK</c> on Linux.</p>
+ <p>If <c>Boolean == true</c>, the corresponding option
+ is turned on for the socket, which means that small
+ amounts of data are accumulated until a full MSS-worth
+ of data is available or this option is turned off.</p>
+ <p>Note that while <c>TCP_NOPUSH</c> socket option is available on OSX, its semantics
+ is very different (e.g., unsetting it does not cause immediate send
+ of accumulated data). Hence, <c>nopush</c> option is intentionally ignored on OSX.</p>
+ </item>
<tag><c>{packet, PacketType}</c>(TCP/IP sockets)</tag>
<item>
<p><marker id="packet"/>Defines the type of packets to use for a socket.
diff --git a/lib/kernel/doc/src/logger.xml b/lib/kernel/doc/src/logger.xml
index 464c65ba76..2bcf137299 100644
--- a/lib/kernel/doc/src/logger.xml
+++ b/lib/kernel/doc/src/logger.xml
@@ -748,6 +748,14 @@ start(_, []) ->
exists, its associated value will be changed
to the given value. If it does not exist, it will
be added.</p>
+ <p>If the value is incomplete, which for example can be the
+ case for the <c>config</c> key, it is up to the handler
+ implementation how the unspecified parts are set. For all
+ handlers in the Kernel application, unspecified data for
+ the <c>config</c> key is set to default values. To update
+ only specified data, and keep the existing configuration for
+ the rest, use <seealso marker="#update_handler_config-3">
+ <c>update_handler_config/3</c></seealso>.</p>
<p>See the definition of
the <seealso marker="#type-handler_config">
<c>handler_config()</c></seealso> type for more
@@ -933,6 +941,42 @@ logger:set_handler_config(HandlerId, maps:merge(Old, Config)).
</func>
<func>
+ <name name="update_handler_config" arity="3" clause_i="1"/>
+ <name name="update_handler_config" arity="3" clause_i="2"/>
+ <name name="update_handler_config" arity="3" clause_i="3"/>
+ <name name="update_handler_config" arity="3" clause_i="4"/>
+ <name name="update_handler_config" arity="3" clause_i="5"/>
+ <fsummary>Add or update configuration data for the specified
+ handler.</fsummary>
+ <type variable="HandlerId"/>
+ <type variable="Level" name_i="1"/>
+ <type variable="FilterDefault" name_i="2"/>
+ <type variable="Filters" name_i="3"/>
+ <type variable="Formatter" name_i="4"/>
+ <type variable="Config" name_i="5"/>
+ <type variable="Return"/>
+ <desc>
+ <p>Add or update configuration data for the specified
+ handler. If the given <c><anno>Key</anno></c> already
+ exists, its associated value will be changed
+ to the given value. If it does not exist, it will
+ be added.</p>
+ <p>If the value is incomplete, which for example can be the
+ case for the <c>config</c> key, it is up to the handler
+ implementation how the unspecified parts are set. For all
+ handlers in the Kernel application, unspecified data for
+ the <c>config</c> key is not changed. To reset unspecified
+ data to default values,
+ use <seealso marker="#set_handler_config-3">
+ <c>set_handler_config/3</c></seealso>.</p>
+ <p>See the definition of
+ the <seealso marker="#type-handler_config">
+ <c>handler_config()</c></seealso> type for more
+ information about the different parameters.</p>
+ </desc>
+ </func>
+
+ <func>
<name name="update_primary_config" arity="1"/>
<fsummary>Update primary configuration data for Logger.</fsummary>
<desc>
@@ -1041,10 +1085,11 @@ logger:set_process_metadata(maps:merge(logger:get_process_metadata(), Meta)).
</func>
<func>
- <name>HModule:changing_config(Config1, Config2) -> {ok, Config3} | {error, Reason}</name>
+ <name>HModule:changing_config(SetOrUpdate, OldConfig, NewConfig) -> {ok, Config} | {error, Reason}</name>
<fsummary>The configuration for this handler is about to change.</fsummary>
<type>
- <v>Config1 = Config2 = Config3 =
+ <v>SetOrUpdate = set | update</v>
+ <v>OldConfig = NewConfig = Config =
<seealso marker="#type-handler_config">handler_config()</seealso></v>
<v>Reason = term()</v>
</type>
@@ -1053,18 +1098,51 @@ logger:set_process_metadata(maps:merge(logger:get_process_metadata(), Meta)).
<p>The function is called on a temporary process when the
configuration for a handler is about to change. The purpose
is to verify and act on the new configuration.</p>
- <p><c>Config1</c> is the existing configuration
- and <c>Config2</c> is the new configuration.</p>
+ <p><c>OldConfig</c> is the existing configuration
+ and <c>NewConfig</c> is the new configuration.</p>
<p>The handler identity is associated with the <c>id</c> key
- in <c>Config1</c>.</p>
+ in <c>OldConfig</c>.</p>
+ <p><c>SetOrUpdate</c> has the value <c>set</c> if the
+ configuration change originates from a call to
+ <seealso marker="#set_handler_config-2">
+ <c>set_handler_config/2,3</c></seealso>, and <c>update</c>
+ if it originates from <seealso marker="#update_handler_config-2">
+ <c>update_handler_config/2,3</c></seealso>. The handler can
+ use this parameteter to decide how to update the value of
+ the <c>config</c> field, that is, the handler specific
+ configuration data. Typically, if <c>SetOrUpdate</c>
+ equals <c>set</c>, values that are not specified must be
+ given their default values. If <c>SetOrUpdate</c>
+ equals <c>update</c>, the values found in <c>OldConfig</c>
+ must be used instead.</p>
<p>If everything succeeds, the callback function must return a
- possibly adjusted configuration in <c>{ok,Config3}</c>.</p>
+ possibly adjusted configuration in <c>{ok,Config}</c>.</p>
<p>If the configuration is faulty, the callback function must
return <c>{error,Reason}</c>.</p>
</desc>
</func>
<func>
+ <name>HModule:filter_config(Config) -> FilteredConfig</name>
+ <fsummary>Remove internal data from configuration.</fsummary>
+ <type>
+ <v>Config = FilteredConfig =
+ <seealso marker="#type-handler_config">handler_config()</seealso></v>
+ </type>
+ <desc>
+ <p>This callback function is optional.</p>
+ <p>The function is called when one of the Logger API functions
+ for fetching the handler configuration is called, for
+ example
+ <seealso marker="#get_handler_config-1">
+ <c>logger:get_handler_config/1</c></seealso>.</p>
+ <p>It allows the handler to remove internal data fields from
+ its configuration data before it is returned to the
+ caller.</p>
+ </desc>
+ </func>
+
+ <func>
<name>HModule:log(LogEvent, Config) -> void()</name>
<fsummary>Log the given log event.</fsummary>
<type>
@@ -1136,7 +1214,7 @@ logger:set_process_metadata(maps:merge(logger:get_process_metadata(), Meta)).
<item><seealso marker="logger#set_handler_config-2">
<c>logger:set_handler_config/2,3</c></seealso></item>
<item><seealso marker="logger#update_handler_config-2">
- <c>logger:updata_handler_config/2</c></seealso></item>
+ <c>logger:updata_handler_config/2,3</c></seealso></item>
<item><seealso marker="logger#update_formatter_config-2">
<c>logger:update_formatter_config/2</c></seealso></item>
</list>
diff --git a/lib/kernel/doc/src/logger_chapter.xml b/lib/kernel/doc/src/logger_chapter.xml
index fdb21fa24c..8fc52ce0a9 100644
--- a/lib/kernel/doc/src/logger_chapter.xml
+++ b/lib/kernel/doc/src/logger_chapter.xml
@@ -384,8 +384,8 @@ logger:debug(#{got => connection_request, id => Id, state => State},
<p>In addition to the mandatory callback function <c>log/2</c>, a
handler module can export the optional callback
- functions <c>adding_handler/1</c>, <c>changing_config/2</c>
- and <c>removing_handler/1</c>. See
+ functions <c>adding_handler/1</c>, <c>changing_config/3</c>,
+ <c>filter_config/1</c>, and <c>removing_handler/1</c>. See
section <seealso marker="logger#handler_callback_functions">Handler
Callback Functions</seealso> in the logger(3) manual page for
more information about these function.</p>
@@ -555,7 +555,7 @@ logger:debug(#{got => connection_request, id => Id, state => State},
<item><seealso marker="logger#set_handler_config-2">
<c>set_handler_config/2,3</c></seealso></item>
<item><seealso marker="logger#update_handler_config-2">
- <c>update_handler_config/2</c></seealso></item>
+ <c>update_handler_config/2,3</c></seealso></item>
<item><seealso marker="logger#add_handler_filter-3">
<c>add_handler_filter/3</c></seealso></item>
<item><seealso marker="logger#remove_handler_filter-2">
@@ -704,9 +704,13 @@ logger:debug(#{got => connection_request, id => Id, state => State},
<item>
<p>If <c>HandlerId</c> is <c>default</c>, then this entry
modifies the default handler, equivalent to calling</p>
- <pre><seealso marker="logger#set_handler_config-2">
- logger:set_handler_config(default, Module, HandlerConfig)
- </seealso></pre>
+ <pre><seealso marker="logger#remove_handler-1">
+ logger:remove_handler(default)
+ </seealso></pre>
+ <p>followed by</p>
+ <pre><seealso marker="logger#add_handler-3">
+ logger:add_handler(default, Module, HandlerConfig)
+ </seealso></pre>
<p>For all other values of <c>HandlerId</c>, this entry
adds a new handler, equivalent to calling</p>
<pre><seealso marker="logger:add_handler/3">
@@ -1024,7 +1028,8 @@ ok</pre>
<list>
<item><c>adding_handler(Config)</c></item>
<item><c>removing_handler(Config)</c></item>
- <item><c>changing_config(OldConfig, NewConfig)</c></item>
+ <item><c>changing_config(SetOrUpdate, OldConfig, NewConfig)</c></item>
+ <item><c>filter_config(Config)</c></item>
</list>
<p>When a handler is added, by for example a call
to <seealso marker="logger#add_handler-3">
@@ -1043,11 +1048,18 @@ ok</pre>
<p>When <seealso marker="logger#set_handler_config-2">
<c>logger:set_handler_config/2,3</c></seealso>
or <seealso marker="logger#update_handler_config/2">
- <c>logger:update_handler_config/2</c></seealso> is called,
+ <c>logger:update_handler_config/2,3</c></seealso> is called,
Logger
- calls <c>HModule:changing_config(OldConfig, NewConfig)</c>. If
+ calls <c>HModule:changing_config(SetOrUpdate, OldConfig, NewConfig)</c>. If
this function returns <c>{ok,NewConfig1}</c>, Logger
writes <c>NewConfig1</c> to the configuration database.</p>
+ <p>When <seealso marker="logger#get_config-0">
+ <c>logger:get_config/0</c></seealso> or
+ <seealso marker="logger#get_handler_config-0">
+ <c>logger:get_handler_config/0,1</c></seealso> is called,
+ Logger calls <c>HModule:filter_config(Config)</c>. This function
+ must return the handler configuration where internal data is
+ removed.</p>
<p>A simple handler that prints to the terminal can be implemented
as follows:</p>
diff --git a/lib/kernel/doc/src/logger_disk_log_h.xml b/lib/kernel/doc/src/logger_disk_log_h.xml
index dfe2ab3275..d9b941a0a9 100644
--- a/lib/kernel/doc/src/logger_disk_log_h.xml
+++ b/lib/kernel/doc/src/logger_disk_log_h.xml
@@ -66,6 +66,10 @@
corresponds to the <c>name</c> property in the
<seealso marker="disk_log#open-1"><c>dlog_option()</c></seealso>
datatype.</p>
+ <p>The value is set when the handler is added, and it can not
+ be changed in runtime.</p>
+ <p>Defaults to the same name as the handler identity, in the
+ current directory.</p>
</item>
<tag><c>type</c></tag>
<item>
@@ -73,6 +77,8 @@
corresponds to the <c>type</c> property in the
<seealso marker="disk_log#open-1"><c>dlog_option()</c></seealso>
datatype.</p>
+ <p>The value is set when the handler is added, and it can not
+ be changed in runtime.</p>
<p>Defaults to <c>wrap</c>.</p>
</item>
<tag><c>max_no_files</c></tag>
@@ -82,6 +88,8 @@
corresponds to the <c>MaxNoFiles</c> element in the <c>size</c> property in the
<seealso marker="disk_log#open-1"><c>dlog_option()</c></seealso>
datatype.</p>
+ <p>The value is set when the handler is added, and it can not
+ be changed in runtime.</p>
<p>Defaults to <c>10</c>.</p>
<p>The setting has no effect on a halt log.</p>
</item>
@@ -93,6 +101,8 @@
corresponds to the <c>MaxNoBytes</c> element in the <c>size</c> property in the
<seealso marker="disk_log#open-1"><c>dlog_option()</c></seealso>
datatype.</p>
+ <p>The value is set when the handler is added, and it can not
+ be changed in runtime.</p>
<p>Defaults to <c>1048576</c> bytes for a wrap log, and
<c>infinity</c> for a halt log.</p>
</item>
diff --git a/lib/kernel/doc/src/logger_std_h.xml b/lib/kernel/doc/src/logger_std_h.xml
index fcd8189bae..e156f5719b 100644
--- a/lib/kernel/doc/src/logger_std_h.xml
+++ b/lib/kernel/doc/src/logger_std_h.xml
@@ -74,7 +74,9 @@
circular logging. Use the disk_log handler,
<seealso marker="logger_disk_log_h"><c>logger_disk_log_h</c></seealso>,
for this.</p>
- <p> Defaults to <c>standard_io</c>.</p>
+ <p>The value is set when the handler is added, and it can not
+ be changed in runtime.</p>
+ <p>Defaults to <c>standard_io</c>.</p>
</item>
<tag><c>filesync_repeat_interval</c></tag>
<item>
diff --git a/lib/kernel/src/inet.erl b/lib/kernel/src/inet.erl
index 5dd68dc285..9f22eb6aaa 100644
--- a/lib/kernel/src/inet.erl
+++ b/lib/kernel/src/inet.erl
@@ -154,6 +154,15 @@
'running' | 'multicast' | 'loopback']} |
{'hwaddr', ether_address()}.
+-type getifaddrs_ifopts() ::
+ [Ifopt :: {flags, Flags :: [up | broadcast | loopback |
+ pointtopoint | running | multicast]} |
+ {addr, Addr :: ip_address()} |
+ {netmask, Netmask :: ip_address()} |
+ {broadaddr, Broadaddr :: ip_address()} |
+ {dstaddr, Dstaddr :: ip_address()} |
+ {hwaddr, Hwaddr :: [byte()]}].
+
-type address_family() :: 'inet' | 'inet6' | 'local'.
-type socket_protocol() :: 'tcp' | 'udp' | 'sctp'.
-type socket_type() :: 'stream' | 'dgram' | 'seqpacket'.
@@ -321,32 +330,32 @@ getopts(Socket, Opts) ->
Other
end.
--spec getifaddrs(Socket :: socket()) ->
- {'ok', [string()]} | {'error', posix()}.
-
+-spec getifaddrs(
+ [Option :: {netns, Namespace :: file:filename_all()}]
+ | socket()) ->
+ {'ok', [{Ifname :: string(),
+ Ifopts :: getifaddrs_ifopts()}]}
+ | {'error', posix()}.
+getifaddrs(Opts) when is_list(Opts) ->
+ withsocket(fun(S) -> prim_inet:getifaddrs(S) end, Opts);
getifaddrs(Socket) ->
prim_inet:getifaddrs(Socket).
--spec getifaddrs() -> {ok, Iflist} | {error, posix()} when
- Iflist :: [{Ifname,[Ifopt]}],
- Ifname :: string(),
- Ifopt :: {flags,[Flag]} | {addr,Addr} | {netmask,Netmask}
- | {broadaddr,Broadaddr} | {dstaddr,Dstaddr}
- | {hwaddr,Hwaddr},
- Flag :: up | broadcast | loopback | pointtopoint
- | running | multicast,
- Addr :: ip_address(),
- Netmask :: ip_address(),
- Broadaddr :: ip_address(),
- Dstaddr :: ip_address(),
- Hwaddr :: [byte()].
-
+-spec getifaddrs() ->
+ {'ok', [{Ifname :: string(),
+ Ifopts :: getifaddrs_ifopts()}]}
+ | {'error', posix()}.
getifaddrs() ->
withsocket(fun(S) -> prim_inet:getifaddrs(S) end).
--spec getiflist(Socket :: socket()) ->
- {'ok', [string()]} | {'error', posix()}.
+-spec getiflist(
+ [Option :: {netns, Namespace :: file:filename_all()}]
+ | socket()) ->
+ {'ok', [string()]} | {'error', posix()}.
+
+getiflist(Opts) when is_list(Opts) ->
+ withsocket(fun(S) -> prim_inet:getiflist(S) end, Opts);
getiflist(Socket) ->
prim_inet:getiflist(Socket).
@@ -363,11 +372,19 @@ getiflist() ->
ifget(Socket, Name, Opts) ->
prim_inet:ifget(Socket, Name, Opts).
--spec ifget(Name :: string() | atom(), Opts :: [if_getopt()]) ->
+-spec ifget(
+ Name :: string() | atom(),
+ Opts :: [if_getopt() |
+ {netns, Namespace :: file:filename_all()}]) ->
{'ok', [if_getopt_result()]} | {'error', posix()}.
ifget(Name, Opts) ->
- withsocket(fun(S) -> prim_inet:ifget(S, Name, Opts) end).
+ {NSOpts,IFOpts} =
+ lists:partition(
+ fun ({netns,_}) -> true;
+ (_) -> false
+ end, Opts),
+ withsocket(fun(S) -> prim_inet:ifget(S, Name, IFOpts) end, NSOpts).
-spec ifset(Socket :: socket(),
Name :: string() | atom(),
@@ -377,11 +394,19 @@ ifget(Name, Opts) ->
ifset(Socket, Name, Opts) ->
prim_inet:ifset(Socket, Name, Opts).
--spec ifset(Name :: string() | atom(), Opts :: [if_setopt()]) ->
+-spec ifset(
+ Name :: string() | atom(),
+ Opts :: [if_setopt() |
+ {netns, Namespace :: file:filename_all()}]) ->
'ok' | {'error', posix()}.
ifset(Name, Opts) ->
- withsocket(fun(S) -> prim_inet:ifset(S, Name, Opts) end).
+ {NSOpts,IFOpts} =
+ lists:partition(
+ fun ({netns,_}) -> true;
+ (_) -> false
+ end, Opts),
+ withsocket(fun(S) -> prim_inet:ifset(S, Name, IFOpts) end, NSOpts).
-spec getif() ->
{'ok', [{ip_address(), ip_address() | 'undefined', ip_address()}]} |
@@ -391,10 +416,14 @@ getif() ->
withsocket(fun(S) -> getif(S) end).
%% backwards compatible getif
--spec getif(Socket :: socket()) ->
+-spec getif(
+ [Option :: {netns, Namespace :: file:filename_all()}]
+ | socket()) ->
{'ok', [{ip_address(), ip_address() | 'undefined', ip_address()}]} |
{'error', posix()}.
+getif(Opts) when is_list(Opts) ->
+ withsocket(fun(S) -> getif(S) end, Opts);
getif(Socket) ->
case prim_inet:getiflist(Socket) of
{ok, IfList} ->
@@ -415,7 +444,10 @@ getif(Socket) ->
end.
withsocket(Fun) ->
- case inet_udp:open(0,[]) of
+ withsocket(Fun, []).
+%%
+withsocket(Fun, Opts) ->
+ case inet_udp:open(0, Opts) of
{ok,Socket} ->
Res = Fun(Socket),
inet_udp:close(Socket),
diff --git a/lib/kernel/src/inet_int.hrl b/lib/kernel/src/inet_int.hrl
index c8e09d18ad..f6525d7261 100644
--- a/lib/kernel/src/inet_int.hrl
+++ b/lib/kernel/src/inet_int.hrl
@@ -162,6 +162,7 @@
-define(INET_OPT_PKTOPTIONS, 45).
-define(INET_OPT_TTL, 46).
-define(INET_OPT_RECVTTL, 47).
+-define(TCP_OPT_NOPUSH, 48).
% Specific SCTP options: separate range:
-define(SCTP_OPT_RTOINFO, 100).
-define(SCTP_OPT_ASSOCINFO, 101).
diff --git a/lib/kernel/src/inet_tcp_dist.erl b/lib/kernel/src/inet_tcp_dist.erl
index d1701afdaa..c37212b0f9 100644
--- a/lib/kernel/src/inet_tcp_dist.erl
+++ b/lib/kernel/src/inet_tcp_dist.erl
@@ -450,7 +450,7 @@ get_tcp_address(Driver, Socket) ->
get_address_resolver(EpmdModule) ->
case erlang:function_exported(EpmdModule, address_please, 3) of
true -> {EpmdModule, address_please};
- _ -> {inet, getaddr}
+ _ -> {erl_epmd, address_please}
end.
%% ------------------------------------------------------------
diff --git a/lib/kernel/src/logger.erl b/lib/kernel/src/logger.erl
index 752dd8d493..6762998d4f 100644
--- a/lib/kernel/src/logger.erl
+++ b/lib/kernel/src/logger.erl
@@ -43,7 +43,8 @@
get_module_level/0, get_module_level/1,
set_primary_config/1, set_primary_config/2,
set_handler_config/2, set_handler_config/3,
- update_primary_config/1, update_handler_config/2,
+ update_primary_config/1,
+ update_handler_config/2, update_handler_config/3,
update_formatter_config/2, update_formatter_config/3,
get_primary_config/0, get_handler_config/1,
get_handler_config/0, get_handler_ids/0, get_config/0,
@@ -423,6 +424,29 @@ set_handler_config(HandlerId,Config) ->
update_primary_config(Config) ->
logger_server:update_config(primary,Config).
+-spec update_handler_config(HandlerId,level,Level) -> Return when
+ HandlerId :: handler_id(),
+ Level :: level() | all | none,
+ Return :: ok | {error,term()};
+ (HandlerId,filter_default,FilterDefault) -> Return when
+ HandlerId :: handler_id(),
+ FilterDefault :: log | stop,
+ Return :: ok | {error,term()};
+ (HandlerId,filters,Filters) -> Return when
+ HandlerId :: handler_id(),
+ Filters :: [{filter_id(),filter()}],
+ Return :: ok | {error,term()};
+ (HandlerId,formatter,Formatter) -> Return when
+ HandlerId :: handler_id(),
+ Formatter :: {module(), formatter_config()},
+ Return :: ok | {error,term()};
+ (HandlerId,config,Config) -> Return when
+ HandlerId :: handler_id(),
+ Config :: term(),
+ Return :: ok | {error,term()}.
+update_handler_config(HandlerId,Key,Value) ->
+ logger_server:update_config(HandlerId,Key,Value).
+
-spec update_handler_config(HandlerId,Config) -> ok | {error,term()} when
HandlerId :: handler_id(),
Config :: handler_config().
@@ -439,7 +463,14 @@ get_primary_config() ->
HandlerId :: handler_id(),
Config :: handler_config().
get_handler_config(HandlerId) ->
- logger_config:get(?LOGGER_TABLE,HandlerId).
+ case logger_config:get(?LOGGER_TABLE,HandlerId) of
+ {ok,#{module:=Module}=Config} ->
+ {ok,try Module:filter_config(Config)
+ catch _:_ -> Config
+ end};
+ Error ->
+ Error
+ end.
-spec get_handler_config() -> [Config] when
Config :: handler_config().
diff --git a/lib/kernel/src/logger_disk_log_h.erl b/lib/kernel/src/logger_disk_log_h.erl
index a8f141f135..2a81458ec8 100644
--- a/lib/kernel/src/logger_disk_log_h.erl
+++ b/lib/kernel/src/logger_disk_log_h.erl
@@ -33,7 +33,8 @@
terminate/2, code_change/3]).
%% logger callbacks
--export([log/2, adding_handler/1, removing_handler/1, changing_config/2]).
+-export([log/2, adding_handler/1, removing_handler/1, changing_config/3,
+ filter_config/1]).
%% handler internal
-export([log_handler_info/4]).
@@ -114,9 +115,8 @@ reset(Name) ->
%%% Handler being added
adding_handler(#{id:=Name}=Config) ->
case check_config(adding, Config) of
- {ok, Config1} ->
+ {ok, #{config:=HConfig}=Config1} ->
%% create initial handler state by merging defaults with config
- HConfig = maps:get(config, Config1, #{}),
HState = maps:merge(get_init_state(), HConfig),
case logger_h_common:overload_levels_ok(HState) of
true ->
@@ -133,32 +133,40 @@ adding_handler(#{id:=Name}=Config) ->
%%%-----------------------------------------------------------------
%%% Updating handler config
-changing_config(OldConfig = #{id:=Name, config:=OldHConfig},
- NewConfig = #{id:=Name, config:=NewHConfig}) ->
- #{type:=Type, file:=File, max_no_files:=MaxFs,
- max_no_bytes:=MaxBytes} = OldHConfig,
- case NewHConfig of
- #{type:=Type, file:=File, max_no_files:=MaxFs,
- max_no_bytes:=MaxBytes} ->
- changing_config1(OldConfig, NewConfig);
- _ ->
- {error,{illegal_config_change,OldConfig,NewConfig}}
- end;
-changing_config(OldConfig, NewConfig) ->
- {error,{illegal_config_change,OldConfig,NewConfig}}.
+changing_config(SetOrUpdate,OldConfig=#{config:=OldHConfig},NewConfig) ->
+ WriteOnce = maps:with([type,file,max_no_files,max_no_bytes],OldHConfig),
+ ReadOnly = maps:with([handler_pid,mode_tab],OldHConfig),
+ NewHConfig0 = maps:get(config, NewConfig, #{}),
+ Default =
+ case SetOrUpdate of
+ set ->
+ %% Do not reset write-once fields to defaults
+ maps:merge(get_default_config(),WriteOnce);
+ update ->
+ OldHConfig
+ end,
-changing_config1(OldConfig=#{config:=OldHConfig}, NewConfig) ->
+ %% Allow (accidentially) included read-only fields - just overwrite them
+ NewHConfig = maps:merge(maps:merge(Default,NewHConfig0),ReadOnly),
+
+ %% But fail if write-once fields are changed
+ case maps:with([type,file,max_no_files,max_no_bytes],NewHConfig) of
+ WriteOnce ->
+ changing_config1(maps:get(handler_pid,OldHConfig),
+ OldConfig,
+ NewConfig#{config=>NewHConfig});
+ Other ->
+ {Old,New} = logger_server:diff_maps(WriteOnce,Other),
+ {error,{illegal_config_change,#{config=>Old},#{config=>New}}}
+ end.
+
+changing_config1(HPid, OldConfig, NewConfig) ->
case check_config(changing, NewConfig) of
- {ok,NewConfig1 = #{config:=NewHConfig}} ->
- #{handler_pid:=HPid,
- mode_tab:=ModeTab} = OldHConfig,
- NewHConfig1 = NewHConfig#{handler_pid=>HPid,
- mode_tab=>ModeTab},
- NewConfig2 = NewConfig1#{config=>NewHConfig1},
- try gen_server:call(HPid, {change_config,OldConfig,NewConfig2},
+ Result = {ok,NewConfig1} ->
+ try gen_server:call(HPid, {change_config,OldConfig,NewConfig1},
?DEFAULT_CALL_TIMEOUT) of
- ok -> {ok,NewConfig2};
- HError -> HError
+ ok -> Result;
+ Error -> Error
catch
_:{timeout,_} -> {error,handler_busy}
end;
@@ -168,10 +176,12 @@ changing_config1(OldConfig=#{config:=OldHConfig}, NewConfig) ->
check_config(adding, #{id:=Name}=Config) ->
%% merge handler specific config data
- HConfig = merge_default_logopts(Name, maps:get(config, Config, #{})),
- case check_h_config(maps:to_list(HConfig)) of
+ HConfig1 = maps:get(config, Config, #{}),
+ HConfig2 = maps:merge(get_default_config(), HConfig1),
+ HConfig3 = merge_default_logopts(Name, HConfig2),
+ case check_h_config(maps:to_list(HConfig3)) of
ok ->
- {ok,Config#{config=>HConfig}};
+ {ok,Config#{config=>HConfig3}};
Error ->
Error
end;
@@ -238,6 +248,11 @@ log(LogEvent, Config = #{id := Name,
Bin = logger_h_common:log_to_binary(LogEvent, Config),
logger_h_common:call_cast_or_drop(Name, HPid, ModeTab, Bin).
+%%%-----------------------------------------------------------------
+%%% Remove internal fields from configuration
+filter_config(#{config:=HConfig}=Config) ->
+ Config#{config=>maps:without([handler_pid,mode_tab],HConfig)}.
+
%%%===================================================================
%%% gen_server callbacks
%%%===================================================================
@@ -438,7 +453,7 @@ code_change(_OldVsn, State, _Extra) ->
%%%-----------------------------------------------------------------
%%%
-get_init_state() ->
+get_default_config() ->
#{sync_mode_qlen => ?SYNC_MODE_QLEN,
drop_mode_qlen => ?DROP_MODE_QLEN,
flush_qlen => ?FLUSH_QLEN,
@@ -449,10 +464,12 @@ get_init_state() ->
overload_kill_qlen => ?OVERLOAD_KILL_QLEN,
overload_kill_mem_size => ?OVERLOAD_KILL_MEM_SIZE,
overload_kill_restart_after => ?OVERLOAD_KILL_RESTART_AFTER,
- dl_sync_int => ?CONTROLLER_SYNC_INTERVAL,
- filesync_ok_qlen => ?FILESYNC_OK_QLEN,
filesync_repeat_interval => ?FILESYNC_REPEAT_INTERVAL}.
+get_init_state() ->
+ #{dl_sync_int => ?CONTROLLER_SYNC_INTERVAL,
+ filesync_ok_qlen => ?FILESYNC_OK_QLEN}.
+
%%%-----------------------------------------------------------------
%%% Add a disk_log handler to the logger.
%%% This starts a dedicated handler process which should always
diff --git a/lib/kernel/src/logger_h_common.erl b/lib/kernel/src/logger_h_common.erl
index 38ac7d8ffc..94c640cb92 100644
--- a/lib/kernel/src/logger_h_common.erl
+++ b/lib/kernel/src/logger_h_common.erl
@@ -306,8 +306,11 @@ stop_or_restart(Name, {shutdown,Reason={overloaded,_Name,_QLen,_Mem}},
exit(HandlerPid, kill)
end,
case ConfigResult of
- {ok,#{module:=HMod}=HConfig} when is_integer(RestartAfter) ->
+ {ok,#{module:=HMod}=HConfig0} when is_integer(RestartAfter) ->
_ = logger:remove_handler(Name),
+ HConfig = try HMod:filter_config(HConfig0)
+ catch _:_ -> HConfig0
+ end,
_ = timer:apply_after(RestartAfter, logger, add_handler,
[Name,HMod,HConfig]);
{ok,_} ->
diff --git a/lib/kernel/src/logger_server.erl b/lib/kernel/src/logger_server.erl
index a1d40f1123..b7735dbcf7 100644
--- a/lib/kernel/src/logger_server.erl
+++ b/lib/kernel/src/logger_server.erl
@@ -27,9 +27,13 @@
add_filter/2, remove_filter/2,
set_module_level/2, unset_module_level/0,
unset_module_level/1, cache_module_level/1,
- set_config/2, set_config/3, update_config/2,
+ set_config/2, set_config/3,
+ update_config/2, update_config/3,
update_formatter_config/2]).
+%% Helper
+-export([diff_maps/2]).
+
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2]).
@@ -105,12 +109,25 @@ cache_module_level(Module) ->
gen_server:cast(?SERVER,{cache_module_level,Module}).
set_config(Owner,Key,Value) ->
- update_config(Owner,#{Key=>Value}).
+ case sanity_check(Owner,Key,Value) of
+ ok ->
+ call({change_config,set,Owner,Key,Value});
+ Error ->
+ Error
+ end.
set_config(Owner,Config) ->
case sanity_check(Owner,Config) of
ok ->
- call({set_config,Owner,Config});
+ call({change_config,set,Owner,Config});
+ Error ->
+ Error
+ end.
+
+update_config(Owner,Key,Value) ->
+ case sanity_check(Owner,Key,Value) of
+ ok ->
+ call({change_config,update,Owner,Key,Value});
Error ->
Error
end.
@@ -118,7 +135,7 @@ set_config(Owner,Config) ->
update_config(Owner, Config) ->
case sanity_check(Owner,Config) of
ok ->
- call({update_config,Owner,Config});
+ call({change_config,update,Owner,Config});
Error ->
Error
end.
@@ -204,46 +221,72 @@ handle_call({add_filter,Id,Filter}, _From,#state{tid=Tid}=State) ->
handle_call({remove_filter,Id,FilterId}, _From, #state{tid=Tid}=State) ->
Reply = do_remove_filter(Tid,Id,FilterId),
{reply,Reply,State};
-handle_call({update_config,primary,NewConfig}, _From, #state{tid=Tid}=State) ->
+handle_call({change_config,SetOrUpd,primary,Config0}, _From,
+ #state{tid=Tid}=State) ->
+ {ok,#{handlers:=Handlers}=OldConfig} = logger_config:get(Tid,primary),
+ Default =
+ case SetOrUpd of
+ set -> default_config(primary);
+ update -> OldConfig
+ end,
+ Config = maps:merge(Default,Config0),
+ Reply = logger_config:set(Tid,primary,Config#{handlers=>Handlers}),
+ {reply,Reply,State};
+handle_call({change_config,_SetOrUpd,primary,Key,Value}, _From,
+ #state{tid=Tid}=State) ->
{ok,OldConfig} = logger_config:get(Tid,primary),
- Config = maps:merge(OldConfig,NewConfig),
- {reply,logger_config:set(Tid,primary,Config),State};
-handle_call({update_config,HandlerId,NewConfig}, From, #state{tid=Tid}=State) ->
+ Reply = logger_config:set(Tid,primary,OldConfig#{Key=>Value}),
+ {reply,Reply,State};
+handle_call({change_config,SetOrUpd,HandlerId,Config0}, From,
+ #state{tid=Tid}=State) ->
case logger_config:get(Tid,HandlerId) of
{ok,#{module:=Module}=OldConfig} ->
- Config = maps:merge(OldConfig,NewConfig),
- call_h_async(
- fun() ->
- call_h(Module,changing_config,[OldConfig,Config],
- {ok,Config})
- end,
- fun({ok,Config1}) ->
- logger_config:set(Tid,HandlerId,Config1);
- (Error) ->
- Error
- end,From,State);
- Error ->
- {reply,Error,State}
+ Default =
+ case SetOrUpd of
+ set -> default_config(HandlerId,Module);
+ update -> OldConfig
+ end,
+ Config = maps:merge(Default,Config0),
+ case check_config_change(OldConfig,Config) of
+ ok ->
+ call_h_async(
+ fun() ->
+ call_h(Module,changing_config,
+ [SetOrUpd,OldConfig,Config],
+ {ok,Config})
+ end,
+ fun({ok,Config1}) ->
+ logger_config:set(Tid,HandlerId,Config1);
+ (Error) ->
+ Error
+ end,From,State);
+ Error ->
+ {reply,Error,State}
+ end;
+ _ ->
+ {reply,{error,{not_found,HandlerId}},State}
end;
-handle_call({set_config,primary,Config0}, _From, #state{tid=Tid}=State) ->
- Config = maps:merge(default_config(primary),Config0),
- {ok,#{handlers:=Handlers}} = logger_config:get(Tid,primary),
- Reply = logger_config:set(Tid,primary,Config#{handlers=>Handlers}),
- {reply,Reply,State};
-handle_call({set_config,HandlerId,Config0}, From, #state{tid=Tid}=State) ->
+handle_call({change_config,SetOrUpd,HandlerId,Key,Value}, From,
+ #state{tid=Tid}=State) ->
case logger_config:get(Tid,HandlerId) of
{ok,#{module:=Module}=OldConfig} ->
- Config = maps:merge(default_config(HandlerId,Module),Config0),
- call_h_async(
- fun() ->
- call_h(Module,changing_config,[OldConfig,Config],
- {ok,Config})
- end,
- fun({ok,Config1}) ->
- logger_config:set(Tid,HandlerId,Config1);
- (Error) ->
- Error
- end,From,State);
+ Config = OldConfig#{Key=>Value},
+ case check_config_change(OldConfig,Config) of
+ ok ->
+ call_h_async(
+ fun() ->
+ call_h(Module,changing_config,
+ [SetOrUpd,OldConfig,Config],
+ {ok,Config})
+ end,
+ fun({ok,Config1}) ->
+ logger_config:set(Tid,HandlerId,Config1);
+ (Error) ->
+ Error
+ end,From,State);
+ Error ->
+ {reply,Error,State}
+ end;
_ ->
{reply,{error,{not_found,HandlerId}},State}
end;
@@ -320,7 +363,7 @@ call(Request) ->
true when
Action == add_handler; Action == remove_handler;
Action == add_filter; Action == remove_filter;
- Action == update_config; Action == set_config ->
+ Action == change_config ->
{error,{attempting_syncronous_call_to_self,Request}};
_ ->
gen_server:call(?SERVER,Request,?DEFAULT_LOGGER_CALL_TIMEOUT)
@@ -458,6 +501,15 @@ check_formatter({Mod,Config}) ->
check_formatter(Formatter) ->
throw({invalid_formatter,Formatter}).
+%% When changing configuration for a handler, the id and module fields
+%% can not be changed.
+check_config_change(#{id:=Id,module:=Module},#{id:=Id,module:=Module}) ->
+ ok;
+check_config_change(OldConfig,NewConfig) ->
+ {Old,New} = logger_server:diff_maps(maps:with([id,module],OldConfig),
+ maps:with([id,module],NewConfig)),
+ {error,{illegal_config_change,Old,New}}.
+
call_h(Module, Function, Args, DefRet) ->
%% Not calling code:ensure_loaded + erlang:function_exported here,
%% since in some rare terminal cases, the code_server might not
@@ -466,6 +518,11 @@ call_h(Module, Function, Args, DefRet) ->
catch
C:R:S ->
case {C,R,S} of
+ {error,undef,[{Module,Function=changing_config,Args,_}|_]}
+ when length(Args)=:=3 ->
+ %% Backwards compatible call, if changing_config/3
+ %% did not exist.
+ call_h(Module, Function, tl(Args), DefRet);
{error,undef,[{Module,Function,Args,_}|_]} ->
DefRet;
_ ->
@@ -525,3 +582,14 @@ call_h_reply(Unexpected,State) ->
{process,?SERVER},
{message,Unexpected}]),
{noreply,State}.
+
+%% Return two maps containing only the fields that differ.
+diff_maps(M1,M2) ->
+ diffs(lists:sort(maps:to_list(M1)),lists:sort(maps:to_list(M2)),#{},#{}).
+
+diffs([H|T1],[H|T2],D1,D2) ->
+ diffs(T1,T2,D1,D2);
+diffs([{K,V1}|T1],[{K,V2}|T2],D1,D2) ->
+ diffs(T1,T2,D1#{K=>V1},D2#{K=>V2});
+diffs([],[],D1,D2) ->
+ {D1,D2}.
diff --git a/lib/kernel/src/logger_std_h.erl b/lib/kernel/src/logger_std_h.erl
index 66fa6b6ab6..42e0f5caf4 100644
--- a/lib/kernel/src/logger_std_h.erl
+++ b/lib/kernel/src/logger_std_h.erl
@@ -35,7 +35,8 @@
terminate/2, code_change/3]).
%% logger callbacks
--export([log/2, adding_handler/1, removing_handler/1, changing_config/2]).
+-export([log/2, adding_handler/1, removing_handler/1, changing_config/3,
+ filter_config/1]).
%% handler internal
-export([log_handler_info/4]).
@@ -116,9 +117,8 @@ reset(Name) ->
%%% Handler being added
adding_handler(#{id:=Name}=Config) ->
case check_config(adding, Config) of
- {ok, Config1} ->
+ {ok, #{config:=HConfig}=Config1} ->
%% create initial handler state by merging defaults with config
- HConfig = maps:get(config, Config1, #{}),
HState = maps:merge(get_init_state(), HConfig),
case logger_h_common:overload_levels_ok(HState) of
true ->
@@ -135,22 +135,31 @@ adding_handler(#{id:=Name}=Config) ->
%%%-----------------------------------------------------------------
%%% Updating handler config
-changing_config(OldConfig=#{id:=Name, config:=OldHConfig},
- NewConfig=#{id:=Name}) ->
- #{type:=Type, handler_pid:=HPid, mode_tab:=ModeTab} = OldHConfig,
- NewHConfig = maps:get(config, NewConfig, #{}),
- case maps:get(type, NewHConfig, Type) of
- Type ->
- NewHConfig1 = NewHConfig#{type=>Type,
- handler_pid=>HPid,
- mode_tab=>ModeTab},
- changing_config1(HPid, OldConfig,
- NewConfig#{config=>NewHConfig1});
- _ ->
- {error,{illegal_config_change,OldConfig,NewConfig}}
- end;
-changing_config(OldConfig, NewConfig) ->
- {error,{illegal_config_change,OldConfig,NewConfig}}.
+changing_config(SetOrUpdate,OldConfig=#{config:=OldHConfig},NewConfig) ->
+ WriteOnce = maps:with([type],OldHConfig),
+ ReadOnly = maps:with([handler_pid,mode_tab],OldHConfig),
+ NewHConfig0 = maps:get(config, NewConfig, #{}),
+ Default =
+ case SetOrUpdate of
+ set ->
+ %% Do not reset write-once fields to defaults
+ maps:merge(get_default_config(),WriteOnce);
+ update ->
+ OldHConfig
+ end,
+
+ %% Allow (accidentially) included read-only fields - just overwrite them
+ NewHConfig = maps:merge(maps:merge(Default, NewHConfig0),ReadOnly),
+
+ %% But fail if write-once fields are changed
+ case maps:with([type],NewHConfig) of
+ WriteOnce ->
+ changing_config1(maps:get(handler_pid,OldHConfig),
+ OldConfig,
+ NewConfig#{config=>NewHConfig});
+ Other ->
+ {error,{illegal_config_change,#{config=>WriteOnce},#{config=>Other}}}
+ end.
changing_config1(HPid, OldConfig, NewConfig) ->
case check_config(changing, NewConfig) of
@@ -169,8 +178,7 @@ changing_config1(HPid, OldConfig, NewConfig) ->
check_config(adding, Config) ->
%% Merge in defaults on handler level
HConfig0 = maps:get(config, Config, #{}),
- HConfig = maps:merge(#{type => standard_io},
- HConfig0),
+ HConfig = maps:merge(get_default_config(),HConfig0),
case check_h_config(maps:to_list(HConfig)) of
ok ->
{ok,Config#{config=>HConfig}};
@@ -223,6 +231,11 @@ log(LogEvent, Config = #{id := Name,
Bin = logger_h_common:log_to_binary(LogEvent, Config),
logger_h_common:call_cast_or_drop(Name, HPid, ModeTab, Bin).
+%%%-----------------------------------------------------------------
+%%% Remove internal fields from configuration
+filter_config(#{config:=HConfig}=Config) ->
+ Config#{config=>maps:without([handler_pid,mode_tab],HConfig)}.
+
%%%===================================================================
%%% gen_server callbacks
%%%===================================================================
@@ -428,8 +441,9 @@ code_change(_OldVsn, State, _Extra) ->
%%%-----------------------------------------------------------------
%%%
-get_init_state() ->
- #{sync_mode_qlen => ?SYNC_MODE_QLEN,
+get_default_config() ->
+ #{type => standard_io,
+ sync_mode_qlen => ?SYNC_MODE_QLEN,
drop_mode_qlen => ?DROP_MODE_QLEN,
flush_qlen => ?FLUSH_QLEN,
burst_limit_enable => ?BURST_LIMIT_ENABLE,
@@ -439,10 +453,12 @@ get_init_state() ->
overload_kill_qlen => ?OVERLOAD_KILL_QLEN,
overload_kill_mem_size => ?OVERLOAD_KILL_MEM_SIZE,
overload_kill_restart_after => ?OVERLOAD_KILL_RESTART_AFTER,
- file_ctrl_sync_int => ?CONTROLLER_SYNC_INTERVAL,
- filesync_ok_qlen => ?FILESYNC_OK_QLEN,
filesync_repeat_interval => ?FILESYNC_REPEAT_INTERVAL}.
+get_init_state() ->
+ #{file_ctrl_sync_int => ?CONTROLLER_SYNC_INTERVAL,
+ filesync_ok_qlen => ?FILESYNC_OK_QLEN}.
+
%%%-----------------------------------------------------------------
%%% Add a standard handler to the logger.
%%% This starts a dedicated handler process which should always
@@ -825,4 +841,3 @@ sync_dev(Fd, DevName, PrevSyncResult, HandlerName) ->
logger_h_common:error_notify({HandlerName,filesync,DevName,Error}),
Error
end.
-
diff --git a/lib/kernel/src/net_kernel.erl b/lib/kernel/src/net_kernel.erl
index 3cf11fd7b1..01d809b566 100644
--- a/lib/kernel/src/net_kernel.erl
+++ b/lib/kernel/src/net_kernel.erl
@@ -1432,7 +1432,7 @@ validate_hostname([$@|HostPart] = Host) ->
end.
valid_name_head(Head) ->
- {ok, MP} = re:compile("^[0-9A-Za-z_\\-]*$", [unicode]),
+ {ok, MP} = re:compile("^[0-9A-Za-z_\\-]+$", [unicode]),
case re:run(Head, MP) of
{match, _} ->
true;
diff --git a/lib/kernel/test/code_SUITE.erl b/lib/kernel/test/code_SUITE.erl
index 1314316c13..abb22b5035 100644
--- a/lib/kernel/test/code_SUITE.erl
+++ b/lib/kernel/test/code_SUITE.erl
@@ -525,7 +525,7 @@ upgrade(Config) ->
T = [beam, hipe],
[upgrade_do(DataDir, Client, T) || Client <- T],
- case hipe:llvm_support_available() of
+ case hipe:erllvm_is_supported() of
false -> ok;
true ->
T2 = [beam, hipe_llvm],
diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl
index e784c06865..a51025cba6 100644
--- a/lib/kernel/test/file_SUITE.erl
+++ b/lib/kernel/test/file_SUITE.erl
@@ -100,7 +100,7 @@
-export([unicode_mode/1]).
--export([volume_relative_paths/1]).
+-export([volume_relative_paths/1,unc_paths/1]).
-export([tiny_writes/1, tiny_writes_delayed/1,
large_writes/1, large_writes_delayed/1,
@@ -129,7 +129,7 @@ suite() ->
all() ->
[unicode, altname, read_write_file, {group, dirs},
- {group, files}, delete, rename, names, volume_relative_paths,
+ {group, files}, delete, rename, names, volume_relative_paths, unc_paths,
{group, errors}, {group, compression}, {group, links}, copy,
delayed_write, read_ahead, segment_read, segment_write,
ipread, pid2name, interleaved_read_write, otp_5814, otp_10852,
@@ -2182,6 +2182,30 @@ volume_relative_paths(Config) when is_list(Config) ->
{skip, "This test is Windows-specific."}
end.
+unc_paths(Config) when is_list(Config) ->
+ case os:type() of
+ {win32, _} ->
+ %% We assume administrative shares are set up and reachable, and we
+ %% settle for testing presence as some of the returned data is
+ %% different.
+ {ok, _} = file:read_file_info("C:\\Windows\\explorer.exe"),
+ {ok, _} = file:read_file_info("\\\\localhost\\c$\\Windows\\explorer.exe"),
+
+ {ok, Cwd} = file:get_cwd(),
+
+ try
+ ok = file:set_cwd("\\\\localhost\\c$\\Windows\\"),
+ {ok, _} = file:read_file_info("explorer.exe")
+ after
+ file:set_cwd(Cwd)
+ end,
+
+ [] = flush(),
+ ok;
+ _ ->
+ {skip, "This test is Windows-specific."}
+ end.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -2210,7 +2234,8 @@ e_delete(Config) when is_list(Config) ->
case os:type() of
{win32, _} ->
%% Remove a character device.
- {error, eacces} = ?FILE_MODULE:delete("nul");
+ expect({error, eacces}, {error, einval},
+ ?FILE_MODULE:delete("nul"));
_ ->
?FILE_MODULE:write_file_info(
Base, #file_info {mode=0}),
diff --git a/lib/kernel/test/gen_tcp_misc_SUITE.erl b/lib/kernel/test/gen_tcp_misc_SUITE.erl
index 358ca872f7..04c0c48e3a 100644
--- a/lib/kernel/test/gen_tcp_misc_SUITE.erl
+++ b/lib/kernel/test/gen_tcp_misc_SUITE.erl
@@ -52,7 +52,8 @@
several_accepts_in_one_go/1, accept_system_limit/1,
active_once_closed/1, send_timeout/1, send_timeout_active/1,
otp_7731/1, zombie_sockets/1, otp_7816/1, otp_8102/1,
- wrapping_oct/0, wrapping_oct/1, otp_9389/1, otp_13939/1]).
+ wrapping_oct/0, wrapping_oct/1, otp_9389/1, otp_13939/1,
+ otp_12242/1]).
%% Internal exports.
-export([sender/3, not_owner/1, passive_sockets_server/2, priority_server/1,
@@ -95,7 +96,8 @@ all() ->
killing_multi_acceptors2, several_accepts_in_one_go, accept_system_limit,
active_once_closed, send_timeout, send_timeout_active, otp_7731,
wrapping_oct,
- zombie_sockets, otp_7816, otp_8102, otp_9389].
+ zombie_sockets, otp_7816, otp_8102, otp_9389,
+ otp_12242].
groups() ->
[].
@@ -1981,8 +1983,8 @@ recvtclass(_Config) ->
%% pktoptions is not supported for IPv4
recvtos_ok({unix,openbsd}, OSVer) -> not semver_lt(OSVer, {6,4,0});
recvtos_ok({unix,darwin}, OSVer) -> not semver_lt(OSVer, {17,6,0});
-recvtos_ok({unix,freebsd}, OSVer) -> not semver_lt(OSVer, {11,2,0});
%% Using the option returns einval, so it is not implemented.
+recvtos_ok({unix,freebsd}, OSVer) -> not semver_lt(OSVer, {11,2,0});
recvtos_ok({unix,sunos}, OSVer) -> not semver_lt(OSVer, {5,12,0});
%% Does not return any value - not implemented for pktoptions
recvtos_ok({unix,linux}, OSVer) -> not semver_lt(OSVer, {3,1,0});
@@ -1993,8 +1995,8 @@ recvtos_ok(_, _) -> false.
%% pktoptions is not supported for IPv4
recvttl_ok({unix,openbsd}, OSVer) -> not semver_lt(OSVer, {6,4,0});
recvttl_ok({unix,darwin}, OSVer) -> not semver_lt(OSVer, {17,6,0});
-recvttl_ok({unix,freebsd}, OSVer) -> not semver_lt(OSVer, {11,2,0});
%% Using the option returns einval, so it is not implemented.
+recvttl_ok({unix,freebsd}, OSVer) -> not semver_lt(OSVer, {11,2,0});
recvttl_ok({unix,sunos}, OSVer) -> not semver_lt(OSVer, {5,12,0});
%%
recvttl_ok({unix,linux}, _) -> true;
@@ -3284,3 +3286,143 @@ otp_13939(Config) when is_list(Config) ->
exit(Pid, normal),
ct:fail("Server process blocked on send.")
end.
+
+otp_12242(Config) when is_list(Config) ->
+ case os:type() of
+ {win32,_} ->
+ %% Even if we set sndbuf and recbuf to small sizes
+ %% Windows either happily accepts to send GBytes of data
+ %% in no time, so the second send below that is supposed
+ %% to time out just succedes, or the first send that
+ %% is supposed to fill the inet_drv I/O queue and
+ %% start waiting for when more data can be sent
+ %% instead sends all data but suffers a send
+ %% failure that closes the socket
+ {skipped,backpressure_broken_on_win32};
+ _ ->
+ %% Find the IPv4 address of an up and running interface
+ %% that is not loopback nor pointtopoint
+ {ok,IFList} = inet:getifaddrs(),
+ ct:pal("IFList ~p~n", [IFList]),
+ case
+ lists:flatten(
+ [lists:filtermap(
+ fun ({addr,Addr}) when tuple_size(Addr) =:= 4 ->
+ {true,Addr};
+ (_) ->
+ false
+ end, Opts)
+ || {_,Opts} <- IFList,
+ case lists:keyfind(flags, 1, Opts) of
+ {_,Flags} ->
+ lists:member(up, Flags)
+ andalso
+ lists:member(running, Flags)
+ andalso
+ not lists:member(loopback, Flags)
+ andalso
+ not lists:member(pointtopoint, Flags);
+ false ->
+ false
+ end])
+ of
+ [Addr|_] ->
+ otp_12242(Addr);
+ Other ->
+ {skipped,{no_external_address,Other}}
+ end
+ end;
+%%
+otp_12242(Addr) when tuple_size(Addr) =:= 4 ->
+ ct:timetrap(30000),
+ ct:pal("Using address ~p~n", [Addr]),
+ Bufsize = 16 * 1024,
+ Datasize = 128 * 1024 * 1024, % At least 1 s on GBit interface
+ Blob = binary:copy(<<$x>>, Datasize),
+ LOpts =
+ [{backlog,4},{reuseaddr,true},{ip,Addr},
+ binary,{active,false},
+ {recbuf,Bufsize},{sndbuf,Bufsize},{buffer,Bufsize}],
+ COpts =
+ [binary,{active,false},{ip,Addr},
+ {linger,{true,1}}, % 1 s
+ {send_timeout,500},
+ {recbuf,Bufsize},{sndbuf,Bufsize},{buffer,Bufsize}],
+ Dir = filename:dirname(code:which(?MODULE)),
+ {ok,ListenerNode} =
+ test_server:start_node(
+ ?UNIQ_NODE_NAME, slave, [{args,"-pa " ++ Dir}]),
+ Tester = self(),
+ Listener =
+ spawn(
+ ListenerNode,
+ fun () ->
+ {ok,L} = gen_tcp:listen(0, LOpts),
+ {ok,LPort} = inet:port(L),
+ Tester ! {self(),port,LPort},
+ {ok,A} = gen_tcp:accept(L),
+ ok = gen_tcp:close(L),
+ receive
+ {Tester,stop} ->
+ ok = gen_tcp:close(A)
+ end
+ end),
+ ListenerMref = monitor(process, Listener),
+ LPort = receive {Listener,port,P} -> P end,
+ {ok,C} = gen_tcp:connect(Addr, LPort, COpts, infinity),
+ {ok,ReadCOpts} = inet:getopts(C, [recbuf,sndbuf,buffer]),
+ ct:pal("ReadCOpts ~p~n", [ReadCOpts]),
+ %%
+ %% Fill the buffers
+ ct:pal("Sending ~p bytes~n", [Datasize]),
+ ok = gen_tcp:send(C, Blob),
+ ct:pal("Sent ~p bytes~n", [Datasize]),
+ %% Spawn the Closer,
+ %% try to ensure that the close call is in progress
+ %% before the owner proceeds with sending
+ Owner = self(),
+ {_Closer,CloserMref} =
+ spawn_opt(
+ fun () ->
+ Owner ! {tref, erlang:start_timer(50, Owner, closing)},
+ ct:pal("Calling gen_tcp:close(C)~n"),
+ try gen_tcp:close(C) of
+ Result ->
+ ct:pal("gen_tcp:close(C) -> ~p~n", [Result]),
+ ok = Result
+ catch
+ Class:Reason:Stacktrace ->
+ ct:pal(
+ "gen_tcp:close(C) >< ~p:~p~n ~p~n",
+ [Class,Reason,Stacktrace]),
+ erlang:raise(Class, Reason, Stacktrace)
+ end
+ end, [link,monitor]),
+ receive
+ {tref,Tref} ->
+ receive {timeout,Tref,_} -> ok end,
+ ct:pal("Sending ~p bytes again~n", [Datasize]),
+ %% Now should the close be in progress...
+ %% All buffers are full, remote end is not reading,
+ %% and the send timeout is 1 s so this will timeout:
+ {error,timeout} = gen_tcp:send(C, Blob),
+ ct:pal("Sending ~p bytes again timed out~n", [Datasize]),
+ ok = inet:setopts(C, [{send_timeout,10000}]),
+ %% There is a hidden timeout here. Port close is sampled
+ %% every 5 s by prim_inet:send_recv_reply.
+ %% Linger is 3 s so the Closer will finish this send:
+ ct:pal("Sending ~p bytes with 10 s timeout~n", [Datasize]),
+ {error,closed} = gen_tcp:send(C, Blob),
+ ct:pal("Sending ~p bytes with 10 s timeout was closed~n",
+ [Datasize]),
+ normal = wait(CloserMref),
+ ct:pal("The Closer has exited~n"),
+ Listener ! {Tester,stop},
+ receive {'DOWN',ListenerMref,_,_,_} -> ok end,
+ ct:pal("The Listener has exited~n"),
+ test_server:stop_node(ListenerNode),
+ ok
+ end.
+
+wait(Mref) ->
+ receive {'DOWN',Mref,_,_,Reason} -> Reason end.
diff --git a/lib/kernel/test/inet_SUITE.erl b/lib/kernel/test/inet_SUITE.erl
index 713de8c9a8..8b33f4a679 100644
--- a/lib/kernel/test/inet_SUITE.erl
+++ b/lib/kernel/test/inet_SUITE.erl
@@ -1060,28 +1060,26 @@ getservbyname_overflow(Config) when is_list(Config) ->
getifaddrs(Config) when is_list (Config) ->
{ok,IfAddrs} = inet:getifaddrs(),
io:format("IfAddrs = ~p.~n", [IfAddrs]),
- case
- {os:type(),
- [If ||
- {If,Opts} <- IfAddrs,
- lists:keymember(hwaddr, 1, Opts)]} of
- {{unix,sunos},[]} -> ok;
- {OT,[]} ->
- ct:fail({should_have_hwaddr,OT});
- _ -> ok
+ case [If || {If,Opts} <- IfAddrs, lists:keymember(hwaddr, 1, Opts)] of
+ [] ->
+ case os:type() of
+ {unix,sunos} -> ok;
+ OT ->
+ ct:fail({should_have_hwaddr,OT})
+ end;
+ [_|_] -> ok
end,
- Addrs =
- [element(1, A) || A <- ifaddrs(IfAddrs)],
+ Addrs = ifaddrs(IfAddrs),
io:format("Addrs = ~p.~n", [Addrs]),
[check_addr(Addr) || Addr <- Addrs],
ok.
-check_addr({addr,Addr})
+check_addr(Addr)
when tuple_size(Addr) =:= 8,
element(1, Addr) band 16#FFC0 =:= 16#FE80 ->
io:format("Addr: ~p link local; SKIPPED!~n", [Addr]),
ok;
-check_addr({addr,Addr}) ->
+check_addr(Addr) ->
io:format("Addr: ~p.~n", [Addr]),
Ping = "ping",
Pong = "pong",
@@ -1097,78 +1095,86 @@ check_addr({addr,Addr}) ->
ok = gen_tcp:close(S2),
ok = gen_tcp:close(L).
--record(ifopts, {name,flags,addrs=[],hwaddr}).
-
-ifaddrs([]) -> [];
-ifaddrs([{If,Opts}|IOs]) ->
- #ifopts{flags=F} = Ifopts = check_ifopts(Opts, #ifopts{name=If}),
- case F of
- {flags,Flags} ->
- case lists:member(running, Flags) of
- true -> Ifopts#ifopts.addrs;
- false -> []
- end ++ ifaddrs(IOs);
- undefined ->
- ifaddrs(IOs)
+ifaddrs(IfOpts) ->
+ IfMap = collect_ifopts(IfOpts),
+ ChkFun =
+ fun Self({{_,Flags} = Key, Opts}, ok) ->
+ Broadcast = lists:member(broadcast, Flags),
+ P2P = lists:member(pointtopoint, Flags),
+ case Opts of
+ [{addr,_},{netmask,_},{broadaddr,_}|Os]
+ when Broadcast ->
+ Self({Key, Os}, ok);
+ [{addr,_},{netmask,_},{dstaddr,_}|Os]
+ when P2P ->
+ Self({Key, Os}, ok);
+ [{addr,_},{netmask,_}|Os] ->
+ Self({Key, Os}, ok);
+ [{hwaddr,_}|Os] ->
+ Self({Key, Os}, ok);
+ [] ->
+ ok
+ end
+ end,
+ fold_ifopts(ChkFun, ok, IfMap),
+ AddrsFun =
+ fun ({{_,Flags}, Opts}, Acc) ->
+ case
+ lists:member(running, Flags)
+ andalso (not lists:member(pointtopoint, Flags))
+ of
+ true ->
+ lists:reverse(
+ [Addr || {addr,Addr} <- Opts],
+ Acc);
+ false ->
+ Acc
+ end
+ end,
+ fold_ifopts(AddrsFun, [], IfMap).
+
+collect_ifopts(IfOpts) ->
+ collect_ifopts(IfOpts, #{}).
+%%
+collect_ifopts(IfOpts, IfMap) ->
+ case IfOpts of
+ [{If,[{flags,Flags}|Opts]}|IfOs] ->
+ Key = {If,Flags},
+ case maps:is_key(Key, IfMap) of
+ true ->
+ ct:fail({unexpected_ifopts,IfOpts,IfMap});
+ false ->
+ collect_ifopts(IfOs, IfMap, Opts, Key, [])
+ end;
+ [] ->
+ IfMap;
+ _ ->
+ ct:fail({unexpected_ifopts,IfOpts,IfMap})
+ end.
+%%
+collect_ifopts(IfOpts, IfMap, Opts, Key, R) ->
+ case Opts of
+ [{flags,_}|_] ->
+ {If,_} = Key,
+ collect_ifopts(
+ [{If,Opts}|IfOpts], maps:put(Key, lists:reverse(R), IfMap));
+ [OptVal|Os] ->
+ collect_ifopts(IfOpts, IfMap, Os, Key, [OptVal|R]);
+ [] ->
+ collect_ifopts(IfOpts, maps:put(Key, lists:reverse(R), IfMap))
end.
-check_ifopts([], #ifopts{flags=F,addrs=Raddrs}=Ifopts) ->
- Addrs = lists:reverse(Raddrs),
- R = Ifopts#ifopts{addrs=Addrs},
- io:format("~p.~n", [R]),
- %% See how we did...
- {flags,Flags} = F,
- case lists:member(broadcast, Flags) of
- true ->
- [case A of
- {{addr,_},{netmask,_},{broadaddr,_}} ->
- A;
- {{addr,T},{netmask,_}} when tuple_size(T) =:= 8 ->
- A
- end || A <- Addrs];
- false ->
- case lists:member(pointtopoint, Flags) of
- true ->
- [case A of
- {{addr,_},{netmask,_},{dstaddr,_}} ->
- A
- end || A <- Addrs];
- false ->
- [case A of
- {{addr,_},{netmask,_}} ->
- A
- end || A <- Addrs]
- end
- end,
- R;
-check_ifopts([{flags,_}=F|Opts], #ifopts{flags=undefined}=Ifopts) ->
- check_ifopts(Opts, Ifopts#ifopts{flags=F});
-check_ifopts([{flags,_}=F|Opts], #ifopts{flags=Flags}=Ifopts) ->
- case F of
- Flags ->
- check_ifopts(Opts, Ifopts);
- _ ->
- ct:fail({multiple_flags,F,Ifopts})
- end;
-check_ifopts(
- [{addr,_}=A,{netmask,_}=N,{dstaddr,_}=D|Opts],
- #ifopts{addrs=Addrs}=Ifopts) ->
- check_ifopts(Opts, Ifopts#ifopts{addrs=[{A,N,D}|Addrs]});
-check_ifopts(
- [{addr,_}=A,{netmask,_}=N,{broadaddr,_}=B|Opts],
- #ifopts{addrs=Addrs}=Ifopts) ->
- check_ifopts(Opts, Ifopts#ifopts{addrs=[{A,N,B}|Addrs]});
-check_ifopts(
- [{addr,_}=A,{netmask,_}=N|Opts],
- #ifopts{addrs=Addrs}=Ifopts) ->
- check_ifopts(Opts, Ifopts#ifopts{addrs=[{A,N}|Addrs]});
-check_ifopts([{addr,_}=A|Opts], #ifopts{addrs=Addrs}=Ifopts) ->
- check_ifopts(Opts, Ifopts#ifopts{addrs=[{A}|Addrs]});
-check_ifopts([{hwaddr,Hwaddr}=H|Opts], #ifopts{hwaddr=undefined}=Ifopts)
- when is_list(Hwaddr) ->
- check_ifopts(Opts, Ifopts#ifopts{hwaddr=H});
-check_ifopts([{hwaddr,_}=H|_], #ifopts{}=Ifopts) ->
- ct:fail({multiple_hwaddrs,H,Ifopts}).
+fold_ifopts(Fun, Acc, IfMap) ->
+ fold_ifopts(Fun, Acc, IfMap, maps:keys(IfMap)).
+%%
+fold_ifopts(Fun, Acc, IfMap, Keys) ->
+ case Keys of
+ [Key|Ks] ->
+ Opts = maps:get(Key, IfMap),
+ fold_ifopts(Fun, Fun({Key,Opts}, Acc), IfMap, Ks);
+ [] ->
+ Acc
+ end.
%% Works just like lists:member/2, except that any {127,_,_,_} tuple
%% matches any other {127,_,_,_}. We do this to handle Linux systems
diff --git a/lib/kernel/test/inet_sockopt_SUITE.erl b/lib/kernel/test/inet_sockopt_SUITE.erl
index ada9c2689c..27ff74e309 100644
--- a/lib/kernel/test/inet_sockopt_SUITE.erl
+++ b/lib/kernel/test/inet_sockopt_SUITE.erl
@@ -110,9 +110,14 @@ simple(Config) when is_list(Config) ->
{S1,S2} = create_socketpair(Opt, Opt),
{ok,Opt} = inet:getopts(S1,OptTags),
{ok,Opt} = inet:getopts(S2,OptTags),
- COpt = [{X,case X of nodelay -> false;_ -> Y end} || {X,Y} <- Opt],
+ NoPushOpt = case os:type() of
+ {unix, Osname} when Osname =:= linux; Osname =:= freebsd -> {nopush, true};
+ {_,_} -> {nopush, false}
+ end,
+ COpt = [{X,case X of nodelay -> false;_ -> Y end} || {X,Y} <- [NoPushOpt|Opt]],
+ COptTags = [X || {X,_} <- COpt],
inet:setopts(S1,COpt),
- {ok,COpt} = inet:getopts(S1,OptTags),
+ {ok,COpt} = inet:getopts(S1,COptTags),
{ok,Opt} = inet:getopts(S2,OptTags),
gen_tcp:close(S1),
gen_tcp:close(S2),
diff --git a/lib/kernel/test/logger_SUITE.erl b/lib/kernel/test/logger_SUITE.erl
index b7ccba8e70..d831d0d108 100644
--- a/lib/kernel/test/logger_SUITE.erl
+++ b/lib/kernel/test/logger_SUITE.erl
@@ -246,6 +246,18 @@ change_config(_Config) ->
{ok,C4} = logger:get_handler_config(h1),
C4 = C3#{custom:=new_custom},
+ %% Change handler config: Id and module can not be changed
+ {error,{illegal_config_change,Old,New}} =
+ logger:set_handler_config(h1,id,newid),
+ %% Check that only the faulty field is included in return
+ [{id,h1}] = maps:to_list(Old),
+ [{id,newid}] = maps:to_list(New),
+ %% Check that both fields are included when both are changed
+ {error,{illegal_config_change,
+ #{id:=h1,module:=?MODULE},
+ #{id:=newid,module:=newmodule}}} =
+ logger:set_handler_config(h1,#{id=>newid,module=>newmodule}),
+
%% Change primary config: Single key
PConfig0 = logger:get_primary_config(),
ok = logger:set_primary_config(level,warning),
diff --git a/lib/kernel/test/logger_disk_log_h_SUITE.erl b/lib/kernel/test/logger_disk_log_h_SUITE.erl
index a815db14e9..905c2c52c5 100644
--- a/lib/kernel/test/logger_disk_log_h_SUITE.erl
+++ b/lib/kernel/test/logger_disk_log_h_SUITE.erl
@@ -92,6 +92,7 @@ all() ->
disk_log_opts,
default_formatter,
logging,
+ filter_config,
errors,
formatter_fail,
config_fail,
@@ -302,6 +303,20 @@ logging(cleanup, _Config) ->
Name = list_to_atom(lists:concat([?FUNCTION_NAME,"_1"])),
remove_and_stop(Name).
+filter_config(_Config) ->
+ ok = logger:add_handler(?MODULE,logger_disk_log_h,#{}),
+ {ok,#{config:=HConfig}=Config} = logger:get_handler_config(?MODULE),
+ HConfig = maps:without([handler_pid,mode_tab],HConfig),
+
+ FakeFullHConfig = HConfig#{handler_pid=>self(),mode_tab=>erlang:make_ref()},
+ #{config:=HConfig} =
+ logger_disk_log_h:filter_config(Config#{config=>FakeFullHConfig}),
+ ok.
+
+filter_config(cleanup,_Config) ->
+ logger:remove_handler(?MODULE),
+ ok.
+
errors(Config) ->
PrivDir = ?config(priv_dir,Config),
Name1 = list_to_atom(lists:concat([?FUNCTION_NAME,"_1"])),
@@ -316,13 +331,29 @@ errors(Config) ->
%%! TODO:
%%! Check how bad log_opts are handled!
- {error,{illegal_config_change,_,_}} =
- logger:set_handler_config(Name1,
- config,
- #{file=>LogFile1,
- type=>halt}),
- {error,{illegal_config_change,_,_}} =
- logger:set_handler_config(Name1,id,new),
+ {error,{illegal_config_change,
+ #{config:=#{type:=wrap}},
+ #{config:=#{type:=halt}}}} =
+ logger:update_handler_config(Name1,
+ config,
+ #{type=>halt,
+ file=>LogFile1}),
+
+ {error,{illegal_config_change,
+ #{config:=#{file:=LogFile1}},
+ #{config:=#{file:="newfilename"}}}} =
+ logger:update_handler_config(Name1,
+ config,
+ #{file=>"newfilename"}),
+
+ %% Read-only fields may (accidentially) be included in the change,
+ %% but it won't take effect
+ {ok,C} = logger:get_handler_config(Name1),
+ ok = logger:set_handler_config(Name1,config,
+ #{handler_pid=>self(),
+ mode_tab=>erlang:make_ref()}),
+ {ok,C} = logger:get_handler_config(Name1),
+
ok = logger:remove_handler(Name1),
{error,{not_found,Name1}} = logger:remove_handler(Name1),
@@ -403,21 +434,21 @@ config_fail(_Config) ->
formatter=>{?MODULE,self()}}),
%% can't change the disk log options for a log already in use
{error,{illegal_config_change,_,_}} =
- logger:set_handler_config(?MODULE,config,
- #{max_no_files=>2}),
+ logger:update_handler_config(?MODULE,config,
+ #{max_no_files=>2}),
%% can't change name of an existing handler
{error,{illegal_config_change,_,_}} =
- logger:set_handler_config(?MODULE,id,bad),
+ logger:update_handler_config(?MODULE,id,bad),
%% incorrect values of OP params
{ok,#{config := HConfig}} = logger:get_handler_config(?MODULE),
{error,{invalid_levels,_}} =
- logger:set_handler_config(?MODULE,config,
- HConfig#{sync_mode_qlen=>100,
- flush_qlen=>99}),
+ logger:update_handler_config(?MODULE,config,
+ HConfig#{sync_mode_qlen=>100,
+ flush_qlen=>99}),
%% invalid name of config parameter
{error,{invalid_config,logger_disk_log_h,{filesync_rep_int,2000}}} =
- logger:set_handler_config(?MODULE, config,
- HConfig#{filesync_rep_int => 2000}),
+ logger:update_handler_config(?MODULE, config,
+ HConfig#{filesync_rep_int => 2000}),
ok.
config_fail(cleanup,_Config) ->
logger:remove_handler(?MODULE).
@@ -459,10 +490,26 @@ reconfig(Config) ->
log_opts := #{type := ?DISK_LOG_TYPE,
max_no_files := ?DISK_LOG_MAX_NO_FILES,
max_no_bytes := ?DISK_LOG_MAX_NO_BYTES,
- file := _DiskLogFile}} =
+ file := DiskLogFile}} =
logger_disk_log_h:info(?MODULE),
+ {ok,#{config :=
+ #{sync_mode_qlen := ?SYNC_MODE_QLEN,
+ drop_mode_qlen := ?DROP_MODE_QLEN,
+ flush_qlen := ?FLUSH_QLEN,
+ burst_limit_enable := ?BURST_LIMIT_ENABLE,
+ burst_limit_max_count := ?BURST_LIMIT_MAX_COUNT,
+ burst_limit_window_time := ?BURST_LIMIT_WINDOW_TIME,
+ overload_kill_enable := ?OVERLOAD_KILL_ENABLE,
+ overload_kill_qlen := ?OVERLOAD_KILL_QLEN,
+ overload_kill_mem_size := ?OVERLOAD_KILL_MEM_SIZE,
+ overload_kill_restart_after := ?OVERLOAD_KILL_RESTART_AFTER,
+ filesync_repeat_interval := ?FILESYNC_REPEAT_INTERVAL,
+ file := DiskLogFile,
+ max_no_files := ?DISK_LOG_MAX_NO_FILES,
+ max_no_bytes := ?DISK_LOG_MAX_NO_BYTES,
+ type := wrap} = HConfig0}} =
+ logger:get_handler_config(?MODULE),
- {ok,#{config := HConfig0}} = logger:get_handler_config(?MODULE),
HConfig1 = HConfig0#{sync_mode_qlen => 1,
drop_mode_qlen => 2,
flush_qlen => 3,
@@ -488,6 +535,29 @@ reconfig(Config) ->
overload_kill_restart_after := infinity,
filesync_repeat_interval := no_repeat} =
logger_disk_log_h:info(?MODULE),
+ {ok,#{config:=HConfig1}} = logger:get_handler_config(?MODULE),
+
+ ok = logger:update_handler_config(?MODULE, config,
+ #{flush_qlen => ?FLUSH_QLEN}),
+ {ok,#{config:=C1}} = logger:get_handler_config(?MODULE),
+ ct:log("C1: ~p",[C1]),
+ C1 = HConfig1#{flush_qlen => ?FLUSH_QLEN},
+
+ ok = logger:set_handler_config(?MODULE, config, #{sync_mode_qlen => 1}),
+ {ok,#{config:=C2}} = logger:get_handler_config(?MODULE),
+ ct:log("C2: ~p",[C2]),
+ C2 = HConfig0#{sync_mode_qlen => 1},
+
+ ok = logger:set_handler_config(?MODULE, config, #{drop_mode_qlen => 100}),
+ {ok,#{config:=C3}} = logger:get_handler_config(?MODULE),
+ ct:log("C3: ~p",[C3]),
+ C3 = HConfig0#{drop_mode_qlen => 100},
+
+ ok = logger:update_handler_config(?MODULE, config, #{sync_mode_qlen => 1}),
+ {ok,#{config:=C4}} = logger:get_handler_config(?MODULE),
+ ct:log("C4: ~p",[C4]),
+ C4 = HConfig0#{sync_mode_qlen => 1,
+ drop_mode_qlen => 100},
ok = logger:remove_handler(?MODULE),
@@ -507,6 +577,43 @@ reconfig(Config) ->
max_no_bytes := 1024,
file := File}} =
logger_disk_log_h:info(?MODULE),
+ {ok,#{config :=
+ #{type := halt,
+ max_no_files := 1,
+ max_no_bytes := 1024,
+ file := File}=HaltHConfig} = Config2} =
+ logger:get_handler_config(?MODULE),
+
+ ok = logger:update_handler_config(?MODULE, level, notice),
+ {ok,C5} = logger:get_handler_config(?MODULE),
+ ct:log("C5: ~p",[C5]),
+ C5 = Config2#{level => notice},
+
+ ok = logger:set_handler_config(?MODULE, level, info),
+ {ok,C6} = logger:get_handler_config(?MODULE),
+ ct:log("C6: ~p",[C6]),
+ C6 = Config2#{level => info},
+
+ %% You are not allowed to actively set the write once fields
+ %% (type, max_no_files, max_no_bytes, file) in runtime.
+ {error, {illegal_config_change,_,_}} =
+ logger:set_handler_config(?MODULE,config,#{type=>wrap}),
+ {error, {illegal_config_change,_,_}} =
+ logger:set_handler_config(?MODULE,config,#{max_no_files=>2}),
+ {error, {illegal_config_change,_,_}} =
+ logger:set_handler_config(?MODULE,config,#{max_no_bytes=>2048}),
+ {error, {illegal_config_change,_,_}} =
+ logger:set_handler_config(?MODULE,config,#{file=>"otherfile.log"}),
+ {ok,C7} = logger:get_handler_config(?MODULE),
+ ct:log("C7: ~p",[C7]),
+ C7 = C6,
+
+ %% ... but if you don't specify the write once fields, then
+ %% set_handler_config shall NOT reset them to their default value
+ ok = logger:set_handler_config(?MODULE,config,#{sync_mode_qlen=>1}),
+ {ok,#{config:=C8}} = logger:get_handler_config(?MODULE),
+ ct:log("C8: ~p",[C8]),
+ C8 = HaltHConfig#{sync_mode_qlen=>1},
ok.
reconfig(cleanup, _Config) ->
@@ -536,7 +643,7 @@ sync(Config) ->
%% a disk_log_sync is still performed when handler goes idle
{ok,#{config := HConfig}} = logger:get_handler_config(?MODULE),
HConfig1 = HConfig#{filesync_repeat_interval => no_repeat},
- ok = logger:set_handler_config(?MODULE, config, HConfig1),
+ ok = logger:update_handler_config(?MODULE, config, HConfig1),
no_repeat = maps:get(filesync_repeat_interval,
logger_disk_log_h:info(?MODULE)),
@@ -569,13 +676,13 @@ sync(Config) ->
[OneSync || _ <- lists:seq(1, 1 + trunc(WaitT/SyncInt))]),
HConfig2 = HConfig#{filesync_repeat_interval => SyncInt},
- ok = logger:set_handler_config(?MODULE, config, HConfig2),
+ ok = logger:update_handler_config(?MODULE, config, HConfig2),
SyncInt = maps:get(filesync_repeat_interval,
logger_disk_log_h:info(?MODULE)),
timer:sleep(WaitT),
HConfig3 = HConfig#{filesync_repeat_interval => no_repeat},
- ok = logger:set_handler_config(?MODULE, config, HConfig3),
+ ok = logger:update_handler_config(?MODULE, config, HConfig3),
check_tracer(100),
ok.
sync(cleanup,_Config) ->
@@ -797,7 +904,7 @@ sync_failure(Config) ->
LogOpts = maps:get(log_opts, HState),
SyncInt = 500,
- ok = rpc:call(Node, logger, set_handler_config,
+ ok = rpc:call(Node, logger, update_handler_config,
[?STANDARD_HANDLER, config,
#{filesync_repeat_interval => SyncInt}]),
Info = rpc:call(Node, logger_disk_log_h, info, [?STANDARD_HANDLER]),
@@ -872,7 +979,7 @@ op_switch_to_sync(Config) ->
drop_mode_qlen => NumOfReqs+1,
flush_qlen => 2*NumOfReqs,
burst_limit_enable => false}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
send_burst({n,NumOfReqs}, seq, {chars,79}, notice),
Lines = count_lines(Log),
NumOfReqs = Lines,
@@ -897,7 +1004,7 @@ op_switch_to_drop(Config) ->
drop_mode_qlen => 2,
flush_qlen => Procs*NumOfReqs*Bursts,
burst_limit_enable => false}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
%% It sometimes happens that the handler either gets
%% the requests in a slow enough pace so that dropping
%% never occurs. Therefore, lets generate a number of
@@ -943,7 +1050,7 @@ op_switch_to_flush(Config) ->
drop_mode_qlen => 300,
flush_qlen => 300,
burst_limit_enable => false}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
NumOfReqs = 1500,
Procs = 10,
Bursts = 10,
@@ -985,7 +1092,7 @@ limit_burst_disabled(Config) ->
burst_limit_window_time => 2000,
drop_mode_qlen => 200,
flush_qlen => 300}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
NumOfReqs = 100,
send_burst({n,NumOfReqs}, seq, {chars,79}, notice),
Logged = count_lines(Log),
@@ -1005,7 +1112,7 @@ limit_burst_enabled_one(Config) ->
burst_limit_window_time => 2000,
drop_mode_qlen => 200,
flush_qlen => 300}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
NumOfReqs = 100,
send_burst({n,NumOfReqs}, seq, {chars,79}, notice),
Logged = count_lines(Log),
@@ -1026,7 +1133,7 @@ limit_burst_enabled_period(Config) ->
burst_limit_window_time => BurstTWin,
drop_mode_qlen => 20000,
flush_qlen => 20001}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
Windows = 3,
Sent = send_burst({t,BurstTWin*Windows}, seq, {chars,79}, notice),
@@ -1046,7 +1153,7 @@ kill_disabled(Config) ->
HConfig#{config=>DLHConfig#{overload_kill_enable=>false,
overload_kill_qlen=>10,
overload_kill_mem_size=>100}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
NumOfReqs = 100,
send_burst({n,NumOfReqs}, seq, {chars,79}, notice),
Logged = count_lines(Log),
@@ -1068,7 +1175,7 @@ qlen_kill_new(Config) ->
overload_kill_qlen=>10,
overload_kill_mem_size=>Mem0+50000,
overload_kill_restart_after=>RestartAfter}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
MRef = erlang:monitor(process, Pid0),
NumOfReqs = 100,
Procs = 4,
@@ -1105,7 +1212,7 @@ mem_kill_new(Config) ->
overload_kill_qlen=>50000,
overload_kill_mem_size=>Mem0+500,
overload_kill_restart_after=>RestartAfter}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
MRef = erlang:monitor(process, Pid0),
NumOfReqs = 100,
Procs = 4,
@@ -1139,7 +1246,7 @@ restart_after(Config) ->
HConfig#{config=>DLHConfig#{overload_kill_enable=>true,
overload_kill_qlen=>10,
overload_kill_restart_after=>infinity}},
- ok = logger:set_handler_config(?MODULE, NewHConfig1),
+ ok = logger:update_handler_config(?MODULE, NewHConfig1),
MRef1 = erlang:monitor(process, whereis(h_proc_name())),
%% kill handler
send_burst({n,100}, {spawn,4,0}, {chars,79}, notice),
@@ -1161,7 +1268,7 @@ restart_after(Config) ->
HConfig#{config=>DLHConfig#{overload_kill_enable=>true,
overload_kill_qlen=>10,
overload_kill_restart_after=>RestartAfter}},
- ok = logger:set_handler_config(?MODULE, NewHConfig2),
+ ok = logger:update_handler_config(?MODULE, NewHConfig2),
Pid0 = whereis(h_proc_name()),
MRef2 = erlang:monitor(process, Pid0),
%% kill handler
@@ -1194,7 +1301,7 @@ handler_requests_under_load(Config) ->
drop_mode_qlen => 1000,
flush_qlen => 2000,
burst_limit_enable => false}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
Pid = spawn_link(fun() -> send_requests(?MODULE, 1, [{filesync,[]},
{info,[]},
{reset,[]},
@@ -1227,9 +1334,9 @@ send_requests(HName, TO, Reqs = [{Req,Res}|Rs]) ->
Result =
case Req of
change_config ->
- logger:set_handler_config(HName, logger_disk_log_h,
- #{overload_kill_enable =>
- false});
+ logger:update_handler_config(HName, logger_disk_log_h,
+ #{overload_kill_enable =>
+ false});
Func ->
logger_disk_log_h:Func(HName)
end,
diff --git a/lib/kernel/test/logger_std_h_SUITE.erl b/lib/kernel/test/logger_std_h_SUITE.erl
index 3426567bbf..b6a09f4980 100644
--- a/lib/kernel/test/logger_std_h_SUITE.erl
+++ b/lib/kernel/test/logger_std_h_SUITE.erl
@@ -108,6 +108,7 @@ all() ->
add_remove_instance_file1,
add_remove_instance_file2,
default_formatter,
+ filter_config,
errors,
formatter_fail,
config_fail,
@@ -204,6 +205,20 @@ default_formatter(_Config) ->
match = re:run(Msg,"=NOTICE REPORT====.*\n"++M1,[{capture,none}]),
ok.
+filter_config(_Config) ->
+ ok = logger:add_handler(?MODULE,logger_std_h,#{}),
+ {ok,#{config:=HConfig}=Config} = logger:get_handler_config(?MODULE),
+ HConfig = maps:without([handler_pid,mode_tab],HConfig),
+
+ FakeFullHConfig = HConfig#{handler_pid=>self(),mode_tab=>erlang:make_ref()},
+ #{config:=HConfig} =
+ logger_std_h:filter_config(Config#{config=>FakeFullHConfig}),
+ ok.
+
+filter_config(cleanup,_Config) ->
+ logger:remove_handler(?MODULE),
+ ok.
+
errors(Config) ->
Dir = ?config(priv_dir,Config),
Log = filename:join(Dir,?FUNCTION_NAME),
@@ -319,11 +334,10 @@ config_fail(_Config) ->
ok = logger:add_handler(?MODULE,logger_std_h,
#{filter_default=>log,
formatter=>{?MODULE,self()}}),
- {error,{illegal_config_change,_,_}} =
+ {error,{illegal_config_change,#{config:=#{type:=_}},#{config:=#{type:=_}}}} =
logger:set_handler_config(?MODULE,config,
#{type=>{file,"file"}}),
- {error,{illegal_config_change,_,_}} =
- logger:set_handler_config(?MODULE,id,bad),
+
{error,{invalid_levels,_}} =
logger:set_handler_config(?MODULE,config,
#{sync_mode_qlen=>100,
@@ -331,6 +345,15 @@ config_fail(_Config) ->
{error,{invalid_config,logger_std_h,{filesync_rep_int,2000}}} =
logger:set_handler_config(?MODULE, config,
#{filesync_rep_int => 2000}),
+
+ %% Read-only fields may (accidentially) be included in the change,
+ %% but it won't take effect
+ {ok,C} = logger:get_handler_config(?MODULE),
+ ok = logger:set_handler_config(?MODULE,config,
+ #{handler_pid=>self(),
+ mode_tab=>erlang:make_ref()}),
+ {ok,C} = logger:get_handler_config(?MODULE),
+
ok.
config_fail(cleanup,_Config) ->
@@ -457,9 +480,26 @@ reconfig(Config) ->
overload_kill_qlen := ?OVERLOAD_KILL_QLEN,
overload_kill_mem_size := ?OVERLOAD_KILL_MEM_SIZE,
overload_kill_restart_after := ?OVERLOAD_KILL_RESTART_AFTER,
- filesync_repeat_interval := ?FILESYNC_REPEAT_INTERVAL} =
+ filesync_repeat_interval := ?FILESYNC_REPEAT_INTERVAL} = DefaultInfo =
logger_std_h:info(?MODULE),
+ {ok,
+ #{config:=
+ #{type := standard_io,
+ sync_mode_qlen := ?SYNC_MODE_QLEN,
+ drop_mode_qlen := ?DROP_MODE_QLEN,
+ flush_qlen := ?FLUSH_QLEN,
+ burst_limit_enable := ?BURST_LIMIT_ENABLE,
+ burst_limit_max_count := ?BURST_LIMIT_MAX_COUNT,
+ burst_limit_window_time := ?BURST_LIMIT_WINDOW_TIME,
+ overload_kill_enable := ?OVERLOAD_KILL_ENABLE,
+ overload_kill_qlen := ?OVERLOAD_KILL_QLEN,
+ overload_kill_mem_size := ?OVERLOAD_KILL_MEM_SIZE,
+ overload_kill_restart_after := ?OVERLOAD_KILL_RESTART_AFTER,
+ filesync_repeat_interval := ?FILESYNC_REPEAT_INTERVAL} =
+ DefaultHConf}}
+ = logger:get_handler_config(?MODULE),
+
ok = logger:set_handler_config(?MODULE, config,
#{sync_mode_qlen => 1,
drop_mode_qlen => 2,
@@ -485,7 +525,77 @@ reconfig(Config) ->
overload_kill_qlen := 100000,
overload_kill_mem_size := 10000000,
overload_kill_restart_after := infinity,
- filesync_repeat_interval := no_repeat} = logger_std_h:info(?MODULE),
+ filesync_repeat_interval := no_repeat} = Info = logger_std_h:info(?MODULE),
+
+ {ok,#{config :=
+ #{type := standard_io,
+ sync_mode_qlen := 1,
+ drop_mode_qlen := 2,
+ flush_qlen := 3,
+ burst_limit_enable := false,
+ burst_limit_max_count := 10,
+ burst_limit_window_time := 10,
+ overload_kill_enable := true,
+ overload_kill_qlen := 100000,
+ overload_kill_mem_size := 10000000,
+ overload_kill_restart_after := infinity,
+ filesync_repeat_interval := no_repeat} = HConf}} =
+ logger:get_handler_config(?MODULE),
+
+ ok = logger:update_handler_config(?MODULE, config,
+ #{flush_qlen => ?FLUSH_QLEN}),
+ {ok,#{config:=C1}} = logger:get_handler_config(?MODULE),
+ ct:log("C1: ~p",[C1]),
+ C1 = HConf#{flush_qlen => ?FLUSH_QLEN},
+
+ ok = logger:set_handler_config(?MODULE, config, #{sync_mode_qlen => 1}),
+ {ok,#{config:=C2}} = logger:get_handler_config(?MODULE),
+ ct:log("C2: ~p",[C2]),
+ C2 = DefaultHConf#{sync_mode_qlen => 1},
+
+ ok = logger:set_handler_config(?MODULE, config, #{drop_mode_qlen => 100}),
+ {ok,#{config:=C3}} = logger:get_handler_config(?MODULE),
+ ct:log("C3: ~p",[C3]),
+ C3 = DefaultHConf#{drop_mode_qlen => 100},
+
+ ok = logger:update_handler_config(?MODULE, config, #{sync_mode_qlen => 1}),
+ {ok,#{config:=C4}} = logger:get_handler_config(?MODULE),
+ ct:log("C4: ~p",[C4]),
+ C4 = DefaultHConf#{sync_mode_qlen => 1,
+ drop_mode_qlen => 100},
+
+ ok = logger:remove_handler(?MODULE),
+
+ File = filename:join(Dir,lists:concat([?FUNCTION_NAME,".log"])),
+ ok = logger:add_handler(?MODULE,
+ logger_std_h,
+ #{config => #{type => {file,File}},
+ filter_default=>log,
+ filters=>?DEFAULT_HANDLER_FILTERS([?MODULE]),
+ formatter=>{?MODULE,self()}}),
+
+ {ok,#{config:=#{filesync_repeat_interval:=FSI}=FileHConfig}} =
+ logger:get_handler_config(?MODULE),
+ ok = logger:update_handler_config(?MODULE,config,
+ #{filesync_repeat_interval=>FSI+2000}),
+ {ok,#{config:=C5}} = logger:get_handler_config(?MODULE),
+ ct:log("C5: ~p",[C5]),
+ C5 = FileHConfig#{filesync_repeat_interval=>FSI+2000},
+
+ %% You are not allowed to actively set 'type' in runtime, since
+ %% this is a write once field.
+ {error, {illegal_config_change,_,_}} =
+ logger:set_handler_config(?MODULE,config,#{type=>standard_io}),
+ {ok,#{config:=C6}} = logger:get_handler_config(?MODULE),
+ ct:log("C6: ~p",[C6]),
+ C6 = C5,
+
+ %% ... but if you don't specify 'type', then set_handler_config shall
+ %% NOT reset it to its default value
+ ok = logger:set_handler_config(?MODULE,config,#{sync_mode_qlen=>1}),
+ {ok,#{config:=C7}} = logger:get_handler_config(?MODULE),
+ ct:log("C7: ~p",[C7]),
+ C7 = FileHConfig#{sync_mode_qlen=>1},
ok.
reconfig(cleanup, _Config) ->
@@ -561,8 +671,8 @@ sync(Config) ->
%% check that if there's no repeated filesync active,
%% a filesync is still performed when handler goes idle
- logger:set_handler_config(?MODULE, config,
- #{filesync_repeat_interval => no_repeat}),
+ ok = logger:update_handler_config(?MODULE, config,
+ #{filesync_repeat_interval => no_repeat}),
no_repeat = maps:get(filesync_repeat_interval, logger_std_h:info(?MODULE)),
%% The following timer is to make sure the time from last log
%% ("second") to next ("third") is long enough, so the a flush is
@@ -592,12 +702,12 @@ sync(Config) ->
start_tracer([{logger_std_h,handle_cast,2}],
[OneSync || _ <- lists:seq(1, 1 + trunc(WaitT/SyncInt))]),
- logger:set_handler_config(?MODULE, config,
- #{filesync_repeat_interval => SyncInt}),
+ ok = logger:update_handler_config(?MODULE, config,
+ #{filesync_repeat_interval => SyncInt}),
SyncInt = maps:get(filesync_repeat_interval, logger_std_h:info(?MODULE)),
timer:sleep(WaitT),
- logger:set_handler_config(?MODULE, config,
- #{filesync_repeat_interval => no_repeat}),
+ ok = logger:update_handler_config(?MODULE, config,
+ #{filesync_repeat_interval => no_repeat}),
check_tracer(100),
ok.
sync(cleanup, _Config) ->
@@ -652,7 +762,7 @@ sync_failure(Config) ->
rpc:call(Node, ?MODULE, set_result, [file_datasync,ok]),
SyncInt = 500,
- ok = rpc:call(Node, logger, set_handler_config,
+ ok = rpc:call(Node, logger, update_handler_config,
[?STANDARD_HANDLER, config,
#{filesync_repeat_interval => SyncInt}]),
Info = rpc:call(Node, logger_std_h, info, [?STANDARD_HANDLER]),
@@ -718,7 +828,7 @@ op_switch_to_sync_file(Config) ->
drop_mode_qlen => NumOfReqs+1,
flush_qlen => 2*NumOfReqs,
burst_limit_enable => false}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
%% TRecvPid = start_op_trace(),
send_burst({n,NumOfReqs}, seq, {chars,79}, notice),
Lines = count_lines(Log),
@@ -747,7 +857,7 @@ op_switch_to_sync_tty(Config) ->
drop_mode_qlen => NumOfReqs+1,
flush_qlen => 2*NumOfReqs,
burst_limit_enable => false}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
send_burst({n,NumOfReqs}, seq, {chars,79}, notice),
ok.
op_switch_to_sync_tty(cleanup, _Config) ->
@@ -770,7 +880,7 @@ op_switch_to_drop_file(Config) ->
flush_qlen =>
Procs*NumOfReqs*Bursts,
burst_limit_enable => false}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
%% It sometimes happens that the handler gets the
%% requests in a slow enough pace so that dropping
%% never occurs. Therefore, lets generate a number of
@@ -807,7 +917,7 @@ op_switch_to_drop_tty(Config) ->
flush_qlen =>
Procs*NumOfReqs+1,
burst_limit_enable => false}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
send_burst({n,NumOfReqs}, {spawn,Procs,0}, {chars,79}, notice),
ok.
op_switch_to_drop_tty(cleanup, _Config) ->
@@ -832,7 +942,7 @@ op_switch_to_flush_file(Config) ->
drop_mode_qlen => 300,
flush_qlen => 300,
burst_limit_enable => false}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
NumOfReqs = 1500,
Procs = 10,
Bursts = 10,
@@ -879,7 +989,7 @@ op_switch_to_flush_tty(Config) ->
drop_mode_qlen => 100,
flush_qlen => 100,
burst_limit_enable => false}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
NumOfReqs = 1000,
Procs = 100,
send_burst({n,NumOfReqs}, {spawn,Procs,0}, {chars,79}, notice),
@@ -895,7 +1005,7 @@ limit_burst_disabled(Config) ->
burst_limit_window_time => 2000,
drop_mode_qlen => 200,
flush_qlen => 300}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
NumOfReqs = 100,
send_burst({n,NumOfReqs}, seq, {chars,79}, notice),
Logged = count_lines(Log),
@@ -915,7 +1025,7 @@ limit_burst_enabled_one(Config) ->
burst_limit_window_time => 2000,
drop_mode_qlen => 200,
flush_qlen => 300}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
NumOfReqs = 100,
send_burst({n,NumOfReqs}, seq, {chars,79}, notice),
Logged = count_lines(Log),
@@ -936,7 +1046,7 @@ limit_burst_enabled_period(Config) ->
burst_limit_window_time => BurstTWin,
drop_mode_qlen => 20000,
flush_qlen => 20001}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
Windows = 3,
Sent = send_burst({t,BurstTWin*Windows}, seq, {chars,79}, notice),
@@ -956,7 +1066,7 @@ kill_disabled(Config) ->
HConfig#{config=>StdHConfig#{overload_kill_enable=>false,
overload_kill_qlen=>10,
overload_kill_mem_size=>100}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
NumOfReqs = 100,
send_burst({n,NumOfReqs}, seq, {chars,79}, notice),
Logged = count_lines(Log),
@@ -977,7 +1087,7 @@ qlen_kill_new(Config) ->
overload_kill_qlen=>10,
overload_kill_mem_size=>Mem0+50000,
overload_kill_restart_after=>RestartAfter}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
MRef = erlang:monitor(process, Pid0),
NumOfReqs = 100,
Procs = 4,
@@ -1011,7 +1121,7 @@ qlen_kill_std(_Config) ->
%% File = lists:concat([?MODULE,"_",?FUNCTION_NAME,".log"]),
%% Log = filename:join(Dir, File),
%% Node = start_std_h_on_new_node(Config, ?FUNCTION_NAME, Log),
- %% ok = rpc:call(Node, logger, set_handler_config,
+ %% ok = rpc:call(Node, logger, update_handler_config,
%% [?STANDARD_HANDLER, config,
%% #{overload_kill_enable=>true,
%% overload_kill_qlen=>10,
@@ -1028,7 +1138,7 @@ mem_kill_new(Config) ->
overload_kill_qlen=>50000,
overload_kill_mem_size=>Mem0+500,
overload_kill_restart_after=>RestartAfter}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
MRef = erlang:monitor(process, Pid0),
NumOfReqs = 100,
Procs = 4,
@@ -1067,7 +1177,7 @@ restart_after(Config) ->
HConfig#{config=>StdHConfig#{overload_kill_enable=>true,
overload_kill_qlen=>10,
overload_kill_restart_after=>infinity}},
- ok = logger:set_handler_config(?MODULE, NewHConfig1),
+ ok = logger:update_handler_config(?MODULE, NewHConfig1),
MRef1 = erlang:monitor(process, whereis(h_proc_name())),
%% kill handler
send_burst({n,100}, {spawn,4,0}, {chars,79}, notice),
@@ -1082,14 +1192,15 @@ restart_after(Config) ->
ct:pal("Handler state = ~p", [Info1]),
ct:fail("Handler not dead! It should not have survived this!")
end,
-
+
{Log,_,_} = start_handler(?MODULE, ?FUNCTION_NAME, Config),
RestartAfter = ?OVERLOAD_KILL_RESTART_AFTER,
+
NewHConfig2 =
HConfig#{config=>StdHConfig#{overload_kill_enable=>true,
overload_kill_qlen=>10,
overload_kill_restart_after=>RestartAfter}},
- ok = logger:set_handler_config(?MODULE, NewHConfig2),
+ ok = logger:update_handler_config(?MODULE, NewHConfig2),
Pid0 = whereis(h_proc_name()),
MRef2 = erlang:monitor(process, Pid0),
%% kill handler
@@ -1123,7 +1234,7 @@ handler_requests_under_load(Config) ->
drop_mode_qlen => 1000,
flush_qlen => 2000,
burst_limit_enable => false}},
- ok = logger:set_handler_config(?MODULE, NewHConfig),
+ ok = logger:update_handler_config(?MODULE, NewHConfig),
Pid = spawn_link(fun() -> send_requests(?MODULE, 1, [{filesync,[]},
{info,[]},
{reset,[]},
@@ -1155,9 +1266,9 @@ send_requests(HName, TO, Reqs = [{Req,Res}|Rs]) ->
Result =
case Req of
change_config ->
- logger:set_handler_config(HName, config,
- #{overload_kill_enable =>
- false});
+ logger:update_handler_config(HName, config,
+ #{overload_kill_enable =>
+ false});
Func ->
logger_std_h:Func(HName)
end,
diff --git a/lib/kernel/test/prim_file_SUITE.erl b/lib/kernel/test/prim_file_SUITE.erl
index a02b5f87d1..2f465a15bc 100644
--- a/lib/kernel/test/prim_file_SUITE.erl
+++ b/lib/kernel/test/prim_file_SUITE.erl
@@ -1300,7 +1300,8 @@ e_delete(Config) when is_list(Config) ->
case os:type() of
{win32, _} ->
%% Remove a character device.
- {error, eacces} = ?PRIM_FILE:delete("nul");
+ expect({error, eacces}, {error, einval},
+ ?PRIM_FILE:delete("nul"));
_ ->
?PRIM_FILE:write_file_info(
Base, #file_info {mode=0}),
diff --git a/lib/kernel/test/seq_trace_SUITE.erl b/lib/kernel/test/seq_trace_SUITE.erl
index cf4bf11328..3bbf62e832 100644
--- a/lib/kernel/test/seq_trace_SUITE.erl
+++ b/lib/kernel/test/seq_trace_SUITE.erl
@@ -19,6 +19,9 @@
%%
-module(seq_trace_SUITE).
+%% label_capability_mismatch needs to run a part of the test on an OTP 20 node.
+-compile(r20).
+
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_group/2,end_per_group/2,
init_per_testcase/2,end_per_testcase/2]).
@@ -329,7 +332,7 @@ do_incompatible_labels(Rel) ->
Mdir = filename:dirname(Dir),
true = rpc:call(Node,code,add_patha,[Mdir]),
seq_trace:reset_trace(),
- rpc:call(Node,?MODULE,start_tracer,[]),
+ true = is_pid(rpc:call(Node,?MODULE,start_tracer,[])),
Receiver = spawn(Node,?MODULE,one_time_receiver,[]),
%% This node does not support arbitrary labels, so it must fail with a
@@ -356,7 +359,7 @@ do_compatible_labels(Rel) ->
Mdir = filename:dirname(Dir),
true = rpc:call(Node,code,add_patha,[Mdir]),
seq_trace:reset_trace(),
- rpc:call(Node,?MODULE,start_tracer,[]),
+ true = is_pid(rpc:call(Node,?MODULE,start_tracer,[])),
Receiver = spawn(Node,?MODULE,one_time_receiver,[]),
%% This node does not support arbitrary labels, but small integers should
diff --git a/lib/mnesia/examples/bench/README b/lib/mnesia/examples/bench/README
index 5d31b5ba25..3648fb59da 100644
--- a/lib/mnesia/examples/bench/README
+++ b/lib/mnesia/examples/bench/README
@@ -141,7 +141,7 @@ statistics_detail
following atoms: normal, debug and debug2. debug enables a
finer grain of statistics to be reported, but since it requires
more counters, to be updated by the generator processes it may
- cause slightly worse benchmark performace figures than the brief
+ cause slightly worse benchmark performance figures than the brief
default case, that is normal. debug2 prints out the debug info
and formats it according to LMC's benchmark program.
@@ -160,7 +160,7 @@ n_fragments
Defines how many fragments each table should be divided in.
Default is 100. The fragments are evenly distributed over
- all table nodes. The group table not devided in fragments.
+ all table nodes. The group table not divided in fragments.
n_replicas
diff --git a/lib/mnesia/test/README b/lib/mnesia/test/README
index e0ced7399d..30a0d2fd64 100644
--- a/lib/mnesia/test/README
+++ b/lib/mnesia/test/README
@@ -51,7 +51,7 @@ stated as test suite configuration parameters, but by default
the extra node names are generated. In this example the names
will be: a, a1 and a2. It is enough to start the first node
manually, the extra nodes will automatically be started if
-neccessary.
+necessary.
The attached UNIX shell script mt, does not work on all
platforms, but it may be used as a source for inspiration. It
@@ -63,7 +63,7 @@ test cases (i.e. test cases that encountered an error).
During development we want to be able to run the test cases
in the debugger. This demands a little bit of preparations:
- - Start the neccessary number of nodes (normally 3).
+ - Start the necessary number of nodes (normally 3).
This may either be done by running the mt script or
by starting the main node and then invoke mt:start_nodes()
to start the extra nodes with slave.
@@ -73,7 +73,7 @@ in the debugger. This demands a little bit of preparations:
- Load all files that needs to be interpreted. This is typically
all Mnesia files plus the test case. By invoking mnesia:ni()
- and mnesia:ni([TestModule]) the neccessary modules will be
+ and mnesia:ni([TestModule]) the necessary modules will be
loaded on all CONNECTED nodes.
The test case execution is supervised in order to ensure that no test
diff --git a/lib/observer/src/crashdump_viewer.erl b/lib/observer/src/crashdump_viewer.erl
index 14b086ff58..276b209ce5 100644
--- a/lib/observer/src/crashdump_viewer.erl
+++ b/lib/observer/src/crashdump_viewer.erl
@@ -1594,31 +1594,92 @@ read_heap(Fd,Pid,DecodeOpts,Dict0) ->
Dict0
end.
-read_heap(DecodeOpts,Dict0) ->
- %% This function is never called if the dump is truncated in {?proc_heap,Pid}
- case get(fd) of
- end_of_heap ->
+read_heap(DecodeOpts, Dict0) ->
+ %% This function is never called if the dump is truncated in
+ %% {?proc_heap,Pid}.
+ %%
+ %% It is not always possible to reconstruct the heap terms
+ %% in a single pass, especially if maps are involved.
+ %% See crashdump_helper:literal_map/0 for an example.
+ %%
+ %% Therefore, we need two passes. In the first pass
+ %% we collect all lines without parsing them, and in the
+ %% second pass we parse them.
+ %%
+ %% The first pass follows.
+
+ Lines0 = read_heap_lines(),
+
+ %% Save a map of all unprocessed lines so that deref_ptr() can
+ %% access any line when there are references to terms not yet
+ %% built.
+
+ LineMap = maps:from_list(Lines0),
+ put(line_map, LineMap),
+
+ %% Refc binaries (tag "Yc") must be processed before any sub
+ %% binaries (tag "Ys") referencing them, so we make sure to
+ %% process all the refc binaries first.
+ %%
+ %% The other lines can be processed in any order, but processing
+ %% them in the reverse order compared to how they are printed in
+ %% the crash dump seems to minimize the number of references to
+ %% terms that have not yet been built. That happens to be the
+ %% order of the line list as returned by read_heap_lines/0.
+
+ RefcBins = [Refc || {_,<<"Yc",_/binary>>}=Refc <- Lines0],
+ Lines = RefcBins ++ Lines0,
+
+ %% Second pass.
+
+ init_progress("Processing terms", map_size(LineMap)),
+ Dict = parse_heap_terms(Lines, DecodeOpts, Dict0),
+ erase(line_map),
+ end_progress(),
+ Dict.
+
+read_heap_lines() ->
+ read_heap_lines_1(get(fd), []).
+
+read_heap_lines_1(Fd, Acc) ->
+ case bytes(Fd) of
+ "=" ++ _next_tag ->
end_progress(),
- Dict0;
- Fd ->
- case bytes(Fd) of
- "=" ++ _next_tag ->
- end_progress(),
- put(fd, end_of_heap),
- Dict0;
- Line ->
- update_progress(length(Line)+1),
- Dict = parse(Line,DecodeOpts,Dict0),
- read_heap(DecodeOpts,Dict)
- end
+ put(fd, end_of_heap),
+ Acc;
+ Line0 ->
+ update_progress(length(Line0)+1),
+ {Addr,":"++Line1} = get_hex(Line0),
+
+ %% Reduce the memory consumption by converting the
+ %% line to a binary. Measurements show that it may also
+ %% be benefical for performance, too, because it makes the
+ %% garbage collections cheaper.
+
+ Line = list_to_binary(Line1),
+ read_heap_lines_1(Fd, [{Addr,Line}|Acc])
end.
-parse(Line0, DecodeOpts, Dict0) ->
- {Addr,":"++Line1} = get_hex(Line0),
- {_Term,Line,Dict} = parse_heap_term(Line1, Addr, DecodeOpts, Dict0),
- [] = skip_blanks(Line),
+parse_heap_terms([{Addr,Line0}|T], DecodeOpts, Dict0) ->
+ case gb_trees:is_defined(Addr, Dict0) of
+ true ->
+ %% Already parsed (by a recursive call from do_deref_ptr()
+ %% to parse_line()). Nothing to do.
+ parse_heap_terms(T, DecodeOpts, Dict0);
+ false ->
+ %% Parse this previously unparsed term.
+ Dict = parse_line(Addr, Line0, DecodeOpts, Dict0),
+ parse_heap_terms(T, DecodeOpts, Dict)
+ end;
+parse_heap_terms([], _DecodeOpts, Dict) ->
Dict.
+parse_line(Addr, Line0, DecodeOpts, Dict0) ->
+ update_progress(1),
+ Line1 = binary_to_list(Line0),
+ {_Term,Line,Dict} = parse_heap_term(Line1, Addr, DecodeOpts, Dict0),
+ [] = skip_blanks(Line), %Assertion.
+ Dict.
%%-----------------------------------------------------------------
%% Page with one port
@@ -2871,16 +2932,18 @@ parse_atom_translation_table(N, Line0, As) ->
deref_ptr(Ptr, Line, DecodeOpts, D) ->
- Lookup = fun(D0) ->
- gb_trees:lookup(Ptr, D0)
- end,
+ Lookup0 = fun(D0) ->
+ gb_trees:lookup(Ptr, D0)
+ end,
+ Lookup = wrap_line_map(Ptr, Lookup0),
do_deref_ptr(Lookup, Line, DecodeOpts, D).
deref_bin(Binp0, Offset, Sz, Line, DecodeOpts, D) ->
Binp = Binp0 bor DecodeOpts#dec_opts.bin_addr_adj,
- Lookup = fun(D0) ->
- lookup_binary(Binp, Offset, Sz, D0)
- end,
+ Lookup0 = fun(D0) ->
+ lookup_binary(Binp, Offset, Sz, D0)
+ end,
+ Lookup = wrap_line_map(Binp, Lookup0),
do_deref_ptr(Lookup, Line, DecodeOpts, D).
lookup_binary(Binp, Offset, Sz, D) ->
@@ -2899,26 +2962,36 @@ lookup_binary(Binp, Offset, Sz, D) ->
end
end.
+wrap_line_map(Ptr, Lookup) ->
+ wrap_line_map_1(get(line_map), Ptr, Lookup).
+
+wrap_line_map_1(#{}=LineMap, Ptr, Lookup) ->
+ fun(D) ->
+ case Lookup(D) of
+ {value,_}=Res ->
+ Res;
+ none ->
+ case LineMap of
+ #{Ptr:=Line} ->
+ {line,Ptr,Line};
+ #{} ->
+ none
+ end
+ end
+ end;
+wrap_line_map_1(undefined, _Ptr, Lookup) ->
+ Lookup.
+
do_deref_ptr(Lookup, Line, DecodeOpts, D0) ->
case Lookup(D0) of
{value,Term} ->
{Term,Line,D0};
none ->
- case get(fd) of
- end_of_heap ->
- put(incomplete_heap,true),
- {['#CDVIncompleteHeap'],Line,D0};
- Fd ->
- case bytes(Fd) of
- "="++_ ->
- put(fd, end_of_heap),
- do_deref_ptr(Lookup, Line, DecodeOpts, D0);
- L ->
- update_progress(length(L)+1),
- D = parse(L, DecodeOpts, D0),
- do_deref_ptr(Lookup, Line, DecodeOpts, D)
- end
- end
+ put(incomplete_heap, true),
+ {['#CDVIncompleteHeap'],Line,D0};
+ {line,Addr,NewLine} ->
+ D = parse_line(Addr, NewLine, DecodeOpts, D0),
+ do_deref_ptr(Lookup, Line, DecodeOpts, D)
end.
get_hex(L) ->
diff --git a/lib/observer/test/crashdump_helper.erl b/lib/observer/test/crashdump_helper.erl
index 145ff56b71..d8f4e046ae 100644
--- a/lib/observer/test/crashdump_helper.erl
+++ b/lib/observer/test/crashdump_helper.erl
@@ -142,4 +142,23 @@ create_maps() ->
Map3 = lists:foldl(fun(I, A) ->
A#{I=>I*I}
end, Map2, lists:seq(-10, 0)),
- #{a=>Map0,b=>Map1,c=>Map2,d=>Map3,e=>#{}}.
+ #{a=>Map0,b=>Map1,c=>Map2,d=>Map3,e=>#{},literal=>literal_map()}.
+
+literal_map() ->
+ %% A literal map such as the one below will produce a heap dump
+ %% like this:
+ %%
+ %% Address1:t4:H<Address3>,H<Address4>,H<Address5>,H<Address6>
+ %% Address2:Mf4:H<Adress1>:I1,I2,I3,I4
+ %% Address3: ... % "one"
+ %% Address4: ... % "two"
+ %% Address5: ... % "three"
+ %% Address6: ... % "four"
+ %%
+ %% The map cannot be reconstructed in a single sequential pass.
+ %%
+ %% To reconstruct the map, first the string keys "one"
+ %% through "four" must be reconstructed, then the tuple at
+ %% Adress1, then the map at Address2.
+
+ #{"one"=>1,"two"=>2,"three"=>3,"four"=>4}.
diff --git a/lib/os_mon/c_src/cpu_sup.c b/lib/os_mon/c_src/cpu_sup.c
index 17ef48c26e..c96a5c9f7c 100644
--- a/lib/os_mon/c_src/cpu_sup.c
+++ b/lib/os_mon/c_src/cpu_sup.c
@@ -152,6 +152,8 @@ static void util_measure(unsigned int **result_vec, int *result_sz);
#if defined(__sun__)
static unsigned int misc_measure(char* name);
+#elif defined(__linux__)
+static unsigned int misc_measure(char cmd);
#endif
static void sendi(unsigned int data);
static void sendv(unsigned int data[], int ints);
@@ -231,6 +233,11 @@ int main(int argc, char** argv) {
case AVG1: sendi(misc_measure("avenrun_1min")); break;
case AVG5: sendi(misc_measure("avenrun_5min")); break;
case AVG15: sendi(misc_measure("avenrun_15min")); break;
+#elif defined(__linux__)
+ case NPROCS:
+ case AVG1:
+ case AVG5:
+ case AVG15: sendi(misc_measure(cmd)); break;
#elif defined(__OpenBSD__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__FreeBSD__) || defined(__DragonFly__)
case NPROCS: bsd_count_procs(); break;
case AVG1: bsd_loadavg(0); break;
@@ -238,7 +245,7 @@ int main(int argc, char** argv) {
case AVG15: bsd_loadavg(2); break;
#endif
#if defined(__sun__) || defined(__linux__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__FreeBSD__)
- case UTIL: util_measure(&rv,&sz); sendv(rv, sz); break;
+ case UTIL: util_measure(&rv,&sz); sendv(rv, sz); break;
#endif
case QUIT: free((void*)rv); return 0;
default: error("Bad command"); break;
@@ -329,6 +336,22 @@ static void bsd_count_procs(void) {
#if defined(__linux__)
+static unsigned int misc_measure(char cmd) {
+ struct sysinfo info;
+
+ if (sysinfo(&info))
+ error(strerror(errno));
+
+ switch (cmd) {
+ case AVG1: return (unsigned int)(info.loads[0] / 256);
+ case AVG5: return (unsigned int)(info.loads[1] / 256);
+ case AVG15: return (unsigned int)(info.loads[2] / 256);
+ case NPROCS: return info.procs;
+ }
+
+ return -1;
+}
+
static cpu_t *read_procstat(FILE *fp, cpu_t *cpu) {
char buffer[BUFFERSIZE];
@@ -357,8 +380,24 @@ static void util_measure(unsigned int **result_vec, int *result_sz) {
FILE *fp;
unsigned int *rv = NULL;
cpu_t cpu;
-
+
+ rv = *result_vec;
+ rv[0] = no_of_cpus;
+
if ( (fp = fopen(PROCSTAT,"r")) == NULL) {
+ if (errno == EACCES) { /* SELinux */
+ rv[1] = 1; /* just the cpu id */
+ ++rv; /* first value is number of cpus */
+ ++rv; /* second value is number of entries */
+ for (i = 0; i < no_of_cpus; ++i) {
+ rv[0] = CU_CPU_ID;
+ rv[1] = i;
+ rv += 1*2;
+ }
+ *result_sz = 2 + 2*1 * no_of_cpus;
+ return;
+ }
+
/* Check if procfs is mounted,
* otherwise:
* try and try again, bad procsfs.
@@ -367,20 +406,19 @@ static void util_measure(unsigned int **result_vec, int *result_sz) {
return;
}
- /*ignore read*/
+ /*ignore read*/
if (fgets(buffer, BUFFERSIZE, fp) == NULL) {
*result_sz = 0;
return;
}
- rv = *result_vec;
- rv[0] = no_of_cpus;
+
rv[1] = CU_VALUES;
++rv; /* first value is number of cpus */
++rv; /* second value is number of entries */
for (i = 0; i < no_of_cpus; ++i) {
read_procstat(fp, &cpu);
-
+
rv[ 0] = CU_CPU_ID; rv[ 1] = cpu.id;
rv[ 2] = CU_USER; rv[ 3] = cpu.user;
rv[ 4] = CU_NICE_USER; rv[ 5] = cpu.nice_user;
diff --git a/lib/os_mon/src/cpu_sup.erl b/lib/os_mon/src/cpu_sup.erl
index 81e049ef22..ba2d89313e 100644
--- a/lib/os_mon/src/cpu_sup.erl
+++ b/lib/os_mon/src/cpu_sup.erl
@@ -220,17 +220,21 @@ code_change(_OldVsn, State, _Extra) ->
%% internal functions
%%----------------------------------------------------------------------
-get_uint32_measurement(Request, #internal{os_type = {unix, linux}}) ->
- {ok,F} = file:open("/proc/loadavg",[read,raw]),
- {ok,D} = file:read_line(F),
- ok = file:close(F),
- {ok,[Load1,Load5,Load15,_PRun,PTotal],_} = io_lib:fread("~f ~f ~f ~d/~d", D),
- case Request of
- ?avg1 -> sunify(Load1);
- ?avg5 -> sunify(Load5);
- ?avg15 -> sunify(Load15);
- ?ping -> 4711;
- ?nprocs -> PTotal
+get_uint32_measurement(Request, #internal{port = P, os_type = {unix, linux}}) ->
+ case file:open("/proc/loadavg",[read,raw]) of
+ {ok,F} ->
+ {ok,D} = file:read_line(F),
+ ok = file:close(F),
+ {ok,[Load1,Load5,Load15,_PRun,PTotal],_} = io_lib:fread("~f ~f ~f ~d/~d", D),
+ case Request of
+ ?avg1 -> sunify(Load1);
+ ?avg5 -> sunify(Load5);
+ ?avg15 -> sunify(Load15);
+ ?ping -> 4711;
+ ?nprocs -> PTotal
+ end;
+ {error,_} ->
+ port_server_call(P, Request)
end;
get_uint32_measurement(Request, #internal{port = P, os_type = {unix, Sys}}) when
Sys == sunos;
diff --git a/lib/public_key/asn1/OTP-PKIX.asn1 b/lib/public_key/asn1/OTP-PKIX.asn1
index 37196bb9bf..10a83555af 100644
--- a/lib/public_key/asn1/OTP-PKIX.asn1
+++ b/lib/public_key/asn1/OTP-PKIX.asn1
@@ -368,6 +368,13 @@ SupportedPublicKeyAlgorithms PUBLIC-KEY-ALGORITHM-CLASS ::= {
ID id-dsaWithSHA1
TYPE DSAParams }
+ id-dsa-with-sha224 OBJECT IDENTIFIER ::= {
+ joint-iso-ccitt(2) country(16) us(840) organization(1) gov(101)
+ csor(3) algorithms(4) id-dsa-with-sha2(3) 1 }
+
+ id-dsa-with-sha256 OBJECT IDENTIFIER ::= {
+ joint-iso-ccitt(2) country(16) us(840) organization(1) gov(101)
+ csor(3) algorithms(4) id-dsa-with-sha2(3) 2 }
--
-- RSA Keys and Signatures
--
diff --git a/lib/public_key/src/public_key.erl b/lib/public_key/src/public_key.erl
index 3f609ce6c6..dca1e0766e 100644
--- a/lib/public_key/src/public_key.erl
+++ b/lib/public_key/src/public_key.erl
@@ -609,6 +609,10 @@ pkix_sign_types(?'id-dsa-with-sha1') ->
{sha, dsa};
pkix_sign_types(?'id-dsaWithSHA1') ->
{sha, dsa};
+pkix_sign_types(?'id-dsa-with-sha224') ->
+ {sha224, dsa};
+pkix_sign_types(?'id-dsa-with-sha256') ->
+ {sha256, dsa};
pkix_sign_types(?'ecdsa-with-SHA1') ->
{sha, ecdsa};
pkix_sign_types(?'ecdsa-with-SHA256') ->
diff --git a/lib/public_key/test/public_key_SUITE.erl b/lib/public_key/test/public_key_SUITE.erl
index 1955e9e119..878489eb0f 100644
--- a/lib/public_key/test/public_key_SUITE.erl
+++ b/lib/public_key/test/public_key_SUITE.erl
@@ -44,7 +44,9 @@ all() ->
encrypt_decrypt,
{group, sign_verify},
pkix, pkix_countryname, pkix_emailaddress, pkix_path_validation,
- pkix_iso_rsa_oid, pkix_iso_dsa_oid, pkix_crl, general_name,
+ pkix_iso_rsa_oid, pkix_iso_dsa_oid,
+ pkix_dsa_sha2_oid,
+ pkix_crl, general_name,
pkix_verify_hostname_cn,
pkix_verify_hostname_subjAltName,
pkix_verify_hostname_subjAltName_IP,
@@ -1114,6 +1116,13 @@ pkix_iso_dsa_oid(Config) when is_list(Config) ->
{_, dsa} = public_key:pkix_sign_types(SigAlg#'SignatureAlgorithm'.algorithm).
%%--------------------------------------------------------------------
+pkix_dsa_sha2_oid() ->
+ [{doc, "Test support dsa_sha2 oid"}].
+pkix_dsa_sha2_oid(Config) when is_list(Config) ->
+ {sha224, dsa} = public_key:pkix_sign_types(?'id-dsa-with-sha224'),
+ {sha256, dsa} = public_key:pkix_sign_types(?'id-dsa-with-sha256').
+
+%%--------------------------------------------------------------------
pkix_crl() ->
[{doc, "test pkix_crl_* functions"}].
diff --git a/lib/ssh/doc/src/Makefile b/lib/ssh/doc/src/Makefile
index 77fa356092..4e32dd9976 100644
--- a/lib/ssh/doc/src/Makefile
+++ b/lib/ssh/doc/src/Makefile
@@ -45,6 +45,7 @@ XML_REF3_FILES = \
ssh_connection.xml \
ssh_server_channel.xml \
ssh_server_key_api.xml \
+ ssh_file.xml \
ssh_sftp.xml \
ssh_sftpd.xml \
@@ -56,8 +57,8 @@ XML_CHAPTER_FILES = \
notes.xml \
introduction.xml \
using_ssh.xml \
+ terminology.xml \
configure_algos.xml
-# ssh_protocol.xml \
BOOK_FILES = book.xml
diff --git a/lib/ssh/doc/src/ref_man.xml b/lib/ssh/doc/src/ref_man.xml
index df37b0244f..60572b985b 100644
--- a/lib/ssh/doc/src/ref_man.xml
+++ b/lib/ssh/doc/src/ref_man.xml
@@ -40,6 +40,7 @@
<xi:include href="ssh_connection.xml"/>
<xi:include href="ssh_client_key_api.xml"/>
<xi:include href="ssh_server_key_api.xml"/>
+ <xi:include href="ssh_file.xml"/>
<xi:include href="ssh_sftp.xml"/>
<xi:include href="ssh_sftpd.xml"/>
</application>
diff --git a/lib/ssh/doc/src/specs.xml b/lib/ssh/doc/src/specs.xml
index acdbe2ddfd..a6517f3660 100644
--- a/lib/ssh/doc/src/specs.xml
+++ b/lib/ssh/doc/src/specs.xml
@@ -6,6 +6,7 @@
<xi:include href="../specs/specs_ssh_connection.xml"/>
<xi:include href="../specs/specs_ssh_server_channel.xml"/>
<xi:include href="../specs/specs_ssh_server_key_api.xml"/>
+ <xi:include href="../specs/specs_ssh_file.xml"/>
<xi:include href="../specs/specs_ssh_sftp.xml"/>
<xi:include href="../specs/specs_ssh_sftpd.xml"/>
</specs>
diff --git a/lib/ssh/doc/src/ssh.xml b/lib/ssh/doc/src/ssh.xml
index 3bc62073a2..93e52ce023 100644
--- a/lib/ssh/doc/src/ssh.xml
+++ b/lib/ssh/doc/src/ssh.xml
@@ -99,8 +99,8 @@
</p>
<p>The paths could easily be changed by options:
- <seealso marker="#type-user_dir_common_option"><c>user_dir</c></seealso> and
- <seealso marker="#type-system_dir_daemon_option"><c>system_dir</c></seealso>.
+ <seealso marker="ssh_file#type-user_dir_common_option"><c>user_dir</c></seealso> and
+ <seealso marker="ssh_file#type-system_dir_daemon_option"><c>system_dir</c></seealso>.
</p>
<p>A completly different storage could be interfaced by writing call-back modules
using the behaviours
@@ -123,12 +123,12 @@
<item><c>ssh_host_ecdsa_key</c> and <c>ssh_host_ecdsa_key.pub</c></item>
</list>
<p>The host keys directory could be changed with the option
- <seealso marker="#type-system_dir_daemon_option"><c>system_dir</c></seealso>.</p>
+ <seealso marker="ssh_file#type-system_dir_daemon_option"><c>system_dir</c></seealso>.</p>
</item>
<item>Optional: one or more <i>User's public key</i> in case of <c>publickey</c> authorization.
Default is to store them concatenated in the file <c>.ssh/authorized_keys</c> in the user's home directory.
<p>The user keys directory could be changed with the option
- <seealso marker="#type-user_dir_common_option"><c>user_dir</c></seealso>.</p>
+ <seealso marker="ssh_file#type-user_dir_common_option"><c>user_dir</c></seealso>.</p>
</item>
</list>
</section>
@@ -138,7 +138,7 @@
<p>The keys and some other data are by default stored in files in the directory <c>.ssh</c>
in the user's home directory.</p>
<p>The directory could be changed with the option
- <seealso marker="#type-user_dir_common_option"><c>user_dir</c></seealso>.
+ <seealso marker="ssh_file#type-user_dir_common_option"><c>user_dir</c></seealso>.
</p>
<list>
<item>Optional: a list of <i>Host public key(s)</i> for previously connected hosts. This list
@@ -192,22 +192,13 @@
<p>If there is no public key of a specified type available, the corresponding entry is ignored.
Note that the available set is dependent on the underlying cryptolib and current user's public keys.
</p>
- <p>See also the option <seealso marker="#type-user_dir_common_option"><c>user_dir</c></seealso>
+ <p>See also the option <seealso marker="ssh_file#type-user_dir_common_option"><c>user_dir</c></seealso>
for specifying the path to the user's keys.
</p>
</desc>
</datatype>
<datatype>
- <name name="pubkey_passphrase_client_options"/>
- <desc>
- <p>If the user's DSA, RSA or ECDSA key is protected by a passphrase, it can be
- supplied with thoose options.
- </p>
- </desc>
- </datatype>
-
- <datatype>
<name name="host_accepting_client_options"/>
<name name="accept_hosts"/>
<name name="fp_digest_alg"/>
@@ -220,7 +211,7 @@
<p>This option guides the <c>connect</c> function on how to act when the connected server presents a Host
Key that the client has not seen before. The default is to ask the user with a question on stdio of whether to
accept or reject the new Host Key.
- See the option <seealso marker="#type-user_dir_common_option"><c>user_dir</c></seealso>
+ See the option <seealso marker="ssh_file#type-user_dir_common_option"><c>user_dir</c></seealso>
for specifying the path to the file <c>known_hosts</c> where previously accepted Host Keys are recorded.
See also the option
<seealso marker="#type-key_cb_common_option">key_cb</seealso>
@@ -276,7 +267,7 @@
accept question the next time the same host is connected. If the option
<seealso marker="#type-key_cb_common_option"><c>key_cb</c></seealso>
is not present, the key is saved in the file "known_hosts". See option
- <seealso marker="#type-user_dir_common_option"><c>user_dir</c></seealso> for
+ <seealso marker="ssh_file#type-user_dir_common_option"><c>user_dir</c></seealso> for
the location of that file.
</p>
<p>If <c>false</c>, the key is not saved and the key will still be unknown
@@ -478,18 +469,6 @@
<name name="pwdfun_4"/>
<desc>
<taglist>
- <tag><marker id="type-system_dir_daemon_option"/><c>system_dir</c></tag>
- <item>
- <p>Sets the system directory, containing the host key files
- that identify the host keys for <c>ssh</c>. Defaults to
- <c>/etc/ssh</c>.</p>
- <p>For security reasons, this directory is normally accessible only to the root user.</p>
- <p>See also the option
- <seealso marker="#type-key_cb_common_option">key_cb</seealso>
- for the general way to handle keys.
- </p>
- </item>
-
<tag><c>auth_method_kb_interactive_data</c></tag>
<item>
<p>Sets the text strings that the daemon sends to the client for presentation to the user when
@@ -502,7 +481,7 @@
</p>
</item>
- <tag><c>user_passwords</c></tag>
+ <tag><marker id="option-user_passwords"/><c>user_passwords</c></tag>
<item>
<p>Provides passwords for password authentication. The passwords are used when someone tries
to connect to the server and public key user-authentication fails. The option provides
@@ -510,7 +489,7 @@
</p>
</item>
- <tag><c>password</c></tag>
+ <tag><marker id="option-password"/><c>password</c></tag>
<item>
<p>Provides a global password that authenticates any user.</p>
<warning>
@@ -519,7 +498,9 @@
</warning>
</item>
- <tag><c>pwdfun</c> with <c>pwdfun_4()</c></tag>
+ <tag><marker id="option-pwdfun"/><c>pwdfun</c> with
+ <seealso marker="#type-pwdfun_4"><c>pwdfun_4()</c></seealso>
+ </tag>
<item>
<p>Provides a function for password validation. This could used for calling an external system or handeling
passwords stored as hash values.
@@ -546,7 +527,9 @@
can be used for this. The return value <c>disconnect</c> is useful for this.</p>
</item>
- <tag><c>pwdfun</c> with <c>pwdfun_2()</c></tag>
+ <tag><c>pwdfun</c> with
+ <seealso marker="#type-pwdfun_2"><c>pwdfun_2()</c></seealso>
+ </tag>
<item>
<p>Provides a function for password validation. This function is called with user and password
as strings, and returns:</p>
@@ -725,21 +708,6 @@
</datatype>
<datatype>
- <name name="user_dir_common_option"/>
- <desc>
- <p>Sets the user directory. That is, the directory containing <c>ssh</c> configuration
- files for the user, such as
- <c>known_hosts</c>, <c>id_rsa</c>, <c>id_dsa</c>>, <c>id_ecdsa</c> and <c>authorized_key</c>.
- Defaults to the directory normally referred to as <c>~/.ssh</c>.
- </p>
- <p>See also the option
- <seealso marker="#type-key_cb_common_option">key_cb</seealso>
- for the general way to handle keys.
- </p>
- </desc>
- </datatype>
-
- <datatype>
<name name="profile_common_option"/>
<desc>
<p>Used together with <c>ip-address</c> and <c>port</c> to
@@ -795,7 +763,8 @@
</p>
<p>The <c>Opts</c> defaults to <c>[]</c> when only the <c>Module</c> is specified.
</p>
- <p>The default value of this option is <c>{ssh_file, []}</c>.
+ <p>The default value of this option is <c>{ssh_file, []}</c>. See also the manpage of
+ <seealso marker="ssh:ssh_file">ssh_file</seealso>.
</p>
<p>A call to the call-back function <c>F</c> will be</p>
<code>
@@ -804,7 +773,10 @@
<p>where <c>...</c> are arguments to <c>F</c> as in
<seealso marker="ssh_client_key_api">ssh_client_key_api</seealso> and/or
<seealso marker="ssh_server_key_api">ssh_server_key_api</seealso>.
- The <c>UserOptions</c> are the options given to <c>ssh:connect</c>, <c>ssh:shell</c> or <c>ssh:daemon</c>.
+ The <c>UserOptions</c> are the options given to
+ <seealso marker="ssh:ssh#connect-3">ssh:connect</seealso>,
+ <seealso marker="ssh:ssh#shell-1">ssh:shell</seealso> or
+ <seealso marker="ssh:ssh#daemon-2">ssh:daemon</seealso>.
</p>
</desc>
diff --git a/lib/ssh/doc/src/ssh_app.xml b/lib/ssh/doc/src/ssh_app.xml
index e80bb1853d..eb804e67dc 100644
--- a/lib/ssh/doc/src/ssh_app.xml
+++ b/lib/ssh/doc/src/ssh_app.xml
@@ -74,13 +74,18 @@
<c>id_ecdsa_key</c>,
<c>known_hosts</c>, and <c>authorized_keys</c> in ~/.ssh,
and for the host key files in <c>/etc/ssh</c>. These locations can be changed
- by the options <c>user_dir</c> and <c>system_dir</c>.
+ by the options
+ <seealso marker="ssh_file#type-user_dir_common_option"><c>user_dir</c></seealso> and
+ <seealso marker="ssh_file#type-system_dir_daemon_option"><c>system_dir</c></seealso>.
</p>
<p>Public key handling can also be customized through a callback module that
implements the behaviors
<seealso marker="ssh_client_key_api">ssh_client_key_api</seealso> and
<seealso marker="ssh_server_key_api">ssh_server_key_api</seealso>.
</p>
+ <p>See also the default callback module documentation in
+ <seealso marker="ssh_file">ssh_file</seealso>.
+ </p>
</section>
<section>
diff --git a/lib/ssh/doc/src/ssh_file.xml b/lib/ssh/doc/src/ssh_file.xml
new file mode 100644
index 0000000000..ae6ba2e1d9
--- /dev/null
+++ b/lib/ssh/doc/src/ssh_file.xml
@@ -0,0 +1,275 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2018</year><year>2018</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ </legalnotice>
+
+ <title>ssh_file</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ </header>
+ <module>ssh_file</module>
+ <modulesummary>Default callback module for the client's and server's database operations in the ssh application</modulesummary>
+ <description>
+ <p>This module is the default callback handler for the client's and the server's user and host "database" operations.
+ All data, for instance key pairs, are stored in files in the normal file system. This page documents the files, where they
+ are stored and configuration options for this callback module.
+ </p>
+ <p>The intention is to be compatible with the
+ <url href="http://www.openssh.com">OpenSSH</url>
+ storage in files. Therefore it mimics directories and filenames of
+ <url href="http://www.openssh.com">OpenSSH</url>.
+ </p>
+
+ <p>Ssh_file implements the <seealso marker="ssh:ssh_server_key_api">ssh_server_key_api</seealso> and
+ the <seealso marker="ssh:ssh_client_key_api">ssh_client_key_api</seealso>.
+ This enables the user to make an own interface using for example a database handler.
+ </p>
+ <p>Such another callback module could be used by setting the option
+ <seealso marker="ssh:ssh#type-key_cb_common_option"><c>key_cb</c></seealso>
+ when starting a client or a server (with for example
+ <seealso marker="ssh:ssh#connect-3">ssh:connect</seealso>,
+ <seealso marker="ssh:ssh#daemon-2">ssh:daemon</seealso> of
+ <seealso marker="ssh:ssh#shell-1">ssh:shell</seealso>
+ ).
+ </p>
+
+ <note>
+ <p>The functions are <i>Callbacks</i> for the SSH app. They are not intended to be called from the user's code!
+ </p>
+ </note>
+ </description>
+
+ <section>
+ <title>Files, directories and who uses them</title>
+ <section>
+ <title>Daemons</title>
+ <p>Daemons uses all files stored in the <seealso marker="#SYSDIR">SYSDIR</seealso> directory.
+ </p>
+ <p>Optionaly, in case of <c>publickey</c> authorization, one or more of the remote user's public keys
+ in the <seealso marker="#USERDIR">USERDIR</seealso> directory are used.
+ See the files
+ <seealso marker="#USERDIR-authorized_keys"><c>USERDIR/authorized_keys</c></seealso> and
+ <seealso marker="#USERDIR-authorized_keys2"><c>USERDIR/authorized_keys2</c></seealso>.
+ </p>
+ </section>
+
+ <section>
+ <title>Clients</title>
+ <p>Clients uses all files stored in the <seealso marker="#USERDIR">USERDIR</seealso> directory.
+ </p>
+ </section>
+
+ <section>
+ <title>Directory contents</title>
+ <taglist>
+ <tag><marker id="LOCALUSER"/>LOCALUSER</tag>
+ <item><p>The user name of the OS process running the Erlang virtual machine (emulator).</p>
+ </item>
+
+ <tag><marker id="SYSDIR"/>SYSDIR</tag>
+ <item><p>This is the directory holding the server's files:</p>
+ <list>
+ <item><marker id="SYSDIR-ssh_host_dsa_key"/><c>ssh_host_dsa_key</c> - private dss host key (optional)</item>
+ <item><marker id="SYSDIR-ssh_host_rsa_key"/><c>ssh_host_rsa_key</c> - private rsa host key (optional)</item>
+ <item><marker id="SYSDIR-ssh_host_ecdsa_key"/><c>ssh_host_ecdsa_key</c> - private ecdsa host key (optional)</item>
+ </list>
+ <p>At least one host key must be defined. The default value of SYSDIR is <marker id="#/etc/ssh"/><c>/etc/ssh</c>.
+ </p>
+ <p>For security reasons, this directory is normally accessible only to the root user.
+ </p>
+ <p>To change the SYSDIR, see the <seealso marker="#type-system_dir_daemon_option">system_dir</seealso> option.
+ </p>
+ </item>
+
+ <tag><marker id="USERDIR"/>USERDIR</tag>
+ <item><p>This is the directory holding the files:</p>
+ <list>
+ <item><marker id="USERDIR-authorized_keys"/><c>authorized_keys</c>
+ and, as second alternative
+ <marker id="USERDIR-authorized_keys2"/><c>authorized_keys2</c> -
+ the user's public keys are stored concatenated in one of those files.
+ </item>
+ <item><marker id="USERDIR-known_hosts"/><c>known_hosts</c> - host keys from hosts visited
+ concatenated. The file is created and used by the client.</item>
+ <item><marker id="USERDIR-id_dsa"/><c>id_dsa</c> - private dss user key (optional)</item>
+ <item><marker id="USERDIR-id_rsa"/><c>id_rsa</c> - private rsa user key (optional)</item>
+ <item><marker id="USERDIR-id_ecdsa"/><c>id_ecdsa</c> - private ecdsa user key (optional)</item>
+ </list>
+ <p>The default value of USERDIR is <c>/home/</c><seealso marker="#LOCALUSER"><c>LOCALUSER</c></seealso><c>/.ssh</c>.
+ </p>
+ <p>To change the USERDIR, see the <seealso marker="#type-user_dir_common_option">user_dir</seealso> option
+ </p>
+ </item>
+ </taglist>
+ </section>
+ </section>
+
+ <datatypes>
+ <datatype_title>Options for the default ssh_file callback module</datatype_title>
+ <datatype>
+ <name name="user_dir_common_option"/>
+ <desc>
+ <p>Sets the <seealso marker="#USERDIR">user directory</seealso>.</p>
+ </desc>
+ </datatype>
+
+ <datatype>
+ <name name="user_dir_fun_common_option"/>
+ <name name="user2dir"/>
+ <desc>
+ <p>Sets the <seealso marker="#USERDIR">user directory</seealso> dynamically
+ by evaluating the <c>user2dir</c> function.
+ </p>
+ </desc>
+ </datatype>
+
+ <datatype>
+ <name name="system_dir_daemon_option"/>
+ <desc>
+ <p>Sets the <seealso marker="#SYSDIR">system directory</seealso>.</p>
+ </desc>
+ </datatype>
+
+ <datatype>
+ <name name="pubkey_passphrase_client_options"/>
+ <desc>
+ <p>If the user's DSA, RSA or ECDSA key is protected by a passphrase, it can be
+ supplied with thoose options.
+ </p>
+ </desc>
+ </datatype>
+
+ </datatypes>
+
+ <funcs>
+ <func>
+ <name>host_key(Algorithm, DaemonOptions) -> {ok, Key} | {error, Reason}</name>
+ <fsummary></fsummary>
+ <desc>
+ <p><strong>Types and description</strong></p>
+ <p>See the api description in
+ <seealso marker="ssh:ssh_server_key_api#Module:host_key-2">ssh_server_key_api, Module:host_key/2</seealso>.
+ </p>
+ <p><strong>Options</strong></p>
+ <list>
+ <item><seealso marker="#type-system_dir_daemon_option">system_dir</seealso></item>
+ <!-- item>dsa_pass_phrase</item -->
+ <!-- item>rsa_pass_phrase</item -->
+ <!-- item>ecdsa_pass_phrase</item -->
+ </list>
+ <p><strong>Files</strong></p>
+ <list>
+ <item><seealso marker="#SYSDIR-ssh_host_rsa_key"><c>SYSDIR/ssh_host_rsa_key</c></seealso></item>
+ <item><seealso marker="#SYSDIR-ssh_host_dsa_key"><c>SYSDIR/ssh_host_dsa_key</c></seealso></item>
+ <item><seealso marker="#SYSDIR-ssh_host_ecdsa_key"><c>SYSDIR/ssh_host_ecdsa_key</c></seealso></item>
+ </list>
+ </desc>
+ </func>
+
+ <func>
+ <name>is_auth_key(PublicUserKey, User, DaemonOptions) -> Result</name>
+ <fsummary></fsummary>
+ <desc>
+ <p><strong>Types and description</strong></p>
+ <p>See the api description in
+ <seealso marker="ssh:ssh_server_key_api#Module:is_auth_key-3">ssh_server_key_api: Module:is_auth_key/3</seealso>.
+ </p>
+ <p><strong>Options</strong></p>
+ <list>
+ <item><seealso marker="#type-user_dir_fun_common_option">user_dir_fun</seealso></item>
+ <item><seealso marker="#type-user_dir_common_option">user_dir</seealso></item>
+ </list>
+ <p><strong>Files</strong></p>
+ <list>
+ <item><seealso marker="#USERDIR-authorized_keys"><c>USERDIR/authorized_keys</c></seealso></item>
+ <item><seealso marker="#USERDIR-authorized_keys2"><c>USERDIR/authorized_keys2</c></seealso></item>
+ </list>
+ </desc>
+ </func>
+
+ <func>
+ <name>add_host_key(HostNames, PublicHostKey, ConnectOptions) -> ok | {error, Reason}</name>
+ <fsummary></fsummary>
+ <desc>
+ <p><strong>Types and description</strong></p>
+ <p>See the api description in
+ <seealso marker="ssh:ssh_client_key_api#Module:add_host_key-3">ssh_client_key_api, Module:add_host_key/3</seealso>.
+ </p>
+ <p><strong>Option</strong></p>
+ <list>
+ <item><seealso marker="#type-user_dir_common_option">user_dir</seealso></item>
+ </list>
+ <p><strong>File</strong></p>
+ <list>
+ <item><seealso marker="#USERDIR-known_hosts"><c>USERDIR/known_hosts</c></seealso></item>
+ </list>
+ </desc>
+ </func>
+
+ <func>
+ <name>is_host_key(Key, Host, Algorithm, ConnectOptions) -> Result</name>
+ <fsummary></fsummary>
+ <desc>
+ <p><strong>Types and description</strong></p>
+ <p>See the api description in
+ <seealso marker="ssh:ssh_client_key_api#Module:is_host_key-4">ssh_client_key_api, Module:is_host_key/4</seealso>.
+ </p>
+ <p><strong>Option</strong></p>
+ <list>
+ <item><seealso marker="#type-user_dir_common_option">user_dir</seealso></item>
+ </list>
+ <p><strong>File</strong></p>
+ <list>
+ <item><seealso marker="#USERDIR-known_hosts"><c>USERDIR/known_hosts</c></seealso></item>
+ </list>
+ </desc>
+ </func>
+
+ <func>
+ <name>user_key(Algorithm, ConnectOptions) -> {ok, PrivateKey} | {error, Reason}</name>
+ <fsummary></fsummary>
+ <desc>
+ <p><strong>Types and description</strong></p>
+ <p>See the api description in
+ <seealso marker="ssh:ssh_client_key_api#Module:user_key-2">ssh_client_key_api, Module:user_key/2</seealso>.
+ </p>
+ <p><strong>Options</strong></p>
+ <list>
+ <item><seealso marker="#type-user_dir_common_option">user_dir</seealso></item>
+ <item><seealso marker="#type-pubkey_passphrase_client_options">dsa_pass_phrase</seealso></item>
+ <item><seealso marker="#type-pubkey_passphrase_client_options">rsa_pass_phrase</seealso></item>
+ <item><seealso marker="#type-pubkey_passphrase_client_options">ecdsa_pass_phrase</seealso></item>
+ </list>
+ <p><strong>Files</strong></p>
+ <list>
+ <item><seealso marker="#USERDIR-id_dsa"><c>USERDIR/id_dsa</c></seealso></item>
+ <item><seealso marker="#USERDIR-id_rsa"><c>USERDIR/id_rsa</c></seealso></item>
+ <item><seealso marker="#USERDIR-id_ecdsa"><c>USERDIR/id_ecdsa</c></seealso></item>
+ </list>
+ </desc>
+ </func>
+
+ </funcs>
+
+</erlref>
diff --git a/lib/ssh/doc/src/ssh_sftp.xml b/lib/ssh/doc/src/ssh_sftp.xml
index ea55126cb3..8c105147d6 100644
--- a/lib/ssh/doc/src/ssh_sftp.xml
+++ b/lib/ssh/doc/src/ssh_sftp.xml
@@ -425,7 +425,6 @@
<type>
<v>ChannelPid = pid()</v>
<v>Handle = term()</v>
- <v>Position = integer()</v>
<v>Len = integer()</v>
<v>Timeout = timeout()</v>
<v>Data = string() | binary()</v>
diff --git a/lib/ssh/doc/src/terminology.xml b/lib/ssh/doc/src/terminology.xml
new file mode 100644
index 0000000000..db1e08970d
--- /dev/null
+++ b/lib/ssh/doc/src/terminology.xml
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>2018</year>
+ <year>2018</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ </legalnotice>
+
+ <title>Terminology</title>
+ <prepared></prepared>
+ <docno></docno>
+ <approved></approved>
+ <date></date>
+ <rev></rev>
+ <file>terminology.xml</file>
+ </header>
+
+ <section>
+ <title>General Information</title>
+ <p>In the following terms that may cause confusion are explained.
+ </p>
+ </section>
+
+ <section>
+ <title>The term "user"</title>
+ <p>A "user" is a term that everyone understands intuitively. However, the understandings may differ which can
+ cause confusion.
+ </p>
+ <p>The term is used differently in <url href="http://www.openssh.com">OpenSSH</url> and SSH in Erlang/OTP.
+ The reason is the different environments and use cases that are not immediatly obvious.
+ </p>
+ <p>This chapter aims at explaining the differences and giving a rationale for why Erlang/OTP handles "user" as
+ it does.
+ </p>
+
+ <section>
+ <title>In OpenSSH</title>
+ <p>Many have been in contact with the command 'ssh' on a Linux machine (or similar) to remotly log in on
+ another machine. One types
+ </p>
+ <code>ssh host</code>
+ <p>to log in on the machine named <c>host</c>. The command prompts for your password on the remote <c>host</c> and
+ then you can read, write and execute as your <i>user name</i> has rights on the remote <c>host</c>. There are
+ stronger variants with pre-distributed keys or certificates, but that are for now just details in the
+ authentication process.
+ </p>
+ <p>You could log in as the user <c>anotheruser</c> with
+ </p>
+ <code>ssh anotheruser@host</code>
+ <p>and you will then be enabled to act as <c>anotheruser</c> on the <c>host</c> if authorized correctly.
+ </p>
+ <p>So what does <i>"your user name has rights"</i> mean? In a UNIX/Linux/etc context it is exactly as that context:
+ The <i>user</i> could read, write and execute programs according to the OS rules.
+ In addition, the user has a home directory (<c>$HOME</c>) and there is a <c>$HOME/.ssh/</c> directory
+ with ssh-specific files.
+ </p>
+ <section>
+ <title>SSH password authentication</title>
+ <p>When SSH tries to log in to a host, the ssh protocol communicates the user name (as a string) and a password.
+ The remote ssh server checks that there is such a user defined and that the provided password is acceptable.
+ </p>
+ <p>If so, the user is authorized.
+ </p>
+ </section>
+ <section>
+ <title>SSH public key authentication</title>
+ <p>This is a stronger method where the ssh protocol brings the user name, the user's public key and some
+ cryptographic information which we could ignore here.
+ </p>
+ <p>The ssh server on the remote host checks:
+ </p>
+ <list>
+ <item>That the <i>user</i> has a home directory,</item>
+ <item>that home directory contains a .ssh/ directory and</item>
+ <item>the .ssh/ directory contains the public key just received in the <c>authorized_keys</c> file</item>
+ </list>
+ <p>if so, the user is authorized.
+ </p>
+ </section>
+ <section>
+ <title>The SSH server on UNIX/Linux/etc after a succesful authentication</title>
+ <p>After a succesful incoming authentication, a new process runs as the just authenticated user.</p>
+ <p>Next step is to start a service according to the ssh request. In case of a request of a shell,
+ a new one is started which handles the OS-commands that arrives from the client (that's "you").
+ </p>
+ <p>In case of a sftp request, an sftp server is started in with the user's rights. So it could read, write or delete
+ files if allowed for that user.
+ </p>
+ </section>
+ </section>
+
+ <section>
+ <title>In Erlang/OTP SSH</title>
+ <p>For the Erlang/OTP SSH server the situation is different. The server executes in an Erlang process
+ in the Erlang emulator which in turn executes in an OS process. The emulator does not try to change its
+ user when authenticated over the SSH protocol.
+ So the remote user name is only for authentication purposes in the Erlang/OTP SSH application.
+ </p>
+ <section>
+ <title>Password authentication in Erlang SSH</title>
+ <p>The Erlang/OTP SSH server checks the user name and password in the following order:
+ </p>
+ <list type="ordered">
+ <item>If a
+ <seealso marker="ssh:ssh#option-pwdfun"><c>pwdfun</c></seealso>
+ is defined, that one is called and the returned boolean is the authentication result.
+ </item>
+ <item>Else, if the
+ <seealso marker="ssh:ssh#option-user_passwords"><c>user_passwords</c></seealso>
+ option is defined and the username and the password matches, the authentication is a success.
+ </item>
+ <item>Else, if the option
+ <seealso marker="ssh:ssh#option-password"><c>password</c></seealso>
+ is defined and matches the password the authentication is a success.
+ Note that the use of this option is not recommended in non-test code.
+ </item>
+ </list>
+ </section>
+ <section>
+ <title>Public key authentication in Erlang SSH</title>
+ <p>The user name, public key and cryptographic data (a signature) that is sent by the client, are used as follows
+ (some steps left out for clearity):
+ </p>
+ <list type="ordered">
+ <item>A callback module is selected using the options
+ <seealso marker="ssh:ssh#type-key_cb_common_option"><c>key_cb</c></seealso>.
+ </item>
+ <item>The callback module is used to check that the provided public key is one of the user's pre-stored.
+ In case of the default callback module, the files <c>authorized_keys</c> and <c>authorized_keys2</c>
+ are searched in a directory found in the following order:
+ <list>
+ <item>If the option
+ <seealso marker="ssh:ssh_file#type-user_dir_fun_common_option"><c>user_dir_fun</c></seealso>
+ is defined, that fun is called and the returned directory is used,
+ </item>
+ <item>Else, If the option
+ <seealso marker="ssh:ssh_file#type-user_dir_common_option"><c>user_dir</c></seealso>
+ is defined, that directory is used,
+ </item>
+ <item>Else the subdirectory <c>.ssh</c> in the home directory of the user executing
+ the OS process of the Erlang emulator is used.
+ </item>
+ </list>
+ If the provided public key is not found, the authentication fails.
+ </item>
+ <item>Finally, if the provided public key is found, the signature provided by the client is checked with
+ the public key.
+ </item>
+ </list>
+ </section>
+ <section>
+ <title>The Erlang/OTP SSH server after a succesful authentication</title>
+ <p>After a successful authentication an <i>Erlang process</i> is handling the service request from the remote
+ ssh client. The rights of that process are those of the user of the OS process running the Erlang emulator.
+ </p>
+ <p>If a shell service request arrives to the server, an <i>Erlang shell</i> is opened in the server's emulator.
+ The rights in that shell is independent of the just authenticated user.
+ </p>
+ <p>In case of an sftp request, an sftp server is started with the rights of the user of the Erlang emulator's OS
+ process. So with sftp the authenticated user does not influence the rights.
+ </p>
+ <p>So after an authentication, the user name is not used anymore and has no influence.
+ </p>
+ </section>
+ </section>
+ </section>
+</chapter>
+
diff --git a/lib/ssh/doc/src/usersguide.xml b/lib/ssh/doc/src/usersguide.xml
index 38ffa48cde..8a4df208d8 100644
--- a/lib/ssh/doc/src/usersguide.xml
+++ b/lib/ssh/doc/src/usersguide.xml
@@ -36,5 +36,6 @@
</description>
<xi:include href="introduction.xml"/>
<xi:include href="using_ssh.xml"/>
+ <xi:include href="terminology.xml"/>
<xi:include href="configure_algos.xml"/>
</part>
diff --git a/lib/ssh/doc/src/using_ssh.xml b/lib/ssh/doc/src/using_ssh.xml
index 80662e9a70..4455d5ecc5 100644
--- a/lib/ssh/doc/src/using_ssh.xml
+++ b/lib/ssh/doc/src/using_ssh.xml
@@ -74,16 +74,17 @@
<marker id="Running an Erlang ssh Daemon"></marker>
<title>Running an Erlang ssh Daemon</title>
- <p>The <c>system_dir</c> option must be a directory containing a host
- key file and it defaults to <c>/etc/ssh</c>. For details, see Section
- Configuration Files in <seealso
- marker="SSH_app">ssh(6)</seealso>.
+ <p>The
+ <seealso marker="ssh_file#type-system_dir_daemon_option"><c>system_dir</c></seealso>
+ option must be a directory containing a host key file and it defaults to <c>/etc/ssh</c>.
+ For details, see Section Configuration Files in <seealso marker="SSH_app">ssh(6)</seealso>.
</p>
<note><p>Normally, the <c>/etc/ssh</c> directory is only readable by root.</p>
</note>
- <p>The option <c>user_dir</c> defaults to directory <c>users ~/.ssh</c>.</p>
+ <p>The option <seealso marker="ssh_file#type-user_dir_common_option"><c>user_dir</c></seealso>
+ defaults to directory <c>users ~/.ssh</c>.</p>
<p><em>Step 1.</em> To run the example without root privileges,
generate new keys and host keys:</p>
diff --git a/lib/ssh/src/ssh.hrl b/lib/ssh/src/ssh.hrl
index 94b9f3a196..3ac74c4925 100644
--- a/lib/ssh/src/ssh.hrl
+++ b/lib/ssh/src/ssh.hrl
@@ -173,7 +173,7 @@
-type common_options() :: [ common_option() ].
-type common_option() ::
- user_dir_common_option()
+ ssh_file:user_dir_common_option()
| profile_common_option()
| max_idle_time_common_option()
| key_cb_common_option()
@@ -191,8 +191,6 @@
-define(COMMON_OPTION, common_option()).
-
--type user_dir_common_option() :: {user_dir, false | string()}.
-type profile_common_option() :: {profile, atom() }.
-type max_idle_time_common_option() :: {idle_time, timeout()}.
-type rekey_limit_common_option() :: {rekey_limit, Bytes::limit_bytes() |
@@ -223,14 +221,14 @@
{transport, {atom(),atom(),atom()} }
| {vsn, {non_neg_integer(),non_neg_integer()} }
| {tstflg, list(term())}
- | {user_dir_fun, fun()}
+ | ssh_file:user_dir_fun_common_option()
| {max_random_length_padding, non_neg_integer()} .
-type client_option() ::
pref_public_key_algs_client_option()
- | pubkey_passphrase_client_options()
+ | ssh_file:pubkey_passphrase_client_options()
| host_accepting_client_options()
| authentication_client_options()
| diffie_hellman_group_exchange_client_option()
@@ -246,10 +244,6 @@
-type pref_public_key_algs_client_option() :: {pref_public_key_algs, [pubkey_alg()] } .
--type pubkey_passphrase_client_options() :: {dsa_pass_phrase, string()}
- | {rsa_pass_phrase, string()}
- | {ecdsa_pass_phrase, string()} .
-
-type host_accepting_client_options() ::
{silently_accept_hosts, accept_hosts()}
| {user_interaction, boolean()}
@@ -311,7 +305,7 @@
-type send_ext_info_daemon_option() :: {send_ext_info, boolean()} .
-type authentication_daemon_options() ::
- {system_dir, string()}
+ ssh_file:system_dir_daemon_option()
| {auth_method_kb_interactive_data, prompt_texts() }
| {user_passwords, [{UserName::string(),Pwd::string()}]}
| {password, string()}
diff --git a/lib/ssh/src/ssh_file.erl b/lib/ssh/src/ssh_file.erl
index 832952ed52..669b0f9be2 100644
--- a/lib/ssh/src/ssh_file.erl
+++ b/lib/ssh/src/ssh_file.erl
@@ -39,6 +39,23 @@
is_auth_key/3]).
+-export_type([system_dir_daemon_option/0,
+ user_dir_common_option/0,
+ user_dir_fun_common_option/0,
+ pubkey_passphrase_client_options/0
+ ]).
+
+-type system_dir_daemon_option() :: {system_dir, string()}.
+-type user_dir_common_option() :: {user_dir, string()}.
+-type user_dir_fun_common_option() :: {user_dir_fun, user2dir()}.
+-type user2dir() :: fun((RemoteUserName::string()) -> UserDir :: string()) .
+
+-type pubkey_passphrase_client_options() :: {dsa_pass_phrase, string()}
+ | {rsa_pass_phrase, string()}
+ | {ecdsa_pass_phrase, string()} .
+
+
+
-define(PERM_700, 8#700).
-define(PERM_644, 8#644).
diff --git a/lib/ssh/test/property_test/ssh_eqc_client_info_timing.erl b/lib/ssh/test/property_test/ssh_eqc_client_info_timing.erl
index 6d0d8f5d99..f4b521356f 100644
--- a/lib/ssh/test/property_test/ssh_eqc_client_info_timing.erl
+++ b/lib/ssh/test/property_test/ssh_eqc_client_info_timing.erl
@@ -58,6 +58,7 @@
%%% Properties:
prop_seq(Config) ->
+ error_logger:tty(false),
{ok,Pid} = ssh_eqc_event_handler:add_report_handler(),
{_, _, Port} = init_daemon(Config),
numtests(1000,
@@ -66,16 +67,25 @@ prop_seq(Config) ->
send_bad_sequence(Port, Delay, Pid),
not any_relevant_error_report(Pid)
catch
- C:E -> io:format('~p:~p~n',[C,E]),
+ C:E:S -> ct:log("~p:~p~n~p",[C,E,S]),
false
end
)).
send_bad_sequence(Port, Delay, Pid) ->
- {ok,S} = gen_tcp:connect("localhost",Port,[]),
- gen_tcp:send(S,"Illegal info-string\r\n"),
- ssh_test_lib:sleep_microsec(Delay),
- gen_tcp:close(S).
+ send_bad_sequence(Port, Delay, Pid, 10).
+
+send_bad_sequence(Port, Delay, Pid, N) ->
+ case gen_tcp:connect("localhost",Port,[]) of
+ {ok,S} ->
+ gen_tcp:send(S,"Illegal info-string\r\n"),
+ ssh_test_lib:sleep_microsec(Delay),
+ gen_tcp:close(S);
+
+ {error,econnreset} when N>0 ->
+ timer:sleep(1),
+ send_bad_sequence(Port, Delay, Pid, N-1)
+ end.
any_relevant_error_report(Pid) ->
{ok, Reports} = ssh_eqc_event_handler:get_reports(Pid),
diff --git a/lib/ssh/test/property_test/ssh_eqc_client_server.erl b/lib/ssh/test/property_test/ssh_eqc_client_server.erl
index 39d0b4e410..acb0faa0c7 100644
--- a/lib/ssh/test/property_test/ssh_eqc_client_server.erl
+++ b/lib/ssh/test/property_test/ssh_eqc_client_server.erl
@@ -22,25 +22,27 @@
-module(ssh_eqc_client_server).
-compile(export_all).
+
+-proptest([proper]).
--include_lib("common_test/include/ct.hrl").
-
--ifdef(PROPER).
-%% Proper is not supported.
--else.
--ifdef(TRIQ).
-%% Proper is not supported.
+-ifndef(PROPER).
-else.
+%% Only use proper
+%%
+%% Previously only EQC was supported, but the changes to support PROPER is not
+%% just a wrapper. Since we do not have access to eqc we can't test the changes
+%% so therefore eqc is disabeled.
+%% However, with access to eqc it ought to be quite easy to re-enable eqc by
+%% studying the diff.
+-include_lib("proper/include/proper.hrl").
+-define(MOD_eqc,proper).
+
+-include_lib("common_test/include/ct.hrl").
%% Limit the testing time on CI server... this needs to be improved in % from total budget.
-define(TESTINGTIME(Prop), eqc:testing_time(30,Prop)).
-
--include_lib("eqc/include/eqc.hrl").
--include_lib("eqc/include/eqc_statem.hrl").
--eqc_group_commands(true).
-
-define(SSH_DIR,"ssh_eqc_client_server_dirs").
-define(sec, *1000).
@@ -51,10 +53,6 @@
port
}).
--record(conn,{ref,
- srvr_ref
- }).
-
-record(chan, {ref,
conn_ref,
subsystem,
@@ -65,7 +63,7 @@
initialized = false,
servers = [], % [#srvr{}]
clients = [],
- connections = [], % [#conn{}]
+ connections = [],
channels = [], % [#chan{}]
data_dir
}).
@@ -80,9 +78,8 @@
-define(SUBSYSTEMS, ["echo1", "echo2", "echo3", "echo4"]).
--define(SERVER_ADDRESS, { {127,1,0,choose(1,254)}, % IP
- choose(1024,65535) % Port
- }).
+-define(SERVER_ADDRESS, {127,0,0,1}). % Server listening IP. Darwin, Solaris & FreeBSD
+ % dislikes all other in 127.0.0.0/24
-define(SERVER_EXTRA_OPTIONS, [{parallel_login,bool()}] ).
@@ -104,10 +101,12 @@
%% To be called as eqc:quickcheck( ssh_eqc_client_server:prop_seq() ).
prop_seq() ->
- ?TESTINGTIME(do_prop_seq(?SSH_DIR)).
+ error_logger:tty(false),
+ ?TESTINGTIME(do_prop_seq(?SSH_DIR)).
%% To be called from a common_test test suite
prop_seq(CT_Config) ->
+ error_logger:tty(false),
do_prop_seq(full_path(?SSH_DIR, CT_Config)).
@@ -124,10 +123,12 @@ full_path(SSHdir, CT_Config) ->
SSHdir).
%%%----
prop_parallel() ->
+ error_logger:tty(false),
?TESTINGTIME(do_prop_parallel(?SSH_DIR)).
%% To be called from a common_test test suite
prop_parallel(CT_Config) ->
+ error_logger:tty(false),
do_prop_parallel(full_path(?SSH_DIR, CT_Config)).
do_prop_parallel(DataDir) ->
@@ -139,22 +140,22 @@ do_prop_parallel(DataDir) ->
end).
%%%----
-prop_parallel_multi() ->
- ?TESTINGTIME(do_prop_parallel_multi(?SSH_DIR)).
-
-%% To be called from a common_test test suite
-prop_parallel_multi(CT_Config) ->
- do_prop_parallel_multi(full_path(?SSH_DIR, CT_Config)).
-
-do_prop_parallel_multi(DataDir) ->
- setup_rsa(DataDir),
- ?FORALL(Repetitions,?SHRINK(1,[10]),
- ?FORALL(Cmds,parallel_commands(?MODULE),
- ?ALWAYS(Repetitions,
- begin
- {H,Sf,Result} = run_parallel_commands(?MODULE,Cmds,[{data_dir,DataDir}]),
- present_result(?MODULE, Cmds, {H,Sf,Result}, Result==ok)
- end))).
+%% prop_parallel_multi() ->
+%% ?TESTINGTIME(do_prop_parallel_multi(?SSH_DIR)).
+
+%% %% To be called from a common_test test suite
+%% prop_parallel_multi(CT_Config) ->
+%% do_prop_parallel_multi(full_path(?SSH_DIR, CT_Config)).
+
+%% do_prop_parallel_multi(DataDir) ->
+%% setup_rsa(DataDir),
+%% ?FORALL(Repetitions,?SHRINK(1,[10]),
+%% ?FORALL(Cmds,parallel_commands(?MODULE),
+%% ?ALWAYS(Repetitions,
+%% begin
+%% {H,Sf,Result} = run_parallel_commands(?MODULE,Cmds,[{data_dir,DataDir}]),
+%% present_result(?MODULE, Cmds, {H,Sf,Result}, Result==ok)
+%% end))).
%%%================================================================
%%% State machine spec
@@ -169,13 +170,50 @@ initial_state(DataDir) ->
ssh:start().
%%%----------------
-weight(S, ssh_send) -> 5*length([C || C<-S#state.channels, has_subsyst(C)]);
-weight(S, ssh_start_subsyst) -> 3*length([C || C<-S#state.channels, no_subsyst(C)]);
+weight(S, ssh_send) -> 20*length([C || C<-S#state.channels, has_subsyst(C)]);
+weight(S, ssh_start_subsyst) -> 10*length([C || C<-S#state.channels, no_subsyst(C)]);
weight(S, ssh_close_channel) -> 2*length([C || C<-S#state.channels, has_subsyst(C)]);
-weight(S, ssh_open_channel) -> length(S#state.connections);
+weight(S, ssh_open_channel) -> 2*length(S#state.connections);
weight(_S, _) -> 1.
%%%----------------
+fns() -> [initial_state,
+ ssh_server,
+ ssh_client,
+ ssh_open_connection,
+ ssh_close_connection,
+ ssh_open_channel,
+ ssh_close_channel,
+ ssh_start_subsyst,
+ ssh_send
+ ].
+
+call_f(Name, Sfx) ->
+ case get({Name,Sfx}) of
+ undefined -> F = list_to_atom(lists:concat([Name,"_",Sfx])),
+ put({Name,Sfx}, F),
+ F;
+ F when is_atom(F) -> F
+ end.
+
+-define(call(Name, What, Args), apply(?MODULE, call_f(Name,What), Args)).
+
+symbolic_call(S,Name) -> {call, ?MODULE, Name, ?call(Name,args,[S])}.
+
+may_generate(S, F) -> ?call(F,pre,[S]).
+
+command(S) ->
+ frequency([{weight(S,F), symbolic_call(S,F)} || F <- fns(),
+ may_generate(S, F)]
+ ).
+
+precondition(S, {call,_M,F,As}) -> try ?call(F, pre, [S,As])
+ catch _:undef -> try ?call(F,pre,[S]) catch _:undef -> true end
+ end.
+next_state(S, Res, {call,_M,F,As}) -> try ?call(F, next, [S,Res,As]) catch _:undef -> S end.
+postcondition(S, {call,_M,F,As}, Res) -> try ?call(F, post, [S,As,Res]) catch _:undef -> true end.
+
+%%%----------------
%%% Initialize
initial_state_pre(S) -> not S#state.initialized.
@@ -200,24 +238,34 @@ ssh_server_pre(S) -> S#state.initialized andalso
ssh_server_args(_) -> [?SERVER_ADDRESS, {var,data_dir}, ?SERVER_EXTRA_OPTIONS].
-ssh_server({IP,Port}, DataDir, ExtraOptions) ->
- ok(ssh:daemon(IP, Port,
- [
- {system_dir, system_dir(DataDir)},
- {user_dir, user_dir(DataDir)},
- {subsystems, [{SS, {ssh_eqc_subsys, [SS]}} || SS <- ?SUBSYSTEMS]}
- | ExtraOptions
- ])).
-
-ssh_server_post(_S, _Args, {error,eaddrinuse}) -> true;
-ssh_server_post(_S, _Args, Result) -> is_ok(Result).
-
-ssh_server_next(S, {error,eaddrinuse}, _) -> S;
-ssh_server_next(S, Result, [{IP,Port},_,_]) ->
- S#state{servers=[#srvr{ref = Result,
- address = IP,
- port = Port}
- | S#state.servers]}.
+ssh_server(IP0, DataDir, ExtraOptions) ->
+ case ssh:daemon(IP0, 0,
+ [
+ {system_dir, system_dir(DataDir)},
+ {user_dir, user_dir(DataDir)},
+ {subsystems, [{SS, {ssh_eqc_subsys, [SS]}} || SS <- ?SUBSYSTEMS]}
+ | ExtraOptions
+ ]) of
+ {ok,DaemonRef} ->
+ case ssh:daemon_info(DaemonRef) of
+ {ok, Props} ->
+ Port = proplists:get_value(port,Props),
+ IP = proplists:get_value(ip,Props),
+ #srvr{ref = DaemonRef,
+ address = IP,
+ port = Port};
+ Other ->
+ Other
+ end;
+ Other ->
+ Other
+ end.
+
+ssh_server_post(_S, _Args, #srvr{port=Port}) -> (0 < Port) andalso (Port < 65536);
+ssh_server_post(_S, _Args, _) -> false.
+
+ssh_server_next(S, Srvr, _) ->
+ S#state{servers=[Srvr | S#state.servers]}.
%%%----------------
%%% Start a new client
@@ -271,8 +319,7 @@ ssh_open_connection(#srvr{address=Ip, port=Port}, DataDir) ->
ssh_open_connection_post(_S, _Args, Result) -> is_ok(Result).
-ssh_open_connection_next(S, ConnRef, [#srvr{ref=SrvrRef},_]) ->
- S#state{connections=[#conn{ref=ConnRef, srvr_ref=SrvrRef}|S#state.connections]}.
+ssh_open_connection_next(S, ConnRef, [_,_]) -> S#state{connections=[ConnRef|S#state.connections]}.
%%%----------------
%%% Stop a new connection
@@ -282,12 +329,12 @@ ssh_close_connection_pre(S) -> S#state.connections /= [].
ssh_close_connection_args(S) -> [oneof(S#state.connections)].
-ssh_close_connection(#conn{ref=ConnectionRef}) -> ssh:close(ConnectionRef).
+ssh_close_connection(ConnectionRef) -> ssh:close(ConnectionRef).
-ssh_close_connection_next(S, _, [Conn=#conn{ref=ConnRef}]) ->
- S#state{connections = S#state.connections--[Conn],
- channels = [C || C <- S#state.channels,
- C#chan.conn_ref /= ConnRef]
+ssh_close_connection_next(S, _, [ConnRef]) ->
+ S#state{connections = S#state.connections--[ConnRef],
+ channels = [C || C <- S#state.channels,
+ C#chan.conn_ref /= ConnRef]
}.
%%%----------------
@@ -299,14 +346,14 @@ ssh_open_channel_pre(S) -> S#state.connections /= [].
ssh_open_channel_args(S) -> [oneof(S#state.connections)].
%%% For re-arrangement in parallel tests.
-ssh_open_channel_pre(S,[C]) -> lists:member(C,S#state.connections).
+ssh_open_channel_pre(S,[C]) when is_record(S,state) -> lists:member(C,S#state.connections).
-ssh_open_channel(#conn{ref=ConnectionRef}) ->
+ssh_open_channel(ConnectionRef) ->
ok(ssh_connection:session_channel(ConnectionRef, 20?sec)).
ssh_open_channel_post(_S, _Args, Result) -> is_ok(Result).
-ssh_open_channel_next(S, ChannelRef, [#conn{ref=ConnRef}]) ->
+ssh_open_channel_next(S, ChannelRef, [ConnRef]) ->
S#state{channels=[#chan{ref=ChannelRef,
conn_ref=ConnRef}
| S#state.channels]}.
@@ -326,9 +373,7 @@ ssh_close_channel_next(S, _, [C]) ->
S#state{channels = [Ci || Ci <- S#state.channels,
sig(C) /= sig(Ci)]}.
-
sig(C) -> {C#chan.ref, C#chan.conn_ref}.
-
%%%----------------
%%% Start a sub system on a channel
@@ -361,9 +406,10 @@ ssh_start_subsyst_next(S, _Result, [C,SS,Pid|_]) ->
ssh_send_pre(S) -> lists:any(fun has_subsyst/1, S#state.channels).
-ssh_send_args(S) -> [oneof(lists:filter(fun has_subsyst/1, S#state.channels)),
- choose(0,1),
- message()].
+ssh_send_args(S) ->
+ [oneof(lists:filter(fun has_subsyst/1, S#state.channels)),
+ choose(0,1),
+ message()].
%% For re-arrangement in parallel tests.
ssh_send_pre(S, [C|_]) -> lists:member(C, S#state.channels).
@@ -388,17 +434,17 @@ ssh_send(C=#chan{conn_ref=ConnectionRef, ref=ChannelRef, client_pid=Pid}, Type,
end).
ssh_send_blocking(_S, _Args) ->
- true.
+ true.
ssh_send_post(_S, [C,_,Msg], Response) when is_binary(Response) ->
- Expected = ssh_eqc_subsys:response(modify_msg(C,Msg), C#chan.subsystem),
+ Expected = ssh_eqc_subsys:response(modify_msg(C,Msg), C#chan.subsystem),
case Response of
Expected -> true;
_ -> {send_failed, size(Response), size(Expected)}
end;
ssh_send_post(_S, _Args, Response) ->
- {error,Response}.
+ {error,Response}.
modify_msg(_, <<>>) -> <<>>;
@@ -440,7 +486,11 @@ present_result(_Module, Cmds, _Triple, true) ->
true)))));
present_result(Module, Cmds, Triple, false) ->
- pretty_commands(Module, Cmds, Triple, [{show_states,true}], false).
+ pretty_comands(Module, Cmds, Triple, [{show_states,true}], false),
+ false. % Proper dislikes non-boolean results while eqc treats non-true as false.
+
+pretty_comands(Module, Cmds, Triple, Opts, Bool) ->
+ ct:log("Module = ~p,~n Cmds = ~p,~n Triple = ~p,~n Opts = ~p,~n Bool = ~p",[Module, Cmds, Triple, Opts, Bool]).
@@ -476,23 +526,35 @@ traverse_commands(Fseq, Fpar, {Seq, ParLs}) -> lists:append([Fseq(Seq)|Fpar(ParL
print_frequencies() -> print_frequencies(10).
print_frequencies(Ngroups) -> fun([]) -> io:format('Empty list!~n',[]);
- (L ) -> print_frequencies(L,Ngroups,0,element(1,lists:last(L)))
+ (L ) ->
+ try
+ M = lists:last(L),
+ Max = if is_integer(M) -> M;
+ is_tuple(M) -> element(1,L)
+ end,
+ print_frequencies(L,Ngroups,0,Max)
+ catch
+ C:E:S ->
+ ct:pal("~p:~p ~p:~p~n~p~n~p",[?MODULE,?LINE,C,E,S,L])
+ end
end.
+
print_frequencies(Ngroups, MaxValue) -> fun(L) -> print_frequencies(L,Ngroups,0,MaxValue) end.
print_frequencies(L, N, Min, Max) when N>Max -> print_frequencies(L++[{N,0}], N, Min, N);
-print_frequencies(L, N, Min, Max) ->
-%%io:format('L=~p~n',[L]),
+print_frequencies(L, N, Min, Max0) ->
try
+ Interval = round((Max0-Min)/N),
+ Max = Max0 + (Max0 rem Interval),
IntervalUpperLimits =
lists:reverse(
- [Max | tl(lists:reverse(lists:seq(Min,Max,round((Max-Min)/N))))]
+ [Max | tl(lists:reverse(lists:seq(Min,Max,Interval)))]
),
{Acc0,_} = lists:mapfoldl(fun(Upper,Lower) ->
{{{Lower,Upper},0}, Upper+1}
end, hd(IntervalUpperLimits), tl(IntervalUpperLimits)),
- Fs0 = get_frequencies(L, Acc0),
+ Fs0 = get_frequencies(L, Acc0),
SumVal = lists:sum([V||{_,V}<-Fs0]),
Fs = with_percentage(Fs0, SumVal),
Mean = mean(L),
@@ -517,7 +579,6 @@ print_frequencies(L, N, Min, Max) ->
|| {Interval={Rlow,Rhigh},Val,Percent} <- Fs],
io:format('~*c ~*c~n',[2*Npos_range,32,Npos_value+2,$-]),
io:format('~*c ~*w~n',[2*Npos_range,32,Npos_value,SumVal])
- %%,io:format('L=~p~n',[L])
catch
C:E ->
io:format('*** Faild printing (~p:~p) for~n~p~n',[C,E,L])
@@ -527,6 +588,8 @@ get_frequencies([{I,Num}|T], [{{Lower,Upper},Cnt}|Acc]) when Lower=<I,I=<Upper -
get_frequencies(T, [{{Lower,Upper},Cnt+Num}|Acc]);
get_frequencies(L=[{I,_Num}|_], [Ah={{_Lower,Upper},_Cnt}|Acc]) when I>Upper ->
[Ah | get_frequencies(L,Acc)];
+get_frequencies([I|T], Acc) when is_integer(I) ->
+ get_frequencies([{I,1}|T], Acc);
get_frequencies([], Acc) ->
Acc.
@@ -616,4 +679,3 @@ erase_dir(Dir) ->
file:del_dir(Dir).
-endif.
--endif.
diff --git a/lib/ssh/test/ssh_property_test_SUITE.erl b/lib/ssh/test/ssh_property_test_SUITE.erl
index 3318b86d39..9aaac898a0 100644
--- a/lib/ssh/test/ssh_property_test_SUITE.erl
+++ b/lib/ssh/test/ssh_property_test_SUITE.erl
@@ -46,8 +46,9 @@ groups() ->
[{messages, [], [decode,
decode_encode]},
{client_server, [], [client_server_sequential,
- client_server_parallel,
- client_server_parallel_multi]}
+ client_server_parallel
+ %% client_server_parallel_multi
+ ]}
].
@@ -62,7 +63,7 @@ end_per_suite(Config) ->
%%% if we run proper.
init_per_group(client_server, Config) ->
case proplists:get_value(property_test_tool,Config) of
- eqc -> Config;
+ proper -> Config;
X -> {skip, lists:concat([X," is not supported"])}
end;
init_per_group(_, Config) ->
diff --git a/lib/ssl/doc/src/notes.xml b/lib/ssl/doc/src/notes.xml
index c54acfcf53..d117641496 100644
--- a/lib/ssl/doc/src/notes.xml
+++ b/lib/ssl/doc/src/notes.xml
@@ -27,6 +27,35 @@
</header>
<p>This document describes the changes made to the SSL application.</p>
+<section><title>SSL 9.0.3</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Correct alert handling with new TLS sender process, from
+ ssl-9.0.2. CLOSE ALERTS could under some circumstances be
+ encoded using an incorrect cipher state. This would cause
+ the peer to regard them as unknown messages.</p>
+ <p>
+ Own Id: OTP-15337 Aux Id: ERL-738 </p>
+ </item>
+ <item>
+ <p>
+ Correct handling of socket packet option with new TLS
+ sender process, from ssl-9.0.2. When changing the socket
+ option {packet, 1|2|3|4} with ssl:setopts/2 the option
+ must internally be propagated to the sender process as
+ well as the reader process as this particular option also
+ affects the data to be sent.</p>
+ <p>
+ Own Id: OTP-15348 Aux Id: ERL-747 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>SSL 9.0.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/ssl/doc/src/ssl.xml b/lib/ssl/doc/src/ssl.xml
index 6efa022a79..ef99ace351 100644
--- a/lib/ssl/doc/src/ssl.xml
+++ b/lib/ssl/doc/src/ssl.xml
@@ -209,7 +209,24 @@
elliptic_curves => [oid] | undefined,
sni => string() | undefined}
}</c></p></item>
-
+
+ <tag><c>signature_scheme() =</c></tag>
+ <item>
+ <p><c>rsa_pkcs1_sha256</c></p>
+ <p><c>| rsa_pkcs1_sha384</c></p>
+ <p><c>| rsa_pkcs1_sha512</c></p>
+ <p><c>| ecdsa_secp256r1_sha256</c></p>
+ <p><c>| ecdsa_secp384r1_sha384</c></p>
+ <p><c>| ecdsa_secp521r1_sha512</c></p>
+ <p><c>| rsa_pss_rsae_sha256</c></p>
+ <p><c>| rsa_pss_rsae_sha384</c></p>
+ <p><c>| rsa_pss_rsae_sha512</c></p>
+ <p><c>| rsa_pss_pss_sha256</c></p>
+ <p><c>| rsa_pss_pss_sha384</c></p>
+ <p><c>| rsa_pss_pss_sha512</c></p>
+ <p><c>| rsa_pkcs1_sha1</c></p>
+ <p><c>| ecdsa_sha1</c></p>
+ </item>
</taglist>
</section>
@@ -709,6 +726,26 @@ fun(srp, Username :: string(), UserState :: term()) ->
that may be selected. Default support for {md5, rsa} removed in ssl-8.0
</p>
</item>
+ <tag><marker id="signature_algs_cert"/><c>{signature_algs_cert, [signature_scheme()]}</c></tag>
+ <item>
+ <p>
+ In addition to the signature_algorithms extension from TLS 1.2,
+ <url href="http://www.ietf.org/rfc/rfc8446.txt#section-4.2.3">TLS 1.3
+ (RFC 5246 Section 4.2.3)</url>adds the signature_algorithms_cert extension
+ which enables having special requirements on the signatures used in the
+ certificates that differs from the requirements on digital signatures as a whole.
+ If this is not required this extension is not needed.
+ </p>
+ <p>
+ The client will send a signature_algorithms_cert extension (ClientHello),
+ if TLS version 1.3 or later is used, and the signature_algs_cert option is
+ explicitly specified. By default, only the signature_algs extension is sent.
+ </p>
+ <p>
+ The signature schemes shall be ordered according to the client's preference
+ (favorite choice first).
+ </p>
+ </item>
</taglist>
</section>
@@ -860,7 +897,6 @@ fun(srp, Username :: string(), UserState :: term()) ->
negotiation, introduced in TLS-1.2. The algorithms will also be offered to the client if a
client certificate is requested. For more details see the <seealso marker="#client_signature_algs">corresponding client option</seealso>.
</p> </item>
-
</taglist>
</section>
diff --git a/lib/ssl/src/Makefile b/lib/ssl/src/Makefile
index af36d04a99..d4cb5350d1 100644
--- a/lib/ssl/src/Makefile
+++ b/lib/ssl/src/Makefile
@@ -83,6 +83,7 @@ MODULES= \
tls_socket \
dtls_socket \
tls_record \
+ tls_record_1_3\
dtls_record \
ssl_record \
ssl_v3 \
@@ -95,7 +96,7 @@ INTERNAL_HRL_FILES = \
tls_connection.hrl dtls_connection.hrl ssl_connection.hrl \
ssl_handshake.hrl tls_handshake.hrl tls_handshake_1_3.hrl dtls_handshake.hrl \
ssl_api.hrl ssl_internal.hrl \
- ssl_record.hrl tls_record.hrl dtls_record.hrl ssl_srp.hrl
+ ssl_record.hrl tls_record.hrl tls_record_1_3.hrl dtls_record.hrl ssl_srp.hrl
ERL_FILES= \
$(MODULES:%=%.erl) \
diff --git a/lib/ssl/src/dtls_handshake.erl b/lib/ssl/src/dtls_handshake.erl
index c8daa11433..55aa8174a3 100644
--- a/lib/ssl/src/dtls_handshake.erl
+++ b/lib/ssl/src/dtls_handshake.erl
@@ -194,7 +194,7 @@ handle_client_hello(Version,
?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY);
_ ->
#{key_exchange := KeyExAlg} = ssl_cipher_format:suite_definition(CipherSuite),
- case ssl_handshake:select_hashsign(ClientHashSigns, Cert, KeyExAlg,
+ case ssl_handshake:select_hashsign({ClientHashSigns, undefined}, Cert, KeyExAlg,
SupportedHashSigns, TLSVersion) of
#alert{} = Alert ->
Alert;
diff --git a/lib/ssl/src/dtls_record.erl b/lib/ssl/src/dtls_record.erl
index 9eb0d8e2d7..b7346d3ec8 100644
--- a/lib/ssl/src/dtls_record.erl
+++ b/lib/ssl/src/dtls_record.erl
@@ -499,23 +499,22 @@ encode_dtls_cipher_text(Type, {MajVer, MinVer}, Fragment,
WriteState#{sequence_number => Seq + 1}}.
encode_plain_text(Type, Version, Data, #{compression_state := CompS0,
+ cipher_state := CipherS0,
epoch := Epoch,
sequence_number := Seq,
- cipher_state := CipherS0,
security_parameters :=
#security_parameters{
cipher_type = ?AEAD,
- bulk_cipher_algorithm =
- BulkCipherAlgo,
+ bulk_cipher_algorithm = BCAlg,
compression_algorithm = CompAlg}
} = WriteState0) ->
{Comp, CompS1} = ssl_record:compress(CompAlg, Data, CompS0),
- AAD = calc_aad(Type, Version, Epoch, Seq),
+ AAD = start_additional_data(Type, Version, Epoch, Seq),
+ CipherS = ssl_record:nonce_seed(BCAlg, <<?UINT16(Epoch), ?UINT48(Seq)>>, CipherS0),
+ WriteState = WriteState0#{compression_state => CompS1,
+ cipher_state => CipherS},
TLSVersion = dtls_v1:corresponding_tls_version(Version),
- {CipherFragment, CipherS1} =
- ssl_cipher:cipher_aead(BulkCipherAlgo, CipherS0, Seq, AAD, Comp, TLSVersion),
- {CipherFragment, WriteState0#{compression_state => CompS1,
- cipher_state => CipherS1}};
+ ssl_record:cipher_aead(TLSVersion, Comp, WriteState, AAD);
encode_plain_text(Type, Version, Fragment, #{compression_state := CompS0,
epoch := Epoch,
sequence_number := Seq,
@@ -547,9 +546,10 @@ decode_cipher_text(#ssl_tls{type = Type, version = Version,
BulkCipherAlgo,
compression_algorithm = CompAlg}} = ReadState0,
ConnnectionStates0) ->
- AAD = calc_aad(Type, Version, Epoch, Seq),
+ AAD = start_additional_data(Type, Version, Epoch, Seq),
+ CipherS1 = ssl_record:nonce_seed(BulkCipherAlgo, <<?UINT16(Epoch), ?UINT48(Seq)>>, CipherS0),
TLSVersion = dtls_v1:corresponding_tls_version(Version),
- case ssl_cipher:decipher_aead(BulkCipherAlgo, CipherS0, Seq, AAD, CipherFragment, TLSVersion) of
+ case ssl_record:decipher_aead(BulkCipherAlgo, CipherS1, AAD, CipherFragment, TLSVersion) of
{PlainFragment, CipherState} ->
{Plain, CompressionS1} = ssl_record:uncompress(CompAlg,
PlainFragment, CompressionS0),
@@ -600,7 +600,7 @@ mac_hash({Major, Minor}, MacAlg, MacSecret, Epoch, SeqNo, Type, Length, Fragment
Fragment],
dtls_v1:hmac_hash(MacAlg, MacSecret, Value).
-calc_aad(Type, {MajVer, MinVer}, Epoch, SeqNo) ->
+start_additional_data(Type, {MajVer, MinVer}, Epoch, SeqNo) ->
<<?UINT16(Epoch), ?UINT48(SeqNo), ?BYTE(Type), ?BYTE(MajVer), ?BYTE(MinVer)>>.
%%--------------------------------------------------------------------
diff --git a/lib/ssl/src/inet_tls_dist.erl b/lib/ssl/src/inet_tls_dist.erl
index 7f1a77f601..ce771343fe 100644
--- a/lib/ssl/src/inet_tls_dist.erl
+++ b/lib/ssl/src/inet_tls_dist.erl
@@ -568,7 +568,7 @@ gen_close(Driver, Socket) ->
get_address_resolver(EpmdModule, Driver) ->
case erlang:function_exported(EpmdModule, address_please, 3) of
true -> {EpmdModule, address_please};
- _ -> {Driver, getaddr}
+ _ -> {erl_epmd, address_please}
end.
%% ------------------------------------------------------------
diff --git a/lib/ssl/src/ssl.app.src b/lib/ssl/src/ssl.app.src
index 17173d7c79..0d92c7b447 100644
--- a/lib/ssl/src/ssl.app.src
+++ b/lib/ssl/src/ssl.app.src
@@ -7,6 +7,7 @@
tls_handshake,
tls_handshake_1_3,
tls_record,
+ tls_record_1_3,
tls_socket,
tls_v1,
ssl_v3,
diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl
index ef9aac34bf..3319aadd68 100644
--- a/lib/ssl/src/ssl.erl
+++ b/lib/ssl/src/ssl.erl
@@ -614,6 +614,25 @@ getopts(#sslsocket{}, OptionTags) ->
%%
%% Description: Sets options
%%--------------------------------------------------------------------
+setopts(#sslsocket{pid = [Pid, Sender]}, Options0) when is_pid(Pid), is_list(Options0) ->
+ try proplists:expand([{binary, [{mode, binary}]},
+ {list, [{mode, list}]}], Options0) of
+ Options ->
+ case proplists:get_value(packet, Options, undefined) of
+ undefined ->
+ ssl_connection:set_opts(Pid, Options);
+ PacketOpt ->
+ case tls_sender:setopts(Sender, [{packet, PacketOpt}]) of
+ ok ->
+ ssl_connection:set_opts(Pid, Options);
+ Error ->
+ Error
+ end
+ end
+ catch
+ _:_ ->
+ {error, {options, {not_a_proplist, Options0}}}
+ end;
setopts(#sslsocket{pid = [Pid|_]}, Options0) when is_pid(Pid), is_list(Options0) ->
try proplists:expand([{binary, [{mode, binary}]},
{list, [{mode, list}]}], Options0) of
@@ -975,10 +994,7 @@ handle_options(Opts0, Role, Host) ->
proplists:get_value(
signature_algs_cert,
Opts,
- default_option_role(server,
- tls_v1:default_signature_schemes(HighestVersion),
- Role
- )),
+ undefined), %% Do not send by default
tls_version(HighestVersion)),
%% Server side option
reuse_session = handle_option(reuse_session, Opts, ReuseSessionFun),
@@ -1041,8 +1057,8 @@ handle_options(Opts0, Role, Host) ->
alpn_preferred_protocols, next_protocols_advertised,
client_preferred_next_protocols, log_alert, log_level,
server_name_indication, honor_cipher_order, padding_check, crl_check, crl_cache,
- fallback, signature_algs, eccs, honor_ecc_order, beast_mitigation,
- max_handshake_size, handshake, customize_hostname_check],
+ fallback, signature_algs, signature_algs_cert, eccs, honor_ecc_order,
+ beast_mitigation, max_handshake_size, handshake, customize_hostname_check],
SockOpts = lists:foldl(fun(Key, PropList) ->
proplists:delete(Key, PropList)
end, Opts, SslOptions),
@@ -1326,8 +1342,6 @@ handle_signature_algorithms_option(Value, Version) when is_list(Value)
_ ->
Value
end;
-handle_signature_algorithms_option(_, Version) when Version >= {3, 4} ->
- handle_signature_algorithms_option(tls_v1:default_signature_schemes(Version), Version);
handle_signature_algorithms_option(_, _Version) ->
undefined.
@@ -1645,6 +1659,14 @@ new_ssl_options([{signature_algs, Value} | Rest], #ssl_options{} = Opts, RecordC
handle_hashsigns_option(Value,
tls_version(RecordCB:highest_protocol_version()))},
RecordCB);
+new_ssl_options([{signature_algs_cert, Value} | Rest], #ssl_options{} = Opts, RecordCB) ->
+ new_ssl_options(
+ Rest,
+ Opts#ssl_options{signature_algs_cert =
+ handle_signature_algorithms_option(
+ Value,
+ tls_version(RecordCB:highest_protocol_version()))},
+ RecordCB);
new_ssl_options([{protocol, dtls = Value} | Rest], #ssl_options{} = Opts, dtls_record = RecordCB) ->
new_ssl_options(Rest, Opts#ssl_options{protocol = Value}, RecordCB);
new_ssl_options([{protocol, tls = Value} | Rest], #ssl_options{} = Opts, tls_record = RecordCB) ->
diff --git a/lib/ssl/src/ssl_cipher.erl b/lib/ssl/src/ssl_cipher.erl
index 9bb2beaebd..cfcdcb8ac5 100644
--- a/lib/ssl/src/ssl_cipher.erl
+++ b/lib/ssl/src/ssl_cipher.erl
@@ -35,7 +35,7 @@
-include_lib("public_key/include/public_key.hrl").
-export([security_parameters/2, security_parameters/3,
- cipher_init/3, decipher/6, cipher/5, decipher_aead/6, cipher_aead/6,
+ cipher_init/3, nonce_seed/2, decipher/6, cipher/5, aead_encrypt/5, aead_decrypt/6,
suites/1, all_suites/1, crypto_support_filters/0,
chacha_suites/1, anonymous_suites/1, psk_suites/1, psk_suites_anon/1,
srp_suites/0, srp_suites_anon/0,
@@ -50,6 +50,8 @@
-type cipher_enum() :: integer().
+-export_type([cipher_enum/0]).
+
%%--------------------------------------------------------------------
-spec security_parameters(ssl_cipher_format:cipher_suite(), #security_parameters{}) ->
#security_parameters{}.
@@ -93,10 +95,15 @@ cipher_init(?RC4, IV, Key) ->
#cipher_state{iv = IV, key = Key, state = State};
cipher_init(?AES_GCM, IV, Key) ->
<<Nonce:64>> = random_bytes(8),
- #cipher_state{iv = IV, key = Key, nonce = Nonce};
+ #cipher_state{iv = IV, key = Key, nonce = Nonce, tag_len = 16};
+cipher_init(?CHACHA20_POLY1305, IV, Key) ->
+ #cipher_state{iv = IV, key = Key, tag_len = 16};
cipher_init(_BCA, IV, Key) ->
#cipher_state{iv = IV, key = Key}.
+nonce_seed(Seed, CipherState) ->
+ CipherState#cipher_state{nonce = Seed}.
+
%%--------------------------------------------------------------------
-spec cipher(cipher_enum(), #cipher_state{}, binary(), iodata(), ssl_record:ssl_version()) ->
{binary(), #cipher_state{}}.
@@ -128,32 +135,16 @@ cipher(?AES_CBC, CipherState, Mac, Fragment, Version) ->
crypto:block_encrypt(aes_cbc256, Key, IV, T)
end, block_size(aes_128_cbc), CipherState, Mac, Fragment, Version).
-%%--------------------------------------------------------------------
--spec cipher_aead(cipher_enum(), #cipher_state{}, integer(), binary(), iodata(), ssl_record:ssl_version()) ->
- {binary(), #cipher_state{}}.
-%%
-%% Description: Encrypts the data and protects associated data (AAD) using chipher
-%% described by cipher_enum() and updating the cipher state
-%% Use for suites that use authenticated encryption with associated data (AEAD)
-%%-------------------------------------------------------------------
-cipher_aead(?AES_GCM, CipherState, SeqNo, AAD, Fragment, Version) ->
- aead_cipher(aes_gcm, CipherState, SeqNo, AAD, Fragment, Version);
-cipher_aead(?CHACHA20_POLY1305, CipherState, SeqNo, AAD, Fragment, Version) ->
- aead_cipher(chacha20_poly1305, CipherState, SeqNo, AAD, Fragment, Version).
-
-aead_cipher(chacha20_poly1305, #cipher_state{key=Key} = CipherState, SeqNo, AAD0, Fragment, _Version) ->
- CipherLen = erlang:iolist_size(Fragment),
- AAD = <<AAD0/binary, ?UINT16(CipherLen)>>,
- Nonce = ?uint64(SeqNo),
- {Content, CipherTag} = crypto:block_encrypt(chacha20_poly1305, Key, Nonce, {AAD, Fragment}),
- {<<Content/binary, CipherTag/binary>>, CipherState};
-aead_cipher(Type, #cipher_state{key=Key, iv = IV0, nonce = Nonce} = CipherState, _SeqNo, AAD0, Fragment, _Version) ->
- CipherLen = erlang:iolist_size(Fragment),
- AAD = <<AAD0/binary, ?UINT16(CipherLen)>>,
- <<Salt:4/bytes, _/binary>> = IV0,
- IV = <<Salt/binary, Nonce:64/integer>>,
- {Content, CipherTag} = crypto:block_encrypt(Type, Key, IV, {AAD, Fragment}),
- {<<Nonce:64/integer, Content/binary, CipherTag/binary>>, CipherState#cipher_state{nonce = Nonce + 1}}.
+aead_encrypt(Type, Key, Nonce, Fragment, AdditionalData) ->
+ crypto:block_encrypt(aead_type(Type), Key, Nonce, {AdditionalData, Fragment}).
+
+aead_decrypt(Type, Key, Nonce, CipherText, CipherTag, AdditionalData) ->
+ crypto:block_decrypt(aead_type(Type), Key, Nonce, {AdditionalData, CipherText, CipherTag}).
+
+aead_type(?AES_GCM) ->
+ aes_gcm;
+aead_type(?CHACHA20_POLY1305) ->
+ chacha20_poly1305.
build_cipher_block(BlockSz, Mac, Fragment) ->
TotSz = byte_size(Mac) + erlang:iolist_size(Fragment) + 1,
@@ -220,19 +211,6 @@ decipher(?AES_CBC, HashSz, CipherState, Fragment, Version, PaddingCheck) ->
crypto:block_decrypt(aes_cbc256, Key, IV, T)
end, CipherState, HashSz, Fragment, Version, PaddingCheck).
-%%--------------------------------------------------------------------
--spec decipher_aead(cipher_enum(), #cipher_state{}, integer(), binary(), binary(), ssl_record:ssl_version()) ->
- {binary(), #cipher_state{}} | #alert{}.
-%%
-%% Description: Decrypts the data and checks the associated data (AAD) MAC using
-%% cipher described by cipher_enum() and updating the cipher state.
-%% Use for suites that use authenticated encryption with associated data (AEAD)
-%%-------------------------------------------------------------------
-decipher_aead(?AES_GCM, CipherState, SeqNo, AAD, Fragment, Version) ->
- aead_decipher(aes_gcm, CipherState, SeqNo, AAD, Fragment, Version);
-decipher_aead(?CHACHA20_POLY1305, CipherState, SeqNo, AAD, Fragment, Version) ->
- aead_decipher(chacha20_poly1305, CipherState, SeqNo, AAD, Fragment, Version).
-
block_decipher(Fun, #cipher_state{key=Key, iv=IV} = CipherState0,
HashSz, Fragment, Version, PaddingCheck) ->
try
@@ -263,34 +241,6 @@ block_decipher(Fun, #cipher_state{key=Key, iv=IV} = CipherState0,
?ALERT_REC(?FATAL, ?BAD_RECORD_MAC, decryption_failed)
end.
-aead_ciphertext_to_state(chacha20_poly1305, SeqNo, _IV, AAD0, Fragment, _Version) ->
- CipherLen = size(Fragment) - 16,
- <<CipherText:CipherLen/bytes, CipherTag:16/bytes>> = Fragment,
- AAD = <<AAD0/binary, ?UINT16(CipherLen)>>,
- Nonce = ?uint64(SeqNo),
- {Nonce, AAD, CipherText, CipherTag};
-aead_ciphertext_to_state(_, _SeqNo, <<Salt:4/bytes, _/binary>>, AAD0, Fragment, _Version) ->
- CipherLen = size(Fragment) - 24,
- <<ExplicitNonce:8/bytes, CipherText:CipherLen/bytes, CipherTag:16/bytes>> = Fragment,
- AAD = <<AAD0/binary, ?UINT16(CipherLen)>>,
- Nonce = <<Salt/binary, ExplicitNonce/binary>>,
- {Nonce, AAD, CipherText, CipherTag}.
-
-aead_decipher(Type, #cipher_state{key = Key, iv = IV} = CipherState,
- SeqNo, AAD0, Fragment, Version) ->
- try
- {Nonce, AAD, CipherText, CipherTag} = aead_ciphertext_to_state(Type, SeqNo, IV, AAD0, Fragment, Version),
- case crypto:block_decrypt(Type, Key, Nonce, {AAD, CipherText, CipherTag}) of
- Content when is_binary(Content) ->
- {Content, CipherState};
- _ ->
- ?ALERT_REC(?FATAL, ?BAD_RECORD_MAC, decryption_failed)
- end
- catch
- _:_ ->
- ?ALERT_REC(?FATAL, ?BAD_RECORD_MAC, decryption_failed)
- end.
-
%%--------------------------------------------------------------------
-spec suites(ssl_record:ssl_version()) -> [ssl_cipher_format:cipher_suite()].
%%
diff --git a/lib/ssl/src/ssl_cipher.hrl b/lib/ssl/src/ssl_cipher.hrl
index 1febc52e43..5891f3a7cc 100644
--- a/lib/ssl/src/ssl_cipher.hrl
+++ b/lib/ssl/src/ssl_cipher.hrl
@@ -48,7 +48,8 @@
iv,
key,
state,
- nonce
+ nonce,
+ tag_len
}).
%%% TLS_NULL_WITH_NULL_NULL is specified and is the initial state of a
diff --git a/lib/ssl/src/ssl_connection.erl b/lib/ssl/src/ssl_connection.erl
index 3eb3b0a980..6e602eac23 100644
--- a/lib/ssl/src/ssl_connection.erl
+++ b/lib/ssl/src/ssl_connection.erl
@@ -848,7 +848,9 @@ certify(internal, #certificate_request{} = CertRequest,
role = client,
ssl_options = #ssl_options{signature_algs = SupportedHashSigns},
negotiated_version = Version} = State0, Connection) ->
- case ssl_handshake:select_hashsign(CertRequest, Cert, SupportedHashSigns, ssl:tls_version(Version)) of
+ case ssl_handshake:select_hashsign(CertRequest, Cert,
+ SupportedHashSigns,
+ ssl:tls_version(Version)) of
#alert {} = Alert ->
handle_own_alert(Alert, Version, ?FUNCTION_NAME, State0);
NegotiatedHashSign ->
diff --git a/lib/ssl/src/ssl_handshake.erl b/lib/ssl/src/ssl_handshake.erl
index ba0b670091..1e57dfd710 100644
--- a/lib/ssl/src/ssl_handshake.erl
+++ b/lib/ssl/src/ssl_handshake.erl
@@ -1015,12 +1015,17 @@ client_hello_extensions(Version, CipherSuites,
{3,4} ->
HelloExtensions#{client_hello_versions =>
#client_hello_versions{versions = Versions},
- signature_algs_cert =>
- #signature_scheme_list{signature_scheme_list = SignatureSchemes}};
+ signature_algs_cert =>
+ signature_scheme_list(SignatureSchemes)};
_Else ->
HelloExtensions
end.
+signature_scheme_list(undefined) ->
+ undefined;
+signature_scheme_list(SignatureSchemes) ->
+ #signature_scheme_list{signature_scheme_list = SignatureSchemes}.
+
handle_client_hello_extensions(RecordCB, Random, ClientCipherSuites,
Exts, Version,
#ssl_options{secure_renegotiate = SecureRenegotation,
@@ -1128,26 +1133,50 @@ select_hashsign(_, _, KeyExAlgo, _, _Version) when KeyExAlgo == dh_anon;
{null, anon};
%% The signature_algorithms extension was introduced with TLS 1.2. Ignore it if we have
%% negotiated a lower version.
-select_hashsign(HashSigns, Cert, KeyExAlgo,
- undefined, {Major, Minor} = Version) when Major >= 3 andalso Minor >= 3->
- select_hashsign(HashSigns, Cert, KeyExAlgo, tls_v1:default_signature_algs(Version), Version);
-select_hashsign(#hash_sign_algos{hash_sign_algos = HashSigns}, Cert, KeyExAlgo, SupportedHashSigns,
- {Major, Minor}) when Major >= 3 andalso Minor >= 3 ->
- #'OTPCertificate'{tbsCertificate = TBSCert} = public_key:pkix_decode_cert(Cert, otp),
- #'OTPSubjectPublicKeyInfo'{algorithm = {_, SubjAlgo, _}} =
- TBSCert#'OTPTBSCertificate'.subjectPublicKeyInfo,
-
- SubSign = sign_algo(SubjAlgo),
-
- case lists:filter(fun({_, S} = Algos) when S == SubSign ->
- is_acceptable_hash_sign(Algos, KeyExAlgo, SupportedHashSigns);
- (_) ->
- false
- end, HashSigns) of
- [] ->
- ?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY, no_suitable_signature_algorithm);
- [HashSign | _] ->
- HashSign
+select_hashsign({ClientHashSigns, ClientSignatureSchemes},
+ Cert, KeyExAlgo, undefined, {Major, Minor} = Version)
+ when Major >= 3 andalso Minor >= 3->
+ select_hashsign({ClientHashSigns, ClientSignatureSchemes}, Cert, KeyExAlgo,
+ tls_v1:default_signature_algs(Version), Version);
+select_hashsign({#hash_sign_algos{hash_sign_algos = ClientHashSigns},
+ ClientSignatureSchemes0},
+ Cert, KeyExAlgo, SupportedHashSigns, {Major, Minor})
+ when Major >= 3 andalso Minor >= 3 ->
+ ClientSignatureSchemes = get_signature_scheme(ClientSignatureSchemes0),
+ {SignAlgo0, Param, PublicKeyAlgo0} = get_cert_params(Cert),
+ SignAlgo = sign_algo(SignAlgo0),
+ PublicKeyAlgo = public_key_algo(PublicKeyAlgo0),
+
+ %% RFC 5246 (TLS 1.2)
+ %% If the client provided a "signature_algorithms" extension, then all
+ %% certificates provided by the server MUST be signed by a
+ %% hash/signature algorithm pair that appears in that extension.
+ %%
+ %% RFC 8446 (TLS 1.3)
+ %% TLS 1.3 provides two extensions for indicating which signature
+ %% algorithms may be used in digital signatures. The
+ %% "signature_algorithms_cert" extension applies to signatures in
+ %% certificates and the "signature_algorithms" extension, which
+ %% originally appeared in TLS 1.2, applies to signatures in
+ %% CertificateVerify messages.
+ %%
+ %% If no "signature_algorithms_cert" extension is
+ %% present, then the "signature_algorithms" extension also applies to
+ %% signatures appearing in certificates.
+ case is_supported_sign(SignAlgo, Param, ClientHashSigns, ClientSignatureSchemes) of
+ true ->
+ case lists:filter(fun({_, S} = Algos) when S == PublicKeyAlgo ->
+ is_acceptable_hash_sign(Algos, KeyExAlgo, SupportedHashSigns);
+ (_) ->
+ false
+ end, ClientHashSigns) of
+ [] ->
+ ?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY, no_suitable_signature_algorithm);
+ [HashSign | _] ->
+ HashSign
+ end;
+ false ->
+ ?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY, no_suitable_signature_algorithm)
end;
select_hashsign(_, Cert, _, _, Version) ->
#'OTPCertificate'{tbsCertificate = TBSCert} = public_key:pkix_decode_cert(Cert, otp),
@@ -1161,21 +1190,23 @@ select_hashsign(_, Cert, _, _, Version) ->
%%
%% Description: Handles signature algorithms selection for certificate requests (client)
%%--------------------------------------------------------------------
-select_hashsign(#certificate_request{hashsign_algorithms = #hash_sign_algos{hash_sign_algos = HashSigns},
- certificate_types = Types}, Cert, SupportedHashSigns,
+select_hashsign(#certificate_request{
+ hashsign_algorithms = #hash_sign_algos{
+ hash_sign_algos = HashSigns},
+ certificate_types = Types},
+ Cert,
+ SupportedHashSigns,
{Major, Minor}) when Major >= 3 andalso Minor >= 3->
- #'OTPCertificate'{tbsCertificate = TBSCert} = public_key:pkix_decode_cert(Cert, otp),
- #'OTPCertificate'{tbsCertificate = TBSCert,
- signatureAlgorithm = {_,SignAlgo, _}} = public_key:pkix_decode_cert(Cert, otp),
- #'OTPSubjectPublicKeyInfo'{algorithm = {_, SubjAlgo, _}} =
- TBSCert#'OTPTBSCertificate'.subjectPublicKeyInfo,
-
- Sign = sign_algo(SignAlgo),
- SubSign = sign_algo(SubjAlgo),
-
- case is_acceptable_cert_type(SubSign, HashSigns, Types) andalso is_supported_sign(Sign, HashSigns) of
+ {SignAlgo0, Param, PublicKeyAlgo0} = get_cert_params(Cert),
+ SignAlgo = sign_algo(SignAlgo0),
+ PublicKeyAlgo = public_key_algo(PublicKeyAlgo0),
+
+ case is_acceptable_cert_type(PublicKeyAlgo, Types) andalso
+ %% certificate_request has no "signature_algorithms_cert"
+ %% extension in TLS 1.2.
+ is_supported_sign(SignAlgo, Param, HashSigns, undefined) of
true ->
- case lists:filter(fun({_, S} = Algos) when S == SubSign ->
+ case lists:filter(fun({_, S} = Algos) when S == PublicKeyAlgo ->
is_acceptable_hash_sign(Algos, SupportedHashSigns);
(_) ->
false
@@ -1188,8 +1219,38 @@ select_hashsign(#certificate_request{hashsign_algorithms = #hash_sign_algos{hash
false ->
?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY, no_suitable_signature_algorithm)
end;
-select_hashsign(#certificate_request{}, Cert, _, Version) ->
- select_hashsign(undefined, Cert, undefined, [], Version).
+select_hashsign(#certificate_request{certificate_types = Types}, Cert, _, Version) ->
+ {_, _, PublicKeyAlgo0} = get_cert_params(Cert),
+ PublicKeyAlgo = public_key_algo(PublicKeyAlgo0),
+
+ %% Check cert even for TLS 1.0/1.1
+ case is_acceptable_cert_type(PublicKeyAlgo, Types) of
+ true ->
+ select_hashsign(undefined, Cert, undefined, [], Version);
+ false ->
+ ?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY, no_suitable_signature_algorithm)
+ end.
+
+
+%% Gets the relevant parameters of a certificate:
+%% - signature algorithm
+%% - parameters of the signature algorithm
+%% - public key algorithm (key type)
+get_cert_params(Cert) ->
+ #'OTPCertificate'{tbsCertificate = TBSCert,
+ signatureAlgorithm =
+ {_,SignAlgo, Param}} = public_key:pkix_decode_cert(Cert, otp),
+ #'OTPSubjectPublicKeyInfo'{algorithm = {_, PublicKeyAlgo, _}} =
+ TBSCert#'OTPTBSCertificate'.subjectPublicKeyInfo,
+ {SignAlgo, Param, PublicKeyAlgo}.
+
+
+get_signature_scheme(undefined) ->
+ undefined;
+get_signature_scheme(#signature_scheme_list{
+ signature_scheme_list = ClientSignatureSchemes}) ->
+ ClientSignatureSchemes.
+
%%--------------------------------------------------------------------
-spec select_hashsign_algs({atom(), atom()}| undefined, oid(), ssl_record:ssl_version()) ->
@@ -1258,33 +1319,30 @@ int_to_bin(I) ->
L = (length(integer_to_list(I, 16)) + 1) div 2,
<<I:(L*8)>>.
-certificate_types(_, {N, M}) when N >= 3 andalso M >= 3 ->
- case proplists:get_bool(ecdsa,
- proplists:get_value(public_keys, crypto:supports())) of
- true ->
- <<?BYTE(?ECDSA_SIGN), ?BYTE(?RSA_SIGN), ?BYTE(?DSS_SIGN)>>;
- false ->
- <<?BYTE(?RSA_SIGN), ?BYTE(?DSS_SIGN)>>
- end;
-
-certificate_types(#{key_exchange := KeyExchange}, _) when KeyExchange == rsa;
- KeyExchange == dh_rsa;
- KeyExchange == dhe_rsa;
- KeyExchange == ecdhe_rsa ->
- <<?BYTE(?RSA_SIGN)>>;
-
-certificate_types(#{key_exchange := KeyExchange}, _) when KeyExchange == dh_dss;
- KeyExchange == dhe_dss;
- KeyExchange == srp_dss ->
- <<?BYTE(?DSS_SIGN)>>;
-
-certificate_types(#{key_exchange := KeyExchange}, _) when KeyExchange == dh_ecdsa;
- KeyExchange == dhe_ecdsa;
- KeyExchange == ecdh_ecdsa;
- KeyExchange == ecdhe_ecdsa ->
- <<?BYTE(?ECDSA_SIGN)>>;
+%% TLS 1.0+
+%% The end-entity certificate provided by the client MUST contain a
+%% key that is compatible with certificate_types.
+certificate_types(_, {N, M}) when N >= 3 andalso M >= 1 ->
+ ECDSA = supported_cert_type_or_empty(ecdsa, ?ECDSA_SIGN),
+ RSA = supported_cert_type_or_empty(rsa, ?RSA_SIGN),
+ DSS = supported_cert_type_or_empty(dss, ?DSS_SIGN),
+ <<ECDSA/binary,RSA/binary,DSS/binary>>;
+%% SSL 3.0
certificate_types(_, _) ->
- <<?BYTE(?RSA_SIGN)>>.
+ RSA = supported_cert_type_or_empty(rsa, ?RSA_SIGN),
+ DSS = supported_cert_type_or_empty(dss, ?DSS_SIGN),
+ <<RSA/binary,DSS/binary>>.
+
+%% Returns encoded certificate_type if algorithm is supported
+supported_cert_type_or_empty(Algo, Type) ->
+ case proplists:get_bool(
+ Algo,
+ proplists:get_value(public_keys, crypto:supports())) of
+ true ->
+ <<?BYTE(Type)>>;
+ false ->
+ <<>>
+ end.
certificate_authorities(CertDbHandle, CertDbRef) ->
Authorities = certificate_authorities_from_db(CertDbHandle, CertDbRef),
@@ -2355,17 +2413,6 @@ handle_srp_extension(undefined, Session) ->
handle_srp_extension(#srp{username = Username}, Session) ->
Session#session{srp_username = Username}.
-
-sign_algo(?rsaEncryption) ->
- rsa;
-sign_algo(?'id-ecPublicKey') ->
- ecdsa;
-sign_algo(?'id-dsa') ->
- dsa;
-sign_algo(Alg) ->
- {_, Sign} =public_key:pkix_sign_types(Alg),
- Sign.
-
is_acceptable_hash_sign( _, KeyExAlgo, _) when
KeyExAlgo == psk;
KeyExAlgo == dhe_psk;
@@ -2381,15 +2428,80 @@ is_acceptable_hash_sign(Algos,_, SupportedHashSigns) ->
is_acceptable_hash_sign(Algos, SupportedHashSigns) ->
lists:member(Algos, SupportedHashSigns).
-is_acceptable_cert_type(Sign, _HashSigns, Types) ->
+is_acceptable_cert_type(Sign, Types) ->
lists:member(sign_type(Sign), binary_to_list(Types)).
-is_supported_sign(Sign, HashSigns) ->
- [] =/= lists:dropwhile(fun({_, S}) when S =/= Sign ->
- true;
- (_)->
- false
- end, HashSigns).
+%% signature_algorithms_cert = undefined
+is_supported_sign(SignAlgo, _, HashSigns, undefined) ->
+ lists:member(SignAlgo, HashSigns);
+
+%% {'SignatureAlgorithm',{1,2,840,113549,1,1,11},'NULL'}
+is_supported_sign({Hash, Sign}, 'NULL', _, SignatureSchemes) ->
+ Fun = fun (Scheme, Acc) ->
+ {H0, S0, _} = ssl_cipher:scheme_to_components(Scheme),
+ S1 = case S0 of
+ rsa_pkcs1 -> rsa;
+ S -> S
+ end,
+ H1 = case H0 of
+ sha1 -> sha;
+ H -> H
+ end,
+ Acc orelse (Sign =:= S1 andalso
+ Hash =:= H1)
+ end,
+ lists:foldl(Fun, false, SignatureSchemes);
+
+%% TODO: Implement validation for the curve used in the signature
+%% RFC 3279 - 2.2.3 ECDSA Signature Algorithm
+%% When the ecdsa-with-SHA1 algorithm identifier appears as the
+%% algorithm field in an AlgorithmIdentifier, the encoding MUST omit the
+%% parameters field. That is, the AlgorithmIdentifier SHALL be a
+%% SEQUENCE of one component: the OBJECT IDENTIFIER ecdsa-with-SHA1.
+%%
+%% The elliptic curve parameters in the subjectPublicKeyInfo field of
+%% the certificate of the issuer SHALL apply to the verification of the
+%% signature.
+is_supported_sign({Hash, Sign}, _Param, _, SignatureSchemes) ->
+ Fun = fun (Scheme, Acc) ->
+ {H0, S0, _} = ssl_cipher:scheme_to_components(Scheme),
+ S1 = case S0 of
+ rsa_pkcs1 -> rsa;
+ S -> S
+ end,
+ H1 = case H0 of
+ sha1 -> sha;
+ H -> H
+ end,
+ Acc orelse (Sign =:= S1 andalso
+ Hash =:= H1)
+ end,
+ lists:foldl(Fun, false, SignatureSchemes).
+
+%% SupportedPublicKeyAlgorithms PUBLIC-KEY-ALGORITHM-CLASS ::= {
+%% dsa | rsa-encryption | dh | kea | ec-public-key }
+public_key_algo(?rsaEncryption) ->
+ rsa;
+public_key_algo(?'id-ecPublicKey') ->
+ ecdsa;
+public_key_algo(?'id-dsa') ->
+ dsa.
+
+%% SupportedSignatureAlgorithms SIGNATURE-ALGORITHM-CLASS ::= {
+%% dsa-with-sha1 | dsaWithSHA1 | md2-with-rsa-encryption |
+%% md5-with-rsa-encryption | sha1-with-rsa-encryption | sha-1with-rsa-encryption |
+%% sha224-with-rsa-encryption |
+%% sha256-with-rsa-encryption |
+%% sha384-with-rsa-encryption |
+%% sha512-with-rsa-encryption |
+%% ecdsa-with-sha1 |
+%% ecdsa-with-sha224 |
+%% ecdsa-with-sha256 |
+%% ecdsa-with-sha384 |
+%% ecdsa-with-sha512 }
+sign_algo(Alg) ->
+ public_key:pkix_sign_types(Alg).
+
sign_type(rsa) ->
?RSA_SIGN;
sign_type(dsa) ->
diff --git a/lib/ssl/src/ssl_handshake.hrl b/lib/ssl/src/ssl_handshake.hrl
index 36aefd5e22..b14bc21862 100644
--- a/lib/ssl/src/ssl_handshake.hrl
+++ b/lib/ssl/src/ssl_handshake.hrl
@@ -401,7 +401,7 @@
%% Datagram Transport Layer Security (DTLS) Heartbeat Extension
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Not supported
--define(HEARTBEAT, 15).
+-define(HS_HEARTBEAT, 15).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% RFC 6962 Certificate Transparency
diff --git a/lib/ssl/src/ssl_record.erl b/lib/ssl/src/ssl_record.erl
index 446bb6c56a..ddc83821b4 100644
--- a/lib/ssl/src/ssl_record.erl
+++ b/lib/ssl/src/ssl_record.erl
@@ -45,7 +45,7 @@
-export([compress/3, uncompress/3, compressions/0]).
%% Payload encryption/decryption
--export([cipher/4, decipher/4, cipher_aead/4, is_correct_mac/2]).
+-export([cipher/4, decipher/4, cipher_aead/4, decipher_aead/5, is_correct_mac/2, nonce_seed/3]).
-export_type([ssl_version/0, ssl_atom_version/0, connection_states/0, connection_state/0]).
@@ -305,22 +305,20 @@ cipher(Version, Fragment,
{CipherFragment, CipherS1} =
ssl_cipher:cipher(BulkCipherAlgo, CipherS0, MacHash, Fragment, Version),
{CipherFragment, WriteState0#{cipher_state => CipherS1}}.
-%% %%--------------------------------------------------------------------
-%% -spec cipher_aead(ssl_version(), iodata(), connection_state(), MacHash::binary()) ->
-%% {CipherFragment::binary(), connection_state()}.
-%% %%
-%% %% Description: Payload encryption
+%%--------------------------------------------------------------------
+-spec cipher_aead(ssl_version(), iodata(), connection_state(), AAD::binary()) ->
+ {CipherFragment::binary(), connection_state()}.
+
+%% Description: Payload encryption
%% %%--------------------------------------------------------------------
cipher_aead(Version, Fragment,
#{cipher_state := CipherS0,
- sequence_number := SeqNo,
security_parameters :=
#security_parameters{bulk_cipher_algorithm =
BulkCipherAlgo}
} = WriteState0, AAD) ->
-
{CipherFragment, CipherS1} =
- ssl_cipher:cipher_aead(BulkCipherAlgo, CipherS0, SeqNo, AAD, Fragment, Version),
+ cipher_aead(BulkCipherAlgo, CipherS0, AAD, Fragment, Version),
{CipherFragment, WriteState0#{cipher_state => CipherS1}}.
%%--------------------------------------------------------------------
@@ -343,10 +341,39 @@ decipher(Version, CipherFragment,
#alert{} = Alert ->
Alert
end.
+%%--------------------------------------------------------------------
+-spec decipher_aead(ssl_cipher:cipher_enum(), #cipher_state{},
+ binary(), binary(), ssl_record:ssl_version()) ->
+ {binary(), #cipher_state{}} | #alert{}.
+%%
+%% Description: Decrypts the data and checks the associated data (AAD) MAC using
+%% cipher described by cipher_enum() and updating the cipher state.
+%% Use for suites that use authenticated encryption with associated data (AEAD)
+%%-------------------------------------------------------------------
+decipher_aead(Type, #cipher_state{key = Key} = CipherState, AAD0, CipherFragment, _) ->
+ try
+ Nonce = decrypt_nonce(Type, CipherState, CipherFragment),
+ {AAD, CipherText, CipherTag} = aead_ciphertext_split(Type, CipherState, CipherFragment, AAD0),
+ case ssl_cipher:aead_decrypt(Type, Key, Nonce, CipherText, CipherTag, AAD) of
+ Content when is_binary(Content) ->
+ {Content, CipherState};
+ _ ->
+ ?ALERT_REC(?FATAL, ?BAD_RECORD_MAC, decryption_failed)
+ end
+ catch
+ _:_ ->
+ ?ALERT_REC(?FATAL, ?BAD_RECORD_MAC, decryption_failed)
+ end.
+
+nonce_seed(?CHACHA20_POLY1305, Seed, CipherState) ->
+ ssl_cipher:nonce_seed(Seed, CipherState);
+nonce_seed(_,_, CipherState) ->
+ CipherState.
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
+
empty_connection_state(ConnectionEnd, BeastMitigation) ->
SecParams = empty_security_params(ConnectionEnd),
#{security_parameters => SecParams,
@@ -399,3 +426,37 @@ initial_security_params(ConnectionEnd) ->
compression_algorithm = ?NULL},
ssl_cipher:security_parameters(?TLS_NULL_WITH_NULL_NULL, SecParams).
+cipher_aead(?CHACHA20_POLY1305 = Type, #cipher_state{key=Key} = CipherState, AAD0, Fragment, _Version) ->
+ AAD = end_additional_data(AAD0, erlang:iolist_size(Fragment)),
+ Nonce = encrypt_nonce(Type, CipherState),
+ {Content, CipherTag} = ssl_cipher:aead_encrypt(Type, Key, Nonce, Fragment, AAD),
+ {<<Content/binary, CipherTag/binary>>, CipherState};
+cipher_aead(Type, #cipher_state{key=Key, nonce = ExplicitNonce} = CipherState, AAD0, Fragment, _Version) ->
+ AAD = end_additional_data(AAD0, erlang:iolist_size(Fragment)),
+ Nonce = encrypt_nonce(Type, CipherState),
+ {Content, CipherTag} = ssl_cipher:aead_encrypt(Type, Key, Nonce, Fragment, AAD),
+ {<<ExplicitNonce:64/integer, Content/binary, CipherTag/binary>>, CipherState#cipher_state{nonce = ExplicitNonce + 1}}.
+
+encrypt_nonce(?CHACHA20_POLY1305, #cipher_state{nonce = Nonce, iv = IV}) ->
+ crypto:exor(<<?UINT32(0), Nonce/binary>>, IV);
+encrypt_nonce(?AES_GCM, #cipher_state{iv = IV, nonce = ExplicitNonce}) ->
+ <<Salt:4/bytes, _/binary>> = IV,
+ <<Salt/binary, ExplicitNonce:64/integer>>.
+
+decrypt_nonce(?CHACHA20_POLY1305, #cipher_state{nonce = Nonce, iv = IV}, _) ->
+ crypto:exor(<<Nonce:96/unsigned-big-integer>>, IV);
+decrypt_nonce(?AES_GCM, #cipher_state{iv = <<Salt:4/bytes, _/binary>>}, <<ExplicitNonce:8/bytes, _/binary>>) ->
+ <<Salt/binary, ExplicitNonce/binary>>.
+
+aead_ciphertext_split(?CHACHA20_POLY1305, #cipher_state{tag_len = Len}, CipherTextFragment, AAD) ->
+ CipherLen = size(CipherTextFragment) - Len,
+ <<CipherText:CipherLen/bytes, CipherTag:Len/bytes>> = CipherTextFragment,
+ {end_additional_data(AAD, CipherLen), CipherText, CipherTag};
+aead_ciphertext_split(?AES_GCM, #cipher_state{tag_len = Len}, CipherTextFragment, AAD) ->
+ CipherLen = size(CipherTextFragment) - (Len + 8), %% 8 is length of explicit Nonce
+ << _:8/bytes, CipherText:CipherLen/bytes, CipherTag:Len/bytes>> = CipherTextFragment,
+ {end_additional_data(AAD, CipherLen), CipherText, CipherTag}.
+
+end_additional_data(AAD, Len) ->
+ <<AAD/binary, ?UINT16(Len)>>.
+
diff --git a/lib/ssl/src/ssl_record.hrl b/lib/ssl/src/ssl_record.hrl
index e8ce50040f..4cb19d9d0d 100644
--- a/lib/ssl/src/ssl_record.hrl
+++ b/lib/ssl/src/ssl_record.hrl
@@ -140,6 +140,7 @@
-define(ALERT, 21).
-define(HANDSHAKE, 22).
-define(APPLICATION_DATA, 23).
+-define(HEARTBEAT, 24).
-define(MAX_PLAIN_TEXT_LENGTH, 16384).
-define(MAX_COMPRESSED_LENGTH, (?MAX_PLAIN_TEXT_LENGTH+1024)).
-define(MAX_CIPHER_TEXT_LENGTH, (?MAX_PLAIN_TEXT_LENGTH+2048)).
diff --git a/lib/ssl/src/tls_connection.erl b/lib/ssl/src/tls_connection.erl
index 8ded2cbff7..af59dda442 100644
--- a/lib/ssl/src/tls_connection.erl
+++ b/lib/ssl/src/tls_connection.erl
@@ -152,9 +152,10 @@ next_record(#state{protocol_buffers =
#protocol_buffers{tls_packets = [], tls_cipher_texts = [CT | Rest]}
= Buffers,
connection_states = ConnStates0,
+ negotiated_version = Version,
ssl_options = #ssl_options{padding_check = Check}} = State) ->
- case tls_record:decode_cipher_text(CT, ConnStates0, Check) of
+ case tls_record:decode_cipher_text(Version, CT, ConnStates0, Check) of
{Plain, ConnStates} ->
{Plain, State#state{protocol_buffers =
Buffers#protocol_buffers{tls_cipher_texts = Rest},
diff --git a/lib/ssl/src/tls_handshake.erl b/lib/ssl/src/tls_handshake.erl
index 050b4be870..b39a7732e7 100644
--- a/lib/ssl/src/tls_handshake.erl
+++ b/lib/ssl/src/tls_handshake.erl
@@ -276,6 +276,7 @@ handle_client_hello(Version,
true ->
Curves = maps:get(elliptic_curves, HelloExt, undefined),
ClientHashSigns = maps:get(signature_algs, HelloExt, undefined),
+ ClientSignatureSchemes = maps:get(signature_algs_cert, HelloExt, undefined),
AvailableHashSigns = ssl_handshake:available_signature_algs(
ClientHashSigns, SupportedHashSigns, Cert, Version),
ECCCurve = ssl_handshake:select_curve(Curves, SupportedECCs, ECCOrder),
@@ -289,8 +290,10 @@ handle_client_hello(Version,
?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY, no_suitable_ciphers);
_ ->
#{key_exchange := KeyExAlg} = ssl_cipher_format:suite_definition(CipherSuite),
- case ssl_handshake:select_hashsign(ClientHashSigns, Cert, KeyExAlg,
- SupportedHashSigns, Version) of
+ case ssl_handshake:select_hashsign({ClientHashSigns, ClientSignatureSchemes},
+ Cert, KeyExAlg,
+ SupportedHashSigns,
+ Version) of
#alert{} = Alert ->
Alert;
HashSign ->
diff --git a/lib/ssl/src/tls_record.erl b/lib/ssl/src/tls_record.erl
index 444759aafa..7debac7d37 100644
--- a/lib/ssl/src/tls_record.erl
+++ b/lib/ssl/src/tls_record.erl
@@ -41,7 +41,7 @@
-export([encode_plain_text/4]).
%% Decoding
--export([decode_cipher_text/3]).
+-export([decode_cipher_text/4]).
%% Protocol version handling
-export([protocol_version/1, lowest_protocol_version/1, lowest_protocol_version/2,
@@ -106,6 +106,8 @@ get_tls_records(Data, Versions, Buffer, SslOpts) ->
%
%% Description: Encodes a handshake message to send on the ssl-socket.
%%--------------------------------------------------------------------
+encode_handshake(Frag, {3, 4}, ConnectionStates) ->
+ tls_record_1_3:encode_handshake(Frag, ConnectionStates);
encode_handshake(Frag, Version,
#{current_write :=
#{beast_mitigation := BeastMitigation,
@@ -126,6 +128,8 @@ encode_handshake(Frag, Version,
%%
%% Description: Encodes an alert message to send on the ssl-socket.
%%--------------------------------------------------------------------
+encode_alert_record(Alert, {3, 4}, ConnectionStates) ->
+ tls_record_1_3:encode_handshake(Alert, ConnectionStates);
encode_alert_record(#alert{level = Level, description = Description},
Version, ConnectionStates) ->
encode_plain_text(?ALERT, Version, <<?BYTE(Level), ?BYTE(Description)>>,
@@ -146,6 +150,8 @@ encode_change_cipher_spec(Version, ConnectionStates) ->
%%
%% Description: Encodes data to send on the ssl-socket.
%%--------------------------------------------------------------------
+encode_data(Data, {3, 4}, ConnectionStates) ->
+ tls_record_1_3:encode_data(Data, ConnectionStates);
encode_data(Frag, Version,
#{current_write := #{beast_mitigation := BeastMitigation,
security_parameters :=
@@ -159,12 +165,14 @@ encode_data(Frag, Version,
%%====================================================================
%%--------------------------------------------------------------------
--spec decode_cipher_text(#ssl_tls{}, ssl_record:connection_states(), boolean()) ->
+-spec decode_cipher_text(tls_version(), #ssl_tls{}, ssl_record:connection_states(), boolean()) ->
{#ssl_tls{}, ssl_record:connection_states()}| #alert{}.
%%
%% Description: Decode cipher text
%%--------------------------------------------------------------------
-decode_cipher_text(#ssl_tls{type = Type, version = Version,
+decode_cipher_text({3,4}, CipherTextRecord, ConnectionStates, _) ->
+ tls_record_1_3:decode_cipher_text(CipherTextRecord, ConnectionStates);
+decode_cipher_text(_, #ssl_tls{type = Type, version = Version,
fragment = CipherFragment} = CipherText,
#{current_read :=
#{compression_state := CompressionS0,
@@ -177,14 +185,15 @@ decode_cipher_text(#ssl_tls{type = Type, version = Version,
BulkCipherAlgo,
compression_algorithm = CompAlg}
} = ReadState0} = ConnnectionStates0, _) ->
- AAD = calc_aad(Type, Version, ReadState0),
- case ssl_cipher:decipher_aead(BulkCipherAlgo, CipherS0, Seq, AAD, CipherFragment, Version) of
- {PlainFragment, CipherS1} ->
+ AAD = start_additional_data(Type, Version, ReadState0),
+ CipherS1 = ssl_record:nonce_seed(BulkCipherAlgo, <<?UINT64(Seq)>>, CipherS0),
+ case ssl_record:decipher_aead(BulkCipherAlgo, CipherS1, AAD, CipherFragment, Version) of
+ {PlainFragment, CipherState} ->
{Plain, CompressionS1} = ssl_record:uncompress(CompAlg,
PlainFragment, CompressionS0),
ConnnectionStates = ConnnectionStates0#{
current_read => ReadState0#{
- cipher_state => CipherS1,
+ cipher_state => CipherState,
sequence_number => Seq + 1,
compression_state => CompressionS1}},
{CipherText#ssl_tls{fragment = Plain}, ConnnectionStates};
@@ -192,7 +201,7 @@ decode_cipher_text(#ssl_tls{type = Type, version = Version,
Alert
end;
-decode_cipher_text(#ssl_tls{type = Type, version = Version,
+decode_cipher_text(_, #ssl_tls{type = Type, version = Version,
fragment = CipherFragment} = CipherText,
#{current_read :=
#{compression_state := CompressionS0,
@@ -486,15 +495,20 @@ encode_iolist(Type, Data, Version, ConnectionStates0) ->
{lists:reverse(EncodedMsg), ConnectionStates}.
%%--------------------------------------------------------------------
do_encode_plain_text(Type, Version, Data, #{compression_state := CompS0,
- security_parameters :=
+ cipher_state := CipherS0,
+ sequence_number := Seq,
+ security_parameters :=
#security_parameters{
cipher_type = ?AEAD,
+ bulk_cipher_algorithm = BCAlg,
compression_algorithm = CompAlg}
} = WriteState0) ->
{Comp, CompS1} = ssl_record:compress(CompAlg, Data, CompS0),
- WriteState1 = WriteState0#{compression_state => CompS1},
- AAD = calc_aad(Type, Version, WriteState1),
- ssl_record:cipher_aead(Version, Comp, WriteState1, AAD);
+ CipherS = ssl_record:nonce_seed(BCAlg, <<?UINT64(Seq)>>, CipherS0),
+ WriteState = WriteState0#{compression_state => CompS1,
+ cipher_state => CipherS},
+ AAD = start_additional_data(Type, Version, WriteState),
+ ssl_record:cipher_aead(Version, Comp, WriteState, AAD);
do_encode_plain_text(Type, Version, Data, #{compression_state := CompS0,
security_parameters :=
#security_parameters{compression_algorithm = CompAlg}
@@ -506,7 +520,7 @@ do_encode_plain_text(Type, Version, Data, #{compression_state := CompS0,
do_encode_plain_text(_,_,_,CS) ->
exit({cs, CS}).
%%--------------------------------------------------------------------
-calc_aad(Type, {MajVer, MinVer},
+start_additional_data(Type, {MajVer, MinVer},
#{sequence_number := SeqNo}) ->
<<?UINT64(SeqNo), ?BYTE(Type), ?BYTE(MajVer), ?BYTE(MinVer)>>.
diff --git a/lib/ssl/src/tls_record_1_3.erl b/lib/ssl/src/tls_record_1_3.erl
new file mode 100644
index 0000000000..ff198a09bf
--- /dev/null
+++ b/lib/ssl/src/tls_record_1_3.erl
@@ -0,0 +1,260 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2007-2018. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+
+-module(tls_record_1_3).
+
+-include("tls_record.hrl").
+-include("tls_record_1_3.hrl").
+-include("ssl_internal.hrl").
+-include("ssl_alert.hrl").
+-include("ssl_cipher.hrl").
+
+%% Encoding
+-export([encode_handshake/2, encode_alert_record/2,
+ encode_data/2]).
+-export([encode_plain_text/3]).
+
+%% Decoding
+-export([decode_cipher_text/2]).
+
+%%====================================================================
+%% Encoding
+%%====================================================================
+
+%%--------------------------------------------------------------------
+-spec encode_handshake(iolist(), ssl_record:connection_states()) ->
+ {iolist(), ssl_record:connection_states()}.
+%
+%% Description: Encodes a handshake message to send on the tls-1.3-socket.
+%%--------------------------------------------------------------------
+encode_handshake(Frag, ConnectionStates) ->
+ case iolist_size(Frag) of
+ N when N > ?MAX_PLAIN_TEXT_LENGTH ->
+ %% TODO: Consider padding here
+ Data = split_bin(iolist_to_binary(Frag), ?MAX_PLAIN_TEXT_LENGTH),
+ encode_iolist(?HANDSHAKE, Data, ConnectionStates);
+ _ ->
+ encode_plain_text(?HANDSHAKE, Frag, ConnectionStates)
+ end.
+
+%%--------------------------------------------------------------------
+-spec encode_alert_record(#alert{}, ssl_record:connection_states()) ->
+ {iolist(), ssl_record:connection_states()}.
+%%
+%% Description: Encodes an alert message to send on the ssl-socket.
+%%--------------------------------------------------------------------
+encode_alert_record(#alert{level = Level, description = Description},
+ ConnectionStates) ->
+ encode_plain_text(?ALERT, <<?BYTE(Level), ?BYTE(Description)>>,
+ ConnectionStates).
+%%--------------------------------------------------------------------
+-spec encode_data(binary(), ssl_record:connection_states()) ->
+ {iolist(), ssl_record:connection_states()}.
+%%
+%% Description: Encodes data to send on the ssl-socket.
+%%--------------------------------------------------------------------
+encode_data(Frag, ConnectionStates) ->
+ Data = split_bin(Frag, ?MAX_PLAIN_TEXT_LENGTH, {3,4}),
+ encode_iolist(?APPLICATION_DATA, Data, ConnectionStates).
+
+encode_plain_text(Type, Data0, #{current_write := Write0} = ConnectionStates) ->
+ PadLen = 0, %% TODO where to specify PadLen?
+ Data = inner_plaintext(Type, Data0, PadLen),
+ {CipherFragment, Write1} = encode_plain_text(Data, Write0),
+ {CipherText, Write} = encode_tls_cipher_text(CipherFragment, Write1),
+ {CipherText, ConnectionStates#{current_write => Write}}.
+
+encode_iolist(Type, Data, ConnectionStates0) ->
+ {ConnectionStates, EncodedMsg} =
+ lists:foldl(fun(Text, {CS0, Encoded}) ->
+ {Enc, CS1} =
+ encode_plain_text(Type, Text, CS0),
+ {CS1, [Enc | Encoded]}
+ end, {ConnectionStates0, []}, Data),
+ {lists:reverse(EncodedMsg), ConnectionStates}.
+
+%%====================================================================
+%% Decoding
+%%====================================================================
+
+%%--------------------------------------------------------------------
+-spec decode_cipher_text(#ssl_tls{}, ssl_record:connection_states()) ->
+ {#ssl_tls{}, ssl_record:connection_states()}| #alert{}.
+%%
+%% Description: Decode cipher text, use legacy type ssl_tls instead of tls_cipher_text
+%% in decoding context so that we can reuse the code from erlier versions.
+%%--------------------------------------------------------------------
+decode_cipher_text(#ssl_tls{type = ?OPAQUE_TYPE,
+ version = ?LEGACY_VERSION,
+ fragment = CipherFragment},
+ #{current_read :=
+ #{sequence_number := Seq,
+ cipher_state := CipherS0,
+ security_parameters :=
+ #security_parameters{
+ cipher_type = ?AEAD,
+ bulk_cipher_algorithm =
+ BulkCipherAlgo}
+ } = ReadState0} = ConnnectionStates0) ->
+ AAD = start_additional_data(),
+ CipherS1 = ssl_cipher:nonce_seed(<<?UINT64(Seq)>>, CipherS0),
+ case decipher_aead(BulkCipherAlgo, CipherS1, AAD, CipherFragment) of
+ {PlainFragment, CipherS1} ->
+ ConnnectionStates =
+ ConnnectionStates0#{current_read =>
+ ReadState0#{cipher_state => CipherS1,
+ sequence_number => Seq + 1}},
+ decode_inner_plaintext(PlainFragment, ConnnectionStates);
+ #alert{} = Alert ->
+ Alert
+ end;
+decode_cipher_text(#ssl_tls{type = Type}, _) ->
+ %% Version mismatch is already asserted
+ ?ALERT_REC(?FATAL, ?BAD_RECORD_MAC, {record_typ_mismatch, Type}).
+
+%%--------------------------------------------------------------------
+%%% Internal functions
+%%--------------------------------------------------------------------
+split_bin(Bin, ChunkSize) ->
+ split_bin(Bin, ChunkSize, []).
+split_bin(Bin, ChunkSize, _) ->
+ do_split_bin(Bin, ChunkSize, []).
+
+do_split_bin(<<>>, _, Acc) ->
+ lists:reverse(Acc);
+do_split_bin(Bin, ChunkSize, Acc) ->
+ case Bin of
+ <<Chunk:ChunkSize/binary, Rest/binary>> ->
+ do_split_bin(Rest, ChunkSize, [Chunk | Acc]);
+ _ ->
+ lists:reverse(Acc, [Bin])
+ end.
+
+inner_plaintext(Type, Data, Length) ->
+ #inner_plaintext{
+ content = Data,
+ type = Type,
+ zeros = zero_padding(Length)
+ }.
+zero_padding(Length)->
+ binary:copy(<<?BYTE(0)>>, Length).
+
+encode_plain_text(#inner_plaintext{
+ content = Data,
+ type = Type,
+ zeros = Zeros
+ }, #{cipher_state := CipherS0,
+ sequence_number := Seq,
+ security_parameters :=
+ #security_parameters{
+ cipher_type = ?AEAD}
+ } = WriteState0) ->
+ PlainText = <<Data/binary, ?BYTE(Type), Zeros/binary>>,
+ AAD = start_additional_data(),
+ CipherS1 = ssl_cipher:nonce_seed(<<?UINT64(Seq)>>, CipherS0),
+ {Encoded, WriteState} = cipher_aead(PlainText, WriteState0#{cipher_state => CipherS1}, AAD),
+ {#tls_cipher_text{encoded_record = Encoded}, WriteState};
+encode_plain_text(_, CS) ->
+ exit({cs, CS}).
+
+start_additional_data() ->
+ {MajVer, MinVer} = ?LEGACY_VERSION,
+ <<?BYTE(?OPAQUE_TYPE), ?BYTE(MajVer), ?BYTE(MinVer)>>.
+
+end_additional_data(AAD, Len) ->
+ <<AAD/binary, ?UINT16(Len)>>.
+
+nonce(#cipher_state{nonce = Nonce, iv = IV}) ->
+ Len = size(IV),
+ crypto:exor(<<Nonce:Len/bytes>>, IV).
+
+cipher_aead(Fragment,
+ #{cipher_state := CipherS0,
+ security_parameters :=
+ #security_parameters{bulk_cipher_algorithm =
+ BulkCipherAlgo}
+ } = WriteState0, AAD) ->
+ {CipherFragment, CipherS1} =
+ cipher_aead(BulkCipherAlgo, CipherS0, AAD, Fragment),
+ {CipherFragment, WriteState0#{cipher_state => CipherS1}}.
+
+cipher_aead(Type, #cipher_state{key=Key} = CipherState, AAD0, Fragment) ->
+ AAD = end_additional_data(AAD0, erlang:iolist_size(Fragment)),
+ Nonce = nonce(CipherState),
+ {Content, CipherTag} = ssl_cipher:aead_encrypt(Type, Key, Nonce, Fragment, AAD),
+ {<<Content/binary, CipherTag/binary>>, CipherState}.
+
+encode_tls_cipher_text(#tls_cipher_text{opaque_type = Type,
+ legacy_version = {MajVer, MinVer},
+ encoded_record = Encoded}, #{sequence_number := Seq} = Write) ->
+ Length = erlang:iolist_size(Encoded),
+ {[<<?BYTE(Type), ?BYTE(MajVer), ?BYTE(MinVer), ?UINT16(Length)>>, Encoded],
+ Write#{sequence_number => Seq +1}}.
+
+decipher_aead(Type, #cipher_state{key = Key} = CipherState, AAD0, CipherFragment) ->
+ try
+ Nonce = nonce(CipherState),
+ {AAD, CipherText, CipherTag} = aead_ciphertext_split(CipherState, CipherFragment, AAD0),
+ case ssl_cipher:aead_decrypt(Type, Key, Nonce, CipherText, CipherTag, AAD) of
+ Content when is_binary(Content) ->
+ {Content, CipherState};
+ _ ->
+ ?ALERT_REC(?FATAL, ?BAD_RECORD_MAC, decryption_failed)
+ end
+ catch
+ _:_ ->
+ ?ALERT_REC(?FATAL, ?BAD_RECORD_MAC, decryption_failed)
+ end.
+
+aead_ciphertext_split(#cipher_state{tag_len = Len}, CipherTextFragment, AAD) ->
+ CipherLen = size(CipherTextFragment) - Len,
+ <<CipherText:CipherLen/bytes, CipherTag:Len/bytes>> = CipherTextFragment,
+ {end_additional_data(AAD, CipherLen), CipherText, CipherTag}.
+
+decode_inner_plaintext(PlainText, ConnnectionStates) ->
+ case remove_padding(PlainText) of
+ #alert{} = Alert ->
+ Alert;
+ {Data, Type} ->
+ {#ssl_tls{type = Type,
+ version = {3,4}, %% Internally use real version
+ fragment = Data}, ConnnectionStates}
+ end.
+
+remove_padding(PlainText)->
+ case binary:split(PlainText, <<0>>, [global, trim]) of
+ [] ->
+ ?ALERT_REC(?FATAL, ?UNEXPECTED_MESSAGE, padding_error);
+ [Content] ->
+ Type = binary:last(Content),
+ split_content(Type, Content, erlang:byte_size(Content) - 1)
+ end.
+
+split_content(?HANDSHAKE, _, 0) ->
+ ?ALERT_REC(?FATAL, ?UNEXPECTED_MESSAGE, empty_handshake);
+split_content(?ALERT, _, 0) ->
+ ?ALERT_REC(?FATAL, ?UNEXPECTED_MESSAGE, empty_alert);
+%% For special middlebox compatible case!
+split_content(?CHANGE_CIPHER_SPEC, _, 0) ->
+ ?ALERT_REC(?FATAL, ?UNEXPECTED_MESSAGE, empty_change_cipher_spec);
+split_content(?APPLICATION_DATA = Type, _, 0) ->
+ {Type, <<>>};
+split_content(Type, Content, N) ->
+ <<Data:N/bytes, ?BYTE(Type)>> = Content,
+ {Type, Data}.
diff --git a/lib/ssl/src/tls_record_1_3.hrl b/lib/ssl/src/tls_record_1_3.hrl
new file mode 100644
index 0000000000..273427a34e
--- /dev/null
+++ b/lib/ssl/src/tls_record_1_3.hrl
@@ -0,0 +1,58 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2018-2018. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+%%----------------------------------------------------------------------
+%% Purpose: Record and constant defenitions for the TLS-1.3-record protocol
+%% see RFC 8446 not present in earlier versions
+%%----------------------------------------------------------------------
+
+-ifndef(tls_record_1_3).
+-define(tls_record_1_3, true).
+
+%% enum {
+%% invalid(0),
+%% %% defined in ssl_record.hrl
+%% change_cipher_spec(20),
+%% alert(21),
+%% handshake(22),
+%% application_data(23),
+%% heartbeat(24), /* RFC 6520 */
+%% (255)
+%% } ContentType;
+
+-define(INVALID, 0).
+-define(LEGACY_VERSION, {3,3}).
+-define(OPAQUE_TYPE, 23).
+
+-record(inner_plaintext, {
+ content, %% data
+ type, %% Contentype
+ zeros %% padding "uint8 zeros[length_of_padding]"
+ }).
+-record(tls_cipher_text, { %% Equivalent of encrypted version of #ssl_tls from previous versions
+ %% decrypted version will still use #ssl_tls for code reuse purposes
+ %% with real values for content type and version
+ opaque_type = ?OPAQUE_TYPE,
+ legacy_version = ?LEGACY_VERSION,
+ encoded_record
+ }).
+
+-endif. % -ifdef(tls_record_1_3).
diff --git a/lib/ssl/src/tls_sender.erl b/lib/ssl/src/tls_sender.erl
index f56b96df65..1c3c44cfe5 100644
--- a/lib/ssl/src/tls_sender.erl
+++ b/lib/ssl/src/tls_sender.erl
@@ -29,7 +29,7 @@
%% API
-export([start/0, start/1, initialize/2, send_data/2, send_alert/2,
- send_and_ack_alert/2, renegotiate/1,
+ send_and_ack_alert/2, setopts/2, renegotiate/1,
update_connection_state/3, dist_tls_socket/1, dist_handshake_complete/3]).
%% gen_statem callbacks
@@ -81,7 +81,7 @@ initialize(Pid, InitMsg) ->
gen_statem:call(Pid, {self(), InitMsg}).
%%--------------------------------------------------------------------
--spec send_data(pid(), iodata()) -> ok.
+-spec send_data(pid(), iodata()) -> ok | {error, term()}.
%% Description: Send application data
%%--------------------------------------------------------------------
send_data(Pid, AppData) ->
@@ -97,12 +97,18 @@ send_alert(Pid, Alert) ->
gen_statem:cast(Pid, Alert).
%%--------------------------------------------------------------------
--spec send_and_ack_alert(pid(), #alert{}) -> ok.
+-spec send_and_ack_alert(pid(), #alert{}) -> _.
%% Description: TLS connection process wants to send an Alert
%% in the connection state and recive an ack.
%%--------------------------------------------------------------------
send_and_ack_alert(Pid, Alert) ->
gen_statem:cast(Pid, {ack_alert, Alert}).
+%%--------------------------------------------------------------------
+-spec setopts(pid(), [{packet, integer() | atom()}]) -> ok | {error, term()}.
+%% Description: Send application data
+%%--------------------------------------------------------------------
+setopts(Pid, Opts) ->
+ call(Pid, {set_opts, Opts}).
%%--------------------------------------------------------------------
-spec renegotiate(pid()) -> {ok, WriteState::map()} | {error, closed}.
@@ -201,6 +207,8 @@ connection({call, From}, {application_data, AppData},
Data ->
send_application_data(Data, From, ?FUNCTION_NAME, StateData)
end;
+connection({call, From}, {set_opts, _} = Call, StateData) ->
+ handle_call(From, Call, ?FUNCTION_NAME, StateData);
connection({call, From}, dist_get_tls_socket,
#data{protocol_cb = Connection,
transport_cb = Transport,
@@ -254,6 +262,8 @@ connection(info, Msg, StateData) ->
StateData :: term()) ->
gen_statem:event_handler_result(atom()).
%%--------------------------------------------------------------------
+handshake({call, From}, {set_opts, _} = Call, StateData) ->
+ handle_call(From, Call, ?FUNCTION_NAME, StateData);
handshake({call, _}, _, _) ->
{keep_state_and_data, [postpone]};
handshake(cast, {new_write, WritesState, Version},
@@ -298,6 +308,9 @@ code_change(_OldVsn, State, Data, _Extra) ->
%%%===================================================================
%%% Internal functions
%%%===================================================================
+handle_call(From, {set_opts, Opts}, StateName, #data{socket_options = SockOpts} = StateData) ->
+ {next_state, StateName, StateData#data{socket_options = set_opts(SockOpts, Opts)}, [{reply, From, ok}]}.
+
handle_info({'DOWN', Monitor, _, _, Reason}, _,
#data{connection_monitor = Monitor,
dist_handle = Handle} = StateData) when Handle =/= undefined->
@@ -369,6 +382,10 @@ encode_size_packet(Bin, Size, Max) ->
false ->
<<Len:Size, Bin/binary>>
end.
+
+set_opts(SocketOptions, [{packet, N}]) ->
+ SocketOptions#socket_options{packet = N}.
+
time_to_renegotiate(_Data,
#{current_write := #{sequence_number := Num}},
RenegotiateAt) ->
diff --git a/lib/ssl/test/make_certs.erl b/lib/ssl/test/make_certs.erl
index 8fe7c54549..578f6a731a 100644
--- a/lib/ssl/test/make_certs.erl
+++ b/lib/ssl/test/make_certs.erl
@@ -365,7 +365,7 @@ req_cnf(Root, C) ->
"default_bits = ", integer_to_list(C#config.default_bits), "\n"
"RANDFILE = $ROOTDIR/RAND\n"
"encrypt_key = no\n"
- "default_md = md5\n"
+ "default_md = sha1\n"
"#string_mask = pkix\n"
"x509_extensions = ca_ext\n"
"prompt = no\n"
@@ -415,7 +415,7 @@ ca_cnf(
["crl_extensions = crl_ext\n" || C#config.v2_crls],
"unique_subject = no\n"
"default_days = 3600\n"
- "default_md = md5\n"
+ "default_md = sha1\n"
"preserve = no\n"
"policy = policy_match\n"
"\n"
@@ -499,7 +499,7 @@ ca_cnf(
["crl_extensions = crl_ext\n" || C#config.v2_crls],
"unique_subject = no\n"
"default_days = 3600\n"
- "default_md = md5\n"
+ "default_md = sha1\n"
"preserve = no\n"
"policy = policy_match\n"
"\n"
diff --git a/lib/ssl/test/ssl_basic_SUITE.erl b/lib/ssl/test/ssl_basic_SUITE.erl
index a0cc9f5c08..97b794c3e2 100644
--- a/lib/ssl/test/ssl_basic_SUITE.erl
+++ b/lib/ssl/test/ssl_basic_SUITE.erl
@@ -3570,14 +3570,14 @@ conf_signature_algs(Config) when is_list(Config) ->
ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
{from, self()},
{mfa, {ssl_test_lib, send_recv_result, []}},
- {options, [{active, false}, {signature_algs, [{sha256, rsa}]} | ServerOpts]}]),
+ {options, [{active, false}, {signature_algs, [{sha, rsa}]} | ServerOpts]}]),
Port = ssl_test_lib:inet_port(Server),
Client =
ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
{host, Hostname},
{from, self()},
{mfa, {ssl_test_lib, send_recv_result, []}},
- {options, [{active, false}, {signature_algs, [{sha256, rsa}]} | ClientOpts]}]),
+ {options, [{active, false}, {signature_algs, [{sha, rsa}]} | ClientOpts]}]),
ct:log("Testcase ~p, Client ~p Server ~p ~n",
[self(), Client, Server]),
diff --git a/lib/ssl/test/ssl_handshake_SUITE.erl b/lib/ssl/test/ssl_handshake_SUITE.erl
index ef1f6be286..861fecc554 100644
--- a/lib/ssl/test/ssl_handshake_SUITE.erl
+++ b/lib/ssl/test/ssl_handshake_SUITE.erl
@@ -25,6 +25,7 @@
-compile(export_all).
-include_lib("common_test/include/ct.hrl").
+-include("ssl_alert.hrl").
-include("ssl_internal.hrl").
-include("tls_handshake.hrl").
-include_lib("public_key/include/public_key.hrl").
@@ -41,7 +42,7 @@ all() -> [decode_hello_handshake,
decode_empty_server_sni_correctly,
select_proper_tls_1_2_rsa_default_hashsign,
ignore_hassign_extension_pre_tls_1_2,
- unorded_chain].
+ unorded_chain, signature_algorithms].
%%--------------------------------------------------------------------
init_per_suite(Config) ->
@@ -55,7 +56,9 @@ init_per_group(_GroupName, Config) ->
end_per_group(_,Config) ->
Config.
-init_per_testcase(ignore_hassign_extension_pre_tls_1_2, Config0) ->
+init_per_testcase(TC, Config0) when
+ TC =:= ignore_hassign_extension_pre_tls_1_2 orelse
+ TC =:= signature_algorithms ->
catch crypto:stop(),
try crypto:start() of
ok ->
@@ -163,11 +166,11 @@ ignore_hassign_extension_pre_tls_1_2(Config) ->
Opts = proplists:get_value(server_opts, Config),
CertFile = proplists:get_value(certfile, Opts),
[{_, Cert, _}] = ssl_test_lib:pem_to_der(CertFile),
- HashSigns = #hash_sign_algos{hash_sign_algos = [{sha512, rsa}, {sha, dsa}]},
- {sha512, rsa} = ssl_handshake:select_hashsign(HashSigns, Cert, ecdhe_rsa, tls_v1:default_signature_algs({3,3}), {3,3}),
+ HashSigns = #hash_sign_algos{hash_sign_algos = [{sha512, rsa}, {sha, dsa}, {sha, rsa}]},
+ {sha512, rsa} = ssl_handshake:select_hashsign({HashSigns, undefined}, Cert, ecdhe_rsa, tls_v1:default_signature_algs({3,3}), {3,3}),
%%% Ignore
- {md5sha, rsa} = ssl_handshake:select_hashsign(HashSigns, Cert, ecdhe_rsa, tls_v1:default_signature_algs({3,2}), {3,2}),
- {md5sha, rsa} = ssl_handshake:select_hashsign(HashSigns, Cert, ecdhe_rsa, tls_v1:default_signature_algs({3,0}), {3,0}).
+ {md5sha, rsa} = ssl_handshake:select_hashsign({HashSigns, undefined}, Cert, ecdhe_rsa, tls_v1:default_signature_algs({3,2}), {3,2}),
+ {md5sha, rsa} = ssl_handshake:select_hashsign({HashSigns, undefined}, Cert, ecdhe_rsa, tls_v1:default_signature_algs({3,0}), {3,0}).
unorded_chain(Config) when is_list(Config) ->
DefConf = ssl_test_lib:default_cert_chain_conf(),
@@ -188,6 +191,55 @@ unorded_chain(Config) when is_list(Config) ->
ssl_certificate:certificate_chain(PeerCert, ets:new(foo, []), ExtractedCerts, UnordedChain).
+signature_algorithms(Config) ->
+ Opts = proplists:get_value(server_opts, Config),
+ CertFile = proplists:get_value(certfile, Opts),
+ io:format("Cert = ~p~n", [CertFile]),
+ [{_, Cert, _}] = ssl_test_lib:pem_to_der(CertFile),
+ HashSigns0 = #hash_sign_algos{
+ hash_sign_algos = [{sha512, rsa},
+ {sha, dsa},
+ {sha, rsa}]},
+ Schemes0 = #signature_scheme_list{
+ signature_scheme_list = [rsa_pkcs1_sha1,
+ ecdsa_sha1]},
+ {sha512, rsa} = ssl_handshake:select_hashsign(
+ {HashSigns0, Schemes0},
+ Cert, ecdhe_rsa,
+ tls_v1:default_signature_algs({3,3}),
+ {3,3}),
+ HashSigns1 = #hash_sign_algos{
+ hash_sign_algos = [{sha, dsa},
+ {sha, rsa}]},
+ {sha, rsa} = ssl_handshake:select_hashsign(
+ {HashSigns1, Schemes0},
+ Cert, ecdhe_rsa,
+ tls_v1:default_signature_algs({3,3}),
+ {3,3}),
+ Schemes1 = #signature_scheme_list{
+ signature_scheme_list = [rsa_pkcs1_sha256,
+ ecdsa_sha1]},
+ %% Signature not supported
+ #alert{} = ssl_handshake:select_hashsign(
+ {HashSigns1, Schemes1},
+ Cert, ecdhe_rsa,
+ tls_v1:default_signature_algs({3,3}),
+ {3,3}),
+ %% No scheme, hashsign is used
+ {sha, rsa} = ssl_handshake:select_hashsign(
+ {HashSigns1, undefined},
+ Cert, ecdhe_rsa,
+ tls_v1:default_signature_algs({3,3}),
+ {3,3}),
+ HashSigns2 = #hash_sign_algos{
+ hash_sign_algos = [{sha, dsa}]},
+ %% Signature not supported
+ #alert{} = ssl_handshake:select_hashsign(
+ {HashSigns2, Schemes1},
+ Cert, ecdhe_rsa,
+ tls_v1:default_signature_algs({3,3}),
+ {3,3}).
+
%%--------------------------------------------------------------------
%% Internal functions ------------------------------------------------
%%--------------------------------------------------------------------
diff --git a/lib/ssl/test/ssl_packet_SUITE.erl b/lib/ssl/test/ssl_packet_SUITE.erl
index 3261244ace..ebf8ddbfac 100644
--- a/lib/ssl/test/ssl_packet_SUITE.erl
+++ b/lib/ssl/test/ssl_packet_SUITE.erl
@@ -141,6 +141,7 @@ socket_active_packet_tests() ->
packet_4_active_some_big,
packet_wait_active,
packet_size_active,
+ packet_switch,
%% inet header option should be deprecated!
header_decode_one_byte_active,
header_decode_two_bytes_active,
@@ -702,6 +703,34 @@ packet_size_passive(Config) when is_list(Config) ->
ssl_test_lib:close(Server),
ssl_test_lib:close(Client).
+
+%%--------------------------------------------------------------------
+packet_switch() ->
+ [{doc,"Test packet option {packet, 2} followd by {packet, 4}"}].
+
+packet_switch(Config) when is_list(Config) ->
+ ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+
+ Server = ssl_test_lib:start_server([{node, ClientNode}, {port, 0},
+ {from, self()},
+ {mfa, {?MODULE, send_switch_packet ,["Hello World", 4]}},
+ {options, [{nodelay, true},{packet, 2} | ServerOpts]}]),
+ Port = ssl_test_lib:inet_port(Server),
+ Client = ssl_test_lib:start_client([{node, ServerNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {mfa, {?MODULE, recv_switch_packet, ["Hello World", 4]}},
+ {options, [{nodelay, true}, {packet, 2} |
+ ClientOpts]}]),
+
+ ssl_test_lib:check_result(Client, ok),
+
+ ssl_test_lib:close(Server),
+ ssl_test_lib:close(Client).
+
+
%%--------------------------------------------------------------------
packet_cdr_decode() ->
[{doc,"Test setting the packet option {packet, cdr}, {mode, binary}"}].
@@ -2286,3 +2315,26 @@ client_reject_packet_opt(Config, PacketOpt) ->
ClientOpts]}]),
ssl_test_lib:check_result(Client, {error, {options, {not_supported, PacketOpt}}}).
+
+
+send_switch_packet(SslSocket, Data, NextPacket) ->
+ ssl:send(SslSocket, Data),
+ receive
+ {ssl, SslSocket, "Hello World"} ->
+ ssl:setopts(SslSocket, [{packet, NextPacket}]),
+ ssl:send(SslSocket, Data),
+ receive
+ {ssl, SslSocket, "Hello World"} ->
+ ok
+ end
+ end.
+recv_switch_packet(SslSocket, Data, NextPacket) ->
+ receive
+ {ssl, SslSocket, "Hello World"} ->
+ ssl:send(SslSocket, Data),
+ ssl:setopts(SslSocket, [{packet, NextPacket}]),
+ receive
+ {ssl, SslSocket, "Hello World"} ->
+ ssl:send(SslSocket, Data)
+ end
+ end.
diff --git a/lib/stdlib/doc/src/assert_hrl.xml b/lib/stdlib/doc/src/assert_hrl.xml
index 4dc7299609..fb27954235 100644
--- a/lib/stdlib/doc/src/assert_hrl.xml
+++ b/lib/stdlib/doc/src/assert_hrl.xml
@@ -46,7 +46,7 @@
is the macro name, for example, <c>assertEqual</c>. <c>Info</c> is a list
of tagged values, such as <c>[{module, M}, {line, L}, ...]</c>, which
gives more information about the location and cause of the exception. All
- entries in the <c>Info</c> list are optional; do not rely programatically
+ entries in the <c>Info</c> list are optional; do not rely programmatically
on any of them being present.</p>
<p>Each assert macro has a corresponding version with an extra argument,
diff --git a/lib/stdlib/doc/src/beam_lib.xml b/lib/stdlib/doc/src/beam_lib.xml
index 26d0724aaf..213170df7f 100644
--- a/lib/stdlib/doc/src/beam_lib.xml
+++ b/lib/stdlib/doc/src/beam_lib.xml
@@ -180,8 +180,8 @@ io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).</code>
<name name="beam"/>
<desc>
<p>Each of the functions described below accept either the
- module name, the filename, or a binary containing the BEAM
- module.</p>
+ filename (as a string) or a binary containing the BEAM
+ module.</p>
</desc>
</datatype>
<datatype>
diff --git a/lib/stdlib/doc/src/gen_event.xml b/lib/stdlib/doc/src/gen_event.xml
index f793ec7fdf..fc34e51216 100644
--- a/lib/stdlib/doc/src/gen_event.xml
+++ b/lib/stdlib/doc/src/gen_event.xml
@@ -775,7 +775,7 @@ gen_event:stop -----> Module:terminate/2
<p>This callback is optional, so callback modules need not
export it. The <c>gen_event</c> module provides a default
implementation of this function that logs about the unexpected
- <c>Info</c> message, drops it and returns <c>{noreply, State}</c>.</p>
+ <c>Info</c> message, drops it and returns <c>{ok, State}</c>.</p>
</note>
<p>This function is called for each installed event handler when
an event manager receives any other message than an event or
diff --git a/lib/stdlib/doc/src/rand.xml b/lib/stdlib/doc/src/rand.xml
index 25eec216ef..8e657698c6 100644
--- a/lib/stdlib/doc/src/rand.xml
+++ b/lib/stdlib/doc/src/rand.xml
@@ -38,34 +38,50 @@
<p>
This module provides a pseudo random number generator.
The module contains a number of algorithms.
- The uniform distribution algorithms use the
+ The uniform distribution algorithms are based on the
<url href="http://xorshift.di.unimi.it">
- xoroshiro116+ and xorshift1024* algorithms by Sebastiano Vigna.
+ Xoroshiro and Xorshift algorithms
</url>
+ by Sebastiano Vigna.
The normal distribution algorithm uses the
<url href="http://www.jstatsoft.org/v05/i08">
Ziggurat Method by Marsaglia and Tsang
</url>
on top of the uniform distribution algorithm.
</p>
- <p>For some algorithms, jump functions are provided for generating
- non-overlapping sequences for parallel computations.
- The jump functions perform calculations
- equivalent to perform a large number of repeated calls
- for calculating new states. </p>
+ <p>
+ For most algorithms, jump functions are provided for generating
+ non-overlapping sequences for parallel computations.
+ The jump functions perform calculations
+ equivalent to perform a large number of repeated calls
+ for calculating new states.
+ </p>
<p>The following algorithms are provided:</p>
<taglist>
- <tag><c>exrop</c></tag>
+ <tag><c>exsss</c></tag>
<item>
- <p>Xoroshiro116+, 58 bits precision and period of 2^116-1</p>
+ <p>Xorshift116**, 58 bits precision and period of 2^116-1</p>
<p>Jump function: equivalent to 2^64 calls</p>
- </item>
- <tag><c>exs1024s</c></tag>
- <item>
- <p>Xorshift1024*, 64 bits precision and a period of 2^1024-1</p>
- <p>Jump function: equivalent to 2^512 calls</p>
+ <p>
+ This is the Xorshift116 generator combined with the StarStar scrambler
+ from the 2018 paper by David Blackman and Sebastiano Vigna:
+ <url href="http://vigna.di.unimi.it/ftp/papers/ScrambledLinear.pdf">
+ Scrambled Linear Pseudorandom Number Generators
+ </url>
+ </p>
+ <p>
+ The generator does not need 58-bit rotates so it is faster
+ than the Xoroshiro116 generator, and when combined with
+ the StarStar scrambler it does not have any weak low bits
+ like <c>exrop</c> (Xoroshiro116+).
+ </p>
+ <p>
+ Alas, this combination is about 10% slower than <c>exrop</c>,
+ but is despite that the default algorithm thanks to its
+ statistical qualities.
+ </p>
</item>
<tag><c>exro928ss</c></tag>
<item>
@@ -77,8 +93,8 @@
<url href="http://vigna.di.unimi.it/ftp/papers/ScrambledLinear.pdf">
Scrambled Linear Pseudorandom Number Generators
</url>
- that on a 64 bit Erlang system executes only about 30% slower than
- the default <c>exrop</c> algorithm but with much longer period
+ that on a 64 bit Erlang system executes only about 40% slower than
+ the default <c>exsss</c> algorithm but with much longer period
and better statistical properties, and on the flip side
a larger state.
</p>
@@ -87,6 +103,16 @@
the 58 bit adaption.
</p>
</item>
+ <tag><c>exrop</c></tag>
+ <item>
+ <p>Xoroshiro116+, 58 bits precision and period of 2^116-1</p>
+ <p>Jump function: equivalent to 2^64 calls</p>
+ </item>
+ <tag><c>exs1024s</c></tag>
+ <item>
+ <p>Xorshift1024*, 64 bits precision and a period of 2^1024-1</p>
+ <p>Jump function: equivalent to 2^512 calls</p>
+ </item>
<tag><c>exsp</c></tag>
<item>
<p>Xorshift116+, 58 bits precision and period of 2^116-1</p>
@@ -103,7 +129,7 @@
</taglist>
<p>
- The default algorithm is <c>exrop</c> (Xoroshiro116+).
+ The default algorithm is <c>exsss</c> (Xorshift116**).
If a specific algorithm is
required, ensure to always use <seealso marker="#seed-1">
<c>seed/1</c></seealso> to initialize the state.
@@ -174,19 +200,19 @@ R1 = rand:uniform(),</pre>
<p>Use a specified algorithm:</p>
<pre>
-_ = rand:seed(exs1024s),
+_ = rand:seed(exs928ss),
R2 = rand:uniform(),</pre>
<p>Use a specified algorithm with a constant seed:</p>
<pre>
-_ = rand:seed(exs1024s, {123, 123534, 345345}),
+_ = rand:seed(exs928ss, {123, 123534, 345345}),
R3 = rand:uniform(),</pre>
<p>Use the functional API with a non-constant seed:</p>
<pre>
-S0 = rand:seed_s(exrop),
+S0 = rand:seed_s(exsss),
{R4, S1} = rand:uniform_s(S0),</pre>
<p>Textbook basic form Box-Muller standard normal deviate</p>
@@ -215,8 +241,9 @@ SND0 = math:sqrt(-2 * math:log(R5)) * math:cos(math:pi() * R6)</pre>
</note>
<p>
- For all these generators except <c>exro928ss</c> the lowest bit(s)
- has got a slightly less random behaviour than all other bits.
+ For all these generators except <c>exro928ss</c> and <c>exsss</c>
+ the lowest bit(s) has got a slightly less
+ random behaviour than all other bits.
1 bit for <c>exrop</c> (and <c>exsp</c>),
and 3 bits for <c>exs1024s</c>.
See for example the explanation in the
@@ -231,7 +258,7 @@ up to (and included) 16TB, with the exception of binary rank tests,
which fail due to the lowest bit being an LFSR; all other bits pass all
tests. We suggest to use a sign test to extract a random Boolean value.</pre>
<p>
- If this is a problem; to generate a boolean
+ If this is a problem; to generate a boolean with these algorithms
use something like this:
</p>
<pre>(rand:uniform(16) > 8)</pre>
@@ -299,19 +326,19 @@ tests. We suggest to use a sign test to extract a random Boolean value.</pre>
</desc>
</datatype>
<datatype>
- <name name="exrop_state"/>
+ <name name="exsplus_state"/>
<desc><p>Algorithm specific internal state</p></desc>
</datatype>
<datatype>
- <name name="exs1024_state"/>
+ <name name="exro928_state"/>
<desc><p>Algorithm specific internal state</p></desc>
</datatype>
<datatype>
- <name name="exro928_state"/>
+ <name name="exrop_state"/>
<desc><p>Algorithm specific internal state</p></desc>
</datatype>
<datatype>
- <name name="exsplus_state"/>
+ <name name="exs1024_state"/>
<desc><p>Algorithm specific internal state</p></desc>
</datatype>
<datatype>
diff --git a/lib/stdlib/src/beam_lib.erl b/lib/stdlib/src/beam_lib.erl
index 01181b1097..3386cfcbe6 100644
--- a/lib/stdlib/src/beam_lib.erl
+++ b/lib/stdlib/src/beam_lib.erl
@@ -53,7 +53,7 @@
%%-------------------------------------------------------------------------
--type beam() :: module() | file:filename() | binary().
+-type beam() :: file:filename() | binary().
-type debug_info() :: {DbgiVersion :: atom(), Backend :: module(), Data :: term()} | 'no_debug_info'.
-type forms() :: [erl_parse:abstract_form() | erl_parse:form_info()].
diff --git a/lib/stdlib/src/rand.erl b/lib/stdlib/src/rand.erl
index 9854c778a1..3a9a1e007b 100644
--- a/lib/stdlib/src/rand.erl
+++ b/lib/stdlib/src/rand.erl
@@ -43,13 +43,13 @@
%% Debug
-export([make_float/3, float2str/1, bc64/1]).
--compile({inline, [exs64_next/1, exsplus_next/1,
+-compile({inline, [exs64_next/1, exsplus_next/1, exsss_next/1,
exs1024_next/1, exs1024_calc/2,
exro928_next_state/4,
exrop_next/1, exrop_next_s/2,
get_52/1, normal_kiwi/1]}).
--define(DEFAULT_ALG_HANDLER, exrop).
+-define(DEFAULT_ALG_HANDLER, exsss).
-define(SEED_DICT, rand_seed).
%% =====================================================================
@@ -86,7 +86,7 @@
%% This depends on the algorithm handler function
-type alg_state() ::
- exrop_state() | exs1024_state() | exro928_state() | exsplus_state() |
+ exsplus_state() | exro928_state() | exrop_state() | exs1024_state() |
exs64_state() | term().
%% This is the algorithm handling definition within this module,
@@ -131,7 +131,7 @@
%% Algorithm state
-type state() :: {alg_handler(), alg_state()}.
-type builtin_alg() ::
- exrop | exs1024s | exro928ss | exsp | exs64 | exsplus | exs1024.
+ exsss | exro928ss | exrop | exs1024s | exsp | exs64 | exsplus | exs1024.
-type alg() :: builtin_alg() | atom().
-type export_state() :: {alg(), alg_state()}.
-type seed() :: [integer()] | integer() | {integer(), integer(), integer()}.
@@ -139,7 +139,7 @@
[builtin_alg/0, alg/0, alg_handler/0, alg_state/0,
state/0, export_state/0, seed/0]).
-export_type(
- [exrop_state/0, exs1024_state/0, exro928_state/0, exsplus_state/0,
+ [exsplus_state/0, exro928_state/0, exrop_state/0, exs1024_state/0,
exs64_state/0]).
%% =====================================================================
@@ -618,6 +618,11 @@ mk_alg(exsp) ->
uniform=>fun exsp_uniform/1, uniform_n=>fun exsp_uniform/2,
jump=>fun exsplus_jump/1},
fun exsplus_seed/1};
+mk_alg(exsss) ->
+ {#{type=>exsss, bits=>58, next=>fun exsss_next/1,
+ uniform=>fun exsss_uniform/1, uniform_n=>fun exsss_uniform/2,
+ jump=>fun exsplus_jump/1},
+ fun exsss_seed/1};
mk_alg(exs1024) ->
{#{type=>exs1024, max=>?MASK(64), next=>fun exs1024_next/1,
jump=>fun exs1024_jump/1},
@@ -675,6 +680,36 @@ exs64_next(R) ->
%% 58 bits fits into an immediate on 64bits erlang and is thus much faster.
%% Modification of the original Xorshift128+ algorithm to 116
%% by Sebastiano Vigna, a lot of thanks for his help and work.
+%%
+%% Reference C code for Xorshift116+ and Xorshift116**
+%%
+%% #include <stdint.h>
+%%
+%% #define MASK(b, v) (((UINT64_C(1) << (b)) - 1) & (v))
+%% #define BSL(b, v, n) (MASK((b)-(n), (v)) << (n))
+%% #define ROTL(b, v, n) (BSL((b), (v), (n)) | ((v) >> ((b)-(n))))
+%%
+%% uint64_t s[2];
+%%
+%% uint64_t next(void) {
+%% uint64_t s1 = s[0];
+%% const uint64_t s0 = s[1];
+%%
+%% s1 ^= BSL(58, s1, 24); // a
+%% s1 ^= s0 ^ (s1 >> 11) ^ (s0 >> 41); // b, c
+%% s[0] = s0;
+%% s[1] = s1;
+%%
+%% const uint64_t result_plus = MASK(58, s0 + s1);
+%% uint64_t result_starstar = s0;
+%% result_starstar = MASK(58, result_starstar * 5);
+%% result_starstar = ROTL(58, result_starstar, 7);
+%% result_starstar = MASK(58, result_starstar * 9);
+%%
+%% return result_plus;
+%% return result_starstar;
+%% }
+%%
%% =====================================================================
-opaque exsplus_state() :: nonempty_improper_list(uint58(), uint58()).
@@ -697,16 +732,62 @@ exsplus_seed({A1, A2, A3}) ->
tl(R1)]),
R2.
+-dialyzer({no_improper_lists, exsss_seed/1}).
+
+exsss_seed(L) when is_list(L) ->
+ [S0,S1] = seed58_nz(2, L),
+ [S0|S1];
+exsss_seed(X) when is_integer(X) ->
+ [S0,S1] = seed58(2, ?MASK(64, X)),
+ [S0|S1];
+%%
+%% Seed from traditional integer triple - mix into splitmix
+exsss_seed({A1, A2, A3}) ->
+ {_, X0} = seed58(?MASK(64, A1)),
+ {S0, X1} = seed58(?MASK(64, A2) bxor X0),
+ {S1, _} = seed58(?MASK(64, A3) bxor X1),
+ [S0|S1].
+
+%% Advance Xorshift116 state one step
+-define(
+ exs_next(S0, S1, S1_b),
+ begin
+ S1_b = S1 bxor ?BSL(58, S1, 24),
+ S1_b bxor S0 bxor (S1_b bsr 11) bxor (S0 bsr 41)
+ end).
+
+-define(
+ scramble_starstar(S, V_a, V_b),
+ begin
+ %% The multiply by add shifted trick avoids creating bignums
+ %% which improves performance significantly
+ %%
+ V_a = ?MASK(58, S + ?BSL(58, S, 2)), % V_a = S * 5
+ V_b = ?ROTL(58, V_a, 7),
+ ?MASK(58, V_b + ?BSL(58, V_b, 3)) % V_b * 9
+ end).
+
-dialyzer({no_improper_lists, exsplus_next/1}).
-%% Advance xorshift116+ state for one step and generate 58bit unsigned integer
+%% Advance state and generate 58bit unsigned integer
-spec exsplus_next(exsplus_state()) -> {uint58(), exsplus_state()}.
exsplus_next([S1|S0]) ->
%% Note: members s0 and s1 are swapped here
- S11 = S1 bxor ?BSL(58, S1, 24),
- S12 = S11 bxor S0 bxor (S11 bsr 11) bxor (S0 bsr 41),
- {?MASK(58, S0 + S12), [S0|S12]}.
+ NewS1 = ?exs_next(S0, S1, S1_1),
+ {?MASK(58, S0 + NewS1), [S0|NewS1]}.
+%% %% Note: members s0 and s1 are swapped here
+%% S11 = S1 bxor ?BSL(58, S1, 24),
+%% S12 = S11 bxor S0 bxor (S11 bsr 11) bxor (S0 bsr 41),
+%% {?MASK(58, S0 + S12), [S0|S12]}.
+
+-dialyzer({no_improper_lists, exsss_next/1}).
+-spec exsss_next(exsplus_state()) -> {uint58(), exsplus_state()}.
+exsss_next([S1|S0]) ->
+ %% Note: members s0 and s1 are swapped here
+ NewS1 = ?exs_next(S0, S1, S1_1),
+ {?scramble_starstar(S0, V_0, V_1), [S0|NewS1]}.
+%% {?MASK(58, S0 + NewS1), [S0|NewS1]}.
exsp_uniform({Alg, R0}) ->
{I, R1} = exsplus_next(R0),
@@ -714,18 +795,48 @@ exsp_uniform({Alg, R0}) ->
%% randomness quality than the others
{(I bsr (58-53)) * ?TWO_POW_MINUS53, {Alg, R1}}.
+exsss_uniform({Alg, R0}) ->
+ {I, R1} = exsss_next(R0),
+ {(I bsr (58-53)) * ?TWO_POW_MINUS53, {Alg, R1}}.
+
exsp_uniform(Range, {Alg, R}) ->
{V, R1} = exsplus_next(R),
MaxMinusRange = ?BIT(58) - Range,
?uniform_range(Range, Alg, R1, V, MaxMinusRange, I).
+exsss_uniform(Range, {Alg, R}) ->
+ {V, R1} = exsss_next(R),
+ MaxMinusRange = ?BIT(58) - Range,
+ ?uniform_range(Range, Alg, R1, V, MaxMinusRange, I).
+
-%% This is the jump function for the exsplus generator, equivalent
+%% This is the jump function for the exs* generators,
+%% i.e the Xorshift116 generators, equivalent
%% to 2^64 calls to next/1; it can be used to generate 2^52
%% non-overlapping subsequences for parallel computations.
%% Note: the jump function takes 116 times of the execution time of
%% next/1.
-
+%%
+%% #include <stdint.h>
+%%
+%% void jump(void) {
+%% static const uint64_t JUMP[] = { 0x02f8ea6bc32c797,
+%% 0x345d2a0f85f788c };
+%% int i, b;
+%% uint64_t s0 = 0;
+%% uint64_t s1 = 0;
+%% for(i = 0; i < sizeof JUMP / sizeof *JUMP; i++)
+%% for(b = 0; b < 58; b++) {
+%% if (JUMP[i] & 1ULL << b) {
+%% s0 ^= s[0];
+%% s1 ^= s[1];
+%% }
+%% next();
+%% }
+%% s[0] = s0;
+%% s[1] = s1;
+%% }
+%%
%% -define(JUMPCONST, 16#000d174a83e17de2302f8ea6bc32c797).
%% split into 58-bit chunks
%% and two iterative executions
@@ -973,13 +1084,14 @@ exro928ss_next({[S15,S0|Ss], Rs}) ->
%% {S, R, T} = {5, 7, 9}
%% const uint64_t result_starstar = rotl(s0 * S, R) * T;
%%
- %% The multiply by add shifted trick avoids creating bignums
- %% which improves performance significantly
- %%
- V0 = ?MASK(58, S0 + ?BSL(58, S0, 2)), % V0 = S0 * 5
- V1 = ?ROTL(58, V0, 7),
- V = ?MASK(58, V1 + ?BSL(58, V1, 3)), % V = V1 * 9
- {V, SR};
+ {?scramble_starstar(S0, V_0, V_1), SR};
+%% %% The multiply by add shifted trick avoids creating bignums
+%% %% which improves performance significantly
+%% %%
+%% V0 = ?MASK(58, S0 + ?BSL(58, S0, 2)), % V0 = S0 * 5
+%% V1 = ?ROTL(58, V0, 7),
+%% V = ?MASK(58, V1 + ?BSL(58, V1, 3)), % V = V1 * 9
+%% {V, SR};
exro928ss_next({[S15], Rs}) ->
exro928ss_next({[S15|lists:reverse(Rs)], []}).
diff --git a/lib/stdlib/test/gen_fsm_SUITE.erl b/lib/stdlib/test/gen_fsm_SUITE.erl
index 41ee3246f5..a8264e5a84 100644
--- a/lib/stdlib/test/gen_fsm_SUITE.erl
+++ b/lib/stdlib/test/gen_fsm_SUITE.erl
@@ -124,8 +124,10 @@ start2(Config) when is_list(Config) ->
{ok, Pid0} = gen_fsm:start(gen_fsm_SUITE, [], []),
ok = do_func_test(Pid0),
ok = do_sync_func_test(Pid0),
+ MRef = monitor(process,Pid0),
shutdown_stopped =
gen_fsm:sync_send_all_state_event(Pid0, stop_shutdown),
+ receive {'DOWN',MRef,_,_,shutdown} -> ok end,
{'EXIT', {noproc,_}} =
(catch gen_fsm:sync_send_event(Pid0, hej)),
diff --git a/lib/stdlib/test/rand_SUITE.erl b/lib/stdlib/test/rand_SUITE.erl
index 6c9fab51dc..7685c17967 100644
--- a/lib/stdlib/test/rand_SUITE.erl
+++ b/lib/stdlib/test/rand_SUITE.erl
@@ -79,7 +79,7 @@ test() ->
end, Tests).
algs() ->
- [exrop, exsp, exs1024s, exs64, exsplus, exs1024, exro928ss].
+ [exsss, exrop, exsp, exs1024s, exs64, exsplus, exs1024, exro928ss].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -276,7 +276,7 @@ gen(Algo) ->
if
Algo =:= exs64 -> %% Printed with orig 'C' code and this seed
rand:seed_s(exs64, [12345678]);
- Algo =:= exsplus; Algo =:= exsp; Algo =:= exrop ->
+ Algo =:= exsplus; Algo =:= exsp; Algo =:= exrop; Algo =:= exsss ->
%% Printed with orig 'C' code and this seed
rand:seed_s(Algo, [12345678,12345678]);
Algo =:= exs1024; Algo =:= exs1024s; Algo =:= exro928ss ->
@@ -438,7 +438,7 @@ stats_standard_normal_box_muller(Config) when is_list(Config) ->
([S|Z]) ->
{Z, [S]}
end,
- State = [rand:seed(exrop)],
+ State = [rand:seed(exsss)],
stats_standard_normal(NormalS, State, 3)
catch error:_ ->
{skip, "math:erfc/1 not supported"}
@@ -463,7 +463,7 @@ stats_standard_normal_box_muller_2(Config) when is_list(Config) ->
([S|Z]) ->
{Z, [S]}
end,
- State = [rand:seed(exrop)],
+ State = [rand:seed(exsss)],
stats_standard_normal(NormalS, State, 3)
catch error:_ ->
{skip, "math:erfc/1 not supported"}
@@ -475,7 +475,7 @@ stats_standard_normal(Config) when is_list(Config) ->
try math:erfc(1.0) of
_ ->
stats_standard_normal(
- fun rand:normal_s/1, rand:seed_s(exrop), Retries)
+ fun rand:normal_s/1, rand:seed_s(exsss), Retries)
catch error:_ ->
{skip, "math:erfc/1 not supported"}
end.
@@ -1071,7 +1071,7 @@ do_measure(_Config) ->
end,
State)
end,
- exrop, TMarkNormalFloat),
+ exsss, TMarkNormalFloat),
ok.
-define(LOOP_MEASURE, (?LOOP div 5)).
@@ -1170,7 +1170,7 @@ gen_jump_1(Algo) ->
catch
error:not_implemented -> [error_not_implemented]
end;
- _ when Algo =:= exsplus; Algo =:= exsp; Algo =:= exrop ->
+ _ when Algo =:= exsplus; Algo =:= exsp; Algo =:= exrop; Algo =:= exsss ->
%% Printed with orig 'C' code and this seed
gen_jump_2(
rand:seed_s(Algo, [12345678,12345678]));
@@ -1224,7 +1224,7 @@ gen_jump_p1(Algo) ->
catch
error:not_implemented -> [error_not_implemented]
end;
- _ when Algo =:= exsplus; Algo =:= exsp; Algo =:= exrop ->
+ _ when Algo =:= exsplus; Algo =:= exsp; Algo =:= exrop; Algo =:= exsss ->
%% Printed with orig 'C' code and this seed
gen_jump_p2(
rand:seed(Algo, [12345678,12345678]));
@@ -1377,6 +1377,34 @@ reference_val(exsplus) ->
16#3dd493b8012970f,16#be13bed1e00e5c,16#ceef033b74ae10,16#3da38c6a50abe03,
16#15cbd1a421c7a8c,16#22794e3ec6ef3b1,16#26154d26e7ea99f,16#3a66681359a6ab6];
+reference_val(exsss) ->
+ [16#108e8d5b01,16#33b72092117209a,16#224d4d2961a2d0a,16#2c4c81aac3da48d,
+ 16#2f4bc39bfc36f3a,16#41826d4c4d243a,16#19871b8bb4e23ee,16#3e2112cdf9384b1,
+ 16#69801943bf91ab,16#2de1a603c31ec45,16#a90ca1991b831e,16#51ca29571a69a7,
+ 16#93ce3e511906cf,16#93ebc5768aef75,16#2412f284b902ae7,16#1ac10e758410c52,
+ 16#3f32494560368f6,16#39a5e82dcf0de95,16#3f4b14d59cc6a21,16#3174668db0b36ae,
+ 16#1449812fb8bd54e,16#eaca1f8ece51e1,16#2564b2545fd23c1,16#3cf3a2d2217e0d7,
+ 16#226f4164ba1d054,16#10dac9ae207ceef,16#17f2c4b2d40fcb9,16#1c1b282d386fdcb,
+ 16#a264f450ba2912,16#2a0a1dd67e52666,16#2be84eb835cb1e1,16#2a1cd9aa16ccc37,
+ 16#7dd5e8c2b3f490,16#254a3db4976c05b,16#2a0a67971ec1e63,16#13a0cbf7c0eed8a,
+ 16#3192d7edc0a20bc,16#2705ad756292e84,16#3ec429a18119c81,16#25944b38baa975b,
+ 16#291dcc43e3256f4,16#30d10b759237db,16#c1522a652058a,16#8ef1e9378381e6,
+ 16#1f442f33c2439f4,16#186087710a73818,16#12887f94b2b8387,16#3e42e8b1f3c9b4b,
+ 16#e462859d55f9d8,16#2356ae85be908de,16#15e96a927b3bc52,16#35c6dc52511ce46,
+ 16#7bc0624ce66e01,16#33ab7d95b738322,16#26f01effc182aa0,16#1b66ae7eaafea88,
+ 16#278f3dc14943b90,16#22178bc8d8faf28,16#396c37d53c11985,16#5e0d79d0b10f18,
+ 16#1be3de3b5675ec,16#d4db298f1f4b50,16#2da6cb99bb5c7b1,16#130b2dc17d03be8,
+ 16#f1847e7e059e9f,16#2da6591788326e7,16#222e4a18c24211c,16#949213ca49baab,
+ 16#b5129fec56f6a2,16#30f25f1e926f43e,16#1ddd8d04445fb4d,16#15995b542514150,
+ 16#1595fe879296296,16#e2f237a488453b,16#23e5cd2d6047890,16#3a5dc88fc954666,
+ 16#89bca9969b103,16#5e6893cd35dc63,16#1fed534feeeef5a,16#26f40e2147ee558,
+ 16#30c131a00625837,16#2618a7e617422e9,16#23630b297e45e7,16#1143b17502f3219,
+ 16#15607dac41168da,16#2886bdc314b3fb8,16#465d1cc1536546,16#30b09123e3a02e4,
+ 16#245a375f810be52,16#6a1b0792376a03,16#221425f59f2470f,16#867ce16dfac81c,
+ 16#9c62d95fae9b58,16#380381db1394426,16#34908dedc01c324,16#1f0ff517089b561,
+ 16#1571366dd873d32,16#3ee353dc56e192,16#15a1dee8d889b11,16#41036ad76d9888
+ ];
+
reference_val(exsp) ->
reference_val(exsplus);
reference_val(exs1024s) ->
@@ -1517,6 +1545,33 @@ reference_jump_val(exsplus) ->
12504080415362731, 45083100453836317, 270968267812126657, 93505647407734103,
252852934678537969, 258758309277167202, 74250882143432077, 141629095984552833];
+reference_jump_val(exsss) ->
+ [16#304ae783d40db2b,16#1dfb196b3a5600a,16#2a24116effc6a0d,16#1f138d68c56725,
+ 16#9360a445e2f989,16#32ed8080390e242,16#294ca85a270cff6,16#1418e6296a88bf,
+ 16#114fae3dc578ba7,16#479c42c760eb72,16#334a40655df22d6,16#e7a85dd4d37d72,
+ 16#181db16c8925c77,16#1b8a5a8afd16cbd,16#329107bf9777a39,16#2fc915c08535e42,
+ 16#16696d142c6078,16#2e2a2601c919448,16#2246150d1000568,16#26109007cb3dd44,
+ 16#3761360723e3175,16#169abd352db74de,16#1c97d520983684f,16#12455f0adee8c66,
+ 16#46719cff00622d,16#1fc92792ed4e437,16#18e2edae21affb5,16#3a67fa9e3e7d46e,
+ 16#1313fdc2728aa74,16#1c1a2b577581db8,16#db49357ea196b1,16#10e219a21d93fc7,
+ 16#3c43abede083666,16#3eef5055a58bbf9,16#1975056f95d90e3,16#3916c133ab16d87,
+ 16#2bc0bea891c26f1,16#391e4b369fc6b36,16#183f83155a359f6,16#1d9f137e9d2e488,
+ 16#ef084de5f4cd3c,16#36a9cf7e29e55d3,16#19eca704e0409a7,16#1bdb99902896c69,
+ 16#21777e2ad128203,16#5d0369ec0563e4,16#36db40b863bd74a,16#33feb71b7515159,
+ 16#208d923ce26f257,16#3841b32891c082d,16#2748f224c2ba226,16#2fcd93b2daf79bb,
+ 16#2c8e6cacad58ec4,16#39850131a1a85f,16#134648d6eea624d,16#2e102e197d5725c,
+ 16#12ac280fa744758,16#1c18266c7442d16,16#22b5f91b15fe17e,16#316740ca870f7c8,
+ 16#720ed4836c426,16#1aac0f738d04f8c,16#34fcd2a647b462c,16#3d430ac755114a3,
+ 16#3692e3670fdf2a,16#265279ab0fc0a15,16#10bd883dee80945,16#10e7843413175e4,
+ 16#b291deba08cee2,16#3915a8234caf11,16#34b911b96707dbd,16#ae63fcda15fde6,
+ 16#b13b9091e82e41,16#29de1b6d70dc04f,16#23fbcbc409617e8,16#1389a0738061066,
+ 16#360f39af790f5d1,16#f436da2a7d12f5,16#2d06ba8da21e08,16#3601a6492b887d,
+ 16#2b2590b8c6cc186,16#f8d613b6904464,16#e5456786e46b78,16#201b8b1f96ed80c,
+ 16#1b75b86d9b843f2,16#2e8bfaa7243a630,16#125ff068a78c3b4,16#3875a28c48bd26e,
+ 16#f09a06941fc9d7,16#107c4de8ca77744,16#357c34144bb9ed6,16#3ccc55d3ebb3378,
+ 16#28db7cea7d3fdee,16#3197fd0b49f6370,16#11af6fedb708ea6,16#2bde0382e37469e,
+ 16#10666171abddb3f,16#1a8876c1f4e78a8,16#169c0efd4422043,16#1501c49abf0440f];
+
reference_jump_val(exs1024) ->
[2655961906500790629, 17003395417078685063, 10466831598958356428, 7603399148503548021,
1650550950190587188, 12294992315080723704, 15743995773860389219, 5492181000145247327,
diff --git a/lib/stdlib/test/sys_SUITE.erl b/lib/stdlib/test/sys_SUITE.erl
index 3278eb0eb0..fcc4419569 100644
--- a/lib/stdlib/test/sys_SUITE.erl
+++ b/lib/stdlib/test/sys_SUITE.erl
@@ -219,7 +219,7 @@ spec_proc(Mod) ->
{Mod,system_get_state},{throw,fail}},_}} ->
ok
end,
- ok = sys:terminate(Mod, normal),
+ ok = sync_terminate(Mod),
{ok,_} = Mod:start_link(4),
ok = case catch sys:replace_state(Mod, fun(_) -> {} end) of
{} ->
@@ -228,7 +228,7 @@ spec_proc(Mod) ->
{Mod,system_replace_state},{throw,fail}},_}} ->
ok
end,
- ok = sys:terminate(Mod, normal),
+ ok = sync_terminate(Mod),
{ok,_} = Mod:start_link(4),
StateFun = fun(_) -> error(fail) end,
ok = case catch sys:replace_state(Mod, StateFun) of
@@ -240,7 +240,18 @@ spec_proc(Mod) ->
{'EXIT',{{callback_failed,StateFun,{error,fail}},_}} ->
ok
end,
- ok = sys:terminate(Mod, normal).
+ ok = sync_terminate(Mod).
+
+sync_terminate(Mod) ->
+ P = whereis(Mod),
+ MRef = erlang:monitor(process,P),
+ ok = sys:terminate(Mod, normal),
+ receive
+ {'DOWN',MRef,_,_,normal} ->
+ ok
+ end,
+ undefined = whereis(Mod),
+ ok.
%%%%%%%%%%%%%%%%%%%%
%% Dummy server
diff --git a/lib/stdlib/test/unicode_util_SUITE_data/GraphemeBreakTest.txt b/lib/stdlib/test/unicode_util_SUITE_data/GraphemeBreakTest.txt
index d7d8f90de0..6847953c23 100644
--- a/lib/stdlib/test/unicode_util_SUITE_data/GraphemeBreakTest.txt
+++ b/lib/stdlib/test/unicode_util_SUITE_data/GraphemeBreakTest.txt
@@ -1,6 +1,6 @@
-# GraphemeBreakTest-10.0.0.txt
-# Date: 2017-04-14, 05:40:29 GMT
-# ยฉ 2017 Unicodeยฎ, Inc.
+# GraphemeBreakTest-11.0.0.txt
+# Date: 2018-03-18, 13:30:33 GMT
+# ยฉ 2018 Unicodeยฎ, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -23,828 +23,678 @@
# These samples may be extended or changed in the future.
#
รท 0020 รท 0020 รท # รท [0.2] SPACE (Other) รท [999.0] SPACE (Other) รท [0.3]
-รท 0020 ร— 0308 รท 0020 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
+รท 0020 ร— 0308 รท 0020 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
รท 0020 รท 000D รท # รท [0.2] SPACE (Other) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 0020 ร— 0308 รท 000D รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 0020 ร— 0308 รท 000D รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
รท 0020 รท 000A รท # รท [0.2] SPACE (Other) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 0020 ร— 0308 รท 000A รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 0020 ร— 0308 รท 000A รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
รท 0020 รท 0001 รท # รท [0.2] SPACE (Other) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 0020 ร— 0308 รท 0001 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 0020 ร— 0300 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 0020 ร— 0308 ร— 0300 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
+รท 0020 ร— 0308 รท 0001 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 0020 ร— 034F รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 0020 ร— 0308 ร— 034F รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 0020 รท 1F1E6 รท # รท [0.2] SPACE (Other) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 0020 ร— 0308 รท 1F1E6 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
รท 0020 รท 0600 รท # รท [0.2] SPACE (Other) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 0020 ร— 0308 รท 0600 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 0020 ร— 0308 รท 0600 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
รท 0020 ร— 0903 รท # รท [0.2] SPACE (Other) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 0020 ร— 0308 ร— 0903 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 0020 ร— 0308 ร— 0903 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
รท 0020 รท 1100 รท # รท [0.2] SPACE (Other) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 0020 ร— 0308 รท 1100 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 0020 ร— 0308 รท 1100 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท 0020 รท 1160 รท # รท [0.2] SPACE (Other) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 0020 ร— 0308 รท 1160 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 0020 ร— 0308 รท 1160 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
รท 0020 รท 11A8 รท # รท [0.2] SPACE (Other) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 0020 ร— 0308 รท 11A8 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 0020 ร— 0308 รท 11A8 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
รท 0020 รท AC00 รท # รท [0.2] SPACE (Other) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 0020 ร— 0308 รท AC00 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 0020 ร— 0308 รท AC00 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
รท 0020 รท AC01 รท # รท [0.2] SPACE (Other) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 0020 ร— 0308 รท AC01 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 0020 รท 1F1E6 รท # รท [0.2] SPACE (Other) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 0020 ร— 0308 รท 1F1E6 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 0020 รท 261D รท # รท [0.2] SPACE (Other) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 0020 ร— 0308 รท 261D รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 0020 รท 1F3FB รท # รท [0.2] SPACE (Other) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 0020 ร— 0308 รท 1F3FB รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 0020 ร— 200D รท # รท [0.2] SPACE (Other) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 0020 ร— 0308 ร— 200D รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 0020 รท 2640 รท # รท [0.2] SPACE (Other) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 0020 ร— 0308 รท 2640 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 0020 รท 1F466 รท # รท [0.2] SPACE (Other) รท [999.0] BOY (EBG) รท [0.3]
-รท 0020 ร— 0308 รท 1F466 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
+รท 0020 ร— 0308 รท AC01 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 0020 รท 231A รท # รท [0.2] SPACE (Other) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 0020 ร— 0308 รท 231A รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 0020 ร— 0300 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 0020 ร— 0308 ร— 0300 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 0020 ร— 200D รท # รท [0.2] SPACE (Other) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 0020 ร— 0308 ร— 200D รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
รท 0020 รท 0378 รท # รท [0.2] SPACE (Other) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 0020 ร— 0308 รท 0378 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 0020 ร— 0308 รท 0378 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
รท 0020 รท D800 รท # รท [0.2] SPACE (Other) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 0020 ร— 0308 รท D800 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 0020 ร— 0308 รท D800 รท # รท [0.2] SPACE (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
รท 000D รท 0020 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] SPACE (Other) รท [0.3]
-รท 000D รท 0308 รท 0020 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
+รท 000D รท 0308 รท 0020 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
รท 000D รท 000D รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 000D รท 0308 รท 000D รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 000D รท 0308 รท 000D รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
รท 000D ร— 000A รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) ร— [3.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 000D รท 0308 รท 000A รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 000D รท 0308 รท 000A รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
รท 000D รท 0001 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] <START OF HEADING> (Control) รท [0.3]
-รท 000D รท 0308 รท 0001 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 000D รท 0300 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 000D รท 0308 ร— 0300 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
+รท 000D รท 0308 รท 0001 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 000D รท 034F รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 000D รท 0308 ร— 034F รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 000D รท 1F1E6 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 000D รท 0308 รท 1F1E6 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
รท 000D รท 0600 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 000D รท 0308 รท 0600 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 000D รท 0308 รท 0600 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
รท 000D รท 0903 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 000D รท 0308 ร— 0903 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 000D รท 0308 ร— 0903 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
รท 000D รท 1100 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 000D รท 0308 รท 1100 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 000D รท 0308 รท 1100 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท 000D รท 1160 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 000D รท 0308 รท 1160 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 000D รท 0308 รท 1160 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
รท 000D รท 11A8 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 000D รท 0308 รท 11A8 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 000D รท 0308 รท 11A8 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
รท 000D รท AC00 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 000D รท 0308 รท AC00 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 000D รท 0308 รท AC00 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
รท 000D รท AC01 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 000D รท 0308 รท AC01 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 000D รท 1F1E6 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 000D รท 0308 รท 1F1E6 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 000D รท 261D รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 000D รท 0308 รท 261D รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 000D รท 1F3FB รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 000D รท 0308 รท 1F3FB รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 000D รท 200D รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 000D รท 0308 ร— 200D รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 000D รท 2640 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 000D รท 0308 รท 2640 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 000D รท 1F466 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] BOY (EBG) รท [0.3]
-รท 000D รท 0308 รท 1F466 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
+รท 000D รท 0308 รท AC01 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 000D รท 231A รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] WATCH (ExtPict) รท [0.3]
+รท 000D รท 0308 รท 231A รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 000D รท 0300 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 000D รท 0308 ร— 0300 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 000D รท 200D รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 000D รท 0308 ร— 200D รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
รท 000D รท 0378 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] <reserved-0378> (Other) รท [0.3]
-รท 000D รท 0308 รท 0378 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 000D รท 0308 รท 0378 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
รท 000D รท D800 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] <surrogate-D800> (Control) รท [0.3]
-รท 000D รท 0308 รท D800 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 000D รท 0308 รท D800 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
รท 000A รท 0020 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] SPACE (Other) รท [0.3]
-รท 000A รท 0308 รท 0020 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
+รท 000A รท 0308 รท 0020 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
รท 000A รท 000D รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 000A รท 0308 รท 000D รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 000A รท 0308 รท 000D รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
รท 000A รท 000A รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 000A รท 0308 รท 000A รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 000A รท 0308 รท 000A รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
รท 000A รท 0001 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] <START OF HEADING> (Control) รท [0.3]
-รท 000A รท 0308 รท 0001 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 000A รท 0300 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 000A รท 0308 ร— 0300 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
+รท 000A รท 0308 รท 0001 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 000A รท 034F รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 000A รท 0308 ร— 034F รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 000A รท 1F1E6 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 000A รท 0308 รท 1F1E6 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
รท 000A รท 0600 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 000A รท 0308 รท 0600 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 000A รท 0308 รท 0600 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
รท 000A รท 0903 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 000A รท 0308 ร— 0903 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 000A รท 0308 ร— 0903 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
รท 000A รท 1100 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 000A รท 0308 รท 1100 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 000A รท 0308 รท 1100 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท 000A รท 1160 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 000A รท 0308 รท 1160 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 000A รท 0308 รท 1160 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
รท 000A รท 11A8 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 000A รท 0308 รท 11A8 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 000A รท 0308 รท 11A8 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
รท 000A รท AC00 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 000A รท 0308 รท AC00 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 000A รท 0308 รท AC00 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
รท 000A รท AC01 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 000A รท 0308 รท AC01 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 000A รท 1F1E6 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 000A รท 0308 รท 1F1E6 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 000A รท 261D รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 000A รท 0308 รท 261D รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 000A รท 1F3FB รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 000A รท 0308 รท 1F3FB รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 000A รท 200D รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 000A รท 0308 ร— 200D รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 000A รท 2640 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 000A รท 0308 รท 2640 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 000A รท 1F466 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] BOY (EBG) รท [0.3]
-รท 000A รท 0308 รท 1F466 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
+รท 000A รท 0308 รท AC01 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 000A รท 231A รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] WATCH (ExtPict) รท [0.3]
+รท 000A รท 0308 รท 231A รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 000A รท 0300 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 000A รท 0308 ร— 0300 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 000A รท 200D รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 000A รท 0308 ร— 200D รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
รท 000A รท 0378 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] <reserved-0378> (Other) รท [0.3]
-รท 000A รท 0308 รท 0378 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 000A รท 0308 รท 0378 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
รท 000A รท D800 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] <surrogate-D800> (Control) รท [0.3]
-รท 000A รท 0308 รท D800 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 000A รท 0308 รท D800 รท # รท [0.2] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
รท 0001 รท 0020 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] SPACE (Other) รท [0.3]
-รท 0001 รท 0308 รท 0020 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
+รท 0001 รท 0308 รท 0020 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
รท 0001 รท 000D รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 0001 รท 0308 รท 000D รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 0001 รท 0308 รท 000D รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
รท 0001 รท 000A รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 0001 รท 0308 รท 000A รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 0001 รท 0308 รท 000A รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
รท 0001 รท 0001 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] <START OF HEADING> (Control) รท [0.3]
-รท 0001 รท 0308 รท 0001 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 0001 รท 0300 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 0001 รท 0308 ร— 0300 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
+รท 0001 รท 0308 รท 0001 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 0001 รท 034F รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 0001 รท 0308 ร— 034F รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 0001 รท 1F1E6 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 0001 รท 0308 รท 1F1E6 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
รท 0001 รท 0600 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 0001 รท 0308 รท 0600 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 0001 รท 0308 รท 0600 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
รท 0001 รท 0903 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 0001 รท 0308 ร— 0903 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 0001 รท 0308 ร— 0903 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
รท 0001 รท 1100 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 0001 รท 0308 รท 1100 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 0001 รท 0308 รท 1100 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท 0001 รท 1160 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 0001 รท 0308 รท 1160 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 0001 รท 0308 รท 1160 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
รท 0001 รท 11A8 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 0001 รท 0308 รท 11A8 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 0001 รท 0308 รท 11A8 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
รท 0001 รท AC00 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 0001 รท 0308 รท AC00 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 0001 รท 0308 รท AC00 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
รท 0001 รท AC01 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 0001 รท 0308 รท AC01 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 0001 รท 1F1E6 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 0001 รท 0308 รท 1F1E6 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 0001 รท 261D รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 0001 รท 0308 รท 261D รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 0001 รท 1F3FB รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 0001 รท 0308 รท 1F3FB รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 0001 รท 200D รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 0001 รท 0308 ร— 200D รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 0001 รท 2640 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 0001 รท 0308 รท 2640 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 0001 รท 1F466 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] BOY (EBG) รท [0.3]
-รท 0001 รท 0308 รท 1F466 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
+รท 0001 รท 0308 รท AC01 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 0001 รท 231A รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] WATCH (ExtPict) รท [0.3]
+รท 0001 รท 0308 รท 231A รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 0001 รท 0300 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 0001 รท 0308 ร— 0300 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 0001 รท 200D รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 0001 รท 0308 ร— 200D รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
รท 0001 รท 0378 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] <reserved-0378> (Other) รท [0.3]
-รท 0001 รท 0308 รท 0378 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 0001 รท 0308 รท 0378 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
รท 0001 รท D800 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] <surrogate-D800> (Control) รท [0.3]
-รท 0001 รท 0308 รท D800 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 0300 รท 0020 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [999.0] SPACE (Other) รท [0.3]
-รท 0300 ร— 0308 รท 0020 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
-รท 0300 รท 000D รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 0300 ร— 0308 รท 000D รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 0300 รท 000A รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 0300 ร— 0308 รท 000A รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 0300 รท 0001 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 0300 ร— 0308 รท 0001 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 0300 ร— 0300 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 0300 ร— 0308 ร— 0300 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 0300 รท 0600 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 0300 ร— 0308 รท 0600 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 0300 ร— 0903 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 0300 ร— 0308 ร— 0903 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 0300 รท 1100 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 0300 ร— 0308 รท 1100 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 0300 รท 1160 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 0300 ร— 0308 รท 1160 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 0300 รท 11A8 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 0300 ร— 0308 รท 11A8 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 0300 รท AC00 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 0300 ร— 0308 รท AC00 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 0300 รท AC01 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 0300 ร— 0308 รท AC01 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 0300 รท 1F1E6 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 0300 ร— 0308 รท 1F1E6 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 0300 รท 261D รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 0300 ร— 0308 รท 261D รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 0300 รท 1F3FB รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 0300 ร— 0308 รท 1F3FB รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 0300 ร— 200D รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 0300 ร— 0308 ร— 200D รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 0300 รท 2640 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 0300 ร— 0308 รท 2640 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 0300 รท 1F466 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [999.0] BOY (EBG) รท [0.3]
-รท 0300 ร— 0308 รท 1F466 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
-รท 0300 รท 0378 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 0300 ร— 0308 รท 0378 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 0300 รท D800 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 0300 ร— 0308 รท D800 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 0001 รท 0308 รท D800 รท # รท [0.2] <START OF HEADING> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 034F รท 0020 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) รท [999.0] SPACE (Other) รท [0.3]
+รท 034F ร— 0308 รท 0020 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
+รท 034F รท 000D รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 034F ร— 0308 รท 000D รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 034F รท 000A รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 034F ร— 0308 รท 000A รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 034F รท 0001 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 034F ร— 0308 รท 0001 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 034F ร— 034F รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 034F ร— 0308 ร— 034F รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 034F รท 1F1E6 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 034F ร— 0308 รท 1F1E6 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 034F รท 0600 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 034F ร— 0308 รท 0600 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 034F ร— 0903 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 034F ร— 0308 ร— 0903 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 034F รท 1100 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 034F ร— 0308 รท 1100 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 034F รท 1160 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 034F ร— 0308 รท 1160 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 034F รท 11A8 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 034F ร— 0308 รท 11A8 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 034F รท AC00 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 034F ร— 0308 รท AC00 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 034F รท AC01 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 034F ร— 0308 รท AC01 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 034F รท 231A รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 034F ร— 0308 รท 231A รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 034F ร— 0300 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 034F ร— 0308 ร— 0300 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 034F ร— 200D รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 034F ร— 0308 ร— 200D รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 034F รท 0378 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 034F ร— 0308 รท 0378 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 034F รท D800 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 034F ร— 0308 รท D800 รท # รท [0.2] COMBINING GRAPHEME JOINER (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 1F1E6 รท 0020 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] SPACE (Other) รท [0.3]
+รท 1F1E6 ร— 0308 รท 0020 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
+รท 1F1E6 รท 000D รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 1F1E6 ร— 0308 รท 000D รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 1F1E6 รท 000A รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 1F1E6 ร— 0308 รท 000A รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 1F1E6 รท 0001 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 1F1E6 ร— 0308 รท 0001 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 1F1E6 ร— 034F รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 1F1E6 ร— 0308 ร— 034F รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 1F1E6 ร— 1F1E6 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [12.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 1F1E6 ร— 0308 รท 1F1E6 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 1F1E6 รท 0600 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 1F1E6 ร— 0308 รท 0600 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 1F1E6 ร— 0903 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 1F1E6 ร— 0308 ร— 0903 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 1F1E6 รท 1100 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 1F1E6 ร— 0308 รท 1100 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 1F1E6 รท 1160 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 1F1E6 ร— 0308 รท 1160 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 1F1E6 รท 11A8 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 1F1E6 ร— 0308 รท 11A8 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 1F1E6 รท AC00 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 1F1E6 ร— 0308 รท AC00 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 1F1E6 รท AC01 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 1F1E6 ร— 0308 รท AC01 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 1F1E6 รท 231A รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 1F1E6 ร— 0308 รท 231A รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 1F1E6 ร— 0300 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 1F1E6 ร— 0308 ร— 0300 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 1F1E6 ร— 200D รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 1F1E6 ร— 0308 ร— 200D รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 1F1E6 รท 0378 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 1F1E6 ร— 0308 รท 0378 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 1F1E6 รท D800 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 1F1E6 ร— 0308 รท D800 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
รท 0600 ร— 0020 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.2] SPACE (Other) รท [0.3]
-รท 0600 ร— 0308 รท 0020 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
+รท 0600 ร— 0308 รท 0020 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
รท 0600 รท 000D รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 0600 ร— 0308 รท 000D รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 0600 ร— 0308 รท 000D รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
รท 0600 รท 000A รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 0600 ร— 0308 รท 000A รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 0600 ร— 0308 รท 000A รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
รท 0600 รท 0001 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 0600 ร— 0308 รท 0001 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 0600 ร— 0300 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 0600 ร— 0308 ร— 0300 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
+รท 0600 ร— 0308 รท 0001 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 0600 ร— 034F รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 0600 ร— 0308 ร— 034F รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 0600 ร— 1F1E6 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 0600 ร— 0308 รท 1F1E6 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
รท 0600 ร— 0600 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.2] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 0600 ร— 0308 รท 0600 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 0600 ร— 0308 รท 0600 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
รท 0600 ร— 0903 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 0600 ร— 0308 ร— 0903 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 0600 ร— 0308 ร— 0903 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
รท 0600 ร— 1100 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.2] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 0600 ร— 0308 รท 1100 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 0600 ร— 0308 รท 1100 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท 0600 ร— 1160 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.2] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 0600 ร— 0308 รท 1160 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 0600 ร— 0308 รท 1160 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
รท 0600 ร— 11A8 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.2] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 0600 ร— 0308 รท 11A8 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 0600 ร— 0308 รท 11A8 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
รท 0600 ร— AC00 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.2] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 0600 ร— 0308 รท AC00 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 0600 ร— 0308 รท AC00 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
รท 0600 ร— AC01 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.2] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 0600 ร— 0308 รท AC01 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 0600 ร— 1F1E6 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 0600 ร— 0308 รท 1F1E6 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 0600 ร— 261D รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.2] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 0600 ร— 0308 รท 261D รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 0600 ร— 1F3FB รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 0600 ร— 0308 รท 1F3FB รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 0600 ร— 200D รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 0600 ร— 0308 ร— 200D รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 0600 ร— 2640 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.2] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 0600 ร— 0308 รท 2640 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 0600 ร— 1F466 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.2] BOY (EBG) รท [0.3]
-รท 0600 ร— 0308 รท 1F466 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
+รท 0600 ร— 0308 รท AC01 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 0600 ร— 231A รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.2] WATCH (ExtPict) รท [0.3]
+รท 0600 ร— 0308 รท 231A รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 0600 ร— 0300 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 0600 ร— 0308 ร— 0300 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 0600 ร— 200D รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 0600 ร— 0308 ร— 200D รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
รท 0600 ร— 0378 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.2] <reserved-0378> (Other) รท [0.3]
-รท 0600 ร— 0308 รท 0378 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 0600 ร— 0308 รท 0378 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
รท 0600 รท D800 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 0600 ร— 0308 รท D800 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 0600 ร— 0308 รท D800 รท # รท [0.2] ARABIC NUMBER SIGN (Prepend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
รท 0903 รท 0020 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] SPACE (Other) รท [0.3]
-รท 0903 ร— 0308 รท 0020 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
+รท 0903 ร— 0308 รท 0020 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
รท 0903 รท 000D รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 0903 ร— 0308 รท 000D รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 0903 ร— 0308 รท 000D รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
รท 0903 รท 000A รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 0903 ร— 0308 รท 000A รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 0903 ร— 0308 รท 000A รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
รท 0903 รท 0001 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 0903 ร— 0308 รท 0001 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 0903 ร— 0300 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 0903 ร— 0308 ร— 0300 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
+รท 0903 ร— 0308 รท 0001 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 0903 ร— 034F รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 0903 ร— 0308 ร— 034F รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 0903 รท 1F1E6 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 0903 ร— 0308 รท 1F1E6 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
รท 0903 รท 0600 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 0903 ร— 0308 รท 0600 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 0903 ร— 0308 รท 0600 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
รท 0903 ร— 0903 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 0903 ร— 0308 ร— 0903 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 0903 ร— 0308 ร— 0903 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
รท 0903 รท 1100 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 0903 ร— 0308 รท 1100 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 0903 ร— 0308 รท 1100 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท 0903 รท 1160 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 0903 ร— 0308 รท 1160 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 0903 ร— 0308 รท 1160 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
รท 0903 รท 11A8 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 0903 ร— 0308 รท 11A8 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 0903 ร— 0308 รท 11A8 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
รท 0903 รท AC00 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 0903 ร— 0308 รท AC00 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 0903 ร— 0308 รท AC00 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
รท 0903 รท AC01 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 0903 ร— 0308 รท AC01 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 0903 รท 1F1E6 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 0903 ร— 0308 รท 1F1E6 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 0903 รท 261D รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 0903 ร— 0308 รท 261D รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 0903 รท 1F3FB รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 0903 ร— 0308 รท 1F3FB รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 0903 ร— 200D รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 0903 ร— 0308 ร— 200D รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 0903 รท 2640 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 0903 ร— 0308 รท 2640 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 0903 รท 1F466 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] BOY (EBG) รท [0.3]
-รท 0903 ร— 0308 รท 1F466 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
+รท 0903 ร— 0308 รท AC01 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 0903 รท 231A รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 0903 ร— 0308 รท 231A รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 0903 ร— 0300 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 0903 ร— 0308 ร— 0300 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 0903 ร— 200D รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 0903 ร— 0308 ร— 200D รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
รท 0903 รท 0378 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 0903 ร— 0308 รท 0378 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 0903 ร— 0308 รท 0378 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
รท 0903 รท D800 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 0903 ร— 0308 รท D800 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 0903 ร— 0308 รท D800 รท # รท [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
รท 1100 รท 0020 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) รท [999.0] SPACE (Other) รท [0.3]
-รท 1100 ร— 0308 รท 0020 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
+รท 1100 ร— 0308 รท 0020 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
รท 1100 รท 000D รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 1100 ร— 0308 รท 000D รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 1100 ร— 0308 รท 000D รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
รท 1100 รท 000A รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 1100 ร— 0308 รท 000A รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 1100 ร— 0308 รท 000A รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
รท 1100 รท 0001 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 1100 ร— 0308 รท 0001 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 1100 ร— 0300 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 1100 ร— 0308 ร— 0300 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
+รท 1100 ร— 0308 รท 0001 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 1100 ร— 034F รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 1100 ร— 0308 ร— 034F รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 1100 รท 1F1E6 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 1100 ร— 0308 รท 1F1E6 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
รท 1100 รท 0600 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 1100 ร— 0308 รท 0600 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 1100 ร— 0308 รท 0600 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
รท 1100 ร— 0903 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 1100 ร— 0308 ร— 0903 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 1100 ร— 0308 ร— 0903 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
รท 1100 ร— 1100 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [6.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 1100 ร— 0308 รท 1100 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 1100 ร— 0308 รท 1100 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท 1100 ร— 1160 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [6.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 1100 ร— 0308 รท 1160 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 1100 ร— 0308 รท 1160 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
รท 1100 รท 11A8 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 1100 ร— 0308 รท 11A8 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 1100 ร— 0308 รท 11A8 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
รท 1100 ร— AC00 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [6.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 1100 ร— 0308 รท AC00 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 1100 ร— 0308 รท AC00 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
รท 1100 ร— AC01 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [6.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 1100 ร— 0308 รท AC01 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 1100 รท 1F1E6 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 1100 ร— 0308 รท 1F1E6 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 1100 รท 261D รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 1100 ร— 0308 รท 261D รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 1100 รท 1F3FB รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 1100 ร— 0308 รท 1F3FB รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 1100 ร— 200D รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 1100 ร— 0308 ร— 200D รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 1100 รท 2640 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 1100 ร— 0308 รท 2640 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 1100 รท 1F466 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) รท [999.0] BOY (EBG) รท [0.3]
-รท 1100 ร— 0308 รท 1F466 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
+รท 1100 ร— 0308 รท AC01 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 1100 รท 231A รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 1100 ร— 0308 รท 231A รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 1100 ร— 0300 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 1100 ร— 0308 ร— 0300 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 1100 ร— 200D รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 1100 ร— 0308 ร— 200D รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
รท 1100 รท 0378 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 1100 ร— 0308 รท 0378 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 1100 ร— 0308 รท 0378 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
รท 1100 รท D800 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 1100 ร— 0308 รท D800 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 1100 ร— 0308 รท D800 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
รท 1160 รท 0020 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [999.0] SPACE (Other) รท [0.3]
-รท 1160 ร— 0308 รท 0020 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
+รท 1160 ร— 0308 รท 0020 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
รท 1160 รท 000D รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 1160 ร— 0308 รท 000D รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 1160 ร— 0308 รท 000D รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
รท 1160 รท 000A รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 1160 ร— 0308 รท 000A รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 1160 ร— 0308 รท 000A รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
รท 1160 รท 0001 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 1160 ร— 0308 รท 0001 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 1160 ร— 0300 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 1160 ร— 0308 ร— 0300 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
+รท 1160 ร— 0308 รท 0001 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 1160 ร— 034F รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 1160 ร— 0308 ร— 034F รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 1160 รท 1F1E6 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 1160 ร— 0308 รท 1F1E6 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
รท 1160 รท 0600 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 1160 ร— 0308 รท 0600 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 1160 ร— 0308 รท 0600 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
รท 1160 ร— 0903 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 1160 ร— 0308 ร— 0903 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 1160 ร— 0308 ร— 0903 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
รท 1160 รท 1100 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 1160 ร— 0308 รท 1100 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 1160 ร— 0308 รท 1100 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท 1160 ร— 1160 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [7.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 1160 ร— 0308 รท 1160 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 1160 ร— 0308 รท 1160 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
รท 1160 ร— 11A8 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [7.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 1160 ร— 0308 รท 11A8 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 1160 ร— 0308 รท 11A8 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
รท 1160 รท AC00 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 1160 ร— 0308 รท AC00 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 1160 ร— 0308 รท AC00 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
รท 1160 รท AC01 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 1160 ร— 0308 รท AC01 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 1160 รท 1F1E6 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 1160 ร— 0308 รท 1F1E6 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 1160 รท 261D รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 1160 ร— 0308 รท 261D รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 1160 รท 1F3FB รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 1160 ร— 0308 รท 1F3FB รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 1160 ร— 200D รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 1160 ร— 0308 ร— 200D รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 1160 รท 2640 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 1160 ร— 0308 รท 2640 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 1160 รท 1F466 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [999.0] BOY (EBG) รท [0.3]
-รท 1160 ร— 0308 รท 1F466 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
+รท 1160 ร— 0308 รท AC01 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 1160 รท 231A รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 1160 ร— 0308 รท 231A รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 1160 ร— 0300 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 1160 ร— 0308 ร— 0300 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 1160 ร— 200D รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 1160 ร— 0308 ร— 200D รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
รท 1160 รท 0378 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 1160 ร— 0308 รท 0378 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 1160 ร— 0308 รท 0378 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
รท 1160 รท D800 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 1160 ร— 0308 รท D800 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 1160 ร— 0308 รท D800 รท # รท [0.2] HANGUL JUNGSEONG FILLER (V) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
รท 11A8 รท 0020 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [999.0] SPACE (Other) รท [0.3]
-รท 11A8 ร— 0308 รท 0020 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
+รท 11A8 ร— 0308 รท 0020 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
รท 11A8 รท 000D รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 11A8 ร— 0308 รท 000D รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 11A8 ร— 0308 รท 000D รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
รท 11A8 รท 000A รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 11A8 ร— 0308 รท 000A รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 11A8 ร— 0308 รท 000A รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
รท 11A8 รท 0001 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 11A8 ร— 0308 รท 0001 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 11A8 ร— 0300 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 11A8 ร— 0308 ร— 0300 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
+รท 11A8 ร— 0308 รท 0001 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 11A8 ร— 034F รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 11A8 ร— 0308 ร— 034F รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 11A8 รท 1F1E6 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 11A8 ร— 0308 รท 1F1E6 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
รท 11A8 รท 0600 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 11A8 ร— 0308 รท 0600 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 11A8 ร— 0308 รท 0600 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
รท 11A8 ร— 0903 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 11A8 ร— 0308 ร— 0903 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 11A8 ร— 0308 ร— 0903 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
รท 11A8 รท 1100 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 11A8 ร— 0308 รท 1100 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 11A8 ร— 0308 รท 1100 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท 11A8 รท 1160 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 11A8 ร— 0308 รท 1160 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 11A8 ร— 0308 รท 1160 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
รท 11A8 ร— 11A8 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [8.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 11A8 ร— 0308 รท 11A8 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 11A8 ร— 0308 รท 11A8 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
รท 11A8 รท AC00 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 11A8 ร— 0308 รท AC00 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 11A8 ร— 0308 รท AC00 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
รท 11A8 รท AC01 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 11A8 ร— 0308 รท AC01 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 11A8 รท 1F1E6 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 11A8 ร— 0308 รท 1F1E6 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 11A8 รท 261D รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 11A8 ร— 0308 รท 261D รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 11A8 รท 1F3FB รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 11A8 ร— 0308 รท 1F3FB รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 11A8 ร— 200D รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 11A8 ร— 0308 ร— 200D รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 11A8 รท 2640 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 11A8 ร— 0308 รท 2640 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 11A8 รท 1F466 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [999.0] BOY (EBG) รท [0.3]
-รท 11A8 ร— 0308 รท 1F466 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
+รท 11A8 ร— 0308 รท AC01 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 11A8 รท 231A รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 11A8 ร— 0308 รท 231A รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 11A8 ร— 0300 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 11A8 ร— 0308 ร— 0300 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 11A8 ร— 200D รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 11A8 ร— 0308 ร— 200D รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
รท 11A8 รท 0378 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 11A8 ร— 0308 รท 0378 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 11A8 ร— 0308 รท 0378 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
รท 11A8 รท D800 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 11A8 ร— 0308 รท D800 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 11A8 ร— 0308 รท D800 รท # รท [0.2] HANGUL JONGSEONG KIYEOK (T) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
รท AC00 รท 0020 รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [999.0] SPACE (Other) รท [0.3]
-รท AC00 ร— 0308 รท 0020 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
+รท AC00 ร— 0308 รท 0020 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
รท AC00 รท 000D รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท AC00 ร— 0308 รท 000D รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท AC00 ร— 0308 รท 000D รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
รท AC00 รท 000A รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท AC00 ร— 0308 รท 000A รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท AC00 ร— 0308 รท 000A รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
รท AC00 รท 0001 รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท AC00 ร— 0308 รท 0001 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท AC00 ร— 0300 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท AC00 ร— 0308 ร— 0300 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
+รท AC00 ร— 0308 รท 0001 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท AC00 ร— 034F รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท AC00 ร— 0308 ร— 034F รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท AC00 รท 1F1E6 รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท AC00 ร— 0308 รท 1F1E6 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
รท AC00 รท 0600 รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท AC00 ร— 0308 รท 0600 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท AC00 ร— 0308 รท 0600 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
รท AC00 ร— 0903 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท AC00 ร— 0308 ร— 0903 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท AC00 ร— 0308 ร— 0903 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
รท AC00 รท 1100 รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท AC00 ร— 0308 รท 1100 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท AC00 ร— 0308 รท 1100 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท AC00 ร— 1160 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [7.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท AC00 ร— 0308 รท 1160 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท AC00 ร— 0308 รท 1160 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
รท AC00 ร— 11A8 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [7.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท AC00 ร— 0308 รท 11A8 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท AC00 ร— 0308 รท 11A8 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
รท AC00 รท AC00 รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท AC00 ร— 0308 รท AC00 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท AC00 ร— 0308 รท AC00 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
รท AC00 รท AC01 รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท AC00 ร— 0308 รท AC01 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท AC00 รท 1F1E6 รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท AC00 ร— 0308 รท 1F1E6 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท AC00 รท 261D รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท AC00 ร— 0308 รท 261D รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท AC00 รท 1F3FB รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท AC00 ร— 0308 รท 1F3FB รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท AC00 ร— 200D รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท AC00 ร— 0308 ร— 200D รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท AC00 รท 2640 รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท AC00 ร— 0308 รท 2640 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท AC00 รท 1F466 รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [999.0] BOY (EBG) รท [0.3]
-รท AC00 ร— 0308 รท 1F466 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
+รท AC00 ร— 0308 รท AC01 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท AC00 รท 231A รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท AC00 ร— 0308 รท 231A รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท AC00 ร— 0300 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท AC00 ร— 0308 ร— 0300 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท AC00 ร— 200D รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท AC00 ร— 0308 ร— 200D รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
รท AC00 รท 0378 รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท AC00 ร— 0308 รท 0378 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท AC00 ร— 0308 รท 0378 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
รท AC00 รท D800 รท # รท [0.2] HANGUL SYLLABLE GA (LV) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท AC00 ร— 0308 รท D800 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท AC00 ร— 0308 รท D800 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
รท AC01 รท 0020 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [999.0] SPACE (Other) รท [0.3]
-รท AC01 ร— 0308 รท 0020 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
+รท AC01 ร— 0308 รท 0020 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
รท AC01 รท 000D รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท AC01 ร— 0308 รท 000D รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท AC01 ร— 0308 รท 000D รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
รท AC01 รท 000A รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท AC01 ร— 0308 รท 000A รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท AC01 ร— 0308 รท 000A รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
รท AC01 รท 0001 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท AC01 ร— 0308 รท 0001 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท AC01 ร— 0300 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท AC01 ร— 0308 ร— 0300 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
+รท AC01 ร— 0308 รท 0001 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท AC01 ร— 034F รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท AC01 ร— 0308 ร— 034F รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท AC01 รท 1F1E6 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท AC01 ร— 0308 รท 1F1E6 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
รท AC01 รท 0600 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท AC01 ร— 0308 รท 0600 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท AC01 ร— 0308 รท 0600 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
รท AC01 ร— 0903 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท AC01 ร— 0308 ร— 0903 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท AC01 ร— 0308 ร— 0903 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
รท AC01 รท 1100 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท AC01 ร— 0308 รท 1100 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท AC01 ร— 0308 รท 1100 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท AC01 รท 1160 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท AC01 ร— 0308 รท 1160 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท AC01 ร— 0308 รท 1160 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
รท AC01 ร— 11A8 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [8.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท AC01 ร— 0308 รท 11A8 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท AC01 ร— 0308 รท 11A8 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
รท AC01 รท AC00 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท AC01 ร— 0308 รท AC00 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท AC01 ร— 0308 รท AC00 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
รท AC01 รท AC01 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท AC01 ร— 0308 รท AC01 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท AC01 รท 1F1E6 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท AC01 ร— 0308 รท 1F1E6 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท AC01 รท 261D รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท AC01 ร— 0308 รท 261D รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท AC01 รท 1F3FB รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท AC01 ร— 0308 รท 1F3FB รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท AC01 ร— 200D รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท AC01 ร— 0308 ร— 200D รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท AC01 รท 2640 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท AC01 ร— 0308 รท 2640 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท AC01 รท 1F466 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [999.0] BOY (EBG) รท [0.3]
-รท AC01 ร— 0308 รท 1F466 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
+รท AC01 ร— 0308 รท AC01 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท AC01 รท 231A รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท AC01 ร— 0308 รท 231A รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท AC01 ร— 0300 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท AC01 ร— 0308 ร— 0300 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท AC01 ร— 200D รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท AC01 ร— 0308 ร— 200D รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
รท AC01 รท 0378 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท AC01 ร— 0308 รท 0378 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท AC01 ร— 0308 รท 0378 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
รท AC01 รท D800 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท AC01 ร— 0308 รท D800 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 1F1E6 รท 0020 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] SPACE (Other) รท [0.3]
-รท 1F1E6 ร— 0308 รท 0020 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
-รท 1F1E6 รท 000D รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 1F1E6 ร— 0308 รท 000D รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 1F1E6 รท 000A รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 1F1E6 ร— 0308 รท 000A รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 1F1E6 รท 0001 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 1F1E6 ร— 0308 รท 0001 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 1F1E6 ร— 0300 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 1F1E6 ร— 0308 ร— 0300 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 1F1E6 รท 0600 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 1F1E6 ร— 0308 รท 0600 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 1F1E6 ร— 0903 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 1F1E6 ร— 0308 ร— 0903 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 1F1E6 รท 1100 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 1F1E6 ร— 0308 รท 1100 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 1F1E6 รท 1160 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 1F1E6 ร— 0308 รท 1160 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 1F1E6 รท 11A8 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 1F1E6 ร— 0308 รท 11A8 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 1F1E6 รท AC00 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 1F1E6 ร— 0308 รท AC00 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 1F1E6 รท AC01 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 1F1E6 ร— 0308 รท AC01 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 1F1E6 ร— 1F1E6 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [12.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 1F1E6 ร— 0308 รท 1F1E6 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 1F1E6 รท 261D รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 1F1E6 ร— 0308 รท 261D รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 1F1E6 รท 1F3FB รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 1F1E6 ร— 0308 รท 1F3FB รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 1F1E6 ร— 200D รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 1F1E6 ร— 0308 ร— 200D รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 1F1E6 รท 2640 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 1F1E6 ร— 0308 รท 2640 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 1F1E6 รท 1F466 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] BOY (EBG) รท [0.3]
-รท 1F1E6 ร— 0308 รท 1F466 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
-รท 1F1E6 รท 0378 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 1F1E6 ร— 0308 รท 0378 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 1F1E6 รท D800 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 1F1E6 ร— 0308 รท D800 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 261D รท 0020 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [999.0] SPACE (Other) รท [0.3]
-รท 261D ร— 0308 รท 0020 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
-รท 261D รท 000D รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 261D ร— 0308 รท 000D รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 261D รท 000A รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 261D ร— 0308 รท 000A รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 261D รท 0001 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 261D ร— 0308 รท 0001 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 261D ร— 0300 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 261D ร— 0308 ร— 0300 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 261D รท 0600 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 261D ร— 0308 รท 0600 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 261D ร— 0903 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 261D ร— 0308 ร— 0903 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 261D รท 1100 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 261D ร— 0308 รท 1100 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 261D รท 1160 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 261D ร— 0308 รท 1160 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 261D รท 11A8 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 261D ร— 0308 รท 11A8 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 261D รท AC00 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 261D ร— 0308 รท AC00 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 261D รท AC01 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 261D ร— 0308 รท AC01 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 261D รท 1F1E6 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 261D ร— 0308 รท 1F1E6 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 261D รท 261D รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 261D ร— 0308 รท 261D รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 261D ร— 1F3FB รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 261D ร— 0308 ร— 1F3FB รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 261D ร— 200D รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 261D ร— 0308 ร— 200D รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 261D รท 2640 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 261D ร— 0308 รท 2640 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 261D รท 1F466 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [999.0] BOY (EBG) รท [0.3]
-รท 261D ร— 0308 รท 1F466 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
-รท 261D รท 0378 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 261D ร— 0308 รท 0378 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 261D รท D800 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 261D ร— 0308 รท D800 รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 1F3FB รท 0020 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [999.0] SPACE (Other) รท [0.3]
-รท 1F3FB ร— 0308 รท 0020 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
-รท 1F3FB รท 000D รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 1F3FB ร— 0308 รท 000D รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 1F3FB รท 000A รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 1F3FB ร— 0308 รท 000A รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 1F3FB รท 0001 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 1F3FB ร— 0308 รท 0001 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 1F3FB ร— 0300 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 1F3FB ร— 0308 ร— 0300 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 1F3FB รท 0600 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 1F3FB ร— 0308 รท 0600 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 1F3FB ร— 0903 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 1F3FB ร— 0308 ร— 0903 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 1F3FB รท 1100 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 1F3FB ร— 0308 รท 1100 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 1F3FB รท 1160 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 1F3FB ร— 0308 รท 1160 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 1F3FB รท 11A8 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 1F3FB ร— 0308 รท 11A8 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 1F3FB รท AC00 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 1F3FB ร— 0308 รท AC00 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 1F3FB รท AC01 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 1F3FB ร— 0308 รท AC01 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 1F3FB รท 1F1E6 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 1F3FB ร— 0308 รท 1F1E6 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 1F3FB รท 261D รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 1F3FB ร— 0308 รท 261D รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 1F3FB รท 1F3FB รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 1F3FB ร— 0308 รท 1F3FB รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 1F3FB ร— 200D รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 1F3FB ร— 0308 ร— 200D รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 1F3FB รท 2640 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 1F3FB ร— 0308 รท 2640 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 1F3FB รท 1F466 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [999.0] BOY (EBG) รท [0.3]
-รท 1F3FB ร— 0308 รท 1F466 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
-รท 1F3FB รท 0378 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 1F3FB ร— 0308 รท 0378 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 1F3FB รท D800 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 1F3FB ร— 0308 รท D800 รท # รท [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 200D รท 0020 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) รท [999.0] SPACE (Other) รท [0.3]
-รท 200D ร— 0308 รท 0020 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
-รท 200D รท 000D รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 200D ร— 0308 รท 000D รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 200D รท 000A รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 200D ร— 0308 รท 000A รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 200D รท 0001 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 200D ร— 0308 รท 0001 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 200D ร— 0300 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 200D ร— 0308 ร— 0300 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 200D รท 0600 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 200D ร— 0308 รท 0600 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 200D ร— 0903 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 200D ร— 0308 ร— 0903 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 200D รท 1100 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 200D ร— 0308 รท 1100 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 200D รท 1160 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 200D ร— 0308 รท 1160 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 200D รท 11A8 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 200D ร— 0308 รท 11A8 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 200D รท AC00 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 200D ร— 0308 รท AC00 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 200D รท AC01 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 200D ร— 0308 รท AC01 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 200D รท 1F1E6 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 200D ร— 0308 รท 1F1E6 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 200D รท 261D รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 200D ร— 0308 รท 261D รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 200D รท 1F3FB รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 200D ร— 0308 รท 1F3FB รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 200D ร— 200D รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 200D ร— 0308 ร— 200D รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 200D ร— 2640 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [11.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 200D ร— 0308 รท 2640 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 200D ร— 1F466 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [11.0] BOY (EBG) รท [0.3]
-รท 200D ร— 0308 รท 1F466 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
-รท 200D รท 0378 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 200D ร— 0308 รท 0378 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 200D รท D800 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 200D ร— 0308 รท D800 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 2640 รท 0020 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [999.0] SPACE (Other) รท [0.3]
-รท 2640 ร— 0308 รท 0020 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
-รท 2640 รท 000D รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 2640 ร— 0308 รท 000D รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 2640 รท 000A รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 2640 ร— 0308 รท 000A รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 2640 รท 0001 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 2640 ร— 0308 รท 0001 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 2640 ร— 0300 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 2640 ร— 0308 ร— 0300 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 2640 รท 0600 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 2640 ร— 0308 รท 0600 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 2640 ร— 0903 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 2640 ร— 0308 ร— 0903 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 2640 รท 1100 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 2640 ร— 0308 รท 1100 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 2640 รท 1160 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 2640 ร— 0308 รท 1160 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 2640 รท 11A8 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 2640 ร— 0308 รท 11A8 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 2640 รท AC00 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 2640 ร— 0308 รท AC00 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 2640 รท AC01 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 2640 ร— 0308 รท AC01 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 2640 รท 1F1E6 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 2640 ร— 0308 รท 1F1E6 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 2640 รท 261D รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 2640 ร— 0308 รท 261D รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 2640 รท 1F3FB รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 2640 ร— 0308 รท 1F3FB รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 2640 ร— 200D รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 2640 ร— 0308 ร— 200D รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 2640 รท 2640 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 2640 ร— 0308 รท 2640 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 2640 รท 1F466 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [999.0] BOY (EBG) รท [0.3]
-รท 2640 ร— 0308 รท 1F466 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
-รท 2640 รท 0378 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 2640 ร— 0308 รท 0378 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 2640 รท D800 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 2640 ร— 0308 รท D800 รท # รท [0.2] FEMALE SIGN (Glue_After_Zwj) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 1F466 รท 0020 รท # รท [0.2] BOY (EBG) รท [999.0] SPACE (Other) รท [0.3]
-รท 1F466 ร— 0308 รท 0020 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
-รท 1F466 รท 000D รท # รท [0.2] BOY (EBG) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 1F466 ร— 0308 รท 000D รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 1F466 รท 000A รท # รท [0.2] BOY (EBG) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 1F466 ร— 0308 รท 000A รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 1F466 รท 0001 รท # รท [0.2] BOY (EBG) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 1F466 ร— 0308 รท 0001 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 1F466 ร— 0300 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 1F466 ร— 0308 ร— 0300 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 1F466 รท 0600 รท # รท [0.2] BOY (EBG) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 1F466 ร— 0308 รท 0600 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 1F466 ร— 0903 รท # รท [0.2] BOY (EBG) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 1F466 ร— 0308 ร— 0903 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 1F466 รท 1100 รท # รท [0.2] BOY (EBG) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 1F466 ร— 0308 รท 1100 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 1F466 รท 1160 รท # รท [0.2] BOY (EBG) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 1F466 ร— 0308 รท 1160 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 1F466 รท 11A8 รท # รท [0.2] BOY (EBG) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 1F466 ร— 0308 รท 11A8 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 1F466 รท AC00 รท # รท [0.2] BOY (EBG) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 1F466 ร— 0308 รท AC00 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 1F466 รท AC01 รท # รท [0.2] BOY (EBG) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 1F466 ร— 0308 รท AC01 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 1F466 รท 1F1E6 รท # รท [0.2] BOY (EBG) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 1F466 ร— 0308 รท 1F1E6 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 1F466 รท 261D รท # รท [0.2] BOY (EBG) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 1F466 ร— 0308 รท 261D รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 1F466 ร— 1F3FB รท # รท [0.2] BOY (EBG) ร— [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 1F466 ร— 0308 ร— 1F3FB รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 1F466 ร— 200D รท # รท [0.2] BOY (EBG) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 1F466 ร— 0308 ร— 200D รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 1F466 รท 2640 รท # รท [0.2] BOY (EBG) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 1F466 ร— 0308 รท 2640 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 1F466 รท 1F466 รท # รท [0.2] BOY (EBG) รท [999.0] BOY (EBG) รท [0.3]
-รท 1F466 ร— 0308 รท 1F466 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
-รท 1F466 รท 0378 รท # รท [0.2] BOY (EBG) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 1F466 ร— 0308 รท 0378 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 1F466 รท D800 รท # รท [0.2] BOY (EBG) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 1F466 ร— 0308 รท D800 รท # รท [0.2] BOY (EBG) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท AC01 ร— 0308 รท D800 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 231A รท 0020 รท # รท [0.2] WATCH (ExtPict) รท [999.0] SPACE (Other) รท [0.3]
+รท 231A ร— 0308 รท 0020 รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
+รท 231A รท 000D รท # รท [0.2] WATCH (ExtPict) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 231A ร— 0308 รท 000D รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 231A รท 000A รท # รท [0.2] WATCH (ExtPict) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 231A ร— 0308 รท 000A รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 231A รท 0001 รท # รท [0.2] WATCH (ExtPict) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 231A ร— 0308 รท 0001 รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 231A ร— 034F รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 231A ร— 0308 ร— 034F รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 231A รท 1F1E6 รท # รท [0.2] WATCH (ExtPict) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 231A ร— 0308 รท 1F1E6 รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 231A รท 0600 รท # รท [0.2] WATCH (ExtPict) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 231A ร— 0308 รท 0600 รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 231A ร— 0903 รท # รท [0.2] WATCH (ExtPict) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 231A ร— 0308 ร— 0903 รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 231A รท 1100 รท # รท [0.2] WATCH (ExtPict) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 231A ร— 0308 รท 1100 รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 231A รท 1160 รท # รท [0.2] WATCH (ExtPict) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 231A ร— 0308 รท 1160 รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 231A รท 11A8 รท # รท [0.2] WATCH (ExtPict) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 231A ร— 0308 รท 11A8 รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 231A รท AC00 รท # รท [0.2] WATCH (ExtPict) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 231A ร— 0308 รท AC00 รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 231A รท AC01 รท # รท [0.2] WATCH (ExtPict) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 231A ร— 0308 รท AC01 รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 231A รท 231A รท # รท [0.2] WATCH (ExtPict) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 231A ร— 0308 รท 231A รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 231A ร— 0300 รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 231A ร— 0308 ร— 0300 รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 231A ร— 200D รท # รท [0.2] WATCH (ExtPict) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 231A ร— 0308 ร— 200D รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 231A รท 0378 รท # รท [0.2] WATCH (ExtPict) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 231A ร— 0308 รท 0378 รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 231A รท D800 รท # รท [0.2] WATCH (ExtPict) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 231A ร— 0308 รท D800 รท # รท [0.2] WATCH (ExtPict) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 0300 รท 0020 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
+รท 0300 ร— 0308 รท 0020 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
+รท 0300 รท 000D รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 0300 ร— 0308 รท 000D รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 0300 รท 000A รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 0300 ร— 0308 รท 000A รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 0300 รท 0001 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 0300 ร— 0308 รท 0001 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 0300 ร— 034F รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 0300 ร— 0308 ร— 034F รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 0300 รท 1F1E6 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 0300 ร— 0308 รท 1F1E6 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 0300 รท 0600 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 0300 ร— 0308 รท 0600 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 0300 ร— 0903 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 0300 ร— 0308 ร— 0903 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 0300 รท 1100 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 0300 ร— 0308 รท 1100 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 0300 รท 1160 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 0300 ร— 0308 รท 1160 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 0300 รท 11A8 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 0300 ร— 0308 รท 11A8 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 0300 รท AC00 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 0300 ร— 0308 รท AC00 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 0300 รท AC01 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 0300 ร— 0308 รท AC01 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 0300 รท 231A รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 0300 ร— 0308 รท 231A รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 0300 ร— 0300 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 0300 ร— 0308 ร— 0300 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 0300 ร— 200D รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 0300 ร— 0308 ร— 200D รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 0300 รท 0378 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 0300 ร— 0308 รท 0378 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 0300 รท D800 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 0300 ร— 0308 รท D800 รท # รท [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 200D รท 0020 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
+รท 200D ร— 0308 รท 0020 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
+รท 200D รท 000D รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 200D ร— 0308 รท 000D รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 200D รท 000A รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 200D ร— 0308 รท 000A รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 200D รท 0001 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 200D ร— 0308 รท 0001 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 200D ร— 034F รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 200D ร— 0308 ร— 034F รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 200D รท 1F1E6 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 200D ร— 0308 รท 1F1E6 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 200D รท 0600 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 200D ร— 0308 รท 0600 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 200D ร— 0903 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 200D ร— 0308 ร— 0903 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 200D รท 1100 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 200D ร— 0308 รท 1100 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 200D รท 1160 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 200D ร— 0308 รท 1160 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 200D รท 11A8 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 200D ร— 0308 รท 11A8 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 200D รท AC00 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 200D ร— 0308 รท AC00 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 200D รท AC01 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 200D ร— 0308 รท AC01 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 200D รท 231A รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 200D ร— 0308 รท 231A รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 200D ร— 0300 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 200D ร— 0308 ร— 0300 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 200D ร— 200D รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 200D ร— 0308 ร— 200D รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 200D รท 0378 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 200D ร— 0308 รท 0378 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 200D รท D800 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 200D ร— 0308 รท D800 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
รท 0378 รท 0020 รท # รท [0.2] <reserved-0378> (Other) รท [999.0] SPACE (Other) รท [0.3]
-รท 0378 ร— 0308 รท 0020 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
+รท 0378 ร— 0308 รท 0020 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
รท 0378 รท 000D รท # รท [0.2] <reserved-0378> (Other) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท 0378 ร— 0308 รท 000D รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท 0378 ร— 0308 รท 000D รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
รท 0378 รท 000A รท # รท [0.2] <reserved-0378> (Other) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท 0378 ร— 0308 รท 000A รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท 0378 ร— 0308 รท 000A รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
รท 0378 รท 0001 รท # รท [0.2] <reserved-0378> (Other) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 0378 ร— 0308 รท 0001 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท 0378 ร— 0300 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท 0378 ร— 0308 ร— 0300 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
+รท 0378 ร— 0308 รท 0001 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท 0378 ร— 034F รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 0378 ร— 0308 ร— 034F รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท 0378 รท 1F1E6 รท # รท [0.2] <reserved-0378> (Other) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท 0378 ร— 0308 รท 1F1E6 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
รท 0378 รท 0600 รท # รท [0.2] <reserved-0378> (Other) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท 0378 ร— 0308 รท 0600 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท 0378 ร— 0308 รท 0600 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
รท 0378 ร— 0903 รท # รท [0.2] <reserved-0378> (Other) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท 0378 ร— 0308 ร— 0903 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท 0378 ร— 0308 ร— 0903 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
รท 0378 รท 1100 รท # รท [0.2] <reserved-0378> (Other) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท 0378 ร— 0308 รท 1100 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท 0378 ร— 0308 รท 1100 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท 0378 รท 1160 รท # รท [0.2] <reserved-0378> (Other) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท 0378 ร— 0308 รท 1160 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท 0378 ร— 0308 รท 1160 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
รท 0378 รท 11A8 รท # รท [0.2] <reserved-0378> (Other) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท 0378 ร— 0308 รท 11A8 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท 0378 ร— 0308 รท 11A8 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
รท 0378 รท AC00 รท # รท [0.2] <reserved-0378> (Other) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท 0378 ร— 0308 รท AC00 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท 0378 ร— 0308 รท AC00 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
รท 0378 รท AC01 รท # รท [0.2] <reserved-0378> (Other) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 0378 ร— 0308 รท AC01 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท 0378 รท 1F1E6 รท # รท [0.2] <reserved-0378> (Other) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 0378 ร— 0308 รท 1F1E6 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท 0378 รท 261D รท # รท [0.2] <reserved-0378> (Other) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 0378 ร— 0308 รท 261D รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 0378 รท 1F3FB รท # รท [0.2] <reserved-0378> (Other) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 0378 ร— 0308 รท 1F3FB รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 0378 ร— 200D รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 0378 ร— 0308 ร— 200D รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 0378 รท 2640 รท # รท [0.2] <reserved-0378> (Other) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 0378 ร— 0308 รท 2640 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 0378 รท 1F466 รท # รท [0.2] <reserved-0378> (Other) รท [999.0] BOY (EBG) รท [0.3]
-รท 0378 ร— 0308 รท 1F466 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
+รท 0378 ร— 0308 รท AC01 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท 0378 รท 231A รท # รท [0.2] <reserved-0378> (Other) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 0378 ร— 0308 รท 231A รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท 0378 ร— 0300 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 0378 ร— 0308 ร— 0300 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท 0378 ร— 200D รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 0378 ร— 0308 ร— 200D รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
รท 0378 รท 0378 รท # รท [0.2] <reserved-0378> (Other) รท [999.0] <reserved-0378> (Other) รท [0.3]
-รท 0378 ร— 0308 รท 0378 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท 0378 ร— 0308 รท 0378 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
รท 0378 รท D800 รท # รท [0.2] <reserved-0378> (Other) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 0378 ร— 0308 รท D800 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 0378 ร— 0308 รท D800 รท # รท [0.2] <reserved-0378> (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
รท D800 รท 0020 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] SPACE (Other) รท [0.3]
-รท D800 รท 0308 รท 0020 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] SPACE (Other) รท [0.3]
+รท D800 รท 0308 รท 0020 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
รท D800 รท 000D รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-รท D800 รท 0308 รท 000D รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+รท D800 รท 0308 รท 000D รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
รท D800 รท 000A รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] <LINE FEED (LF)> (LF) รท [0.3]
-รท D800 รท 0308 รท 000A รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
+รท D800 รท 0308 รท 000A รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <LINE FEED (LF)> (LF) รท [0.3]
รท D800 รท 0001 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] <START OF HEADING> (Control) รท [0.3]
-รท D800 รท 0308 รท 0001 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <START OF HEADING> (Control) รท [0.3]
-รท D800 รท 0300 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
-รท D800 รท 0308 ร— 0300 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) ร— [9.0] COMBINING GRAVE ACCENT (Extend) รท [0.3]
+รท D800 รท 0308 รท 0001 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <START OF HEADING> (Control) รท [0.3]
+รท D800 รท 034F รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท D800 รท 0308 ร— 034F รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAPHEME JOINER (Extend) รท [0.3]
+รท D800 รท 1F1E6 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+รท D800 รท 0308 รท 1F1E6 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
รท D800 รท 0600 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
-รท D800 รท 0308 รท 0600 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
+รท D800 รท 0308 รท 0600 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] ARABIC NUMBER SIGN (Prepend) รท [0.3]
รท D800 รท 0903 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
-รท D800 รท 0308 ร— 0903 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
+รท D800 รท 0308 ร— 0903 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [0.3]
รท D800 รท 1100 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
-รท D800 รท 0308 รท 1100 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
+รท D800 รท 0308 รท 1100 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท D800 รท 1160 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
-รท D800 รท 0308 รท 1160 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
+รท D800 รท 0308 รท 1160 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JUNGSEONG FILLER (V) รท [0.3]
รท D800 รท 11A8 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
-รท D800 รท 0308 รท 11A8 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
+รท D800 รท 0308 รท 11A8 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL JONGSEONG KIYEOK (T) รท [0.3]
รท D800 รท AC00 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] HANGUL SYLLABLE GA (LV) รท [0.3]
-รท D800 รท 0308 รท AC00 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
+รท D800 รท 0308 รท AC00 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GA (LV) รท [0.3]
รท D800 รท AC01 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท D800 รท 0308 รท AC01 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
-รท D800 รท 1F1E6 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท D800 รท 0308 รท 1F1E6 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-รท D800 รท 261D รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท D800 รท 0308 รท 261D รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท D800 รท 1F3FB รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท D800 รท 0308 รท 1F3FB รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท D800 รท 200D รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท D800 รท 0308 ร— 200D รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท D800 รท 2640 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท D800 รท 0308 รท 2640 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท D800 รท 1F466 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] BOY (EBG) รท [0.3]
-รท D800 รท 0308 รท 1F466 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] BOY (EBG) รท [0.3]
+รท D800 รท 0308 รท AC01 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] HANGUL SYLLABLE GAG (LVT) รท [0.3]
+รท D800 รท 231A รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] WATCH (ExtPict) รท [0.3]
+รท D800 รท 0308 รท 231A รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] WATCH (ExtPict) รท [0.3]
+รท D800 รท 0300 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท D800 รท 0308 ร— 0300 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) รท [0.3]
+รท D800 รท 200D รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท D800 รท 0308 ร— 200D รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
รท D800 รท 0378 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] <reserved-0378> (Other) รท [0.3]
-รท D800 รท 0308 รท 0378 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [999.0] <reserved-0378> (Other) รท [0.3]
+รท D800 รท 0308 รท 0378 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] <reserved-0378> (Other) รท [0.3]
รท D800 รท D800 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] <surrogate-D800> (Control) รท [0.3]
-รท D800 รท 0308 รท D800 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend) รท [5.0] <surrogate-D800> (Control) รท [0.3]
-รท 000D ร— 000A รท 0061 รท 000A รท 0308 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) ร— [3.0] <LINE FEED (LF)> (LF) รท [4.0] LATIN SMALL LETTER A (Other) รท [5.0] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend) รท [0.3]
-รท 0061 ร— 0308 รท # รท [0.2] LATIN SMALL LETTER A (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [0.3]
-รท 0020 ร— 200D รท 0646 รท # รท [0.2] SPACE (Other) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [999.0] ARABIC LETTER NOON (Other) รท [0.3]
-รท 0646 ร— 200D รท 0020 รท # รท [0.2] ARABIC LETTER NOON (Other) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [999.0] SPACE (Other) รท [0.3]
+รท D800 รท 0308 รท D800 รท # รท [0.2] <surrogate-D800> (Control) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [5.0] <surrogate-D800> (Control) รท [0.3]
+รท 000D ร— 000A รท 0061 รท 000A รท 0308 รท # รท [0.2] <CARRIAGE RETURN (CR)> (CR) ร— [3.0] <LINE FEED (LF)> (LF) รท [4.0] LATIN SMALL LETTER A (Other) รท [5.0] <LINE FEED (LF)> (LF) รท [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [0.3]
+รท 0061 ร— 0308 รท # รท [0.2] LATIN SMALL LETTER A (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [0.3]
+รท 0020 ร— 200D รท 0646 รท # รท [0.2] SPACE (Other) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] ARABIC LETTER NOON (Other) รท [0.3]
+รท 0646 ร— 200D รท 0020 รท # รท [0.2] ARABIC LETTER NOON (Other) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] SPACE (Other) รท [0.3]
รท 1100 ร— 1100 รท # รท [0.2] HANGUL CHOSEONG KIYEOK (L) ร— [6.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท AC00 ร— 11A8 รท 1100 รท # รท [0.2] HANGUL SYLLABLE GA (LV) ร— [7.0] HANGUL JONGSEONG KIYEOK (T) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท AC01 ร— 11A8 รท 1100 รท # รท [0.2] HANGUL SYLLABLE GAG (LVT) ร— [8.0] HANGUL JONGSEONG KIYEOK (T) รท [999.0] HANGUL CHOSEONG KIYEOK (L) รท [0.3]
รท 1F1E6 ร— 1F1E7 รท 1F1E8 รท 0062 รท # รท [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [12.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) รท [999.0] LATIN SMALL LETTER B (Other) รท [0.3]
รท 0061 รท 1F1E6 ร— 1F1E7 รท 1F1E8 รท 0062 รท # รท [0.2] LATIN SMALL LETTER A (Other) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [13.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) รท [999.0] LATIN SMALL LETTER B (Other) รท [0.3]
-รท 0061 รท 1F1E6 ร— 1F1E7 ร— 200D รท 1F1E8 รท 0062 รท # รท [0.2] LATIN SMALL LETTER A (Other) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [13.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) รท [999.0] LATIN SMALL LETTER B (Other) รท [0.3]
-รท 0061 รท 1F1E6 ร— 200D รท 1F1E7 ร— 1F1E8 รท 0062 รท # รท [0.2] LATIN SMALL LETTER A (Other) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ร— [13.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) รท [999.0] LATIN SMALL LETTER B (Other) รท [0.3]
+รท 0061 รท 1F1E6 ร— 1F1E7 ร— 200D รท 1F1E8 รท 0062 รท # รท [0.2] LATIN SMALL LETTER A (Other) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [13.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) รท [999.0] LATIN SMALL LETTER B (Other) รท [0.3]
+รท 0061 รท 1F1E6 ร— 200D รท 1F1E7 ร— 1F1E8 รท 0062 รท # รท [0.2] LATIN SMALL LETTER A (Other) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ร— [13.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) รท [999.0] LATIN SMALL LETTER B (Other) รท [0.3]
รท 0061 รท 1F1E6 ร— 1F1E7 รท 1F1E8 ร— 1F1E9 รท 0062 รท # รท [0.2] LATIN SMALL LETTER A (Other) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ร— [13.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ร— [13.0] REGIONAL INDICATOR SYMBOL LETTER D (RI) รท [999.0] LATIN SMALL LETTER B (Other) รท [0.3]
-รท 0061 ร— 200D รท # รท [0.2] LATIN SMALL LETTER A (Other) ร— [9.0] ZERO WIDTH JOINER (ZWJ) รท [0.3]
-รท 0061 ร— 0308 รท 0062 รท # รท [0.2] LATIN SMALL LETTER A (Other) ร— [9.0] COMBINING DIAERESIS (Extend) รท [999.0] LATIN SMALL LETTER B (Other) รท [0.3]
+รท 0061 ร— 200D รท # รท [0.2] LATIN SMALL LETTER A (Other) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [0.3]
+รท 0061 ร— 0308 รท 0062 รท # รท [0.2] LATIN SMALL LETTER A (Other) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) รท [999.0] LATIN SMALL LETTER B (Other) รท [0.3]
รท 0061 ร— 0903 รท 0062 รท # รท [0.2] LATIN SMALL LETTER A (Other) ร— [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) รท [999.0] LATIN SMALL LETTER B (Other) รท [0.3]
รท 0061 รท 0600 ร— 0062 รท # รท [0.2] LATIN SMALL LETTER A (Other) รท [999.0] ARABIC NUMBER SIGN (Prepend) ร— [9.2] LATIN SMALL LETTER B (Other) รท [0.3]
-รท 261D ร— 1F3FB รท 261D รท # รท [0.2] WHITE UP POINTING INDEX (E_Base) ร— [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [999.0] WHITE UP POINTING INDEX (E_Base) รท [0.3]
-รท 1F466 ร— 1F3FB รท # รท [0.2] BOY (EBG) ร— [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 200D ร— 1F466 ร— 1F3FB รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [11.0] BOY (EBG) ร— [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) รท [0.3]
-รท 200D ร— 2640 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [11.0] FEMALE SIGN (Glue_After_Zwj) รท [0.3]
-รท 200D ร— 1F466 รท # รท [0.2] ZERO WIDTH JOINER (ZWJ) ร— [11.0] BOY (EBG) รท [0.3]
-รท 1F466 รท 1F466 รท # รท [0.2] BOY (EBG) รท [999.0] BOY (EBG) รท [0.3]
+รท 1F476 ร— 1F3FF รท 1F476 รท # รท [0.2] BABY (ExtPict) ร— [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) รท [999.0] BABY (ExtPict) รท [0.3]
+รท 0061 ร— 1F3FF รท 1F476 รท # รท [0.2] LATIN SMALL LETTER A (Other) ร— [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) รท [999.0] BABY (ExtPict) รท [0.3]
+รท 0061 ร— 1F3FF รท 1F476 ร— 200D ร— 1F6D1 รท # รท [0.2] LATIN SMALL LETTER A (Other) ร— [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) รท [999.0] BABY (ExtPict) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [11.0] OCTAGONAL SIGN (ExtPict) รท [0.3]
+รท 1F476 ร— 1F3FF ร— 0308 ร— 200D ร— 1F476 ร— 1F3FF รท # รท [0.2] BABY (ExtPict) ร— [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ร— [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [11.0] BABY (ExtPict) ร— [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) รท [0.3]
+รท 1F6D1 ร— 200D ร— 1F6D1 รท # รท [0.2] OCTAGONAL SIGN (ExtPict) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [11.0] OCTAGONAL SIGN (ExtPict) รท [0.3]
+รท 0061 ร— 200D รท 1F6D1 รท # รท [0.2] LATIN SMALL LETTER A (Other) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] OCTAGONAL SIGN (ExtPict) รท [0.3]
+รท 2701 ร— 200D ร— 2701 รท # รท [0.2] UPPER BLADE SCISSORS (Other) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ร— [11.0] UPPER BLADE SCISSORS (Other) รท [0.3]
+รท 0061 ร— 200D รท 2701 รท # รท [0.2] LATIN SMALL LETTER A (Other) ร— [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) รท [999.0] UPPER BLADE SCISSORS (Other) รท [0.3]
#
-# Lines: 822
+# Lines: 672
#
# EOF
diff --git a/lib/stdlib/test/unicode_util_SUITE_data/LineBreakTest.txt b/lib/stdlib/test/unicode_util_SUITE_data/LineBreakTest.txt
index 6715446aba..0e9e678a85 100644
--- a/lib/stdlib/test/unicode_util_SUITE_data/LineBreakTest.txt
+++ b/lib/stdlib/test/unicode_util_SUITE_data/LineBreakTest.txt
@@ -1,6 +1,6 @@
-# LineBreakTest-10.0.0.txt
-# Date: 2017-04-14, 05:40:30 GMT
-# ยฉ 2017 Unicodeยฎ, Inc.
+# LineBreakTest-11.0.0.txt
+# Date: 2018-05-20, 09:03:09 GMT
+# ยฉ 2018 Unicodeยฎ, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -6242,174 +6242,174 @@
ร— 0001 ร— 0020 รท 3041 รท # ร— [0.3] <START OF HEADING> (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HIRAGANA LETTER SMALL A (CJ_NS) รท [0.3]
ร— 0001 ร— 0308 ร— 3041 รท # ร— [0.3] <START OF HEADING> (CM1_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [21.03] HIRAGANA LETTER SMALL A (CJ_NS) รท [0.3]
ร— 0001 ร— 0308 ร— 0020 รท 3041 รท # ร— [0.3] <START OF HEADING> (CM1_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HIRAGANA LETTER SMALL A (CJ_NS) รท [0.3]
-ร— 200D ร— 0023 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [28.0] NUMBER SIGN (AL) รท [0.3]
+ร— 200D ร— 0023 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] NUMBER SIGN (AL) รท [0.3]
ร— 200D ร— 0020 รท 0023 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] NUMBER SIGN (AL) รท [0.3]
-ร— 200D ร— 0308 ร— 0023 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [28.0] NUMBER SIGN (AL) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 0023 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] NUMBER SIGN (AL) รท [0.3]
-ร— 200D รท 2014 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [999.0] EM DASH (B2) รท [0.3]
+ร— 200D ร— 0308 ร— 0023 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [28.0] NUMBER SIGN (AL) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 0023 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] NUMBER SIGN (AL) รท [0.3]
+ร— 200D ร— 2014 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] EM DASH (B2) รท [0.3]
ร— 200D ร— 0020 รท 2014 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] EM DASH (B2) รท [0.3]
-ร— 200D ร— 0308 รท 2014 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) รท [999.0] EM DASH (B2) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 2014 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] EM DASH (B2) รท [0.3]
-ร— 200D ร— 0009 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [21.01] <CHARACTER TABULATION> (BA) รท [0.3]
+ร— 200D ร— 0308 รท 2014 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) รท [999.0] EM DASH (B2) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 2014 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] EM DASH (B2) รท [0.3]
+ร— 200D ร— 0009 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] <CHARACTER TABULATION> (BA) รท [0.3]
ร— 200D ร— 0020 รท 0009 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] <CHARACTER TABULATION> (BA) รท [0.3]
-ร— 200D ร— 0308 ร— 0009 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [21.01] <CHARACTER TABULATION> (BA) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 0009 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] <CHARACTER TABULATION> (BA) รท [0.3]
-ร— 200D รท 00B4 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [999.0] ACUTE ACCENT (BB) รท [0.3]
+ร— 200D ร— 0308 ร— 0009 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [21.01] <CHARACTER TABULATION> (BA) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 0009 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] <CHARACTER TABULATION> (BA) รท [0.3]
+ร— 200D ร— 00B4 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] ACUTE ACCENT (BB) รท [0.3]
ร— 200D ร— 0020 รท 00B4 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] ACUTE ACCENT (BB) รท [0.3]
-ร— 200D ร— 0308 รท 00B4 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) รท [999.0] ACUTE ACCENT (BB) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 00B4 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] ACUTE ACCENT (BB) รท [0.3]
+ร— 200D ร— 0308 รท 00B4 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) รท [999.0] ACUTE ACCENT (BB) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 00B4 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] ACUTE ACCENT (BB) รท [0.3]
ร— 200D ร— 000B รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [6.0] <LINE TABULATION> (BK) รท [0.3]
ร— 200D ร— 0020 ร— 000B รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) ร— [6.0] <LINE TABULATION> (BK) รท [0.3]
-ร— 200D ร— 0308 ร— 000B รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [6.0] <LINE TABULATION> (BK) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 ร— 000B รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [6.0] <LINE TABULATION> (BK) รท [0.3]
-ร— 200D รท FFFC รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [20.01] OBJECT REPLACEMENT CHARACTER (CB) รท [0.3]
+ร— 200D ร— 0308 ร— 000B รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [6.0] <LINE TABULATION> (BK) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 ร— 000B รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [6.0] <LINE TABULATION> (BK) รท [0.3]
+ร— 200D ร— FFFC รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] OBJECT REPLACEMENT CHARACTER (CB) รท [0.3]
ร— 200D ร— 0020 รท FFFC รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] OBJECT REPLACEMENT CHARACTER (CB) รท [0.3]
-ร— 200D ร— 0308 รท FFFC รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) รท [20.01] OBJECT REPLACEMENT CHARACTER (CB) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท FFFC รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] OBJECT REPLACEMENT CHARACTER (CB) รท [0.3]
-ร— 200D ร— 007D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [13.04] RIGHT CURLY BRACKET (CL) รท [0.3]
+ร— 200D ร— 0308 รท FFFC รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) รท [20.01] OBJECT REPLACEMENT CHARACTER (CB) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท FFFC รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] OBJECT REPLACEMENT CHARACTER (CB) รท [0.3]
+ร— 200D ร— 007D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] RIGHT CURLY BRACKET (CL) รท [0.3]
ร— 200D ร— 0020 ร— 007D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) ร— [13.02] RIGHT CURLY BRACKET (CL) รท [0.3]
-ร— 200D ร— 0308 ร— 007D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [13.04] RIGHT CURLY BRACKET (CL) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 ร— 007D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [13.02] RIGHT CURLY BRACKET (CL) รท [0.3]
-ร— 200D ร— 0029 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [13.04] RIGHT PARENTHESIS (CP) รท [0.3]
+ร— 200D ร— 0308 ร— 007D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [13.04] RIGHT CURLY BRACKET (CL) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 ร— 007D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [13.02] RIGHT CURLY BRACKET (CL) รท [0.3]
+ร— 200D ร— 0029 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] RIGHT PARENTHESIS (CP) รท [0.3]
ร— 200D ร— 0020 ร— 0029 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) ร— [13.02] RIGHT PARENTHESIS (CP) รท [0.3]
-ร— 200D ร— 0308 ร— 0029 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [13.04] RIGHT PARENTHESIS (CP) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 ร— 0029 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [13.02] RIGHT PARENTHESIS (CP) รท [0.3]
+ร— 200D ร— 0308 ร— 0029 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [13.04] RIGHT PARENTHESIS (CP) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 ร— 0029 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [13.02] RIGHT PARENTHESIS (CP) รท [0.3]
ร— 200D ร— 000D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [6.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
ร— 200D ร— 0020 ร— 000D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) ร— [6.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-ร— 200D ร— 0308 ร— 000D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [6.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 ร— 000D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [6.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
-ร— 200D ร— 0021 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [13.01] EXCLAMATION MARK (EX) รท [0.3]
+ร— 200D ร— 0308 ร— 000D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [6.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 ร— 000D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [6.0] <CARRIAGE RETURN (CR)> (CR) รท [0.3]
+ร— 200D ร— 0021 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] EXCLAMATION MARK (EX) รท [0.3]
ร— 200D ร— 0020 ร— 0021 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) ร— [13.01] EXCLAMATION MARK (EX) รท [0.3]
-ร— 200D ร— 0308 ร— 0021 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [13.01] EXCLAMATION MARK (EX) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 ร— 0021 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [13.01] EXCLAMATION MARK (EX) รท [0.3]
-ร— 200D ร— 00A0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [12.3] NO-BREAK SPACE (GL) รท [0.3]
+ร— 200D ร— 0308 ร— 0021 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [13.01] EXCLAMATION MARK (EX) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 ร— 0021 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [13.01] EXCLAMATION MARK (EX) รท [0.3]
+ร— 200D ร— 00A0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] NO-BREAK SPACE (GL) รท [0.3]
ร— 200D ร— 0020 รท 00A0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] NO-BREAK SPACE (GL) รท [0.3]
-ร— 200D ร— 0308 ร— 00A0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [12.3] NO-BREAK SPACE (GL) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 00A0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] NO-BREAK SPACE (GL) รท [0.3]
-ร— 200D รท AC00 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [999.0] HANGUL SYLLABLE GA (H2) รท [0.3]
+ร— 200D ร— 0308 ร— 00A0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [12.3] NO-BREAK SPACE (GL) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 00A0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] NO-BREAK SPACE (GL) รท [0.3]
+ร— 200D ร— AC00 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] HANGUL SYLLABLE GA (H2) รท [0.3]
ร— 200D ร— 0020 รท AC00 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] HANGUL SYLLABLE GA (H2) รท [0.3]
-ร— 200D ร— 0308 รท AC00 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) รท [999.0] HANGUL SYLLABLE GA (H2) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท AC00 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HANGUL SYLLABLE GA (H2) รท [0.3]
-ร— 200D รท AC01 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [999.0] HANGUL SYLLABLE GAG (H3) รท [0.3]
+ร— 200D ร— 0308 รท AC00 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) รท [999.0] HANGUL SYLLABLE GA (H2) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท AC00 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HANGUL SYLLABLE GA (H2) รท [0.3]
+ร— 200D ร— AC01 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] HANGUL SYLLABLE GAG (H3) รท [0.3]
ร— 200D ร— 0020 รท AC01 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] HANGUL SYLLABLE GAG (H3) รท [0.3]
-ร— 200D ร— 0308 รท AC01 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) รท [999.0] HANGUL SYLLABLE GAG (H3) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท AC01 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HANGUL SYLLABLE GAG (H3) รท [0.3]
-ร— 200D ร— 05D0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [28.0] HEBREW LETTER ALEF (HL) รท [0.3]
+ร— 200D ร— 0308 รท AC01 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) รท [999.0] HANGUL SYLLABLE GAG (H3) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท AC01 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HANGUL SYLLABLE GAG (H3) รท [0.3]
+ร— 200D ร— 05D0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] HEBREW LETTER ALEF (HL) รท [0.3]
ร— 200D ร— 0020 รท 05D0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] HEBREW LETTER ALEF (HL) รท [0.3]
-ร— 200D ร— 0308 ร— 05D0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [28.0] HEBREW LETTER ALEF (HL) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 05D0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HEBREW LETTER ALEF (HL) รท [0.3]
-ร— 200D ร— 002D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [21.02] HYPHEN-MINUS (HY) รท [0.3]
+ร— 200D ร— 0308 ร— 05D0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [28.0] HEBREW LETTER ALEF (HL) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 05D0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HEBREW LETTER ALEF (HL) รท [0.3]
+ร— 200D ร— 002D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] HYPHEN-MINUS (HY) รท [0.3]
ร— 200D ร— 0020 รท 002D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] HYPHEN-MINUS (HY) รท [0.3]
-ร— 200D ร— 0308 ร— 002D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [21.02] HYPHEN-MINUS (HY) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 002D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HYPHEN-MINUS (HY) รท [0.3]
+ร— 200D ร— 0308 ร— 002D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [21.02] HYPHEN-MINUS (HY) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 002D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HYPHEN-MINUS (HY) รท [0.3]
ร— 200D ร— 231A รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] WATCH (ID) รท [0.3]
ร— 200D ร— 0020 รท 231A รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] WATCH (ID) รท [0.3]
-ร— 200D ร— 0308 รท 231A รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) รท [999.0] WATCH (ID) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 231A รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] WATCH (ID) รท [0.3]
-ร— 200D ร— 2024 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [22.01] ONE DOT LEADER (IN) รท [0.3]
+ร— 200D ร— 0308 รท 231A รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) รท [999.0] WATCH (ID) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 231A รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] WATCH (ID) รท [0.3]
+ร— 200D ร— 2024 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] ONE DOT LEADER (IN) รท [0.3]
ร— 200D ร— 0020 รท 2024 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] ONE DOT LEADER (IN) รท [0.3]
-ร— 200D ร— 0308 ร— 2024 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [22.01] ONE DOT LEADER (IN) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 2024 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] ONE DOT LEADER (IN) รท [0.3]
-ร— 200D ร— 002C รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [13.04] COMMA (IS) รท [0.3]
+ร— 200D ร— 0308 ร— 2024 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [22.01] ONE DOT LEADER (IN) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 2024 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] ONE DOT LEADER (IN) รท [0.3]
+ร— 200D ร— 002C รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMMA (IS) รท [0.3]
ร— 200D ร— 0020 ร— 002C รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) ร— [13.02] COMMA (IS) รท [0.3]
-ร— 200D ร— 0308 ร— 002C รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [13.04] COMMA (IS) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 ร— 002C รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [13.02] COMMA (IS) รท [0.3]
-ร— 200D รท 1100 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [999.0] HANGUL CHOSEONG KIYEOK (JL) รท [0.3]
+ร— 200D ร— 0308 ร— 002C รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [13.04] COMMA (IS) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 ร— 002C รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [13.02] COMMA (IS) รท [0.3]
+ร— 200D ร— 1100 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] HANGUL CHOSEONG KIYEOK (JL) รท [0.3]
ร— 200D ร— 0020 รท 1100 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] HANGUL CHOSEONG KIYEOK (JL) รท [0.3]
-ร— 200D ร— 0308 รท 1100 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) รท [999.0] HANGUL CHOSEONG KIYEOK (JL) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 1100 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HANGUL CHOSEONG KIYEOK (JL) รท [0.3]
-ร— 200D รท 11A8 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [999.0] HANGUL JONGSEONG KIYEOK (JT) รท [0.3]
+ร— 200D ร— 0308 รท 1100 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) รท [999.0] HANGUL CHOSEONG KIYEOK (JL) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 1100 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HANGUL CHOSEONG KIYEOK (JL) รท [0.3]
+ร— 200D ร— 11A8 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] HANGUL JONGSEONG KIYEOK (JT) รท [0.3]
ร— 200D ร— 0020 รท 11A8 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] HANGUL JONGSEONG KIYEOK (JT) รท [0.3]
-ร— 200D ร— 0308 รท 11A8 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) รท [999.0] HANGUL JONGSEONG KIYEOK (JT) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 11A8 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HANGUL JONGSEONG KIYEOK (JT) รท [0.3]
-ร— 200D รท 1160 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [999.0] HANGUL JUNGSEONG FILLER (JV) รท [0.3]
+ร— 200D ร— 0308 รท 11A8 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) รท [999.0] HANGUL JONGSEONG KIYEOK (JT) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 11A8 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HANGUL JONGSEONG KIYEOK (JT) รท [0.3]
+ร— 200D ร— 1160 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] HANGUL JUNGSEONG FILLER (JV) รท [0.3]
ร— 200D ร— 0020 รท 1160 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] HANGUL JUNGSEONG FILLER (JV) รท [0.3]
-ร— 200D ร— 0308 รท 1160 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) รท [999.0] HANGUL JUNGSEONG FILLER (JV) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 1160 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HANGUL JUNGSEONG FILLER (JV) รท [0.3]
+ร— 200D ร— 0308 รท 1160 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) รท [999.0] HANGUL JUNGSEONG FILLER (JV) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 1160 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HANGUL JUNGSEONG FILLER (JV) รท [0.3]
ร— 200D ร— 000A รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [6.0] <LINE FEED (LF)> (LF) รท [0.3]
ร— 200D ร— 0020 ร— 000A รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) ร— [6.0] <LINE FEED (LF)> (LF) รท [0.3]
-ร— 200D ร— 0308 ร— 000A รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [6.0] <LINE FEED (LF)> (LF) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 ร— 000A รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [6.0] <LINE FEED (LF)> (LF) รท [0.3]
+ร— 200D ร— 0308 ร— 000A รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [6.0] <LINE FEED (LF)> (LF) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 ร— 000A รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [6.0] <LINE FEED (LF)> (LF) รท [0.3]
ร— 200D ร— 0085 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [6.0] <NEXT LINE (NEL)> (NL) รท [0.3]
ร— 200D ร— 0020 ร— 0085 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) ร— [6.0] <NEXT LINE (NEL)> (NL) รท [0.3]
-ร— 200D ร— 0308 ร— 0085 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [6.0] <NEXT LINE (NEL)> (NL) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 ร— 0085 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [6.0] <NEXT LINE (NEL)> (NL) รท [0.3]
-ร— 200D ร— 17D6 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [21.03] KHMER SIGN CAMNUC PII KUUH (NS) รท [0.3]
+ร— 200D ร— 0308 ร— 0085 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [6.0] <NEXT LINE (NEL)> (NL) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 ร— 0085 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [6.0] <NEXT LINE (NEL)> (NL) รท [0.3]
+ร— 200D ร— 17D6 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] KHMER SIGN CAMNUC PII KUUH (NS) รท [0.3]
ร— 200D ร— 0020 รท 17D6 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] KHMER SIGN CAMNUC PII KUUH (NS) รท [0.3]
-ร— 200D ร— 0308 ร— 17D6 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [21.03] KHMER SIGN CAMNUC PII KUUH (NS) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 17D6 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] KHMER SIGN CAMNUC PII KUUH (NS) รท [0.3]
-ร— 200D ร— 0030 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [23.02] DIGIT ZERO (NU) รท [0.3]
+ร— 200D ร— 0308 ร— 17D6 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [21.03] KHMER SIGN CAMNUC PII KUUH (NS) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 17D6 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] KHMER SIGN CAMNUC PII KUUH (NS) รท [0.3]
+ร— 200D ร— 0030 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] DIGIT ZERO (NU) รท [0.3]
ร— 200D ร— 0020 รท 0030 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] DIGIT ZERO (NU) รท [0.3]
-ร— 200D ร— 0308 ร— 0030 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [23.02] DIGIT ZERO (NU) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 0030 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] DIGIT ZERO (NU) รท [0.3]
-ร— 200D ร— 0028 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [30.01] LEFT PARENTHESIS (OP) รท [0.3]
+ร— 200D ร— 0308 ร— 0030 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [23.02] DIGIT ZERO (NU) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 0030 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] DIGIT ZERO (NU) รท [0.3]
+ร— 200D ร— 0028 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] LEFT PARENTHESIS (OP) รท [0.3]
ร— 200D ร— 0020 รท 0028 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] LEFT PARENTHESIS (OP) รท [0.3]
-ร— 200D ร— 0308 ร— 0028 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [30.01] LEFT PARENTHESIS (OP) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 0028 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] LEFT PARENTHESIS (OP) รท [0.3]
-ร— 200D ร— 0025 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [24.03] PERCENT SIGN (PO) รท [0.3]
+ร— 200D ร— 0308 ร— 0028 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [30.01] LEFT PARENTHESIS (OP) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 0028 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] LEFT PARENTHESIS (OP) รท [0.3]
+ร— 200D ร— 0025 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] PERCENT SIGN (PO) รท [0.3]
ร— 200D ร— 0020 รท 0025 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] PERCENT SIGN (PO) รท [0.3]
-ร— 200D ร— 0308 ร— 0025 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [24.03] PERCENT SIGN (PO) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 0025 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] PERCENT SIGN (PO) รท [0.3]
-ร— 200D ร— 0024 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [24.03] DOLLAR SIGN (PR) รท [0.3]
+ร— 200D ร— 0308 ร— 0025 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [24.03] PERCENT SIGN (PO) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 0025 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] PERCENT SIGN (PO) รท [0.3]
+ร— 200D ร— 0024 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] DOLLAR SIGN (PR) รท [0.3]
ร— 200D ร— 0020 รท 0024 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] DOLLAR SIGN (PR) รท [0.3]
-ร— 200D ร— 0308 ร— 0024 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [24.03] DOLLAR SIGN (PR) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 0024 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] DOLLAR SIGN (PR) รท [0.3]
-ร— 200D ร— 0022 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [19.01] QUOTATION MARK (QU) รท [0.3]
+ร— 200D ร— 0308 ร— 0024 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [24.03] DOLLAR SIGN (PR) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 0024 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] DOLLAR SIGN (PR) รท [0.3]
+ร— 200D ร— 0022 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] QUOTATION MARK (QU) รท [0.3]
ร— 200D ร— 0020 รท 0022 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] QUOTATION MARK (QU) รท [0.3]
-ร— 200D ร— 0308 ร— 0022 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [19.01] QUOTATION MARK (QU) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 0022 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] QUOTATION MARK (QU) รท [0.3]
+ร— 200D ร— 0308 ร— 0022 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [19.01] QUOTATION MARK (QU) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 0022 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] QUOTATION MARK (QU) รท [0.3]
ร— 200D ร— 0020 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [0.3]
ร— 200D ร— 0020 ร— 0020 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) ร— [7.01] SPACE (SP) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 ร— 0020 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [7.01] SPACE (SP) รท [0.3]
-ร— 200D ร— 002F รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [13.04] SOLIDUS (SY) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 ร— 0020 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [7.01] SPACE (SP) รท [0.3]
+ร— 200D ร— 002F รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] SOLIDUS (SY) รท [0.3]
ร— 200D ร— 0020 ร— 002F รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) ร— [13.02] SOLIDUS (SY) รท [0.3]
-ร— 200D ร— 0308 ร— 002F รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [13.04] SOLIDUS (SY) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 ร— 002F รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [13.02] SOLIDUS (SY) รท [0.3]
-ร— 200D ร— 2060 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [11.01] WORD JOINER (WJ) รท [0.3]
+ร— 200D ร— 0308 ร— 002F รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [13.04] SOLIDUS (SY) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 ร— 002F รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [13.02] SOLIDUS (SY) รท [0.3]
+ร— 200D ร— 2060 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] WORD JOINER (WJ) รท [0.3]
ร— 200D ร— 0020 ร— 2060 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) ร— [11.01] WORD JOINER (WJ) รท [0.3]
-ร— 200D ร— 0308 ร— 2060 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [11.01] WORD JOINER (WJ) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 ร— 2060 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [11.01] WORD JOINER (WJ) รท [0.3]
+ร— 200D ร— 0308 ร— 2060 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [11.01] WORD JOINER (WJ) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 ร— 2060 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [11.01] WORD JOINER (WJ) รท [0.3]
ร— 200D ร— 200B รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.02] ZERO WIDTH SPACE (ZW) รท [0.3]
ร— 200D ร— 0020 ร— 200B รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) ร— [7.02] ZERO WIDTH SPACE (ZW) รท [0.3]
-ร— 200D ร— 0308 ร— 200B รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.02] ZERO WIDTH SPACE (ZW) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 ร— 200B รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [7.02] ZERO WIDTH SPACE (ZW) รท [0.3]
-ร— 200D รท 1F1E6 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+ร— 200D ร— 0308 ร— 200B รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.02] ZERO WIDTH SPACE (ZW) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 ร— 200B รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) ร— [7.02] ZERO WIDTH SPACE (ZW) รท [0.3]
+ร— 200D ร— 1F1E6 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
ร— 200D ร— 0020 รท 1F1E6 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-ร— 200D ร— 0308 รท 1F1E6 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 1F1E6 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+ร— 200D ร— 0308 รท 1F1E6 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) รท [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 1F1E6 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) รท [0.3]
ร— 200D ร— 261D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] WHITE UP POINTING INDEX (EB) รท [0.3]
ร— 200D ร— 0020 รท 261D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] WHITE UP POINTING INDEX (EB) รท [0.3]
-ร— 200D ร— 0308 รท 261D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) รท [999.0] WHITE UP POINTING INDEX (EB) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 261D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] WHITE UP POINTING INDEX (EB) รท [0.3]
+ร— 200D ร— 0308 รท 261D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) รท [999.0] WHITE UP POINTING INDEX (EB) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 261D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] WHITE UP POINTING INDEX (EB) รท [0.3]
ร— 200D ร— 1F3FB รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) รท [0.3]
ร— 200D ร— 0020 รท 1F3FB รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) รท [0.3]
-ร— 200D ร— 0308 รท 1F3FB รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 1F3FB รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) รท [0.3]
-ร— 200D ร— 0001 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] <START OF HEADING> (CM1_CM) รท [0.3]
+ร— 200D ร— 0308 รท 1F3FB รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) รท [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 1F3FB รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) รท [0.3]
+ร— 200D ร— 0001 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] <START OF HEADING> (CM1_CM) รท [0.3]
ร— 200D ร— 0020 รท 0001 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] <START OF HEADING> (CM1_CM) รท [0.3]
-ร— 200D ร— 0308 ร— 0001 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [9.0] <START OF HEADING> (CM1_CM) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 0001 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] <START OF HEADING> (CM1_CM) รท [0.3]
-ร— 200D ร— 200D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [0.3]
+ร— 200D ร— 0308 ร— 0001 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [9.0] <START OF HEADING> (CM1_CM) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 0001 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] <START OF HEADING> (CM1_CM) รท [0.3]
+ร— 200D ร— 200D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [0.3]
ร— 200D ร— 0020 รท 200D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [0.3]
-ร— 200D ร— 0308 ร— 200D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 200D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [0.3]
-ร— 200D ร— 00A7 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [28.0] SECTION SIGN (AI_AL) รท [0.3]
+ร— 200D ร— 0308 ร— 200D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 200D รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) รท [0.3]
+ร— 200D ร— 00A7 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] SECTION SIGN (AI_AL) รท [0.3]
ร— 200D ร— 0020 รท 00A7 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] SECTION SIGN (AI_AL) รท [0.3]
-ร— 200D ร— 0308 ร— 00A7 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [28.0] SECTION SIGN (AI_AL) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 00A7 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] SECTION SIGN (AI_AL) รท [0.3]
-ร— 200D ร— 50005 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [28.0] <reserved-50005> (XX_AL) รท [0.3]
+ร— 200D ร— 0308 ร— 00A7 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [28.0] SECTION SIGN (AI_AL) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 00A7 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] SECTION SIGN (AI_AL) รท [0.3]
+ร— 200D ร— 50005 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] <reserved-50005> (XX_AL) รท [0.3]
ร— 200D ร— 0020 รท 50005 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] <reserved-50005> (XX_AL) รท [0.3]
-ร— 200D ร— 0308 ร— 50005 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [28.0] <reserved-50005> (XX_AL) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 50005 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] <reserved-50005> (XX_AL) รท [0.3]
-ร— 200D ร— 0E01 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [28.0] THAI CHARACTER KO KAI (SA_AL) รท [0.3]
+ร— 200D ร— 0308 ร— 50005 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [28.0] <reserved-50005> (XX_AL) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 50005 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] <reserved-50005> (XX_AL) รท [0.3]
+ร— 200D ร— 0E01 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] THAI CHARACTER KO KAI (SA_AL) รท [0.3]
ร— 200D ร— 0020 รท 0E01 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] THAI CHARACTER KO KAI (SA_AL) รท [0.3]
-ร— 200D ร— 0308 ร— 0E01 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [28.0] THAI CHARACTER KO KAI (SA_AL) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 0E01 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] THAI CHARACTER KO KAI (SA_AL) รท [0.3]
-ร— 200D ร— 3041 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [21.03] HIRAGANA LETTER SMALL A (CJ_NS) รท [0.3]
+ร— 200D ร— 0308 ร— 0E01 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [28.0] THAI CHARACTER KO KAI (SA_AL) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 0E01 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] THAI CHARACTER KO KAI (SA_AL) รท [0.3]
+ร— 200D ร— 3041 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] HIRAGANA LETTER SMALL A (CJ_NS) รท [0.3]
ร— 200D ร— 0020 รท 3041 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [18.0] HIRAGANA LETTER SMALL A (CJ_NS) รท [0.3]
-ร— 200D ร— 0308 ร— 3041 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [21.03] HIRAGANA LETTER SMALL A (CJ_NS) รท [0.3]
-ร— 200D ร— 0308 ร— 0020 รท 3041 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HIRAGANA LETTER SMALL A (CJ_NS) รท [0.3]
+ร— 200D ร— 0308 ร— 3041 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [21.03] HIRAGANA LETTER SMALL A (CJ_NS) รท [0.3]
+ร— 200D ร— 0308 ร— 0020 รท 3041 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HIRAGANA LETTER SMALL A (CJ_NS) รท [0.3]
ร— 00A7 ร— 0023 รท # ร— [0.3] SECTION SIGN (AI_AL) ร— [28.0] NUMBER SIGN (AL) รท [0.3]
ร— 00A7 ร— 0020 รท 0023 รท # ร— [0.3] SECTION SIGN (AI_AL) ร— [7.01] SPACE (SP) รท [18.0] NUMBER SIGN (AL) รท [0.3]
ร— 00A7 ร— 0308 ร— 0023 รท # ร— [0.3] SECTION SIGN (AI_AL) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [28.0] NUMBER SIGN (AL) รท [0.3]
@@ -7084,7 +7084,7 @@
ร— 3041 ร— 0308 ร— 0020 รท 3041 รท # ร— [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [7.01] SPACE (SP) รท [18.0] HIRAGANA LETTER SMALL A (CJ_NS) รท [0.3]
ร— 000D ร— 000A รท 0061 ร— 000A รท 0308 รท # ร— [0.3] <CARRIAGE RETURN (CR)> (CR) ร— [5.01] <LINE FEED (LF)> (LF) รท [5.03] LATIN SMALL LETTER A (AL) ร— [6.0] <LINE FEED (LF)> (LF) รท [5.03] COMBINING DIAERESIS (CM1_CM) รท [0.3]
ร— 0061 ร— 0308 รท # ร— [0.3] LATIN SMALL LETTER A (AL) ร— [9.0] COMBINING DIAERESIS (CM1_CM) รท [0.3]
-ร— 0020 รท 200D ร— 0646 รท # ร— [0.3] SPACE (SP) รท [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [28.0] ARABIC LETTER NOON (AL) รท [0.3]
+ร— 0020 รท 200D ร— 0646 รท # ร— [0.3] SPACE (SP) รท [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] ARABIC LETTER NOON (AL) รท [0.3]
ร— 0646 ร— 200D ร— 0020 รท # ร— [0.3] ARABIC LETTER NOON (AL) ร— [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [7.01] SPACE (SP) รท [0.3]
ร— 000B รท 3041 รท # ร— [0.3] <LINE TABULATION> (BK) รท [4.0] HIRAGANA LETTER SMALL A (CJ_NS) รท [0.3]
ร— 000D รท 3041 รท # ร— [0.3] <CARRIAGE RETURN (CR)> (CR) รท [5.02] HIRAGANA LETTER SMALL A (CJ_NS) รท [0.3]
@@ -7093,8 +7093,8 @@
ร— 3041 ร— 2060 รท # ร— [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ร— [11.01] WORD JOINER (WJ) รท [0.3]
ร— 2060 ร— 3041 รท # ร— [0.3] WORD JOINER (WJ) ร— [11.02] HIRAGANA LETTER SMALL A (CJ_NS) รท [0.3]
ร— 3041 ร— 0308 ร— 00A0 รท # ร— [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ร— [9.0] COMBINING DIAERESIS (CM1_CM) ร— [12.2] NO-BREAK SPACE (GL) รท [0.3]
-ร— 200D ร— 00A0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [12.3] NO-BREAK SPACE (GL) รท [0.3]
-ร— 200D ร— 002F รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [13.04] SOLIDUS (SY) รท [0.3]
+ร— 200D ร— 00A0 รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] NO-BREAK SPACE (GL) รท [0.3]
+ร— 200D ร— 002F รท # ร— [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ร— [8.1] SOLIDUS (SY) รท [0.3]
ร— 2014 ร— 2014 รท # ร— [0.3] EM DASH (B2) ร— [17.0] EM DASH (B2) รท [0.3]
ร— 3041 รท FFFC รท # ร— [0.3] HIRAGANA LETTER SMALL A (CJ_NS) รท [20.01] OBJECT REPLACEMENT CHARACTER (CB) รท [0.3]
ร— FFFC รท 3041 รท # ร— [0.3] OBJECT REPLACEMENT CHARACTER (CB) รท [20.02] HIRAGANA LETTER SMALL A (CJ_NS) รท [0.3]
diff --git a/lib/stdlib/test/unicode_util_SUITE_data/NormalizationTest.txt b/lib/stdlib/test/unicode_util_SUITE_data/NormalizationTest.txt
index 71f2371c5e..72a31bcdf1 100644
--- a/lib/stdlib/test/unicode_util_SUITE_data/NormalizationTest.txt
+++ b/lib/stdlib/test/unicode_util_SUITE_data/NormalizationTest.txt
@@ -1,6 +1,6 @@
-# NormalizationTest-10.0.0.txt
-# Date: 2017-03-08, 08:41:55 GMT
-# ยฉ 2017 Unicodeยฎ, Inc.
+# NormalizationTest-11.0.0.txt
+# Date: 2018-02-19, 18:33:08 GMT
+# ยฉ 2018 Unicodeยฎ, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -17479,6 +17479,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (๏ฟฎ; ๏ฟฎ; ๏ฟฎ; โ—‹; โ—‹; ) HALFWIDTH WHITE CIRCLE
0061 07F2 059A 0316 302A 0062;0061 302A 07F2 0316 059A 0062;0061 302A 07F2 0316 059A 0062;0061 302A 07F2 0316 059A 0062;0061 302A 07F2 0316 059A 0062; # (aโ—Œ฿ฒโ—Œึšโ—Œฬ–โ—Œใ€ชb; aโ—Œใ€ชโ—Œ฿ฒโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ฿ฒโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ฿ฒโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ฿ฒโ—Œฬ–โ—Œึšb; ) LATIN SMALL LETTER A, NKO COMBINING NASALIZATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
0061 0315 0300 05AE 07F3 0062;00E0 05AE 07F3 0315 0062;0061 05AE 0300 07F3 0315 0062;00E0 05AE 07F3 0315 0062;0061 05AE 0300 07F3 0315 0062; # (aโ—Œฬ•โ—Œฬ€โ—Œึฎโ—Œ฿ณb; ร โ—Œึฎโ—Œ฿ณโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ฿ณโ—Œฬ•b; ร โ—Œึฎโ—Œ฿ณโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ฿ณโ—Œฬ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NKO COMBINING DOUBLE DOT ABOVE, LATIN SMALL LETTER B
0061 07F3 0315 0300 05AE 0062;0061 05AE 07F3 0300 0315 0062;0061 05AE 07F3 0300 0315 0062;0061 05AE 07F3 0300 0315 0062;0061 05AE 07F3 0300 0315 0062; # (aโ—Œ฿ณโ—Œฬ•โ—Œฬ€โ—Œึฎb; aโ—Œึฎโ—Œ฿ณโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ฿ณโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ฿ณโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ฿ณโ—Œฬ€โ—Œฬ•b; ) LATIN SMALL LETTER A, NKO COMBINING DOUBLE DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 059A 0316 302A 07FD 0062;0061 302A 0316 07FD 059A 0062;0061 302A 0316 07FD 059A 0062;0061 302A 0316 07FD 059A 0062;0061 302A 0316 07FD 059A 0062; # (aโ—Œึšโ—Œฬ–โ—Œใ€ชโ—Œ฿ฝb; aโ—Œใ€ชโ—Œฬ–โ—Œ฿ฝโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ฿ฝโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ฿ฝโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ฿ฝโ—Œึšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, NKO DANTAYALAN, LATIN SMALL LETTER B
+0061 07FD 059A 0316 302A 0062;0061 302A 07FD 0316 059A 0062;0061 302A 07FD 0316 059A 0062;0061 302A 07FD 0316 059A 0062;0061 302A 07FD 0316 059A 0062; # (aโ—Œ฿ฝโ—Œึšโ—Œฬ–โ—Œใ€ชb; aโ—Œใ€ชโ—Œ฿ฝโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ฿ฝโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ฿ฝโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ฿ฝโ—Œฬ–โ—Œึšb; ) LATIN SMALL LETTER A, NKO DANTAYALAN, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
0061 0315 0300 05AE 0816 0062;00E0 05AE 0816 0315 0062;0061 05AE 0300 0816 0315 0062;00E0 05AE 0816 0315 0062;0061 05AE 0300 0816 0315 0062; # (aโ—Œฬ•โ—Œฬ€โ—Œึฎโ—Œเ –b; ร โ—Œึฎโ—Œเ –โ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œเ –โ—Œฬ•b; ร โ—Œึฎโ—Œเ –โ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œเ –โ—Œฬ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN MARK IN, LATIN SMALL LETTER B
0061 0816 0315 0300 05AE 0062;0061 05AE 0816 0300 0315 0062;0061 05AE 0816 0300 0315 0062;0061 05AE 0816 0300 0315 0062;0061 05AE 0816 0300 0315 0062; # (aโ—Œเ –โ—Œฬ•โ—Œฬ€โ—Œึฎb; aโ—Œึฎโ—Œเ –โ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œเ –โ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œเ –โ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œเ –โ—Œฬ€โ—Œฬ•b; ) LATIN SMALL LETTER A, SAMARITAN MARK IN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0817 0062;00E0 05AE 0817 0315 0062;0061 05AE 0300 0817 0315 0062;00E0 05AE 0817 0315 0062;0061 05AE 0300 0817 0315 0062; # (aโ—Œฬ•โ—Œฬ€โ—Œึฎโ—Œเ —b; ร โ—Œึฎโ—Œเ —โ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œเ —โ—Œฬ•b; ร โ—Œึฎโ—Œเ —โ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œเ —โ—Œฬ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN MARK IN-ALAF, LATIN SMALL LETTER B
@@ -17527,6 +17529,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (๏ฟฎ; ๏ฟฎ; ๏ฟฎ; โ—‹; โ—‹; ) HALFWIDTH WHITE CIRCLE
0061 085A 059A 0316 302A 0062;0061 302A 085A 0316 059A 0062;0061 302A 085A 0316 059A 0062;0061 302A 085A 0316 059A 0062;0061 302A 085A 0316 059A 0062; # (aโ—Œเกšโ—Œึšโ—Œฬ–โ—Œใ€ชb; aโ—Œใ€ชโ—Œเกšโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œเกšโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œเกšโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œเกšโ—Œฬ–โ—Œึšb; ) LATIN SMALL LETTER A, MANDAIC VOCALIZATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
0061 059A 0316 302A 085B 0062;0061 302A 0316 085B 059A 0062;0061 302A 0316 085B 059A 0062;0061 302A 0316 085B 059A 0062;0061 302A 0316 085B 059A 0062; # (aโ—Œึšโ—Œฬ–โ—Œใ€ชโ—Œเก›b; aโ—Œใ€ชโ—Œฬ–โ—Œเก›โ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œเก›โ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œเก›โ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œเก›โ—Œึšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MANDAIC GEMINATION MARK, LATIN SMALL LETTER B
0061 085B 059A 0316 302A 0062;0061 302A 085B 0316 059A 0062;0061 302A 085B 0316 059A 0062;0061 302A 085B 0316 059A 0062;0061 302A 085B 0316 059A 0062; # (aโ—Œเก›โ—Œึšโ—Œฬ–โ—Œใ€ชb; aโ—Œใ€ชโ—Œเก›โ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œเก›โ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œเก›โ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œเก›โ—Œฬ–โ—Œึšb; ) LATIN SMALL LETTER A, MANDAIC GEMINATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 302A 08D3 0062;0061 302A 0316 08D3 059A 0062;0061 302A 0316 08D3 059A 0062;0061 302A 0316 08D3 059A 0062;0061 302A 0316 08D3 059A 0062; # (aโ—Œึšโ—Œฬ–โ—Œใ€ชโ—Œเฃ“b; aโ—Œใ€ชโ—Œฬ–โ—Œเฃ“โ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œเฃ“โ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œเฃ“โ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œเฃ“โ—Œึšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC SMALL LOW WAW, LATIN SMALL LETTER B
+0061 08D3 059A 0316 302A 0062;0061 302A 08D3 0316 059A 0062;0061 302A 08D3 0316 059A 0062;0061 302A 08D3 0316 059A 0062;0061 302A 08D3 0316 059A 0062; # (aโ—Œเฃ“โ—Œึšโ—Œฬ–โ—Œใ€ชb; aโ—Œใ€ชโ—Œเฃ“โ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œเฃ“โ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œเฃ“โ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œเฃ“โ—Œฬ–โ—Œึšb; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WAW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
0061 0315 0300 05AE 08D4 0062;00E0 05AE 08D4 0315 0062;0061 05AE 0300 08D4 0315 0062;00E0 05AE 08D4 0315 0062;0061 05AE 0300 08D4 0315 0062; # (aโ—Œฬ•โ—Œฬ€โ—Œึฎโ—Œเฃ”b; ร โ—Œึฎโ—Œเฃ”โ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œเฃ”โ—Œฬ•b; ร โ—Œึฎโ—Œเฃ”โ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œเฃ”โ—Œฬ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD AR-RUB, LATIN SMALL LETTER B
0061 08D4 0315 0300 05AE 0062;0061 05AE 08D4 0300 0315 0062;0061 05AE 08D4 0300 0315 0062;0061 05AE 08D4 0300 0315 0062;0061 05AE 08D4 0300 0315 0062; # (aโ—Œเฃ”โ—Œฬ•โ—Œฬ€โ—Œึฎb; aโ—Œึฎโ—Œเฃ”โ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œเฃ”โ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œเฃ”โ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œเฃ”โ—Œฬ€โ—Œฬ•b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD AR-RUB, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 08D5 0062;00E0 05AE 08D5 0315 0062;0061 05AE 0300 08D5 0315 0062;00E0 05AE 08D5 0315 0062;0061 05AE 0300 08D5 0315 0062; # (aโ—Œฬ•โ—Œฬ€โ—Œึฎโ—Œเฃ•b; ร โ—Œึฎโ—Œเฃ•โ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œเฃ•โ—Œฬ•b; ร โ—Œึฎโ—Œเฃ•โ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œเฃ•โ—Œฬ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH SAD, LATIN SMALL LETTER B
@@ -17629,6 +17633,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (๏ฟฎ; ๏ฟฎ; ๏ฟฎ; โ—‹; โ—‹; ) HALFWIDTH WHITE CIRCLE
0061 09BC 3099 093C 0334 0062;0061 0334 09BC 093C 3099 0062;0061 0334 09BC 093C 3099 0062;0061 0334 09BC 093C 3099 0062;0061 0334 09BC 093C 3099 0062; # (aโ—Œเฆผโ—Œใ‚™โ—Œเคผโ—Œฬดb; aโ—Œฬดโ—Œเฆผโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œเฆผโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œเฆผโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œเฆผโ—Œเคผโ—Œใ‚™b; ) LATIN SMALL LETTER A, BENGALI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 05B0 094D 3099 09CD 0062;0061 3099 094D 09CD 05B0 0062;0061 3099 094D 09CD 05B0 0062;0061 3099 094D 09CD 05B0 0062;0061 3099 094D 09CD 05B0 0062; # (aโ—Œึฐโ—Œเฅโ—Œใ‚™โ—Œเงb; aโ—Œใ‚™โ—Œเฅโ—Œเงโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œเงโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œเงโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œเงโ—Œึฐb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BENGALI SIGN VIRAMA, LATIN SMALL LETTER B
0061 09CD 05B0 094D 3099 0062;0061 3099 09CD 094D 05B0 0062;0061 3099 09CD 094D 05B0 0062;0061 3099 09CD 094D 05B0 0062;0061 3099 09CD 094D 05B0 0062; # (aโ—Œเงโ—Œึฐโ—Œเฅโ—Œใ‚™b; aโ—Œใ‚™โ—Œเงโ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œเงโ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œเงโ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œเงโ—Œเฅโ—Œึฐb; ) LATIN SMALL LETTER A, BENGALI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
+0061 0315 0300 05AE 09FE 0062;00E0 05AE 09FE 0315 0062;0061 05AE 0300 09FE 0315 0062;00E0 05AE 09FE 0315 0062;0061 05AE 0300 09FE 0315 0062; # (aโ—Œฬ•โ—Œฬ€โ—Œึฎโ—Œเงพb; ร โ—Œึฎโ—Œเงพโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œเงพโ—Œฬ•b; ร โ—Œึฎโ—Œเงพโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œเงพโ—Œฬ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BENGALI SANDHI MARK, LATIN SMALL LETTER B
+0061 09FE 0315 0300 05AE 0062;0061 05AE 09FE 0300 0315 0062;0061 05AE 09FE 0300 0315 0062;0061 05AE 09FE 0300 0315 0062;0061 05AE 09FE 0300 0315 0062; # (aโ—Œเงพโ—Œฬ•โ—Œฬ€โ—Œึฎb; aโ—Œึฎโ—Œเงพโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œเงพโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œเงพโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œเงพโ—Œฬ€โ—Œฬ•b; ) LATIN SMALL LETTER A, BENGALI SANDHI MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 3099 093C 0334 0A3C 0062;0061 0334 093C 0A3C 3099 0062;0061 0334 093C 0A3C 3099 0062;0061 0334 093C 0A3C 3099 0062;0061 0334 093C 0A3C 3099 0062; # (aโ—Œใ‚™โ—Œเคผโ—Œฬดโ—Œเจผb; aโ—Œฬดโ—Œเคผโ—Œเจผโ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œเจผโ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œเจผโ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œเจผโ—Œใ‚™b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, GURMUKHI SIGN NUKTA, LATIN SMALL LETTER B
0061 0A3C 3099 093C 0334 0062;0061 0334 0A3C 093C 3099 0062;0061 0334 0A3C 093C 3099 0062;0061 0334 0A3C 093C 3099 0062;0061 0334 0A3C 093C 3099 0062; # (aโ—Œเจผโ—Œใ‚™โ—Œเคผโ—Œฬดb; aโ—Œฬดโ—Œเจผโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œเจผโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œเจผโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œเจผโ—Œเคผโ—Œใ‚™b; ) LATIN SMALL LETTER A, GURMUKHI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 05B0 094D 3099 0A4D 0062;0061 3099 094D 0A4D 05B0 0062;0061 3099 094D 0A4D 05B0 0062;0061 3099 094D 0A4D 05B0 0062;0061 3099 094D 0A4D 05B0 0062; # (aโ—Œึฐโ—Œเฅโ—Œใ‚™โ—Œเฉb; aโ—Œใ‚™โ—Œเฅโ—Œเฉโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œเฉโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œเฉโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œเฉโ—Œึฐb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, GURMUKHI SIGN VIRAMA, LATIN SMALL LETTER B
@@ -18329,6 +18335,36 @@ FFEE;FFEE;FFEE;25CB;25CB; # (๏ฟฎ; ๏ฟฎ; ๏ฟฎ; โ—‹; โ—‹; ) HALFWIDTH WHITE CIRCLE
0061 10AE5 0315 0300 05AE 0062;0061 05AE 10AE5 0300 0315 0062;0061 05AE 10AE5 0300 0315 0062;0061 05AE 10AE5 0300 0315 0062;0061 05AE 10AE5 0300 0315 0062; # (aโ—Œ๐ซฅโ—Œฬ•โ—Œฬ€โ—Œึฎb; aโ—Œึฎโ—Œ๐ซฅโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ซฅโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ซฅโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ซฅโ—Œฬ€โ—Œฬ•b; ) LATIN SMALL LETTER A, MANICHAEAN ABBREVIATION MARK ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 059A 0316 302A 10AE6 0062;0061 302A 0316 10AE6 059A 0062;0061 302A 0316 10AE6 059A 0062;0061 302A 0316 10AE6 059A 0062;0061 302A 0316 10AE6 059A 0062; # (aโ—Œึšโ—Œฬ–โ—Œใ€ชโ—Œ๐ซฆb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ซฆโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ซฆโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ซฆโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ซฆโ—Œึšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MANICHAEAN ABBREVIATION MARK BELOW, LATIN SMALL LETTER B
0061 10AE6 059A 0316 302A 0062;0061 302A 10AE6 0316 059A 0062;0061 302A 10AE6 0316 059A 0062;0061 302A 10AE6 0316 059A 0062;0061 302A 10AE6 0316 059A 0062; # (aโ—Œ๐ซฆโ—Œึšโ—Œฬ–โ—Œใ€ชb; aโ—Œใ€ชโ—Œ๐ซฆโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ซฆโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ซฆโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ซฆโ—Œฬ–โ—Œึšb; ) LATIN SMALL LETTER A, MANICHAEAN ABBREVIATION MARK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 0315 0300 05AE 10D24 0062;00E0 05AE 10D24 0315 0062;0061 05AE 0300 10D24 0315 0062;00E0 05AE 10D24 0315 0062;0061 05AE 0300 10D24 0315 0062; # (aโ—Œฬ•โ—Œฬ€โ—Œึฎโ—Œ๐ดคb; ร โ—Œึฎโ—Œ๐ดคโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ดคโ—Œฬ•b; ร โ—Œึฎโ—Œ๐ดคโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ดคโ—Œฬ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HANIFI ROHINGYA SIGN HARBAHAY, LATIN SMALL LETTER B
+0061 10D24 0315 0300 05AE 0062;0061 05AE 10D24 0300 0315 0062;0061 05AE 10D24 0300 0315 0062;0061 05AE 10D24 0300 0315 0062;0061 05AE 10D24 0300 0315 0062; # (aโ—Œ๐ดคโ—Œฬ•โ—Œฬ€โ—Œึฎb; aโ—Œึฎโ—Œ๐ดคโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ดคโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ดคโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ดคโ—Œฬ€โ—Œฬ•b; ) LATIN SMALL LETTER A, HANIFI ROHINGYA SIGN HARBAHAY, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 10D25 0062;00E0 05AE 10D25 0315 0062;0061 05AE 0300 10D25 0315 0062;00E0 05AE 10D25 0315 0062;0061 05AE 0300 10D25 0315 0062; # (aโ—Œฬ•โ—Œฬ€โ—Œึฎโ—Œ๐ดฅb; ร โ—Œึฎโ—Œ๐ดฅโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ดฅโ—Œฬ•b; ร โ—Œึฎโ—Œ๐ดฅโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ดฅโ—Œฬ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HANIFI ROHINGYA SIGN TAHALA, LATIN SMALL LETTER B
+0061 10D25 0315 0300 05AE 0062;0061 05AE 10D25 0300 0315 0062;0061 05AE 10D25 0300 0315 0062;0061 05AE 10D25 0300 0315 0062;0061 05AE 10D25 0300 0315 0062; # (aโ—Œ๐ดฅโ—Œฬ•โ—Œฬ€โ—Œึฎb; aโ—Œึฎโ—Œ๐ดฅโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ดฅโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ดฅโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ดฅโ—Œฬ€โ—Œฬ•b; ) LATIN SMALL LETTER A, HANIFI ROHINGYA SIGN TAHALA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 10D26 0062;00E0 05AE 10D26 0315 0062;0061 05AE 0300 10D26 0315 0062;00E0 05AE 10D26 0315 0062;0061 05AE 0300 10D26 0315 0062; # (aโ—Œฬ•โ—Œฬ€โ—Œึฎโ—Œ๐ดฆb; ร โ—Œึฎโ—Œ๐ดฆโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ดฆโ—Œฬ•b; ร โ—Œึฎโ—Œ๐ดฆโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ดฆโ—Œฬ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HANIFI ROHINGYA SIGN TANA, LATIN SMALL LETTER B
+0061 10D26 0315 0300 05AE 0062;0061 05AE 10D26 0300 0315 0062;0061 05AE 10D26 0300 0315 0062;0061 05AE 10D26 0300 0315 0062;0061 05AE 10D26 0300 0315 0062; # (aโ—Œ๐ดฆโ—Œฬ•โ—Œฬ€โ—Œึฎb; aโ—Œึฎโ—Œ๐ดฆโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ดฆโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ดฆโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ดฆโ—Œฬ€โ—Œฬ•b; ) LATIN SMALL LETTER A, HANIFI ROHINGYA SIGN TANA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 10D27 0062;00E0 05AE 10D27 0315 0062;0061 05AE 0300 10D27 0315 0062;00E0 05AE 10D27 0315 0062;0061 05AE 0300 10D27 0315 0062; # (aโ—Œฬ•โ—Œฬ€โ—Œึฎโ—Œ๐ดงb; ร โ—Œึฎโ—Œ๐ดงโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ดงโ—Œฬ•b; ร โ—Œึฎโ—Œ๐ดงโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ดงโ—Œฬ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HANIFI ROHINGYA SIGN TASSI, LATIN SMALL LETTER B
+0061 10D27 0315 0300 05AE 0062;0061 05AE 10D27 0300 0315 0062;0061 05AE 10D27 0300 0315 0062;0061 05AE 10D27 0300 0315 0062;0061 05AE 10D27 0300 0315 0062; # (aโ—Œ๐ดงโ—Œฬ•โ—Œฬ€โ—Œึฎb; aโ—Œึฎโ—Œ๐ดงโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ดงโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ดงโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ดงโ—Œฬ€โ—Œฬ•b; ) LATIN SMALL LETTER A, HANIFI ROHINGYA SIGN TASSI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 059A 0316 302A 10F46 0062;0061 302A 0316 10F46 059A 0062;0061 302A 0316 10F46 059A 0062;0061 302A 0316 10F46 059A 0062;0061 302A 0316 10F46 059A 0062; # (aโ—Œึšโ—Œฬ–โ—Œใ€ชโ—Œ๐ฝ†b; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝ†โ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝ†โ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝ†โ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝ†โ—Œึšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SOGDIAN COMBINING DOT BELOW, LATIN SMALL LETTER B
+0061 10F46 059A 0316 302A 0062;0061 302A 10F46 0316 059A 0062;0061 302A 10F46 0316 059A 0062;0061 302A 10F46 0316 059A 0062;0061 302A 10F46 0316 059A 0062; # (aโ—Œ๐ฝ†โ—Œึšโ—Œฬ–โ—Œใ€ชb; aโ—Œใ€ชโ—Œ๐ฝ†โ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝ†โ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝ†โ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝ†โ—Œฬ–โ—Œึšb; ) LATIN SMALL LETTER A, SOGDIAN COMBINING DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 302A 10F47 0062;0061 302A 0316 10F47 059A 0062;0061 302A 0316 10F47 059A 0062;0061 302A 0316 10F47 059A 0062;0061 302A 0316 10F47 059A 0062; # (aโ—Œึšโ—Œฬ–โ—Œใ€ชโ—Œ๐ฝ‡b; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝ‡โ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝ‡โ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝ‡โ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝ‡โ—Œึšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SOGDIAN COMBINING TWO DOTS BELOW, LATIN SMALL LETTER B
+0061 10F47 059A 0316 302A 0062;0061 302A 10F47 0316 059A 0062;0061 302A 10F47 0316 059A 0062;0061 302A 10F47 0316 059A 0062;0061 302A 10F47 0316 059A 0062; # (aโ—Œ๐ฝ‡โ—Œึšโ—Œฬ–โ—Œใ€ชb; aโ—Œใ€ชโ—Œ๐ฝ‡โ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝ‡โ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝ‡โ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝ‡โ—Œฬ–โ—Œึšb; ) LATIN SMALL LETTER A, SOGDIAN COMBINING TWO DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 0315 0300 05AE 10F48 0062;00E0 05AE 10F48 0315 0062;0061 05AE 0300 10F48 0315 0062;00E0 05AE 10F48 0315 0062;0061 05AE 0300 10F48 0315 0062; # (aโ—Œฬ•โ—Œฬ€โ—Œึฎโ—Œ๐ฝˆb; ร โ—Œึฎโ—Œ๐ฝˆโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ฝˆโ—Œฬ•b; ร โ—Œึฎโ—Œ๐ฝˆโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ฝˆโ—Œฬ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SOGDIAN COMBINING DOT ABOVE, LATIN SMALL LETTER B
+0061 10F48 0315 0300 05AE 0062;0061 05AE 10F48 0300 0315 0062;0061 05AE 10F48 0300 0315 0062;0061 05AE 10F48 0300 0315 0062;0061 05AE 10F48 0300 0315 0062; # (aโ—Œ๐ฝˆโ—Œฬ•โ—Œฬ€โ—Œึฎb; aโ—Œึฎโ—Œ๐ฝˆโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ฝˆโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ฝˆโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ฝˆโ—Œฬ€โ—Œฬ•b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 10F49 0062;00E0 05AE 10F49 0315 0062;0061 05AE 0300 10F49 0315 0062;00E0 05AE 10F49 0315 0062;0061 05AE 0300 10F49 0315 0062; # (aโ—Œฬ•โ—Œฬ€โ—Œึฎโ—Œ๐ฝ‰b; ร โ—Œึฎโ—Œ๐ฝ‰โ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ฝ‰โ—Œฬ•b; ร โ—Œึฎโ—Œ๐ฝ‰โ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ฝ‰โ—Œฬ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SOGDIAN COMBINING TWO DOTS ABOVE, LATIN SMALL LETTER B
+0061 10F49 0315 0300 05AE 0062;0061 05AE 10F49 0300 0315 0062;0061 05AE 10F49 0300 0315 0062;0061 05AE 10F49 0300 0315 0062;0061 05AE 10F49 0300 0315 0062; # (aโ—Œ๐ฝ‰โ—Œฬ•โ—Œฬ€โ—Œึฎb; aโ—Œึฎโ—Œ๐ฝ‰โ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ฝ‰โ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ฝ‰โ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ฝ‰โ—Œฬ€โ—Œฬ•b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING TWO DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 10F4A 0062;00E0 05AE 10F4A 0315 0062;0061 05AE 0300 10F4A 0315 0062;00E0 05AE 10F4A 0315 0062;0061 05AE 0300 10F4A 0315 0062; # (aโ—Œฬ•โ—Œฬ€โ—Œึฎโ—Œ๐ฝŠb; ร โ—Œึฎโ—Œ๐ฝŠโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ฝŠโ—Œฬ•b; ร โ—Œึฎโ—Œ๐ฝŠโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ฝŠโ—Œฬ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SOGDIAN COMBINING CURVE ABOVE, LATIN SMALL LETTER B
+0061 10F4A 0315 0300 05AE 0062;0061 05AE 10F4A 0300 0315 0062;0061 05AE 10F4A 0300 0315 0062;0061 05AE 10F4A 0300 0315 0062;0061 05AE 10F4A 0300 0315 0062; # (aโ—Œ๐ฝŠโ—Œฬ•โ—Œฬ€โ—Œึฎb; aโ—Œึฎโ—Œ๐ฝŠโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ฝŠโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ฝŠโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ฝŠโ—Œฬ€โ—Œฬ•b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING CURVE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 059A 0316 302A 10F4B 0062;0061 302A 0316 10F4B 059A 0062;0061 302A 0316 10F4B 059A 0062;0061 302A 0316 10F4B 059A 0062;0061 302A 0316 10F4B 059A 0062; # (aโ—Œึšโ—Œฬ–โ—Œใ€ชโ—Œ๐ฝ‹b; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝ‹โ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝ‹โ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝ‹โ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝ‹โ—Œึšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SOGDIAN COMBINING CURVE BELOW, LATIN SMALL LETTER B
+0061 10F4B 059A 0316 302A 0062;0061 302A 10F4B 0316 059A 0062;0061 302A 10F4B 0316 059A 0062;0061 302A 10F4B 0316 059A 0062;0061 302A 10F4B 0316 059A 0062; # (aโ—Œ๐ฝ‹โ—Œึšโ—Œฬ–โ—Œใ€ชb; aโ—Œใ€ชโ—Œ๐ฝ‹โ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝ‹โ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝ‹โ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝ‹โ—Œฬ–โ—Œึšb; ) LATIN SMALL LETTER A, SOGDIAN COMBINING CURVE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 0315 0300 05AE 10F4C 0062;00E0 05AE 10F4C 0315 0062;0061 05AE 0300 10F4C 0315 0062;00E0 05AE 10F4C 0315 0062;0061 05AE 0300 10F4C 0315 0062; # (aโ—Œฬ•โ—Œฬ€โ—Œึฎโ—Œ๐ฝŒb; ร โ—Œึฎโ—Œ๐ฝŒโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ฝŒโ—Œฬ•b; ร โ—Œึฎโ—Œ๐ฝŒโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐ฝŒโ—Œฬ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SOGDIAN COMBINING HOOK ABOVE, LATIN SMALL LETTER B
+0061 10F4C 0315 0300 05AE 0062;0061 05AE 10F4C 0300 0315 0062;0061 05AE 10F4C 0300 0315 0062;0061 05AE 10F4C 0300 0315 0062;0061 05AE 10F4C 0300 0315 0062; # (aโ—Œ๐ฝŒโ—Œฬ•โ—Œฬ€โ—Œึฎb; aโ—Œึฎโ—Œ๐ฝŒโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ฝŒโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ฝŒโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐ฝŒโ—Œฬ€โ—Œฬ•b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING HOOK ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 059A 0316 302A 10F4D 0062;0061 302A 0316 10F4D 059A 0062;0061 302A 0316 10F4D 059A 0062;0061 302A 0316 10F4D 059A 0062;0061 302A 0316 10F4D 059A 0062; # (aโ—Œึšโ—Œฬ–โ—Œใ€ชโ—Œ๐ฝb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝโ—Œึšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SOGDIAN COMBINING HOOK BELOW, LATIN SMALL LETTER B
+0061 10F4D 059A 0316 302A 0062;0061 302A 10F4D 0316 059A 0062;0061 302A 10F4D 0316 059A 0062;0061 302A 10F4D 0316 059A 0062;0061 302A 10F4D 0316 059A 0062; # (aโ—Œ๐ฝโ—Œึšโ—Œฬ–โ—Œใ€ชb; aโ—Œใ€ชโ—Œ๐ฝโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝโ—Œฬ–โ—Œึšb; ) LATIN SMALL LETTER A, SOGDIAN COMBINING HOOK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 302A 10F4E 0062;0061 302A 0316 10F4E 059A 0062;0061 302A 0316 10F4E 059A 0062;0061 302A 0316 10F4E 059A 0062;0061 302A 0316 10F4E 059A 0062; # (aโ—Œึšโ—Œฬ–โ—Œใ€ชโ—Œ๐ฝŽb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝŽโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝŽโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝŽโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝŽโ—Œึšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SOGDIAN COMBINING LONG HOOK BELOW, LATIN SMALL LETTER B
+0061 10F4E 059A 0316 302A 0062;0061 302A 10F4E 0316 059A 0062;0061 302A 10F4E 0316 059A 0062;0061 302A 10F4E 0316 059A 0062;0061 302A 10F4E 0316 059A 0062; # (aโ—Œ๐ฝŽโ—Œึšโ—Œฬ–โ—Œใ€ชb; aโ—Œใ€ชโ—Œ๐ฝŽโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝŽโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝŽโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝŽโ—Œฬ–โ—Œึšb; ) LATIN SMALL LETTER A, SOGDIAN COMBINING LONG HOOK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 302A 10F4F 0062;0061 302A 0316 10F4F 059A 0062;0061 302A 0316 10F4F 059A 0062;0061 302A 0316 10F4F 059A 0062;0061 302A 0316 10F4F 059A 0062; # (aโ—Œึšโ—Œฬ–โ—Œใ€ชโ—Œ๐ฝb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝโ—Œึšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SOGDIAN COMBINING RESH BELOW, LATIN SMALL LETTER B
+0061 10F4F 059A 0316 302A 0062;0061 302A 10F4F 0316 059A 0062;0061 302A 10F4F 0316 059A 0062;0061 302A 10F4F 0316 059A 0062;0061 302A 10F4F 0316 059A 0062; # (aโ—Œ๐ฝโ—Œึšโ—Œฬ–โ—Œใ€ชb; aโ—Œใ€ชโ—Œ๐ฝโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝโ—Œฬ–โ—Œึšb; ) LATIN SMALL LETTER A, SOGDIAN COMBINING RESH BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 302A 10F50 0062;0061 302A 0316 10F50 059A 0062;0061 302A 0316 10F50 059A 0062;0061 302A 0316 10F50 059A 0062;0061 302A 0316 10F50 059A 0062; # (aโ—Œึšโ—Œฬ–โ—Œใ€ชโ—Œ๐ฝb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝโ—Œึšb; aโ—Œใ€ชโ—Œฬ–โ—Œ๐ฝโ—Œึšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SOGDIAN COMBINING STROKE BELOW, LATIN SMALL LETTER B
+0061 10F50 059A 0316 302A 0062;0061 302A 10F50 0316 059A 0062;0061 302A 10F50 0316 059A 0062;0061 302A 10F50 0316 059A 0062;0061 302A 10F50 0316 059A 0062; # (aโ—Œ๐ฝโ—Œึšโ—Œฬ–โ—Œใ€ชb; aโ—Œใ€ชโ—Œ๐ฝโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝโ—Œฬ–โ—Œึšb; aโ—Œใ€ชโ—Œ๐ฝโ—Œฬ–โ—Œึšb; ) LATIN SMALL LETTER A, SOGDIAN COMBINING STROKE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
0061 05B0 094D 3099 11046 0062;0061 3099 094D 11046 05B0 0062;0061 3099 094D 11046 05B0 0062;0061 3099 094D 11046 05B0 0062;0061 3099 094D 11046 05B0 0062; # (aโ—Œึฐโ—Œเฅโ—Œใ‚™โ—Œ๐‘†b; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘†โ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘†โ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘†โ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘†โ—Œึฐb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BRAHMI VIRAMA, LATIN SMALL LETTER B
0061 11046 05B0 094D 3099 0062;0061 3099 11046 094D 05B0 0062;0061 3099 11046 094D 05B0 0062;0061 3099 11046 094D 05B0 0062;0061 3099 11046 094D 05B0 0062; # (aโ—Œ๐‘†โ—Œึฐโ—Œเฅโ—Œใ‚™b; aโ—Œใ‚™โ—Œ๐‘†โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘†โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘†โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘†โ—Œเฅโ—Œึฐb; ) LATIN SMALL LETTER A, BRAHMI VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 05B0 094D 3099 1107F 0062;0061 3099 094D 1107F 05B0 0062;0061 3099 094D 1107F 05B0 0062;0061 3099 094D 1107F 05B0 0062;0061 3099 094D 1107F 05B0 0062; # (aโ—Œึฐโ—Œเฅโ—Œใ‚™โ—Œ๐‘ฟb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ฟโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ฟโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ฟโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ฟโ—Œึฐb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BRAHMI NUMBER JOINER, LATIN SMALL LETTER B
@@ -18361,6 +18397,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (๏ฟฎ; ๏ฟฎ; ๏ฟฎ; โ—‹; โ—‹; ) HALFWIDTH WHITE CIRCLE
0061 112E9 3099 093C 0334 0062;0061 0334 112E9 093C 3099 0062;0061 0334 112E9 093C 3099 0062;0061 0334 112E9 093C 3099 0062;0061 0334 112E9 093C 3099 0062; # (aโ—Œ๐‘‹ฉโ—Œใ‚™โ—Œเคผโ—Œฬดb; aโ—Œฬดโ—Œ๐‘‹ฉโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘‹ฉโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘‹ฉโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘‹ฉโ—Œเคผโ—Œใ‚™b; ) LATIN SMALL LETTER A, KHUDAWADI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 05B0 094D 3099 112EA 0062;0061 3099 094D 112EA 05B0 0062;0061 3099 094D 112EA 05B0 0062;0061 3099 094D 112EA 05B0 0062;0061 3099 094D 112EA 05B0 0062; # (aโ—Œึฐโ—Œเฅโ—Œใ‚™โ—Œ๐‘‹ชb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘‹ชโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘‹ชโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘‹ชโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘‹ชโ—Œึฐb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KHUDAWADI SIGN VIRAMA, LATIN SMALL LETTER B
0061 112EA 05B0 094D 3099 0062;0061 3099 112EA 094D 05B0 0062;0061 3099 112EA 094D 05B0 0062;0061 3099 112EA 094D 05B0 0062;0061 3099 112EA 094D 05B0 0062; # (aโ—Œ๐‘‹ชโ—Œึฐโ—Œเฅโ—Œใ‚™b; aโ—Œใ‚™โ—Œ๐‘‹ชโ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘‹ชโ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘‹ชโ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘‹ชโ—Œเฅโ—Œึฐb; ) LATIN SMALL LETTER A, KHUDAWADI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
+0061 3099 093C 0334 1133B 0062;0061 0334 093C 1133B 3099 0062;0061 0334 093C 1133B 3099 0062;0061 0334 093C 1133B 3099 0062;0061 0334 093C 1133B 3099 0062; # (aโ—Œใ‚™โ—Œเคผโ—Œฬดโ—Œ๐‘Œปb; aโ—Œฬดโ—Œเคผโ—Œ๐‘Œปโ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œ๐‘Œปโ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œ๐‘Œปโ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œ๐‘Œปโ—Œใ‚™b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, COMBINING BINDU BELOW, LATIN SMALL LETTER B
+0061 1133B 3099 093C 0334 0062;0061 0334 1133B 093C 3099 0062;0061 0334 1133B 093C 3099 0062;0061 0334 1133B 093C 3099 0062;0061 0334 1133B 093C 3099 0062; # (aโ—Œ๐‘Œปโ—Œใ‚™โ—Œเคผโ—Œฬดb; aโ—Œฬดโ—Œ๐‘Œปโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘Œปโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘Œปโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘Œปโ—Œเคผโ—Œใ‚™b; ) LATIN SMALL LETTER A, COMBINING BINDU BELOW, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 3099 093C 0334 1133C 0062;0061 0334 093C 1133C 3099 0062;0061 0334 093C 1133C 3099 0062;0061 0334 093C 1133C 3099 0062;0061 0334 093C 1133C 3099 0062; # (aโ—Œใ‚™โ—Œเคผโ—Œฬดโ—Œ๐‘Œผb; aโ—Œฬดโ—Œเคผโ—Œ๐‘Œผโ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œ๐‘Œผโ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œ๐‘Œผโ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œ๐‘Œผโ—Œใ‚™b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, GRANTHA SIGN NUKTA, LATIN SMALL LETTER B
0061 1133C 3099 093C 0334 0062;0061 0334 1133C 093C 3099 0062;0061 0334 1133C 093C 3099 0062;0061 0334 1133C 093C 3099 0062;0061 0334 1133C 093C 3099 0062; # (aโ—Œ๐‘Œผโ—Œใ‚™โ—Œเคผโ—Œฬดb; aโ—Œฬดโ—Œ๐‘Œผโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘Œผโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘Œผโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘Œผโ—Œเคผโ—Œใ‚™b; ) LATIN SMALL LETTER A, GRANTHA SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 05B0 094D 3099 1134D 0062;0061 3099 094D 1134D 05B0 0062;0061 3099 094D 1134D 05B0 0062;0061 3099 094D 1134D 05B0 0062;0061 3099 094D 1134D 05B0 0062; # (aโ—Œึฐโ—Œเฅโ—Œใ‚™๐‘b; aโ—Œใ‚™โ—Œเฅ๐‘โ—Œึฐb; aโ—Œใ‚™โ—Œเฅ๐‘โ—Œึฐb; aโ—Œใ‚™โ—Œเฅ๐‘โ—Œึฐb; aโ—Œใ‚™โ—Œเฅ๐‘โ—Œึฐb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, GRANTHA SIGN VIRAMA, LATIN SMALL LETTER B
@@ -18393,6 +18431,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (๏ฟฎ; ๏ฟฎ; ๏ฟฎ; โ—‹; โ—‹; ) HALFWIDTH WHITE CIRCLE
0061 11442 05B0 094D 3099 0062;0061 3099 11442 094D 05B0 0062;0061 3099 11442 094D 05B0 0062;0061 3099 11442 094D 05B0 0062;0061 3099 11442 094D 05B0 0062; # (aโ—Œ๐‘‘‚โ—Œึฐโ—Œเฅโ—Œใ‚™b; aโ—Œใ‚™โ—Œ๐‘‘‚โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘‘‚โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘‘‚โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘‘‚โ—Œเฅโ—Œึฐb; ) LATIN SMALL LETTER A, NEWA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 3099 093C 0334 11446 0062;0061 0334 093C 11446 3099 0062;0061 0334 093C 11446 3099 0062;0061 0334 093C 11446 3099 0062;0061 0334 093C 11446 3099 0062; # (aโ—Œใ‚™โ—Œเคผโ—Œฬดโ—Œ๐‘‘†b; aโ—Œฬดโ—Œเคผโ—Œ๐‘‘†โ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œ๐‘‘†โ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œ๐‘‘†โ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œ๐‘‘†โ—Œใ‚™b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, NEWA SIGN NUKTA, LATIN SMALL LETTER B
0061 11446 3099 093C 0334 0062;0061 0334 11446 093C 3099 0062;0061 0334 11446 093C 3099 0062;0061 0334 11446 093C 3099 0062;0061 0334 11446 093C 3099 0062; # (aโ—Œ๐‘‘†โ—Œใ‚™โ—Œเคผโ—Œฬดb; aโ—Œฬดโ—Œ๐‘‘†โ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘‘†โ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘‘†โ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘‘†โ—Œเคผโ—Œใ‚™b; ) LATIN SMALL LETTER A, NEWA SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
+0061 0315 0300 05AE 1145E 0062;00E0 05AE 1145E 0315 0062;0061 05AE 0300 1145E 0315 0062;00E0 05AE 1145E 0315 0062;0061 05AE 0300 1145E 0315 0062; # (aโ—Œฬ•โ—Œฬ€โ—Œึฎโ—Œ๐‘‘žb; ร โ—Œึฎโ—Œ๐‘‘žโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐‘‘žโ—Œฬ•b; ร โ—Œึฎโ—Œ๐‘‘žโ—Œฬ•b; aโ—Œึฎโ—Œฬ€โ—Œ๐‘‘žโ—Œฬ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NEWA SANDHI MARK, LATIN SMALL LETTER B
+0061 1145E 0315 0300 05AE 0062;0061 05AE 1145E 0300 0315 0062;0061 05AE 1145E 0300 0315 0062;0061 05AE 1145E 0300 0315 0062;0061 05AE 1145E 0300 0315 0062; # (aโ—Œ๐‘‘žโ—Œฬ•โ—Œฬ€โ—Œึฎb; aโ—Œึฎโ—Œ๐‘‘žโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐‘‘žโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐‘‘žโ—Œฬ€โ—Œฬ•b; aโ—Œึฎโ—Œ๐‘‘žโ—Œฬ€โ—Œฬ•b; ) LATIN SMALL LETTER A, NEWA SANDHI MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 05B0 094D 3099 114C2 0062;0061 3099 094D 114C2 05B0 0062;0061 3099 094D 114C2 05B0 0062;0061 3099 094D 114C2 05B0 0062;0061 3099 094D 114C2 05B0 0062; # (aโ—Œึฐโ—Œเฅโ—Œใ‚™โ—Œ๐‘“‚b; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘“‚โ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘“‚โ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘“‚โ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘“‚โ—Œึฐb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TIRHUTA SIGN VIRAMA, LATIN SMALL LETTER B
0061 114C2 05B0 094D 3099 0062;0061 3099 114C2 094D 05B0 0062;0061 3099 114C2 094D 05B0 0062;0061 3099 114C2 094D 05B0 0062;0061 3099 114C2 094D 05B0 0062; # (aโ—Œ๐‘“‚โ—Œึฐโ—Œเฅโ—Œใ‚™b; aโ—Œใ‚™โ—Œ๐‘“‚โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘“‚โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘“‚โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘“‚โ—Œเฅโ—Œึฐb; ) LATIN SMALL LETTER A, TIRHUTA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 3099 093C 0334 114C3 0062;0061 0334 093C 114C3 3099 0062;0061 0334 093C 114C3 3099 0062;0061 0334 093C 114C3 3099 0062;0061 0334 093C 114C3 3099 0062; # (aโ—Œใ‚™โ—Œเคผโ—Œฬดโ—Œ๐‘“ƒb; aโ—Œฬดโ—Œเคผโ—Œ๐‘“ƒโ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œ๐‘“ƒโ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œ๐‘“ƒโ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œ๐‘“ƒโ—Œใ‚™b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, TIRHUTA SIGN NUKTA, LATIN SMALL LETTER B
@@ -18409,6 +18449,10 @@ FFEE;FFEE;FFEE;25CB;25CB; # (๏ฟฎ; ๏ฟฎ; ๏ฟฎ; โ—‹; โ—‹; ) HALFWIDTH WHITE CIRCLE
0061 116B7 3099 093C 0334 0062;0061 0334 116B7 093C 3099 0062;0061 0334 116B7 093C 3099 0062;0061 0334 116B7 093C 3099 0062;0061 0334 116B7 093C 3099 0062; # (aโ—Œ๐‘šทโ—Œใ‚™โ—Œเคผโ—Œฬดb; aโ—Œฬดโ—Œ๐‘šทโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘šทโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘šทโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘šทโ—Œเคผโ—Œใ‚™b; ) LATIN SMALL LETTER A, TAKRI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 05B0 094D 3099 1172B 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062; # (aโ—Œึฐโ—Œเฅโ—Œใ‚™โ—Œ๐‘œซb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘œซโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘œซโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘œซโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘œซโ—Œึฐb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, AHOM SIGN KILLER, LATIN SMALL LETTER B
0061 1172B 05B0 094D 3099 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062; # (aโ—Œ๐‘œซโ—Œึฐโ—Œเฅโ—Œใ‚™b; aโ—Œใ‚™โ—Œ๐‘œซโ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘œซโ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘œซโ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘œซโ—Œเฅโ—Œึฐb; ) LATIN SMALL LETTER A, AHOM SIGN KILLER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
+0061 05B0 094D 3099 11839 0062;0061 3099 094D 11839 05B0 0062;0061 3099 094D 11839 05B0 0062;0061 3099 094D 11839 05B0 0062;0061 3099 094D 11839 05B0 0062; # (aโ—Œึฐโ—Œเฅโ—Œใ‚™โ—Œ๐‘ นb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ นโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ นโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ นโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ นโ—Œึฐb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DOGRA SIGN VIRAMA, LATIN SMALL LETTER B
+0061 11839 05B0 094D 3099 0062;0061 3099 11839 094D 05B0 0062;0061 3099 11839 094D 05B0 0062;0061 3099 11839 094D 05B0 0062;0061 3099 11839 094D 05B0 0062; # (aโ—Œ๐‘ นโ—Œึฐโ—Œเฅโ—Œใ‚™b; aโ—Œใ‚™โ—Œ๐‘ นโ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘ นโ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘ นโ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘ นโ—Œเฅโ—Œึฐb; ) LATIN SMALL LETTER A, DOGRA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
+0061 3099 093C 0334 1183A 0062;0061 0334 093C 1183A 3099 0062;0061 0334 093C 1183A 3099 0062;0061 0334 093C 1183A 3099 0062;0061 0334 093C 1183A 3099 0062; # (aโ—Œใ‚™โ—Œเคผโ—Œฬดโ—Œ๐‘ บb; aโ—Œฬดโ—Œเคผโ—Œ๐‘ บโ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œ๐‘ บโ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œ๐‘ บโ—Œใ‚™b; aโ—Œฬดโ—Œเคผโ—Œ๐‘ บโ—Œใ‚™b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, DOGRA SIGN NUKTA, LATIN SMALL LETTER B
+0061 1183A 3099 093C 0334 0062;0061 0334 1183A 093C 3099 0062;0061 0334 1183A 093C 3099 0062;0061 0334 1183A 093C 3099 0062;0061 0334 1183A 093C 3099 0062; # (aโ—Œ๐‘ บโ—Œใ‚™โ—Œเคผโ—Œฬดb; aโ—Œฬดโ—Œ๐‘ บโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘ บโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘ บโ—Œเคผโ—Œใ‚™b; aโ—Œฬดโ—Œ๐‘ บโ—Œเคผโ—Œใ‚™b; ) LATIN SMALL LETTER A, DOGRA SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 05B0 094D 3099 11A34 0062;0061 3099 094D 11A34 05B0 0062;0061 3099 094D 11A34 05B0 0062;0061 3099 094D 11A34 05B0 0062;0061 3099 094D 11A34 05B0 0062; # (aโ—Œึฐโ—Œเฅโ—Œใ‚™โ—Œ๐‘จดb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘จดโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘จดโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘จดโ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘จดโ—Œึฐb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, ZANABAZAR SQUARE SIGN VIRAMA, LATIN SMALL LETTER B
0061 11A34 05B0 094D 3099 0062;0061 3099 11A34 094D 05B0 0062;0061 3099 11A34 094D 05B0 0062;0061 3099 11A34 094D 05B0 0062;0061 3099 11A34 094D 05B0 0062; # (aโ—Œ๐‘จดโ—Œึฐโ—Œเฅโ—Œใ‚™b; aโ—Œใ‚™โ—Œ๐‘จดโ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘จดโ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘จดโ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘จดโ—Œเฅโ—Œึฐb; ) LATIN SMALL LETTER A, ZANABAZAR SQUARE SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 05B0 094D 3099 11A47 0062;0061 3099 094D 11A47 05B0 0062;0061 3099 094D 11A47 05B0 0062;0061 3099 094D 11A47 05B0 0062;0061 3099 094D 11A47 05B0 0062; # (aโ—Œึฐโ—Œเฅโ—Œใ‚™โ—Œ๐‘ฉ‡b; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ฉ‡โ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ฉ‡โ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ฉ‡โ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ฉ‡โ—Œึฐb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, ZANABAZAR SQUARE SUBJOINER, LATIN SMALL LETTER B
@@ -18423,6 +18467,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (๏ฟฎ; ๏ฟฎ; ๏ฟฎ; โ—‹; โ—‹; ) HALFWIDTH WHITE CIRCLE
0061 11D44 05B0 094D 3099 0062;0061 3099 11D44 094D 05B0 0062;0061 3099 11D44 094D 05B0 0062;0061 3099 11D44 094D 05B0 0062;0061 3099 11D44 094D 05B0 0062; # (aโ—Œ๐‘ต„โ—Œึฐโ—Œเฅโ—Œใ‚™b; aโ—Œใ‚™โ—Œ๐‘ต„โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘ต„โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘ต„โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘ต„โ—Œเฅโ—Œึฐb; ) LATIN SMALL LETTER A, MASARAM GONDI SIGN HALANTA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 05B0 094D 3099 11D45 0062;0061 3099 094D 11D45 05B0 0062;0061 3099 094D 11D45 05B0 0062;0061 3099 094D 11D45 05B0 0062;0061 3099 094D 11D45 05B0 0062; # (aโ—Œึฐโ—Œเฅโ—Œใ‚™โ—Œ๐‘ต…b; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ต…โ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ต…โ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ต…โ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ต…โ—Œึฐb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MASARAM GONDI VIRAMA, LATIN SMALL LETTER B
0061 11D45 05B0 094D 3099 0062;0061 3099 11D45 094D 05B0 0062;0061 3099 11D45 094D 05B0 0062;0061 3099 11D45 094D 05B0 0062;0061 3099 11D45 094D 05B0 0062; # (aโ—Œ๐‘ต…โ—Œึฐโ—Œเฅโ—Œใ‚™b; aโ—Œใ‚™โ—Œ๐‘ต…โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘ต…โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘ต…โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘ต…โ—Œเฅโ—Œึฐb; ) LATIN SMALL LETTER A, MASARAM GONDI VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
+0061 05B0 094D 3099 11D97 0062;0061 3099 094D 11D97 05B0 0062;0061 3099 094D 11D97 05B0 0062;0061 3099 094D 11D97 05B0 0062;0061 3099 094D 11D97 05B0 0062; # (aโ—Œึฐโ—Œเฅโ—Œใ‚™โ—Œ๐‘ถ—b; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ถ—โ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ถ—โ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ถ—โ—Œึฐb; aโ—Œใ‚™โ—Œเฅโ—Œ๐‘ถ—โ—Œึฐb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, GUNJALA GONDI VIRAMA, LATIN SMALL LETTER B
+0061 11D97 05B0 094D 3099 0062;0061 3099 11D97 094D 05B0 0062;0061 3099 11D97 094D 05B0 0062;0061 3099 11D97 094D 05B0 0062;0061 3099 11D97 094D 05B0 0062; # (aโ—Œ๐‘ถ—โ—Œึฐโ—Œเฅโ—Œใ‚™b; aโ—Œใ‚™โ—Œ๐‘ถ—โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘ถ—โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘ถ—โ—Œเฅโ—Œึฐb; aโ—Œใ‚™โ—Œ๐‘ถ—โ—Œเฅโ—Œึฐb; ) LATIN SMALL LETTER A, GUNJALA GONDI VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 093C 0334 16AF0 0062;0061 0334 16AF0 093C 0062;0061 0334 16AF0 093C 0062;0061 0334 16AF0 093C 0062;0061 0334 16AF0 093C 0062; # (aโ—Œเคผโ—Œฬดโ—Œ๐–ซฐb; aโ—Œฬดโ—Œ๐–ซฐโ—Œเคผb; aโ—Œฬดโ—Œ๐–ซฐโ—Œเคผb; aโ—Œฬดโ—Œ๐–ซฐโ—Œเคผb; aโ—Œฬดโ—Œ๐–ซฐโ—Œเคผb; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, BASSA VAH COMBINING HIGH TONE, LATIN SMALL LETTER B
0061 16AF0 093C 0334 0062;0061 16AF0 0334 093C 0062;0061 16AF0 0334 093C 0062;0061 16AF0 0334 093C 0062;0061 16AF0 0334 093C 0062; # (aโ—Œ๐–ซฐโ—Œเคผโ—Œฬดb; aโ—Œ๐–ซฐโ—Œฬดโ—Œเคผb; aโ—Œ๐–ซฐโ—Œฬดโ—Œเคผb; aโ—Œ๐–ซฐโ—Œฬดโ—Œเคผb; aโ—Œ๐–ซฐโ—Œฬดโ—Œเคผb; ) LATIN SMALL LETTER A, BASSA VAH COMBINING HIGH TONE, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 093C 0334 16AF1 0062;0061 0334 16AF1 093C 0062;0061 0334 16AF1 093C 0062;0061 0334 16AF1 093C 0062;0061 0334 16AF1 093C 0062; # (aโ—Œเคผโ—Œฬดโ—Œ๐–ซฑb; aโ—Œฬดโ—Œ๐–ซฑโ—Œเคผb; aโ—Œฬดโ—Œ๐–ซฑโ—Œเคผb; aโ—Œฬดโ—Œ๐–ซฑโ—Œเคผb; aโ—Œฬดโ—Œ๐–ซฑโ—Œเคผb; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, BASSA VAH COMBINING LOW TONE, LATIN SMALL LETTER B
diff --git a/lib/stdlib/uc_spec/CaseFolding.txt b/lib/stdlib/uc_spec/CaseFolding.txt
index efdf18e441..cce350f49c 100644
--- a/lib/stdlib/uc_spec/CaseFolding.txt
+++ b/lib/stdlib/uc_spec/CaseFolding.txt
@@ -1,6 +1,6 @@
-# CaseFolding-10.0.0.txt
-# Date: 2017-04-14, 05:40:18 GMT
-# ยฉ 2017 Unicodeยฎ, Inc.
+# CaseFolding-11.0.0.txt
+# Date: 2018-01-31, 08:20:09 GMT
+# ยฉ 2018 Unicodeยฎ, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -603,6 +603,52 @@
1C86; C; 044A; # CYRILLIC SMALL LETTER TALL HARD SIGN
1C87; C; 0463; # CYRILLIC SMALL LETTER TALL YAT
1C88; C; A64B; # CYRILLIC SMALL LETTER UNBLENDED UK
+1C90; C; 10D0; # GEORGIAN MTAVRULI CAPITAL LETTER AN
+1C91; C; 10D1; # GEORGIAN MTAVRULI CAPITAL LETTER BAN
+1C92; C; 10D2; # GEORGIAN MTAVRULI CAPITAL LETTER GAN
+1C93; C; 10D3; # GEORGIAN MTAVRULI CAPITAL LETTER DON
+1C94; C; 10D4; # GEORGIAN MTAVRULI CAPITAL LETTER EN
+1C95; C; 10D5; # GEORGIAN MTAVRULI CAPITAL LETTER VIN
+1C96; C; 10D6; # GEORGIAN MTAVRULI CAPITAL LETTER ZEN
+1C97; C; 10D7; # GEORGIAN MTAVRULI CAPITAL LETTER TAN
+1C98; C; 10D8; # GEORGIAN MTAVRULI CAPITAL LETTER IN
+1C99; C; 10D9; # GEORGIAN MTAVRULI CAPITAL LETTER KAN
+1C9A; C; 10DA; # GEORGIAN MTAVRULI CAPITAL LETTER LAS
+1C9B; C; 10DB; # GEORGIAN MTAVRULI CAPITAL LETTER MAN
+1C9C; C; 10DC; # GEORGIAN MTAVRULI CAPITAL LETTER NAR
+1C9D; C; 10DD; # GEORGIAN MTAVRULI CAPITAL LETTER ON
+1C9E; C; 10DE; # GEORGIAN MTAVRULI CAPITAL LETTER PAR
+1C9F; C; 10DF; # GEORGIAN MTAVRULI CAPITAL LETTER ZHAR
+1CA0; C; 10E0; # GEORGIAN MTAVRULI CAPITAL LETTER RAE
+1CA1; C; 10E1; # GEORGIAN MTAVRULI CAPITAL LETTER SAN
+1CA2; C; 10E2; # GEORGIAN MTAVRULI CAPITAL LETTER TAR
+1CA3; C; 10E3; # GEORGIAN MTAVRULI CAPITAL LETTER UN
+1CA4; C; 10E4; # GEORGIAN MTAVRULI CAPITAL LETTER PHAR
+1CA5; C; 10E5; # GEORGIAN MTAVRULI CAPITAL LETTER KHAR
+1CA6; C; 10E6; # GEORGIAN MTAVRULI CAPITAL LETTER GHAN
+1CA7; C; 10E7; # GEORGIAN MTAVRULI CAPITAL LETTER QAR
+1CA8; C; 10E8; # GEORGIAN MTAVRULI CAPITAL LETTER SHIN
+1CA9; C; 10E9; # GEORGIAN MTAVRULI CAPITAL LETTER CHIN
+1CAA; C; 10EA; # GEORGIAN MTAVRULI CAPITAL LETTER CAN
+1CAB; C; 10EB; # GEORGIAN MTAVRULI CAPITAL LETTER JIL
+1CAC; C; 10EC; # GEORGIAN MTAVRULI CAPITAL LETTER CIL
+1CAD; C; 10ED; # GEORGIAN MTAVRULI CAPITAL LETTER CHAR
+1CAE; C; 10EE; # GEORGIAN MTAVRULI CAPITAL LETTER XAN
+1CAF; C; 10EF; # GEORGIAN MTAVRULI CAPITAL LETTER JHAN
+1CB0; C; 10F0; # GEORGIAN MTAVRULI CAPITAL LETTER HAE
+1CB1; C; 10F1; # GEORGIAN MTAVRULI CAPITAL LETTER HE
+1CB2; C; 10F2; # GEORGIAN MTAVRULI CAPITAL LETTER HIE
+1CB3; C; 10F3; # GEORGIAN MTAVRULI CAPITAL LETTER WE
+1CB4; C; 10F4; # GEORGIAN MTAVRULI CAPITAL LETTER HAR
+1CB5; C; 10F5; # GEORGIAN MTAVRULI CAPITAL LETTER HOE
+1CB6; C; 10F6; # GEORGIAN MTAVRULI CAPITAL LETTER FI
+1CB7; C; 10F7; # GEORGIAN MTAVRULI CAPITAL LETTER YN
+1CB8; C; 10F8; # GEORGIAN MTAVRULI CAPITAL LETTER ELIFI
+1CB9; C; 10F9; # GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN
+1CBA; C; 10FA; # GEORGIAN MTAVRULI CAPITAL LETTER AIN
+1CBD; C; 10FD; # GEORGIAN MTAVRULI CAPITAL LETTER AEN
+1CBE; C; 10FE; # GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN
+1CBF; C; 10FF; # GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN
1E00; C; 1E01; # LATIN CAPITAL LETTER A WITH RING BELOW
1E02; C; 1E03; # LATIN CAPITAL LETTER B WITH DOT ABOVE
1E04; C; 1E05; # LATIN CAPITAL LETTER B WITH DOT BELOW
@@ -1180,6 +1226,7 @@ A7B2; C; 029D; # LATIN CAPITAL LETTER J WITH CROSSED-TAIL
A7B3; C; AB53; # LATIN CAPITAL LETTER CHI
A7B4; C; A7B5; # LATIN CAPITAL LETTER BETA
A7B6; C; A7B7; # LATIN CAPITAL LETTER OMEGA
+A7B8; C; A7B9; # LATIN CAPITAL LETTER U WITH STROKE
AB70; C; 13A0; # CHEROKEE SMALL LETTER A
AB71; C; 13A1; # CHEROKEE SMALL LETTER E
AB72; C; 13A2; # CHEROKEE SMALL LETTER I
@@ -1457,6 +1504,38 @@ FF3A; C; FF5A; # FULLWIDTH LATIN CAPITAL LETTER Z
118BD; C; 118DD; # WARANG CITI CAPITAL LETTER SSUU
118BE; C; 118DE; # WARANG CITI CAPITAL LETTER SII
118BF; C; 118DF; # WARANG CITI CAPITAL LETTER VIYO
+16E40; C; 16E60; # MEDEFAIDRIN CAPITAL LETTER M
+16E41; C; 16E61; # MEDEFAIDRIN CAPITAL LETTER S
+16E42; C; 16E62; # MEDEFAIDRIN CAPITAL LETTER V
+16E43; C; 16E63; # MEDEFAIDRIN CAPITAL LETTER W
+16E44; C; 16E64; # MEDEFAIDRIN CAPITAL LETTER ATIU
+16E45; C; 16E65; # MEDEFAIDRIN CAPITAL LETTER Z
+16E46; C; 16E66; # MEDEFAIDRIN CAPITAL LETTER KP
+16E47; C; 16E67; # MEDEFAIDRIN CAPITAL LETTER P
+16E48; C; 16E68; # MEDEFAIDRIN CAPITAL LETTER T
+16E49; C; 16E69; # MEDEFAIDRIN CAPITAL LETTER G
+16E4A; C; 16E6A; # MEDEFAIDRIN CAPITAL LETTER F
+16E4B; C; 16E6B; # MEDEFAIDRIN CAPITAL LETTER I
+16E4C; C; 16E6C; # MEDEFAIDRIN CAPITAL LETTER K
+16E4D; C; 16E6D; # MEDEFAIDRIN CAPITAL LETTER A
+16E4E; C; 16E6E; # MEDEFAIDRIN CAPITAL LETTER J
+16E4F; C; 16E6F; # MEDEFAIDRIN CAPITAL LETTER E
+16E50; C; 16E70; # MEDEFAIDRIN CAPITAL LETTER B
+16E51; C; 16E71; # MEDEFAIDRIN CAPITAL LETTER C
+16E52; C; 16E72; # MEDEFAIDRIN CAPITAL LETTER U
+16E53; C; 16E73; # MEDEFAIDRIN CAPITAL LETTER YU
+16E54; C; 16E74; # MEDEFAIDRIN CAPITAL LETTER L
+16E55; C; 16E75; # MEDEFAIDRIN CAPITAL LETTER Q
+16E56; C; 16E76; # MEDEFAIDRIN CAPITAL LETTER HP
+16E57; C; 16E77; # MEDEFAIDRIN CAPITAL LETTER NY
+16E58; C; 16E78; # MEDEFAIDRIN CAPITAL LETTER X
+16E59; C; 16E79; # MEDEFAIDRIN CAPITAL LETTER D
+16E5A; C; 16E7A; # MEDEFAIDRIN CAPITAL LETTER OE
+16E5B; C; 16E7B; # MEDEFAIDRIN CAPITAL LETTER N
+16E5C; C; 16E7C; # MEDEFAIDRIN CAPITAL LETTER R
+16E5D; C; 16E7D; # MEDEFAIDRIN CAPITAL LETTER O
+16E5E; C; 16E7E; # MEDEFAIDRIN CAPITAL LETTER AI
+16E5F; C; 16E7F; # MEDEFAIDRIN CAPITAL LETTER Y
1E900; C; 1E922; # ADLAM CAPITAL LETTER ALIF
1E901; C; 1E923; # ADLAM CAPITAL LETTER DAALI
1E902; C; 1E924; # ADLAM CAPITAL LETTER LAAM
diff --git a/lib/stdlib/uc_spec/CompositionExclusions.txt b/lib/stdlib/uc_spec/CompositionExclusions.txt
index ff42508686..ea63595bd3 100644
--- a/lib/stdlib/uc_spec/CompositionExclusions.txt
+++ b/lib/stdlib/uc_spec/CompositionExclusions.txt
@@ -1,5 +1,5 @@
-# CompositionExclusions-10.0.0.txt
-# Date: 2017-02-15, 00:00:00 GMT [KW, LI]
+# CompositionExclusions-11.0.0.txt
+# Date: 2017-12-06, 00:00:00 GMT [KW, LI]
# ยฉ 2017 Unicodeยฎ, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
diff --git a/lib/stdlib/uc_spec/GraphemeBreakProperty.txt b/lib/stdlib/uc_spec/GraphemeBreakProperty.txt
index 32bb12e47e..52052e6e33 100644
--- a/lib/stdlib/uc_spec/GraphemeBreakProperty.txt
+++ b/lib/stdlib/uc_spec/GraphemeBreakProperty.txt
@@ -1,6 +1,6 @@
-# GraphemeBreakProperty-10.0.0.txt
-# Date: 2017-03-12, 07:03:41 GMT
-# ยฉ 2017 Unicodeยฎ, Inc.
+# GraphemeBreakProperty-11.0.0.txt
+# Date: 2018-03-16, 20:34:02 GMT
+# ยฉ 2018 Unicodeยฎ, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -24,12 +24,13 @@
08E2 ; Prepend # Cf ARABIC DISPUTED END OF AYAH
0D4E ; Prepend # Lo MALAYALAM LETTER DOT REPH
110BD ; Prepend # Cf KAITHI NUMBER SIGN
+110CD ; Prepend # Cf KAITHI NUMBER SIGN ABOVE
111C2..111C3 ; Prepend # Lo [2] SHARADA SIGN JIHVAMULIYA..SHARADA SIGN UPADHMANIYA
11A3A ; Prepend # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA
11A86..11A89 ; Prepend # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA
11D46 ; Prepend # Lo MASARAM GONDI REPHA
-# Total code points: 19
+# Total code points: 20
# ================================================
@@ -95,12 +96,13 @@ E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
0730..074A ; Extend # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
07A6..07B0 ; Extend # Mn [11] THAANA ABAFILI..THAANA SUKUN
07EB..07F3 ; Extend # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
+07FD ; Extend # Mn NKO DANTAYALAN
0816..0819 ; Extend # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH
081B..0823 ; Extend # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A
0825..0827 ; Extend # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U
0829..082D ; Extend # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA
0859..085B ; Extend # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK
-08D4..08E1 ; Extend # Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA
+08D3..08E1 ; Extend # Mn [15] ARABIC SMALL LOW WAW..ARABIC SMALL HIGH SIGN SAFHA
08E3..0902 ; Extend # Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA
093A ; Extend # Mn DEVANAGARI VOWEL SIGN OE
093C ; Extend # Mn DEVANAGARI SIGN NUKTA
@@ -115,6 +117,7 @@ E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
09CD ; Extend # Mn BENGALI SIGN VIRAMA
09D7 ; Extend # Mc BENGALI AU LENGTH MARK
09E2..09E3 ; Extend # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+09FE ; Extend # Mn BENGALI SANDHI MARK
0A01..0A02 ; Extend # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
0A3C ; Extend # Mn GURMUKHI SIGN NUKTA
0A41..0A42 ; Extend # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
@@ -145,6 +148,7 @@ E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
0BCD ; Extend # Mn TAMIL SIGN VIRAMA
0BD7 ; Extend # Mc TAMIL AU LENGTH MARK
0C00 ; Extend # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE
+0C04 ; Extend # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE
0C3E..0C40 ; Extend # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
0C46..0C48 ; Extend # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
0C4A..0C4D ; Extend # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
@@ -273,6 +277,7 @@ A80B ; Extend # Mn SYLOTI NAGRI SIGN ANUSVARA
A825..A826 ; Extend # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
A8C4..A8C5 ; Extend # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU
A8E0..A8F1 ; Extend # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA
+A8FF ; Extend # Mn DEVANAGARI VOWEL SIGN AY
A926..A92D ; Extend # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU
A947..A951 ; Extend # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
A980..A982 ; Extend # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR
@@ -309,6 +314,8 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
10A38..10A3A ; Extend # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
10A3F ; Extend # Mn KHAROSHTHI VIRAMA
10AE5..10AE6 ; Extend # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
+10D24..10D27 ; Extend # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
+10F46..10F50 ; Extend # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
11001 ; Extend # Mn BRAHMI SIGN ANUSVARA
11038..11046 ; Extend # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA
1107F..11081 ; Extend # Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA
@@ -320,7 +327,7 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
11173 ; Extend # Mn MAHAJANI SIGN NUKTA
11180..11181 ; Extend # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA
111B6..111BE ; Extend # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O
-111CA..111CC ; Extend # Mn [3] SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK
+111C9..111CC ; Extend # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK
1122F..11231 ; Extend # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI
11234 ; Extend # Mn KHOJKI SIGN ANUSVARA
11236..11237 ; Extend # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
@@ -328,7 +335,7 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
112DF ; Extend # Mn KHUDAWADI SIGN ANUSVARA
112E3..112EA ; Extend # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA
11300..11301 ; Extend # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU
-1133C ; Extend # Mn GRANTHA SIGN NUKTA
+1133B..1133C ; Extend # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA
1133E ; Extend # Mc GRANTHA VOWEL SIGN AA
11340 ; Extend # Mn GRANTHA VOWEL SIGN II
11357 ; Extend # Mc GRANTHA AU LENGTH MARK
@@ -337,6 +344,7 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
11438..1143F ; Extend # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI
11442..11444 ; Extend # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA
11446 ; Extend # Mn NEWA SIGN NUKTA
+1145E ; Extend # Mn NEWA SANDHI MARK
114B0 ; Extend # Mc TIRHUTA VOWEL SIGN AA
114B3..114B8 ; Extend # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL
114BA ; Extend # Mn TIRHUTA VOWEL SIGN SHORT E
@@ -358,8 +366,9 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
1171D..1171F ; Extend # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA
11722..11725 ; Extend # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU
11727..1172B ; Extend # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER
-11A01..11A06 ; Extend # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O
-11A09..11A0A ; Extend # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK
+1182F..11837 ; Extend # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA
+11839..1183A ; Extend # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA
+11A01..11A0A ; Extend # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK
11A33..11A38 ; Extend # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA
11A3B..11A3E ; Extend # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA
11A47 ; Extend # Mn ZANABAZAR SQUARE SUBJOINER
@@ -379,6 +388,10 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
11D3C..11D3D ; Extend # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O
11D3F..11D45 ; Extend # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA
11D47 ; Extend # Mn MASARAM GONDI RA-KARA
+11D90..11D91 ; Extend # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI
+11D95 ; Extend # Mn GUNJALA GONDI SIGN ANUSVARA
+11D97 ; Extend # Mn GUNJALA GONDI VIRAMA
+11EF3..11EF4 ; Extend # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
16AF0..16AF4 ; Extend # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
16B30..16B36 ; Extend # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
16F8F..16F92 ; Extend # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW
@@ -403,10 +416,11 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
1E026..1E02A ; Extend # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
1E8D0..1E8D6 ; Extend # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
1E944..1E94A ; Extend # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
+1F3FB..1F3FF ; Extend # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6
E0020..E007F ; Extend # Cf [96] TAG SPACE..CANCEL TAG
E0100..E01EF ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
-# Total code points: 1901
+# Total code points: 1948
# ================================================
@@ -517,6 +531,7 @@ ABEC ; SpacingMark # Mc MEETEI MAYEK LUM IYEK
110B0..110B2 ; SpacingMark # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II
110B7..110B8 ; SpacingMark # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU
1112C ; SpacingMark # Mc CHAKMA VOWEL SIGN E
+11145..11146 ; SpacingMark # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI
11182 ; SpacingMark # Mc SHARADA SIGN VISARGA
111B3..111B5 ; SpacingMark # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II
111BF..111C0 ; SpacingMark # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA
@@ -549,7 +564,8 @@ ABEC ; SpacingMark # Mc MEETEI MAYEK LUM IYEK
116B6 ; SpacingMark # Mc TAKRI SIGN VIRAMA
11720..11721 ; SpacingMark # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA
11726 ; SpacingMark # Mc AHOM VOWEL SIGN E
-11A07..11A08 ; SpacingMark # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU
+1182C..1182E ; SpacingMark # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II
+11838 ; SpacingMark # Mc DOGRA SIGN VISARGA
11A39 ; SpacingMark # Mc ZANABAZAR SQUARE SIGN VISARGA
11A57..11A58 ; SpacingMark # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU
11A97 ; SpacingMark # Mc SOYOMBO SIGN VISARGA
@@ -558,11 +574,15 @@ ABEC ; SpacingMark # Mc MEETEI MAYEK LUM IYEK
11CA9 ; SpacingMark # Mc MARCHEN SUBJOINED LETTER YA
11CB1 ; SpacingMark # Mc MARCHEN VOWEL SIGN I
11CB4 ; SpacingMark # Mc MARCHEN VOWEL SIGN O
+11D8A..11D8E ; SpacingMark # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU
+11D93..11D94 ; SpacingMark # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU
+11D96 ; SpacingMark # Mc GUNJALA GONDI SIGN VISARGA
+11EF5..11EF6 ; SpacingMark # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
16F51..16F7E ; SpacingMark # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG
1D166 ; SpacingMark # Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
1D16D ; SpacingMark # Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT
-# Total code points: 348
+# Total code points: 362
# ================================================
@@ -1395,81 +1415,8 @@ D789..D7A3 ; LVT # Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH
# ================================================
-261D ; E_Base # So WHITE UP POINTING INDEX
-26F9 ; E_Base # So PERSON WITH BALL
-270A..270D ; E_Base # So [4] RAISED FIST..WRITING HAND
-1F385 ; E_Base # So FATHER CHRISTMAS
-1F3C2..1F3C4 ; E_Base # So [3] SNOWBOARDER..SURFER
-1F3C7 ; E_Base # So HORSE RACING
-1F3CA..1F3CC ; E_Base # So [3] SWIMMER..GOLFER
-1F442..1F443 ; E_Base # So [2] EAR..NOSE
-1F446..1F450 ; E_Base # So [11] WHITE UP POINTING BACKHAND INDEX..OPEN HANDS SIGN
-1F46E ; E_Base # So POLICE OFFICER
-1F470..1F478 ; E_Base # So [9] BRIDE WITH VEIL..PRINCESS
-1F47C ; E_Base # So BABY ANGEL
-1F481..1F483 ; E_Base # So [3] INFORMATION DESK PERSON..DANCER
-1F485..1F487 ; E_Base # So [3] NAIL POLISH..HAIRCUT
-1F4AA ; E_Base # So FLEXED BICEPS
-1F574..1F575 ; E_Base # So [2] MAN IN BUSINESS SUIT LEVITATING..SLEUTH OR SPY
-1F57A ; E_Base # So MAN DANCING
-1F590 ; E_Base # So RAISED HAND WITH FINGERS SPLAYED
-1F595..1F596 ; E_Base # So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS
-1F645..1F647 ; E_Base # So [3] FACE WITH NO GOOD GESTURE..PERSON BOWING DEEPLY
-1F64B..1F64F ; E_Base # So [5] HAPPY PERSON RAISING ONE HAND..PERSON WITH FOLDED HANDS
-1F6A3 ; E_Base # So ROWBOAT
-1F6B4..1F6B6 ; E_Base # So [3] BICYCLIST..PEDESTRIAN
-1F6C0 ; E_Base # So BATH
-1F6CC ; E_Base # So SLEEPING ACCOMMODATION
-1F918..1F91C ; E_Base # So [5] SIGN OF THE HORNS..RIGHT-FACING FIST
-1F91E..1F91F ; E_Base # So [2] HAND WITH INDEX AND MIDDLE FINGERS CROSSED..I LOVE YOU HAND SIGN
-1F926 ; E_Base # So FACE PALM
-1F930..1F939 ; E_Base # So [10] PREGNANT WOMAN..JUGGLING
-1F93D..1F93E ; E_Base # So [2] WATER POLO..HANDBALL
-1F9D1..1F9DD ; E_Base # So [13] ADULT..ELF
-
-# Total code points: 98
-
-# ================================================
-
-1F3FB..1F3FF ; E_Modifier # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6
-
-# Total code points: 5
-
-# ================================================
-
200D ; ZWJ # Cf ZERO WIDTH JOINER
# Total code points: 1
-# ================================================
-
-2640 ; Glue_After_Zwj # So FEMALE SIGN
-2642 ; Glue_After_Zwj # So MALE SIGN
-2695..2696 ; Glue_After_Zwj # So [2] STAFF OF AESCULAPIUS..SCALES
-2708 ; Glue_After_Zwj # So AIRPLANE
-2764 ; Glue_After_Zwj # So HEAVY BLACK HEART
-1F308 ; Glue_After_Zwj # So RAINBOW
-1F33E ; Glue_After_Zwj # So EAR OF RICE
-1F373 ; Glue_After_Zwj # So COOKING
-1F393 ; Glue_After_Zwj # So GRADUATION CAP
-1F3A4 ; Glue_After_Zwj # So MICROPHONE
-1F3A8 ; Glue_After_Zwj # So ARTIST PALETTE
-1F3EB ; Glue_After_Zwj # So SCHOOL
-1F3ED ; Glue_After_Zwj # So FACTORY
-1F48B ; Glue_After_Zwj # So KISS MARK
-1F4BB..1F4BC ; Glue_After_Zwj # So [2] PERSONAL COMPUTER..BRIEFCASE
-1F527 ; Glue_After_Zwj # So WRENCH
-1F52C ; Glue_After_Zwj # So MICROSCOPE
-1F5E8 ; Glue_After_Zwj # So LEFT SPEECH BUBBLE
-1F680 ; Glue_After_Zwj # So ROCKET
-1F692 ; Glue_After_Zwj # So FIRE ENGINE
-
-# Total code points: 22
-
-# ================================================
-
-1F466..1F469 ; E_Base_GAZ # So [4] BOY..WOMAN
-
-# Total code points: 4
-
# EOF
diff --git a/lib/stdlib/uc_spec/PropList.txt b/lib/stdlib/uc_spec/PropList.txt
index 9a2d0e4b1c..ef86795abe 100644
--- a/lib/stdlib/uc_spec/PropList.txt
+++ b/lib/stdlib/uc_spec/PropList.txt
@@ -1,6 +1,6 @@
-# PropList-10.0.0.txt
-# Date: 2017-03-10, 08:25:30 GMT
-# ยฉ 2017 Unicodeยฎ, Inc.
+# PropList-11.0.0.txt
+# Date: 2018-03-15, 04:28:35 GMT
+# ยฉ 2018 Unicodeยฎ, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -125,7 +125,7 @@ FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET
05C3 ; Terminal_Punctuation # Po HEBREW PUNCTUATION SOF PASUQ
060C ; Terminal_Punctuation # Po ARABIC COMMA
061B ; Terminal_Punctuation # Po ARABIC SEMICOLON
-061F ; Terminal_Punctuation # Po ARABIC QUESTION MARK
+061E..061F ; Terminal_Punctuation # Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK
06D4 ; Terminal_Punctuation # Po ARABIC FULL STOP
0700..070A ; Terminal_Punctuation # Po [11] SYRIAC END OF PARAGRAPH..SYRIAC CONTRACTION
070C ; Terminal_Punctuation # Po SYRIAC HARKLEAN METOBELUS
@@ -156,6 +156,8 @@ FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET
2E2E ; Terminal_Punctuation # Po REVERSED QUESTION MARK
2E3C ; Terminal_Punctuation # Po STENOGRAPHIC FULL STOP
2E41 ; Terminal_Punctuation # Po REVERSED COMMA
+2E4C ; Terminal_Punctuation # Po MEDIEVAL COMMA
+2E4E ; Terminal_Punctuation # Po PUNCTUS ELEVATUS MARK
3001..3002 ; Terminal_Punctuation # Po [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP
A4FE..A4FF ; Terminal_Punctuation # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP
A60D..A60F ; Terminal_Punctuation # Po [3] VAI COMMA..VAI QUESTION MARK
@@ -185,6 +187,7 @@ FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA
10AF0..10AF5 ; Terminal_Punctuation # Po [6] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION TWO DOTS
10B3A..10B3F ; Terminal_Punctuation # Po [6] TINY TWO DOTS OVER ONE DOT PUNCTUATION..LARGE ONE RING OVER TWO RINGS PUNCTUATION
10B99..10B9C ; Terminal_Punctuation # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT
+10F55..10F59 ; Terminal_Punctuation # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
11047..1104D ; Terminal_Punctuation # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS
110BE..110C1 ; Terminal_Punctuation # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
11141..11143 ; Terminal_Punctuation # Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK
@@ -204,15 +207,17 @@ FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA
11AA1..11AA2 ; Terminal_Punctuation # Po [2] SOYOMBO TERMINAL MARK-1..SOYOMBO TERMINAL MARK-2
11C41..11C43 ; Terminal_Punctuation # Po [3] BHAIKSUKI DANDA..BHAIKSUKI WORD SEPARATOR
11C71 ; Terminal_Punctuation # Po MARCHEN MARK SHAD
+11EF7..11EF8 ; Terminal_Punctuation # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
12470..12474 ; Terminal_Punctuation # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON
16A6E..16A6F ; Terminal_Punctuation # Po [2] MRO DANDA..MRO DOUBLE DANDA
16AF5 ; Terminal_Punctuation # Po BASSA VAH FULL STOP
16B37..16B39 ; Terminal_Punctuation # Po [3] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN CIM CHEEM
16B44 ; Terminal_Punctuation # Po PAHAWH HMONG SIGN XAUS
+16E97..16E98 ; Terminal_Punctuation # Po [2] MEDEFAIDRIN COMMA..MEDEFAIDRIN FULL STOP
1BC9F ; Terminal_Punctuation # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP
1DA87..1DA8A ; Terminal_Punctuation # Po [4] SIGNWRITING COMMA..SIGNWRITING COLON
-# Total code points: 252
+# Total code points: 264
# ================================================
@@ -661,6 +666,7 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
10A01..10A03 ; Other_Alphabetic # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
10A05..10A06 ; Other_Alphabetic # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
10A0C..10A0F ; Other_Alphabetic # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+10D24..10D27 ; Other_Alphabetic # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
11000 ; Other_Alphabetic # Mc BRAHMI SIGN CANDRABINDU
11001 ; Other_Alphabetic # Mn BRAHMI SIGN ANUSVARA
11002 ; Other_Alphabetic # Mc BRAHMI SIGN VISARGA
@@ -673,6 +679,7 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
11127..1112B ; Other_Alphabetic # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU
1112C ; Other_Alphabetic # Mc CHAKMA VOWEL SIGN E
1112D..11132 ; Other_Alphabetic # Mn [6] CHAKMA VOWEL SIGN AI..CHAKMA AU MARK
+11145..11146 ; Other_Alphabetic # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI
11180..11181 ; Other_Alphabetic # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA
11182 ; Other_Alphabetic # Mc SHARADA SIGN VISARGA
111B3..111B5 ; Other_Alphabetic # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II
@@ -730,9 +737,10 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
11722..11725 ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU
11726 ; Other_Alphabetic # Mc AHOM VOWEL SIGN E
11727..1172A ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN AW..AHOM VOWEL SIGN AM
-11A01..11A06 ; Other_Alphabetic # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O
-11A07..11A08 ; Other_Alphabetic # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU
-11A09..11A0A ; Other_Alphabetic # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK
+1182C..1182E ; Other_Alphabetic # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II
+1182F..11837 ; Other_Alphabetic # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA
+11838 ; Other_Alphabetic # Mc DOGRA SIGN VISARGA
+11A01..11A0A ; Other_Alphabetic # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK
11A35..11A38 ; Other_Alphabetic # Mn [4] ZANABAZAR SQUARE SIGN CANDRABINDU..ZANABAZAR SQUARE SIGN ANUSVARA
11A39 ; Other_Alphabetic # Mc ZANABAZAR SQUARE SIGN VISARGA
11A3B..11A3E ; Other_Alphabetic # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA
@@ -758,6 +766,13 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
11D3F..11D41 ; Other_Alphabetic # Mn [3] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI SIGN VISARGA
11D43 ; Other_Alphabetic # Mn MASARAM GONDI SIGN CANDRA
11D47 ; Other_Alphabetic # Mn MASARAM GONDI RA-KARA
+11D8A..11D8E ; Other_Alphabetic # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU
+11D90..11D91 ; Other_Alphabetic # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI
+11D93..11D94 ; Other_Alphabetic # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU
+11D95 ; Other_Alphabetic # Mn GUNJALA GONDI SIGN ANUSVARA
+11D96 ; Other_Alphabetic # Mc GUNJALA GONDI SIGN VISARGA
+11EF3..11EF4 ; Other_Alphabetic # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
+11EF5..11EF6 ; Other_Alphabetic # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
16B30..16B36 ; Other_Alphabetic # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
16F51..16F7E ; Other_Alphabetic # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG
1BC9E ; Other_Alphabetic # Mn DUPLOYAN DOUBLE MARK
@@ -771,7 +786,7 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
1F150..1F169 ; Other_Alphabetic # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z
1F170..1F189 ; Other_Alphabetic # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z
-# Total code points: 1300
+# Total code points: 1334
# ================================================
@@ -780,10 +795,10 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
3021..3029 ; Ideographic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
3038..303A ; Ideographic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
3400..4DB5 ; Ideographic # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
-4E00..9FEA ; Ideographic # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA
+4E00..9FEF ; Ideographic # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF
F900..FA6D ; Ideographic # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D
FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
-17000..187EC ; Ideographic # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC
+17000..187F1 ; Ideographic # Lo [6130] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F1
18800..18AF2 ; Ideographic # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755
1B170..1B2FB ; Ideographic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
20000..2A6D6 ; Ideographic # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
@@ -793,7 +808,7 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM
2CEB0..2EBE0 ; Ideographic # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
2F800..2FA1D ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
-# Total code points: 96174
+# Total code points: 96184
# ================================================
@@ -953,6 +968,9 @@ FF9E..FF9F ; Diacritic # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFW
FFE3 ; Diacritic # Sk FULLWIDTH MACRON
102E0 ; Diacritic # Mn COPTIC EPACT THOUSANDS MARK
10AE5..10AE6 ; Diacritic # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
+10D22..10D23 ; Diacritic # Lo [2] HANIFI ROHINGYA MARK SAKIN..HANIFI ROHINGYA MARK NA KHONNA
+10D24..10D27 ; Diacritic # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
+10F46..10F50 ; Diacritic # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
110B9..110BA ; Diacritic # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
11133..11134 ; Diacritic # Mn [2] CHAKMA VIRAMA..CHAKMA MAAYYAA
11173 ; Diacritic # Mn MAHAJANI SIGN NUKTA
@@ -973,12 +991,14 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON
116B6 ; Diacritic # Mc TAKRI SIGN VIRAMA
116B7 ; Diacritic # Mn TAKRI SIGN NUKTA
1172B ; Diacritic # Mn AHOM SIGN KILLER
+11839..1183A ; Diacritic # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA
11A34 ; Diacritic # Mn ZANABAZAR SQUARE SIGN VIRAMA
11A47 ; Diacritic # Mn ZANABAZAR SQUARE SUBJOINER
11A99 ; Diacritic # Mn SOYOMBO SUBJOINER
11C3F ; Diacritic # Mn BHAIKSUKI SIGN VIRAMA
11D42 ; Diacritic # Mn MASARAM GONDI SIGN NUKTA
11D44..11D45 ; Diacritic # Mn [2] MASARAM GONDI SIGN HALANTA..MASARAM GONDI VIRAMA
+11D97 ; Diacritic # Mn GUNJALA GONDI VIRAMA
16AF0..16AF4 ; Diacritic # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
16F8F..16F92 ; Diacritic # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW
16F93..16F9F ; Diacritic # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8
@@ -991,7 +1011,7 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON
1E944..1E946 ; Diacritic # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK
1E948..1E94A ; Diacritic # Mn [3] ADLAM CONSONANT MODIFIER..ADLAM NUKTA
-# Total code points: 798
+# Total code points: 818
# ================================================
@@ -1137,7 +1157,7 @@ E0020..E007F ; Other_Grapheme_Extend # Cf [96] TAG SPACE..CANCEL TAG
# ================================================
3400..4DB5 ; Unified_Ideograph # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
-4E00..9FEA ; Unified_Ideograph # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA
+4E00..9FEF ; Unified_Ideograph # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF
FA0E..FA0F ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F
FA11 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA11
FA13..FA14 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14
@@ -1151,7 +1171,7 @@ FA27..FA29 ; Unified_Ideograph # Lo [3] CJK COMPATIBILITY IDEOGRAPH-FA27..C
2B820..2CEA1 ; Unified_Ideograph # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
2CEB0..2EBE0 ; Unified_Ideograph # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
-# Total code points: 87882
+# Total code points: 87887
# ================================================
@@ -1255,10 +1275,13 @@ AABB..AABC ; Logical_Order_Exception # Lo [2] TAI VIET VOWEL AUE..TAI VIET
002E ; Sentence_Terminal # Po FULL STOP
003F ; Sentence_Terminal # Po QUESTION MARK
0589 ; Sentence_Terminal # Po ARMENIAN FULL STOP
-061F ; Sentence_Terminal # Po ARABIC QUESTION MARK
+061E..061F ; Sentence_Terminal # Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK
06D4 ; Sentence_Terminal # Po ARABIC FULL STOP
0700..0702 ; Sentence_Terminal # Po [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP
07F9 ; Sentence_Terminal # Po NKO EXCLAMATION MARK
+0837 ; Sentence_Terminal # Po SAMARITAN PUNCTUATION MELODIC QITSA
+0839 ; Sentence_Terminal # Po SAMARITAN PUNCTUATION QITSA
+083D..083E ; Sentence_Terminal # Po [2] SAMARITAN PUNCTUATION SOF MASHFAAT..SAMARITAN PUNCTUATION ANNAAU
0964..0965 ; Sentence_Terminal # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
104A..104B ; Sentence_Terminal # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION
1362 ; Sentence_Terminal # Po ETHIOPIC FULL STOP
@@ -1296,6 +1319,7 @@ FF0E ; Sentence_Terminal # Po FULLWIDTH FULL STOP
FF1F ; Sentence_Terminal # Po FULLWIDTH QUESTION MARK
FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP
10A56..10A57 ; Sentence_Terminal # Po [2] KHAROSHTHI PUNCTUATION DANDA..KHAROSHTHI PUNCTUATION DOUBLE DANDA
+10F55..10F59 ; Sentence_Terminal # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
11047..11048 ; Sentence_Terminal # Po [2] BRAHMI DANDA..BRAHMI DOUBLE DANDA
110BE..110C1 ; Sentence_Terminal # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
11141..11143 ; Sentence_Terminal # Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK
@@ -1313,14 +1337,16 @@ FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP
11A42..11A43 ; Sentence_Terminal # Po [2] ZANABAZAR SQUARE MARK SHAD..ZANABAZAR SQUARE MARK DOUBLE SHAD
11A9B..11A9C ; Sentence_Terminal # Po [2] SOYOMBO MARK SHAD..SOYOMBO MARK DOUBLE SHAD
11C41..11C42 ; Sentence_Terminal # Po [2] BHAIKSUKI DANDA..BHAIKSUKI DOUBLE DANDA
+11EF7..11EF8 ; Sentence_Terminal # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
16A6E..16A6F ; Sentence_Terminal # Po [2] MRO DANDA..MRO DOUBLE DANDA
16AF5 ; Sentence_Terminal # Po BASSA VAH FULL STOP
16B37..16B38 ; Sentence_Terminal # Po [2] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS TSHAB CEEB
16B44 ; Sentence_Terminal # Po PAHAWH HMONG SIGN XAUS
+16E98 ; Sentence_Terminal # Po MEDEFAIDRIN FULL STOP
1BC9F ; Sentence_Terminal # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP
1DA88 ; Sentence_Terminal # Po SIGNWRITING FULL STOP
-# Total code points: 128
+# Total code points: 141
# ================================================
@@ -1521,14 +1547,10 @@ E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION S
2B74..2B75 ; Pattern_Syntax # Cn [2] <reserved-2B74>..<reserved-2B75>
2B76..2B95 ; Pattern_Syntax # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW
2B96..2B97 ; Pattern_Syntax # Cn [2] <reserved-2B96>..<reserved-2B97>
-2B98..2BB9 ; Pattern_Syntax # So [34] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX
-2BBA..2BBC ; Pattern_Syntax # Cn [3] <reserved-2BBA>..<reserved-2BBC>
-2BBD..2BC8 ; Pattern_Syntax # So [12] BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
+2B98..2BC8 ; Pattern_Syntax # So [49] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
2BC9 ; Pattern_Syntax # Cn <reserved-2BC9>
-2BCA..2BD2 ; Pattern_Syntax # So [9] TOP HALF BLACK CIRCLE..GROUP MARK
-2BD3..2BEB ; Pattern_Syntax # Cn [25] <reserved-2BD3>..<reserved-2BEB>
-2BEC..2BEF ; Pattern_Syntax # So [4] LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS
-2BF0..2BFF ; Pattern_Syntax # Cn [16] <reserved-2BF0>..<reserved-2BFF>
+2BCA..2BFE ; Pattern_Syntax # So [53] TOP HALF BLACK CIRCLE..REVERSED RIGHT ANGLE
+2BFF ; Pattern_Syntax # Cn <reserved-2BFF>
2E00..2E01 ; Pattern_Syntax # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
2E02 ; Pattern_Syntax # Pi LEFT SUBSTITUTION BRACKET
2E03 ; Pattern_Syntax # Pf RIGHT SUBSTITUTION BRACKET
@@ -1566,8 +1588,8 @@ E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION S
2E40 ; Pattern_Syntax # Pd DOUBLE HYPHEN
2E41 ; Pattern_Syntax # Po REVERSED COMMA
2E42 ; Pattern_Syntax # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK
-2E43..2E49 ; Pattern_Syntax # Po [7] DASH WITH LEFT UPTURN..DOUBLE STACKED COMMA
-2E4A..2E7F ; Pattern_Syntax # Cn [54] <reserved-2E4A>..<reserved-2E7F>
+2E43..2E4E ; Pattern_Syntax # Po [12] DASH WITH LEFT UPTURN..PUNCTUS ELEVATUS MARK
+2E4F..2E7F ; Pattern_Syntax # Cn [49] <reserved-2E4F>..<reserved-2E7F>
3001..3003 ; Pattern_Syntax # Po [3] IDEOGRAPHIC COMMA..DITTO MARK
3008 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET
3009 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET
@@ -1606,8 +1628,9 @@ FE45..FE46 ; Pattern_Syntax # Po [2] SESAME DOT..WHITE SESAME DOT
070F ; Prepended_Concatenation_Mark # Cf SYRIAC ABBREVIATION MARK
08E2 ; Prepended_Concatenation_Mark # Cf ARABIC DISPUTED END OF AYAH
110BD ; Prepended_Concatenation_Mark # Cf KAITHI NUMBER SIGN
+110CD ; Prepended_Concatenation_Mark # Cf KAITHI NUMBER SIGN ABOVE
-# Total code points: 10
+# Total code points: 11
# ================================================
diff --git a/lib/stdlib/uc_spec/README-UPDATE.txt b/lib/stdlib/uc_spec/README-UPDATE.txt
index d59337e1a5..e1f5c8fcd0 100644
--- a/lib/stdlib/uc_spec/README-UPDATE.txt
+++ b/lib/stdlib/uc_spec/README-UPDATE.txt
@@ -1,7 +1,13 @@
When updating the unicode version copy the necessary files to this
directory.
-
And update the test files in stdlib/test/unicode_util_SUITE_data/*
+Unicode 11 was updated from:
+https://www.unicode.org/Public/11.0.0/ucd/
+https://www.unicode.org/Public/11.0.0/ucd/auxiliary/
+https://www.unicode.org/Public/emoji/11.0/
+
Update the spec_version(..) function in the generator,
gen_unicode_mod.escript
+
+
diff --git a/lib/stdlib/uc_spec/SpecialCasing.txt b/lib/stdlib/uc_spec/SpecialCasing.txt
index b9ba0d81c1..c90d09acb3 100644
--- a/lib/stdlib/uc_spec/SpecialCasing.txt
+++ b/lib/stdlib/uc_spec/SpecialCasing.txt
@@ -1,6 +1,6 @@
-# SpecialCasing-10.0.0.txt
-# Date: 2017-04-14, 05:40:43 GMT
-# ยฉ 2017 Unicodeยฎ, Inc.
+# SpecialCasing-11.0.0.txt
+# Date: 2018-02-22, 06:16:47 GMT
+# ยฉ 2018 Unicodeยฎ, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -121,7 +121,7 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
# The following cases are already in the UnicodeData.txt file, so are only commented here.
-# 0345; 0345; 0345; 0399; # COMBINING GREEK YPOGEGRAMMENI
+# 0345; 0345; 0399; 0399; # COMBINING GREEK YPOGEGRAMMENI
# All letters with YPOGEGRAMMENI (iota-subscript) or PROSGEGRAMMENI (iota adscript)
# have special uppercases.
diff --git a/lib/stdlib/uc_spec/UnicodeData.txt b/lib/stdlib/uc_spec/UnicodeData.txt
index d89c64f526..ec32fafbce 100644
--- a/lib/stdlib/uc_spec/UnicodeData.txt
+++ b/lib/stdlib/uc_spec/UnicodeData.txt
@@ -1362,6 +1362,7 @@
055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;;
055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;;
055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;;
+0560;ARMENIAN SMALL LETTER TURNED AYB;Ll;0;L;;;;;N;;;;;
0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531
0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532
0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533
@@ -1401,6 +1402,7 @@
0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555
0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556
0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L;<compat> 0565 0582;;;;N;;;;;
+0588;ARMENIAN SMALL LETTER YI WITH STROKE;Ll;0;L;;;;;N;;;;;
0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;;
058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;;
058D;RIGHT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;;
@@ -1488,6 +1490,7 @@
05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;;
05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;;
05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;;
+05EF;HEBREW YOD TRIANGLE;Lo;0;R;;;;;N;;;;;
05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;;
05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;;
05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;;
@@ -1982,6 +1985,9 @@
07F8;NKO COMMA;Po;0;ON;;;;;N;;;;;
07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;;
+07FD;NKO DANTAYALAN;Mn;220;NSM;;;;;N;;;;;
+07FE;NKO DOROME SIGN;Sc;0;R;;;;;N;;;;;
+07FF;NKO TAMAN SIGN;Sc;0;R;;;;;N;;;;;
0800;SAMARITAN LETTER ALAF;Lo;0;R;;;;;N;;;;;
0801;SAMARITAN LETTER BIT;Lo;0;R;;;;;N;;;;;
0802;SAMARITAN LETTER GAMAN;Lo;0;R;;;;;N;;;;;
@@ -2112,6 +2118,7 @@
08BB;ARABIC LETTER AFRICAN FEH;Lo;0;AL;;;;;N;;;;;
08BC;ARABIC LETTER AFRICAN QAF;Lo;0;AL;;;;;N;;;;;
08BD;ARABIC LETTER AFRICAN NOON;Lo;0;AL;;;;;N;;;;;
+08D3;ARABIC SMALL LOW WAW;Mn;220;NSM;;;;;N;;;;;
08D4;ARABIC SMALL HIGH WORD AR-RUB;Mn;230;NSM;;;;;N;;;;;
08D5;ARABIC SMALL HIGH SAD;Mn;230;NSM;;;;;N;;;;;
08D6;ARABIC SMALL HIGH AIN;Mn;230;NSM;;;;;N;;;;;
@@ -2379,6 +2386,7 @@
09FB;BENGALI GANDA MARK;Sc;0;ET;;;;;N;;;;;
09FC;BENGALI LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;;
09FD;BENGALI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+09FE;BENGALI SANDHI MARK;Mn;230;NSM;;;;;N;;;;;
0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;;
0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;;
0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
@@ -2458,6 +2466,7 @@
0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;;
0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;;
0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;;
+0A76;GURMUKHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
@@ -2715,6 +2724,7 @@
0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;;
0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C04;TELUGU SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;;
0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;;
0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;;
0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;;
@@ -2811,6 +2821,7 @@
0C81;KANNADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C84;KANNADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;;
0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;;
0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;;
0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;;
@@ -3667,54 +3678,54 @@
10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;2D25;
10C7;GEORGIAN CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;2D27;
10CD;GEORGIAN CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;2D2D;
-10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;;
-10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;;
-10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;;
-10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;;
-10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;;
-10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;;
-10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;;
-10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;;
-10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;;
-10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;;
-10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;;
-10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;;
-10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;;
-10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;;
-10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;;
-10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;;
-10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;;
-10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;;
-10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;;
-10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;;
-10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;;
-10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;;
-10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;;
-10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;;
-10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;;
-10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;;
-10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;;
-10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;;
-10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;;
-10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;;
-10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;;
-10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;;
-10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;;
-10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;;
-10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;;
-10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;;
-10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;;
-10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;;
-10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;;
-10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;;
-10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;;
-10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;;
-10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;;
+10D0;GEORGIAN LETTER AN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;1C90;;10D0
+10D1;GEORGIAN LETTER BAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;1C91;;10D1
+10D2;GEORGIAN LETTER GAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;1C92;;10D2
+10D3;GEORGIAN LETTER DON;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;1C93;;10D3
+10D4;GEORGIAN LETTER EN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;1C94;;10D4
+10D5;GEORGIAN LETTER VIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;1C95;;10D5
+10D6;GEORGIAN LETTER ZEN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;1C96;;10D6
+10D7;GEORGIAN LETTER TAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;1C97;;10D7
+10D8;GEORGIAN LETTER IN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;1C98;;10D8
+10D9;GEORGIAN LETTER KAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;1C99;;10D9
+10DA;GEORGIAN LETTER LAS;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;1C9A;;10DA
+10DB;GEORGIAN LETTER MAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;1C9B;;10DB
+10DC;GEORGIAN LETTER NAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;1C9C;;10DC
+10DD;GEORGIAN LETTER ON;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;1C9D;;10DD
+10DE;GEORGIAN LETTER PAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;1C9E;;10DE
+10DF;GEORGIAN LETTER ZHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;1C9F;;10DF
+10E0;GEORGIAN LETTER RAE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;1CA0;;10E0
+10E1;GEORGIAN LETTER SAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;1CA1;;10E1
+10E2;GEORGIAN LETTER TAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;1CA2;;10E2
+10E3;GEORGIAN LETTER UN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;1CA3;;10E3
+10E4;GEORGIAN LETTER PHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;1CA4;;10E4
+10E5;GEORGIAN LETTER KHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;1CA5;;10E5
+10E6;GEORGIAN LETTER GHAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;1CA6;;10E6
+10E7;GEORGIAN LETTER QAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;1CA7;;10E7
+10E8;GEORGIAN LETTER SHIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;1CA8;;10E8
+10E9;GEORGIAN LETTER CHIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;1CA9;;10E9
+10EA;GEORGIAN LETTER CAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;1CAA;;10EA
+10EB;GEORGIAN LETTER JIL;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;1CAB;;10EB
+10EC;GEORGIAN LETTER CIL;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;1CAC;;10EC
+10ED;GEORGIAN LETTER CHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;1CAD;;10ED
+10EE;GEORGIAN LETTER XAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;1CAE;;10EE
+10EF;GEORGIAN LETTER JHAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;1CAF;;10EF
+10F0;GEORGIAN LETTER HAE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;1CB0;;10F0
+10F1;GEORGIAN LETTER HE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;1CB1;;10F1
+10F2;GEORGIAN LETTER HIE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;1CB2;;10F2
+10F3;GEORGIAN LETTER WE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;1CB3;;10F3
+10F4;GEORGIAN LETTER HAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;1CB4;;10F4
+10F5;GEORGIAN LETTER HOE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;1CB5;;10F5
+10F6;GEORGIAN LETTER FI;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;1CB6;;10F6
+10F7;GEORGIAN LETTER YN;Ll;0;L;;;;;N;;;1CB7;;10F7
+10F8;GEORGIAN LETTER ELIFI;Ll;0;L;;;;;N;;;1CB8;;10F8
+10F9;GEORGIAN LETTER TURNED GAN;Ll;0;L;;;;;N;;;1CB9;;10F9
+10FA;GEORGIAN LETTER AIN;Ll;0;L;;;;;N;;;1CBA;;10FA
10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;N;;;;;
-10FD;GEORGIAN LETTER AEN;Lo;0;L;;;;;N;;;;;
-10FE;GEORGIAN LETTER HARD SIGN;Lo;0;L;;;;;N;;;;;
-10FF;GEORGIAN LETTER LABIAL SIGN;Lo;0;L;;;;;N;;;;;
+10FD;GEORGIAN LETTER AEN;Ll;0;L;;;;;N;;;1CBD;;10FD
+10FE;GEORGIAN LETTER HARD SIGN;Ll;0;L;;;;;N;;;1CBE;;10FE
+10FF;GEORGIAN LETTER LABIAL SIGN;Ll;0;L;;;;;N;;;1CBF;;10FF
1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;;;;
1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;;
1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;;;;
@@ -5513,6 +5524,7 @@
1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;;
1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;;
1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;;
+1878;MONGOLIAN LETTER CHA WITH TWO DOTS;Lo;0;L;;;;;N;;;;;
1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;;
1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;;
1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;;
@@ -6388,6 +6400,52 @@
1C86;CYRILLIC SMALL LETTER TALL HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A
1C87;CYRILLIC SMALL LETTER TALL YAT;Ll;0;L;;;;;N;;;0462;;0462
1C88;CYRILLIC SMALL LETTER UNBLENDED UK;Ll;0;L;;;;;N;;;A64A;;A64A
+1C90;GEORGIAN MTAVRULI CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;10D0;
+1C91;GEORGIAN MTAVRULI CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;10D1;
+1C92;GEORGIAN MTAVRULI CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;10D2;
+1C93;GEORGIAN MTAVRULI CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;10D3;
+1C94;GEORGIAN MTAVRULI CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;10D4;
+1C95;GEORGIAN MTAVRULI CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;10D5;
+1C96;GEORGIAN MTAVRULI CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;10D6;
+1C97;GEORGIAN MTAVRULI CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;10D7;
+1C98;GEORGIAN MTAVRULI CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;10D8;
+1C99;GEORGIAN MTAVRULI CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;10D9;
+1C9A;GEORGIAN MTAVRULI CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;10DA;
+1C9B;GEORGIAN MTAVRULI CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;10DB;
+1C9C;GEORGIAN MTAVRULI CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;10DC;
+1C9D;GEORGIAN MTAVRULI CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;10DD;
+1C9E;GEORGIAN MTAVRULI CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;10DE;
+1C9F;GEORGIAN MTAVRULI CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;10DF;
+1CA0;GEORGIAN MTAVRULI CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;10E0;
+1CA1;GEORGIAN MTAVRULI CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;10E1;
+1CA2;GEORGIAN MTAVRULI CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;10E2;
+1CA3;GEORGIAN MTAVRULI CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;10E3;
+1CA4;GEORGIAN MTAVRULI CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;10E4;
+1CA5;GEORGIAN MTAVRULI CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;10E5;
+1CA6;GEORGIAN MTAVRULI CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;10E6;
+1CA7;GEORGIAN MTAVRULI CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;10E7;
+1CA8;GEORGIAN MTAVRULI CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;10E8;
+1CA9;GEORGIAN MTAVRULI CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;10E9;
+1CAA;GEORGIAN MTAVRULI CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;10EA;
+1CAB;GEORGIAN MTAVRULI CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;10EB;
+1CAC;GEORGIAN MTAVRULI CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;10EC;
+1CAD;GEORGIAN MTAVRULI CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;10ED;
+1CAE;GEORGIAN MTAVRULI CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;10EE;
+1CAF;GEORGIAN MTAVRULI CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;10EF;
+1CB0;GEORGIAN MTAVRULI CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;10F0;
+1CB1;GEORGIAN MTAVRULI CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;10F1;
+1CB2;GEORGIAN MTAVRULI CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;10F2;
+1CB3;GEORGIAN MTAVRULI CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;10F3;
+1CB4;GEORGIAN MTAVRULI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;10F4;
+1CB5;GEORGIAN MTAVRULI CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;10F5;
+1CB6;GEORGIAN MTAVRULI CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;10F6;
+1CB7;GEORGIAN MTAVRULI CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;10F7;
+1CB8;GEORGIAN MTAVRULI CAPITAL LETTER ELIFI;Lu;0;L;;;;;N;;;;10F8;
+1CB9;GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN;Lu;0;L;;;;;N;;;;10F9;
+1CBA;GEORGIAN MTAVRULI CAPITAL LETTER AIN;Lu;0;L;;;;;N;;;;10FA;
+1CBD;GEORGIAN MTAVRULI CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;10FD;
+1CBE;GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;10FE;
+1CBF;GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN;Lu;0;L;;;;;N;;;;10FF;
1CC0;SUNDANESE PUNCTUATION BINDU SURYA;Po;0;L;;;;;N;;;;;
1CC1;SUNDANESE PUNCTUATION BINDU PANGLONG;Po;0;L;;;;;N;;;;;
1CC2;SUNDANESE PUNCTUATION BINDU PURNAMA;Po;0;L;;;;;N;;;;;
@@ -9559,7 +9617,7 @@
299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;;
299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;;
29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;;
-29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;;
+29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;N;;;;;
29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;;
29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;;
29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
@@ -10092,6 +10150,9 @@
2BB7;RIBBON ARROW RIGHT DOWN;So;0;ON;;;;;N;;;;;
2BB8;UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;;
2BB9;UP ARROWHEAD IN A RECTANGLE BOX;So;0;ON;;;;;N;;;;;
+2BBA;OVERLAPPING WHITE SQUARES;So;0;ON;;;;;N;;;;;
+2BBB;OVERLAPPING WHITE AND BLACK SQUARES;So;0;ON;;;;;N;;;;;
+2BBC;OVERLAPPING BLACK SQUARES;So;0;ON;;;;;N;;;;;
2BBD;BALLOT BOX WITH LIGHT X;So;0;ON;;;;;N;;;;;
2BBE;CIRCLED X;So;0;ON;;;;;N;;;;;
2BBF;CIRCLED BOLD X;So;0;ON;;;;;N;;;;;
@@ -10113,10 +10174,50 @@
2BD0;SQUARE POSITION INDICATOR;So;0;ON;;;;;N;;;;;
2BD1;UNCERTAINTY SIGN;So;0;ON;;;;;N;;;;;
2BD2;GROUP MARK;So;0;ON;;;;;N;;;;;
+2BD3;PLUTO FORM TWO;So;0;ON;;;;;N;;;;;
+2BD4;PLUTO FORM THREE;So;0;ON;;;;;N;;;;;
+2BD5;PLUTO FORM FOUR;So;0;ON;;;;;N;;;;;
+2BD6;PLUTO FORM FIVE;So;0;ON;;;;;N;;;;;
+2BD7;TRANSPLUTO;So;0;ON;;;;;N;;;;;
+2BD8;PROSERPINA;So;0;ON;;;;;N;;;;;
+2BD9;ASTRAEA;So;0;ON;;;;;N;;;;;
+2BDA;HYGIEA;So;0;ON;;;;;N;;;;;
+2BDB;PHOLUS;So;0;ON;;;;;N;;;;;
+2BDC;NESSUS;So;0;ON;;;;;N;;;;;
+2BDD;WHITE MOON SELENA;So;0;ON;;;;;N;;;;;
+2BDE;BLACK DIAMOND ON CROSS;So;0;ON;;;;;N;;;;;
+2BDF;TRUE LIGHT MOON ARTA;So;0;ON;;;;;N;;;;;
+2BE0;CUPIDO;So;0;ON;;;;;N;;;;;
+2BE1;HADES;So;0;ON;;;;;N;;;;;
+2BE2;ZEUS;So;0;ON;;;;;N;;;;;
+2BE3;KRONOS;So;0;ON;;;;;N;;;;;
+2BE4;APOLLON;So;0;ON;;;;;N;;;;;
+2BE5;ADMETOS;So;0;ON;;;;;N;;;;;
+2BE6;VULCANUS;So;0;ON;;;;;N;;;;;
+2BE7;POSEIDON;So;0;ON;;;;;N;;;;;
+2BE8;LEFT HALF BLACK STAR;So;0;ON;;;;;N;;;;;
+2BE9;RIGHT HALF BLACK STAR;So;0;ON;;;;;N;;;;;
+2BEA;STAR WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+2BEB;STAR WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
2BEC;LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;;
2BED;UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;;
2BEE;RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;;
2BEF;DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;;
+2BF0;ERIS FORM ONE;So;0;ON;;;;;N;;;;;
+2BF1;ERIS FORM TWO;So;0;ON;;;;;N;;;;;
+2BF2;SEDNA;So;0;ON;;;;;N;;;;;
+2BF3;RUSSIAN ASTROLOGICAL SYMBOL VIGINTILE;So;0;ON;;;;;N;;;;;
+2BF4;RUSSIAN ASTROLOGICAL SYMBOL NOVILE;So;0;ON;;;;;N;;;;;
+2BF5;RUSSIAN ASTROLOGICAL SYMBOL QUINTILE;So;0;ON;;;;;N;;;;;
+2BF6;RUSSIAN ASTROLOGICAL SYMBOL BINOVILE;So;0;ON;;;;;N;;;;;
+2BF7;RUSSIAN ASTROLOGICAL SYMBOL SENTAGON;So;0;ON;;;;;N;;;;;
+2BF8;RUSSIAN ASTROLOGICAL SYMBOL TREDECILE;So;0;ON;;;;;N;;;;;
+2BF9;EQUALS SIGN WITH INFINITY BELOW;So;0;ON;;;;;N;;;;;
+2BFA;UNITED SYMBOL;So;0;ON;;;;;N;;;;;
+2BFB;SEPARATED SYMBOL;So;0;ON;;;;;N;;;;;
+2BFC;DOUBLED SYMBOL;So;0;ON;;;;;N;;;;;
+2BFD;PASSED SYMBOL;So;0;ON;;;;;N;;;;;
+2BFE;REVERSED RIGHT ANGLE;So;0;ON;;;;;Y;;;;;
2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30;
2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31;
2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32;
@@ -10650,6 +10751,11 @@
2E47;LOW KAVYKA;Po;0;ON;;;;;N;;;;;
2E48;LOW KAVYKA WITH DOT;Po;0;ON;;;;;N;;;;;
2E49;DOUBLE STACKED COMMA;Po;0;ON;;;;;N;;;;;
+2E4A;DOTTED SOLIDUS;Po;0;ON;;;;;N;;;;;
+2E4B;TRIPLE DAGGER;Po;0;ON;;;;;N;;;;;
+2E4C;MEDIEVAL COMMA;Po;0;ON;;;;;N;;;;;
+2E4D;PARAGRAPHUS MARK;Po;0;ON;;;;;N;;;;;
+2E4E;PUNCTUS ELEVATUS MARK;Po;0;ON;;;;;N;;;;;
2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;;
2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;;
2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;;
@@ -11286,6 +11392,7 @@
312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;;
312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;;
312E;BOPOMOFO LETTER O WITH DOT ABOVE;Lo;0;L;;;;;N;;;;;
+312F;BOPOMOFO LETTER NN;Lo;0;L;;;;;N;;;;;
3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;;
3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;;
3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;;
@@ -12052,7 +12159,7 @@
4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;;
4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;;
4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;;
-9FEA;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
+9FEF;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;;
A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;;
A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;;
@@ -13980,6 +14087,7 @@ A7AB;LATIN CAPITAL LETTER REVERSED OPEN E;Lu;0;L;;;;;N;;;;025C;
A7AC;LATIN CAPITAL LETTER SCRIPT G;Lu;0;L;;;;;N;;;;0261;
A7AD;LATIN CAPITAL LETTER L WITH BELT;Lu;0;L;;;;;N;;;;026C;
A7AE;LATIN CAPITAL LETTER SMALL CAPITAL I;Lu;0;L;;;;;N;;;;026A;
+A7AF;LATIN LETTER SMALL CAPITAL Q;Ll;0;L;;;;;N;;;;;
A7B0;LATIN CAPITAL LETTER TURNED K;Lu;0;L;;;;;N;;;;029E;
A7B1;LATIN CAPITAL LETTER TURNED T;Lu;0;L;;;;;N;;;;0287;
A7B2;LATIN CAPITAL LETTER J WITH CROSSED-TAIL;Lu;0;L;;;;;N;;;;029D;
@@ -13988,6 +14096,8 @@ A7B4;LATIN CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;A7B5;
A7B5;LATIN SMALL LETTER BETA;Ll;0;L;;;;;N;;;A7B4;;A7B4
A7B6;LATIN CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;A7B7;
A7B7;LATIN SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;A7B6;;A7B6
+A7B8;LATIN CAPITAL LETTER U WITH STROKE;Lu;0;L;;;;;N;;;;A7B9;
+A7B9;LATIN SMALL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;A7B8;;A7B8
A7F7;LATIN EPIGRAPHIC LETTER SIDEWAYS I;Lo;0;L;;;;;N;;;;;
A7F8;MODIFIER LETTER CAPITAL H WITH STROKE;Lm;0;L;<super> 0126;;;;N;;;;;
A7F9;MODIFIER LETTER SMALL LIGATURE OE;Lm;0;L;<super> 0153;;;;N;;;;;
@@ -14219,6 +14329,8 @@ A8FA;DEVANAGARI CARET;Po;0;L;;;;;N;;;;;
A8FB;DEVANAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;;
A8FC;DEVANAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;;
A8FD;DEVANAGARI JAIN OM;Lo;0;L;;;;;N;;;;;
+A8FE;DEVANAGARI LETTER AY;Lo;0;L;;;;;N;;;;;
+A8FF;DEVANAGARI VOWEL SIGN AY;Mn;0;NSM;;;;;N;;;;;
A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -18363,6 +18475,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;;
10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;;
10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;;
+10A34;KHAROSHTHI LETTER TTTA;Lo;0;R;;;;;N;;;;;
+10A35;KHAROSHTHI LETTER VHA;Lo;0;R;;;;;N;;;;;
10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;;
10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;;
10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
@@ -18375,6 +18489,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;;
10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+10A48;KHAROSHTHI FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;;
10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;;
10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;;
10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;;
@@ -18827,6 +18942,56 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10CFD;OLD HUNGARIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;;
10CFE;OLD HUNGARIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
10CFF;OLD HUNGARIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+10D00;HANIFI ROHINGYA LETTER A;Lo;0;AL;;;;;N;;;;;
+10D01;HANIFI ROHINGYA LETTER BA;Lo;0;AL;;;;;N;;;;;
+10D02;HANIFI ROHINGYA LETTER PA;Lo;0;AL;;;;;N;;;;;
+10D03;HANIFI ROHINGYA LETTER TA;Lo;0;AL;;;;;N;;;;;
+10D04;HANIFI ROHINGYA LETTER TTA;Lo;0;AL;;;;;N;;;;;
+10D05;HANIFI ROHINGYA LETTER JA;Lo;0;AL;;;;;N;;;;;
+10D06;HANIFI ROHINGYA LETTER CA;Lo;0;AL;;;;;N;;;;;
+10D07;HANIFI ROHINGYA LETTER HA;Lo;0;AL;;;;;N;;;;;
+10D08;HANIFI ROHINGYA LETTER KHA;Lo;0;AL;;;;;N;;;;;
+10D09;HANIFI ROHINGYA LETTER FA;Lo;0;AL;;;;;N;;;;;
+10D0A;HANIFI ROHINGYA LETTER DA;Lo;0;AL;;;;;N;;;;;
+10D0B;HANIFI ROHINGYA LETTER DDA;Lo;0;AL;;;;;N;;;;;
+10D0C;HANIFI ROHINGYA LETTER RA;Lo;0;AL;;;;;N;;;;;
+10D0D;HANIFI ROHINGYA LETTER RRA;Lo;0;AL;;;;;N;;;;;
+10D0E;HANIFI ROHINGYA LETTER ZA;Lo;0;AL;;;;;N;;;;;
+10D0F;HANIFI ROHINGYA LETTER SA;Lo;0;AL;;;;;N;;;;;
+10D10;HANIFI ROHINGYA LETTER SHA;Lo;0;AL;;;;;N;;;;;
+10D11;HANIFI ROHINGYA LETTER KA;Lo;0;AL;;;;;N;;;;;
+10D12;HANIFI ROHINGYA LETTER GA;Lo;0;AL;;;;;N;;;;;
+10D13;HANIFI ROHINGYA LETTER LA;Lo;0;AL;;;;;N;;;;;
+10D14;HANIFI ROHINGYA LETTER MA;Lo;0;AL;;;;;N;;;;;
+10D15;HANIFI ROHINGYA LETTER NA;Lo;0;AL;;;;;N;;;;;
+10D16;HANIFI ROHINGYA LETTER WA;Lo;0;AL;;;;;N;;;;;
+10D17;HANIFI ROHINGYA LETTER KINNA WA;Lo;0;AL;;;;;N;;;;;
+10D18;HANIFI ROHINGYA LETTER YA;Lo;0;AL;;;;;N;;;;;
+10D19;HANIFI ROHINGYA LETTER KINNA YA;Lo;0;AL;;;;;N;;;;;
+10D1A;HANIFI ROHINGYA LETTER NGA;Lo;0;AL;;;;;N;;;;;
+10D1B;HANIFI ROHINGYA LETTER NYA;Lo;0;AL;;;;;N;;;;;
+10D1C;HANIFI ROHINGYA LETTER VA;Lo;0;AL;;;;;N;;;;;
+10D1D;HANIFI ROHINGYA VOWEL A;Lo;0;AL;;;;;N;;;;;
+10D1E;HANIFI ROHINGYA VOWEL I;Lo;0;AL;;;;;N;;;;;
+10D1F;HANIFI ROHINGYA VOWEL U;Lo;0;AL;;;;;N;;;;;
+10D20;HANIFI ROHINGYA VOWEL E;Lo;0;AL;;;;;N;;;;;
+10D21;HANIFI ROHINGYA VOWEL O;Lo;0;AL;;;;;N;;;;;
+10D22;HANIFI ROHINGYA MARK SAKIN;Lo;0;AL;;;;;N;;;;;
+10D23;HANIFI ROHINGYA MARK NA KHONNA;Lo;0;AL;;;;;N;;;;;
+10D24;HANIFI ROHINGYA SIGN HARBAHAY;Mn;230;NSM;;;;;N;;;;;
+10D25;HANIFI ROHINGYA SIGN TAHALA;Mn;230;NSM;;;;;N;;;;;
+10D26;HANIFI ROHINGYA SIGN TANA;Mn;230;NSM;;;;;N;;;;;
+10D27;HANIFI ROHINGYA SIGN TASSI;Mn;230;NSM;;;;;N;;;;;
+10D30;HANIFI ROHINGYA DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;;
+10D31;HANIFI ROHINGYA DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;;
+10D32;HANIFI ROHINGYA DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;;
+10D33;HANIFI ROHINGYA DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;;
+10D34;HANIFI ROHINGYA DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;;
+10D35;HANIFI ROHINGYA DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;;
+10D36;HANIFI ROHINGYA DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;;
+10D37;HANIFI ROHINGYA DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;;
+10D38;HANIFI ROHINGYA DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;;
+10D39;HANIFI ROHINGYA DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;;
10E60;RUMI DIGIT ONE;No;0;AN;;;1;1;N;;;;;
10E61;RUMI DIGIT TWO;No;0;AN;;;2;2;N;;;;;
10E62;RUMI DIGIT THREE;No;0;AN;;;3;3;N;;;;;
@@ -18858,6 +19023,88 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10E7C;RUMI FRACTION ONE QUARTER;No;0;AN;;;;1/4;N;;;;;
10E7D;RUMI FRACTION ONE THIRD;No;0;AN;;;;1/3;N;;;;;
10E7E;RUMI FRACTION TWO THIRDS;No;0;AN;;;;2/3;N;;;;;
+10F00;OLD SOGDIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;;
+10F01;OLD SOGDIAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;;
+10F02;OLD SOGDIAN LETTER BETH;Lo;0;R;;;;;N;;;;;
+10F03;OLD SOGDIAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;;
+10F04;OLD SOGDIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+10F05;OLD SOGDIAN LETTER HE;Lo;0;R;;;;;N;;;;;
+10F06;OLD SOGDIAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;;
+10F07;OLD SOGDIAN LETTER WAW;Lo;0;R;;;;;N;;;;;
+10F08;OLD SOGDIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+10F09;OLD SOGDIAN LETTER HETH;Lo;0;R;;;;;N;;;;;
+10F0A;OLD SOGDIAN LETTER YODH;Lo;0;R;;;;;N;;;;;
+10F0B;OLD SOGDIAN LETTER KAPH;Lo;0;R;;;;;N;;;;;
+10F0C;OLD SOGDIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;;
+10F0D;OLD SOGDIAN LETTER MEM;Lo;0;R;;;;;N;;;;;
+10F0E;OLD SOGDIAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+10F0F;OLD SOGDIAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;;
+10F10;OLD SOGDIAN LETTER FINAL NUN WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;;
+10F11;OLD SOGDIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+10F12;OLD SOGDIAN LETTER AYIN;Lo;0;R;;;;;N;;;;;
+10F13;OLD SOGDIAN LETTER ALTERNATE AYIN;Lo;0;R;;;;;N;;;;;
+10F14;OLD SOGDIAN LETTER PE;Lo;0;R;;;;;N;;;;;
+10F15;OLD SOGDIAN LETTER SADHE;Lo;0;R;;;;;N;;;;;
+10F16;OLD SOGDIAN LETTER FINAL SADHE;Lo;0;R;;;;;N;;;;;
+10F17;OLD SOGDIAN LETTER FINAL SADHE WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;;
+10F18;OLD SOGDIAN LETTER RESH-AYIN-DALETH;Lo;0;R;;;;;N;;;;;
+10F19;OLD SOGDIAN LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10F1A;OLD SOGDIAN LETTER TAW;Lo;0;R;;;;;N;;;;;
+10F1B;OLD SOGDIAN LETTER FINAL TAW;Lo;0;R;;;;;N;;;;;
+10F1C;OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;;
+10F1D;OLD SOGDIAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+10F1E;OLD SOGDIAN NUMBER TWO;No;0;R;;;;2;N;;;;;
+10F1F;OLD SOGDIAN NUMBER THREE;No;0;R;;;;3;N;;;;;
+10F20;OLD SOGDIAN NUMBER FOUR;No;0;R;;;;4;N;;;;;
+10F21;OLD SOGDIAN NUMBER FIVE;No;0;R;;;;5;N;;;;;
+10F22;OLD SOGDIAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+10F23;OLD SOGDIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10F24;OLD SOGDIAN NUMBER THIRTY;No;0;R;;;;30;N;;;;;
+10F25;OLD SOGDIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+10F26;OLD SOGDIAN FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;;
+10F27;OLD SOGDIAN LIGATURE AYIN-DALETH;Lo;0;R;;;;;N;;;;;
+10F30;SOGDIAN LETTER ALEPH;Lo;0;AL;;;;;N;;;;;
+10F31;SOGDIAN LETTER BETH;Lo;0;AL;;;;;N;;;;;
+10F32;SOGDIAN LETTER GIMEL;Lo;0;AL;;;;;N;;;;;
+10F33;SOGDIAN LETTER HE;Lo;0;AL;;;;;N;;;;;
+10F34;SOGDIAN LETTER WAW;Lo;0;AL;;;;;N;;;;;
+10F35;SOGDIAN LETTER ZAYIN;Lo;0;AL;;;;;N;;;;;
+10F36;SOGDIAN LETTER HETH;Lo;0;AL;;;;;N;;;;;
+10F37;SOGDIAN LETTER YODH;Lo;0;AL;;;;;N;;;;;
+10F38;SOGDIAN LETTER KAPH;Lo;0;AL;;;;;N;;;;;
+10F39;SOGDIAN LETTER LAMEDH;Lo;0;AL;;;;;N;;;;;
+10F3A;SOGDIAN LETTER MEM;Lo;0;AL;;;;;N;;;;;
+10F3B;SOGDIAN LETTER NUN;Lo;0;AL;;;;;N;;;;;
+10F3C;SOGDIAN LETTER SAMEKH;Lo;0;AL;;;;;N;;;;;
+10F3D;SOGDIAN LETTER AYIN;Lo;0;AL;;;;;N;;;;;
+10F3E;SOGDIAN LETTER PE;Lo;0;AL;;;;;N;;;;;
+10F3F;SOGDIAN LETTER SADHE;Lo;0;AL;;;;;N;;;;;
+10F40;SOGDIAN LETTER RESH-AYIN;Lo;0;AL;;;;;N;;;;;
+10F41;SOGDIAN LETTER SHIN;Lo;0;AL;;;;;N;;;;;
+10F42;SOGDIAN LETTER TAW;Lo;0;AL;;;;;N;;;;;
+10F43;SOGDIAN LETTER FETH;Lo;0;AL;;;;;N;;;;;
+10F44;SOGDIAN LETTER LESH;Lo;0;AL;;;;;N;;;;;
+10F45;SOGDIAN INDEPENDENT SHIN;Lo;0;AL;;;;;N;;;;;
+10F46;SOGDIAN COMBINING DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+10F47;SOGDIAN COMBINING TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+10F48;SOGDIAN COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;;;;;
+10F49;SOGDIAN COMBINING TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+10F4A;SOGDIAN COMBINING CURVE ABOVE;Mn;230;NSM;;;;;N;;;;;
+10F4B;SOGDIAN COMBINING CURVE BELOW;Mn;220;NSM;;;;;N;;;;;
+10F4C;SOGDIAN COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;;;;;
+10F4D;SOGDIAN COMBINING HOOK BELOW;Mn;220;NSM;;;;;N;;;;;
+10F4E;SOGDIAN COMBINING LONG HOOK BELOW;Mn;220;NSM;;;;;N;;;;;
+10F4F;SOGDIAN COMBINING RESH BELOW;Mn;220;NSM;;;;;N;;;;;
+10F50;SOGDIAN COMBINING STROKE BELOW;Mn;220;NSM;;;;;N;;;;;
+10F51;SOGDIAN NUMBER ONE;No;0;AL;;;;1;N;;;;;
+10F52;SOGDIAN NUMBER TEN;No;0;AL;;;;10;N;;;;;
+10F53;SOGDIAN NUMBER TWENTY;No;0;AL;;;;20;N;;;;;
+10F54;SOGDIAN NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;;
+10F55;SOGDIAN PUNCTUATION TWO VERTICAL BARS;Po;0;AL;;;;;N;;;;;
+10F56;SOGDIAN PUNCTUATION TWO VERTICAL BARS WITH DOTS;Po;0;AL;;;;;N;;;;;
+10F57;SOGDIAN PUNCTUATION CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;;
+10F58;SOGDIAN PUNCTUATION TWO CIRCLES WITH DOTS;Po;0;AL;;;;;N;;;;;
+10F59;SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;;
11000;BRAHMI SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;;
11001;BRAHMI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
11002;BRAHMI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
@@ -19033,6 +19280,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
110BF;KAITHI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;;
110C0;KAITHI DANDA;Po;0;L;;;;;N;;;;;
110C1;KAITHI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+110CD;KAITHI NUMBER SIGN ABOVE;Cf;0;L;;;;;N;;;;;
110D0;SORA SOMPENG LETTER SAH;Lo;0;L;;;;;N;;;;;
110D1;SORA SOMPENG LETTER TAH;Lo;0;L;;;;;N;;;;;
110D2;SORA SOMPENG LETTER BAH;Lo;0;L;;;;;N;;;;;
@@ -19135,6 +19383,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11141;CHAKMA DANDA;Po;0;L;;;;;N;;;;;
11142;CHAKMA DOUBLE DANDA;Po;0;L;;;;;N;;;;;
11143;CHAKMA QUESTION MARK;Po;0;L;;;;;N;;;;;
+11144;CHAKMA LETTER LHAA;Lo;0;L;;;;;N;;;;;
+11145;CHAKMA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+11146;CHAKMA VOWEL SIGN EI;Mc;0;L;;;;;N;;;;;
11150;MAHAJANI LETTER A;Lo;0;L;;;;;N;;;;;
11151;MAHAJANI LETTER I;Lo;0;L;;;;;N;;;;;
11152;MAHAJANI LETTER U;Lo;0;L;;;;;N;;;;;
@@ -19247,7 +19498,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
111C6;SHARADA DOUBLE DANDA;Po;0;L;;;;;N;;;;;
111C7;SHARADA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
111C8;SHARADA SEPARATOR;Po;0;L;;;;;N;;;;;
-111C9;SHARADA SANDHI MARK;Po;0;L;;;;;N;;;;;
+111C9;SHARADA SANDHI MARK;Mn;0;NSM;;;;;N;;;;;
111CA;SHARADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
111CB;SHARADA VOWEL MODIFIER MARK;Mn;0;NSM;;;;;N;;;;;
111CC;SHARADA EXTRA SHORT VOWEL MARK;Mn;0;NSM;;;;;N;;;;;
@@ -19507,6 +19758,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11337;GRANTHA LETTER SSA;Lo;0;L;;;;;N;;;;;
11338;GRANTHA LETTER SA;Lo;0;L;;;;;N;;;;;
11339;GRANTHA LETTER HA;Lo;0;L;;;;;N;;;;;
+1133B;COMBINING BINDU BELOW;Mn;7;NSM;;;;;N;;;;;
1133C;GRANTHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
1133D;GRANTHA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
1133E;GRANTHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
@@ -19634,6 +19886,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11459;NEWA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
1145B;NEWA PLACEHOLDER MARK;Po;0;L;;;;;N;;;;;
1145D;NEWA INSERTION SIGN;Po;0;L;;;;;N;;;;;
+1145E;NEWA SANDHI MARK;Mn;230;NSM;;;;;N;;;;;
11480;TIRHUTA ANJI;Lo;0;L;;;;;N;;;;;
11481;TIRHUTA LETTER A;Lo;0;L;;;;;N;;;;;
11482;TIRHUTA LETTER AA;Lo;0;L;;;;;N;;;;;
@@ -19992,6 +20245,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11717;AHOM LETTER GHA;Lo;0;L;;;;;N;;;;;
11718;AHOM LETTER BHA;Lo;0;L;;;;;N;;;;;
11719;AHOM LETTER JHA;Lo;0;L;;;;;N;;;;;
+1171A;AHOM LETTER ALTERNATE BA;Lo;0;L;;;;;N;;;;;
1171D;AHOM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;;
1171E;AHOM CONSONANT SIGN MEDIAL RA;Mn;0;NSM;;;;;N;;;;;
1171F;AHOM CONSONANT SIGN MEDIAL LIGATING RA;Mn;0;NSM;;;;;N;;;;;
@@ -20023,6 +20277,66 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1173D;AHOM SIGN SECTION;Po;0;L;;;;;N;;;;;
1173E;AHOM SIGN RULAI;Po;0;L;;;;;N;;;;;
1173F;AHOM SYMBOL VI;So;0;L;;;;;N;;;;;
+11800;DOGRA LETTER A;Lo;0;L;;;;;N;;;;;
+11801;DOGRA LETTER AA;Lo;0;L;;;;;N;;;;;
+11802;DOGRA LETTER I;Lo;0;L;;;;;N;;;;;
+11803;DOGRA LETTER II;Lo;0;L;;;;;N;;;;;
+11804;DOGRA LETTER U;Lo;0;L;;;;;N;;;;;
+11805;DOGRA LETTER UU;Lo;0;L;;;;;N;;;;;
+11806;DOGRA LETTER E;Lo;0;L;;;;;N;;;;;
+11807;DOGRA LETTER AI;Lo;0;L;;;;;N;;;;;
+11808;DOGRA LETTER O;Lo;0;L;;;;;N;;;;;
+11809;DOGRA LETTER AU;Lo;0;L;;;;;N;;;;;
+1180A;DOGRA LETTER KA;Lo;0;L;;;;;N;;;;;
+1180B;DOGRA LETTER KHA;Lo;0;L;;;;;N;;;;;
+1180C;DOGRA LETTER GA;Lo;0;L;;;;;N;;;;;
+1180D;DOGRA LETTER GHA;Lo;0;L;;;;;N;;;;;
+1180E;DOGRA LETTER NGA;Lo;0;L;;;;;N;;;;;
+1180F;DOGRA LETTER CA;Lo;0;L;;;;;N;;;;;
+11810;DOGRA LETTER CHA;Lo;0;L;;;;;N;;;;;
+11811;DOGRA LETTER JA;Lo;0;L;;;;;N;;;;;
+11812;DOGRA LETTER JHA;Lo;0;L;;;;;N;;;;;
+11813;DOGRA LETTER NYA;Lo;0;L;;;;;N;;;;;
+11814;DOGRA LETTER TTA;Lo;0;L;;;;;N;;;;;
+11815;DOGRA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11816;DOGRA LETTER DDA;Lo;0;L;;;;;N;;;;;
+11817;DOGRA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11818;DOGRA LETTER NNA;Lo;0;L;;;;;N;;;;;
+11819;DOGRA LETTER TA;Lo;0;L;;;;;N;;;;;
+1181A;DOGRA LETTER THA;Lo;0;L;;;;;N;;;;;
+1181B;DOGRA LETTER DA;Lo;0;L;;;;;N;;;;;
+1181C;DOGRA LETTER DHA;Lo;0;L;;;;;N;;;;;
+1181D;DOGRA LETTER NA;Lo;0;L;;;;;N;;;;;
+1181E;DOGRA LETTER PA;Lo;0;L;;;;;N;;;;;
+1181F;DOGRA LETTER PHA;Lo;0;L;;;;;N;;;;;
+11820;DOGRA LETTER BA;Lo;0;L;;;;;N;;;;;
+11821;DOGRA LETTER BHA;Lo;0;L;;;;;N;;;;;
+11822;DOGRA LETTER MA;Lo;0;L;;;;;N;;;;;
+11823;DOGRA LETTER YA;Lo;0;L;;;;;N;;;;;
+11824;DOGRA LETTER RA;Lo;0;L;;;;;N;;;;;
+11825;DOGRA LETTER LA;Lo;0;L;;;;;N;;;;;
+11826;DOGRA LETTER VA;Lo;0;L;;;;;N;;;;;
+11827;DOGRA LETTER SHA;Lo;0;L;;;;;N;;;;;
+11828;DOGRA LETTER SSA;Lo;0;L;;;;;N;;;;;
+11829;DOGRA LETTER SA;Lo;0;L;;;;;N;;;;;
+1182A;DOGRA LETTER HA;Lo;0;L;;;;;N;;;;;
+1182B;DOGRA LETTER RRA;Lo;0;L;;;;;N;;;;;
+1182C;DOGRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+1182D;DOGRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+1182E;DOGRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+1182F;DOGRA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+11830;DOGRA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+11831;DOGRA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+11832;DOGRA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+11833;DOGRA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+11834;DOGRA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+11835;DOGRA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+11836;DOGRA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+11837;DOGRA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+11838;DOGRA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+11839;DOGRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+1183A;DOGRA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+1183B;DOGRA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
118A0;WARANG CITI CAPITAL LETTER NGAA;Lu;0;L;;;;;N;;;;118C0;
118A1;WARANG CITI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;118C1;
118A2;WARANG CITI CAPITAL LETTER WI;Lu;0;L;;;;;N;;;;118C2;
@@ -20114,8 +20428,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11A04;ZANABAZAR SQUARE VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
11A05;ZANABAZAR SQUARE VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;;
11A06;ZANABAZAR SQUARE VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
-11A07;ZANABAZAR SQUARE VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
-11A08;ZANABAZAR SQUARE VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+11A07;ZANABAZAR SQUARE VOWEL SIGN AI;Mn;0;L;;;;;N;;;;;
+11A08;ZANABAZAR SQUARE VOWEL SIGN AU;Mn;0;L;;;;;N;;;;;
11A09;ZANABAZAR SQUARE VOWEL SIGN REVERSED I;Mn;0;NSM;;;;;N;;;;;
11A0A;ZANABAZAR SQUARE VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
11A0B;ZANABAZAR SQUARE LETTER KA;Lo;0;L;;;;;N;;;;;
@@ -20254,6 +20568,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11A9A;SOYOMBO MARK TSHEG;Po;0;L;;;;;N;;;;;
11A9B;SOYOMBO MARK SHAD;Po;0;L;;;;;N;;;;;
11A9C;SOYOMBO MARK DOUBLE SHAD;Po;0;L;;;;;N;;;;;
+11A9D;SOYOMBO MARK PLUTA;Lo;0;L;;;;;N;;;;;
11A9E;SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME;Po;0;L;;;;;N;;;;;
11A9F;SOYOMBO HEAD MARK WITH MOON AND SUN AND FLAME;Po;0;L;;;;;N;;;;;
11AA0;SOYOMBO HEAD MARK WITH MOON AND SUN;Po;0;L;;;;;N;;;;;
@@ -20556,6 +20871,94 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11D57;MASARAM GONDI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
11D58;MASARAM GONDI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
11D59;MASARAM GONDI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+11D60;GUNJALA GONDI LETTER A;Lo;0;L;;;;;N;;;;;
+11D61;GUNJALA GONDI LETTER AA;Lo;0;L;;;;;N;;;;;
+11D62;GUNJALA GONDI LETTER I;Lo;0;L;;;;;N;;;;;
+11D63;GUNJALA GONDI LETTER II;Lo;0;L;;;;;N;;;;;
+11D64;GUNJALA GONDI LETTER U;Lo;0;L;;;;;N;;;;;
+11D65;GUNJALA GONDI LETTER UU;Lo;0;L;;;;;N;;;;;
+11D67;GUNJALA GONDI LETTER EE;Lo;0;L;;;;;N;;;;;
+11D68;GUNJALA GONDI LETTER AI;Lo;0;L;;;;;N;;;;;
+11D6A;GUNJALA GONDI LETTER OO;Lo;0;L;;;;;N;;;;;
+11D6B;GUNJALA GONDI LETTER AU;Lo;0;L;;;;;N;;;;;
+11D6C;GUNJALA GONDI LETTER YA;Lo;0;L;;;;;N;;;;;
+11D6D;GUNJALA GONDI LETTER VA;Lo;0;L;;;;;N;;;;;
+11D6E;GUNJALA GONDI LETTER BA;Lo;0;L;;;;;N;;;;;
+11D6F;GUNJALA GONDI LETTER BHA;Lo;0;L;;;;;N;;;;;
+11D70;GUNJALA GONDI LETTER MA;Lo;0;L;;;;;N;;;;;
+11D71;GUNJALA GONDI LETTER KA;Lo;0;L;;;;;N;;;;;
+11D72;GUNJALA GONDI LETTER KHA;Lo;0;L;;;;;N;;;;;
+11D73;GUNJALA GONDI LETTER TA;Lo;0;L;;;;;N;;;;;
+11D74;GUNJALA GONDI LETTER THA;Lo;0;L;;;;;N;;;;;
+11D75;GUNJALA GONDI LETTER LA;Lo;0;L;;;;;N;;;;;
+11D76;GUNJALA GONDI LETTER GA;Lo;0;L;;;;;N;;;;;
+11D77;GUNJALA GONDI LETTER GHA;Lo;0;L;;;;;N;;;;;
+11D78;GUNJALA GONDI LETTER DA;Lo;0;L;;;;;N;;;;;
+11D79;GUNJALA GONDI LETTER DHA;Lo;0;L;;;;;N;;;;;
+11D7A;GUNJALA GONDI LETTER NA;Lo;0;L;;;;;N;;;;;
+11D7B;GUNJALA GONDI LETTER CA;Lo;0;L;;;;;N;;;;;
+11D7C;GUNJALA GONDI LETTER CHA;Lo;0;L;;;;;N;;;;;
+11D7D;GUNJALA GONDI LETTER TTA;Lo;0;L;;;;;N;;;;;
+11D7E;GUNJALA GONDI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11D7F;GUNJALA GONDI LETTER LLA;Lo;0;L;;;;;N;;;;;
+11D80;GUNJALA GONDI LETTER JA;Lo;0;L;;;;;N;;;;;
+11D81;GUNJALA GONDI LETTER JHA;Lo;0;L;;;;;N;;;;;
+11D82;GUNJALA GONDI LETTER DDA;Lo;0;L;;;;;N;;;;;
+11D83;GUNJALA GONDI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11D84;GUNJALA GONDI LETTER NGA;Lo;0;L;;;;;N;;;;;
+11D85;GUNJALA GONDI LETTER PA;Lo;0;L;;;;;N;;;;;
+11D86;GUNJALA GONDI LETTER PHA;Lo;0;L;;;;;N;;;;;
+11D87;GUNJALA GONDI LETTER HA;Lo;0;L;;;;;N;;;;;
+11D88;GUNJALA GONDI LETTER RA;Lo;0;L;;;;;N;;;;;
+11D89;GUNJALA GONDI LETTER SA;Lo;0;L;;;;;N;;;;;
+11D8A;GUNJALA GONDI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+11D8B;GUNJALA GONDI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+11D8C;GUNJALA GONDI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+11D8D;GUNJALA GONDI VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+11D8E;GUNJALA GONDI VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+11D90;GUNJALA GONDI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+11D91;GUNJALA GONDI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+11D93;GUNJALA GONDI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+11D94;GUNJALA GONDI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+11D95;GUNJALA GONDI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+11D96;GUNJALA GONDI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+11D97;GUNJALA GONDI VIRAMA;Mn;9;NSM;;;;;N;;;;;
+11D98;GUNJALA GONDI OM;Lo;0;L;;;;;N;;;;;
+11DA0;GUNJALA GONDI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+11DA1;GUNJALA GONDI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+11DA2;GUNJALA GONDI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+11DA3;GUNJALA GONDI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+11DA4;GUNJALA GONDI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+11DA5;GUNJALA GONDI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+11DA6;GUNJALA GONDI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+11DA7;GUNJALA GONDI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+11DA8;GUNJALA GONDI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+11DA9;GUNJALA GONDI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+11EE0;MAKASAR LETTER KA;Lo;0;L;;;;;N;;;;;
+11EE1;MAKASAR LETTER GA;Lo;0;L;;;;;N;;;;;
+11EE2;MAKASAR LETTER NGA;Lo;0;L;;;;;N;;;;;
+11EE3;MAKASAR LETTER PA;Lo;0;L;;;;;N;;;;;
+11EE4;MAKASAR LETTER BA;Lo;0;L;;;;;N;;;;;
+11EE5;MAKASAR LETTER MA;Lo;0;L;;;;;N;;;;;
+11EE6;MAKASAR LETTER TA;Lo;0;L;;;;;N;;;;;
+11EE7;MAKASAR LETTER DA;Lo;0;L;;;;;N;;;;;
+11EE8;MAKASAR LETTER NA;Lo;0;L;;;;;N;;;;;
+11EE9;MAKASAR LETTER CA;Lo;0;L;;;;;N;;;;;
+11EEA;MAKASAR LETTER JA;Lo;0;L;;;;;N;;;;;
+11EEB;MAKASAR LETTER NYA;Lo;0;L;;;;;N;;;;;
+11EEC;MAKASAR LETTER YA;Lo;0;L;;;;;N;;;;;
+11EED;MAKASAR LETTER RA;Lo;0;L;;;;;N;;;;;
+11EEE;MAKASAR LETTER LA;Lo;0;L;;;;;N;;;;;
+11EEF;MAKASAR LETTER VA;Lo;0;L;;;;;N;;;;;
+11EF0;MAKASAR LETTER SA;Lo;0;L;;;;;N;;;;;
+11EF1;MAKASAR LETTER A;Lo;0;L;;;;;N;;;;;
+11EF2;MAKASAR ANGKA;Lo;0;L;;;;;N;;;;;
+11EF3;MAKASAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+11EF4;MAKASAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+11EF5;MAKASAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+11EF6;MAKASAR VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+11EF7;MAKASAR PASSIMBANG;Po;0;L;;;;;N;;;;;
+11EF8;MAKASAR END OF SECTION;Po;0;L;;;;;N;;;;;
12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;;
12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;;
12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;;
@@ -24219,6 +24622,97 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
16B8D;PAHAWH HMONG CLAN SIGN TSWB;Lo;0;L;;;;;N;;;;;
16B8E;PAHAWH HMONG CLAN SIGN KWM;Lo;0;L;;;;;N;;;;;
16B8F;PAHAWH HMONG CLAN SIGN VWJ;Lo;0;L;;;;;N;;;;;
+16E40;MEDEFAIDRIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;16E60;
+16E41;MEDEFAIDRIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;16E61;
+16E42;MEDEFAIDRIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;16E62;
+16E43;MEDEFAIDRIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;16E63;
+16E44;MEDEFAIDRIN CAPITAL LETTER ATIU;Lu;0;L;;;;;N;;;;16E64;
+16E45;MEDEFAIDRIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;16E65;
+16E46;MEDEFAIDRIN CAPITAL LETTER KP;Lu;0;L;;;;;N;;;;16E66;
+16E47;MEDEFAIDRIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;16E67;
+16E48;MEDEFAIDRIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;16E68;
+16E49;MEDEFAIDRIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;16E69;
+16E4A;MEDEFAIDRIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;16E6A;
+16E4B;MEDEFAIDRIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;16E6B;
+16E4C;MEDEFAIDRIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;16E6C;
+16E4D;MEDEFAIDRIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;16E6D;
+16E4E;MEDEFAIDRIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;16E6E;
+16E4F;MEDEFAIDRIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;16E6F;
+16E50;MEDEFAIDRIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;16E70;
+16E51;MEDEFAIDRIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;16E71;
+16E52;MEDEFAIDRIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;16E72;
+16E53;MEDEFAIDRIN CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;16E73;
+16E54;MEDEFAIDRIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;16E74;
+16E55;MEDEFAIDRIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;16E75;
+16E56;MEDEFAIDRIN CAPITAL LETTER HP;Lu;0;L;;;;;N;;;;16E76;
+16E57;MEDEFAIDRIN CAPITAL LETTER NY;Lu;0;L;;;;;N;;;;16E77;
+16E58;MEDEFAIDRIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;16E78;
+16E59;MEDEFAIDRIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;16E79;
+16E5A;MEDEFAIDRIN CAPITAL LETTER OE;Lu;0;L;;;;;N;;;;16E7A;
+16E5B;MEDEFAIDRIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;16E7B;
+16E5C;MEDEFAIDRIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;16E7C;
+16E5D;MEDEFAIDRIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;16E7D;
+16E5E;MEDEFAIDRIN CAPITAL LETTER AI;Lu;0;L;;;;;N;;;;16E7E;
+16E5F;MEDEFAIDRIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;16E7F;
+16E60;MEDEFAIDRIN SMALL LETTER M;Ll;0;L;;;;;N;;;16E40;;16E40
+16E61;MEDEFAIDRIN SMALL LETTER S;Ll;0;L;;;;;N;;;16E41;;16E41
+16E62;MEDEFAIDRIN SMALL LETTER V;Ll;0;L;;;;;N;;;16E42;;16E42
+16E63;MEDEFAIDRIN SMALL LETTER W;Ll;0;L;;;;;N;;;16E43;;16E43
+16E64;MEDEFAIDRIN SMALL LETTER ATIU;Ll;0;L;;;;;N;;;16E44;;16E44
+16E65;MEDEFAIDRIN SMALL LETTER Z;Ll;0;L;;;;;N;;;16E45;;16E45
+16E66;MEDEFAIDRIN SMALL LETTER KP;Ll;0;L;;;;;N;;;16E46;;16E46
+16E67;MEDEFAIDRIN SMALL LETTER P;Ll;0;L;;;;;N;;;16E47;;16E47
+16E68;MEDEFAIDRIN SMALL LETTER T;Ll;0;L;;;;;N;;;16E48;;16E48
+16E69;MEDEFAIDRIN SMALL LETTER G;Ll;0;L;;;;;N;;;16E49;;16E49
+16E6A;MEDEFAIDRIN SMALL LETTER F;Ll;0;L;;;;;N;;;16E4A;;16E4A
+16E6B;MEDEFAIDRIN SMALL LETTER I;Ll;0;L;;;;;N;;;16E4B;;16E4B
+16E6C;MEDEFAIDRIN SMALL LETTER K;Ll;0;L;;;;;N;;;16E4C;;16E4C
+16E6D;MEDEFAIDRIN SMALL LETTER A;Ll;0;L;;;;;N;;;16E4D;;16E4D
+16E6E;MEDEFAIDRIN SMALL LETTER J;Ll;0;L;;;;;N;;;16E4E;;16E4E
+16E6F;MEDEFAIDRIN SMALL LETTER E;Ll;0;L;;;;;N;;;16E4F;;16E4F
+16E70;MEDEFAIDRIN SMALL LETTER B;Ll;0;L;;;;;N;;;16E50;;16E50
+16E71;MEDEFAIDRIN SMALL LETTER C;Ll;0;L;;;;;N;;;16E51;;16E51
+16E72;MEDEFAIDRIN SMALL LETTER U;Ll;0;L;;;;;N;;;16E52;;16E52
+16E73;MEDEFAIDRIN SMALL LETTER YU;Ll;0;L;;;;;N;;;16E53;;16E53
+16E74;MEDEFAIDRIN SMALL LETTER L;Ll;0;L;;;;;N;;;16E54;;16E54
+16E75;MEDEFAIDRIN SMALL LETTER Q;Ll;0;L;;;;;N;;;16E55;;16E55
+16E76;MEDEFAIDRIN SMALL LETTER HP;Ll;0;L;;;;;N;;;16E56;;16E56
+16E77;MEDEFAIDRIN SMALL LETTER NY;Ll;0;L;;;;;N;;;16E57;;16E57
+16E78;MEDEFAIDRIN SMALL LETTER X;Ll;0;L;;;;;N;;;16E58;;16E58
+16E79;MEDEFAIDRIN SMALL LETTER D;Ll;0;L;;;;;N;;;16E59;;16E59
+16E7A;MEDEFAIDRIN SMALL LETTER OE;Ll;0;L;;;;;N;;;16E5A;;16E5A
+16E7B;MEDEFAIDRIN SMALL LETTER N;Ll;0;L;;;;;N;;;16E5B;;16E5B
+16E7C;MEDEFAIDRIN SMALL LETTER R;Ll;0;L;;;;;N;;;16E5C;;16E5C
+16E7D;MEDEFAIDRIN SMALL LETTER O;Ll;0;L;;;;;N;;;16E5D;;16E5D
+16E7E;MEDEFAIDRIN SMALL LETTER AI;Ll;0;L;;;;;N;;;16E5E;;16E5E
+16E7F;MEDEFAIDRIN SMALL LETTER Y;Ll;0;L;;;;;N;;;16E5F;;16E5F
+16E80;MEDEFAIDRIN DIGIT ZERO;No;0;L;;;;0;N;;;;;
+16E81;MEDEFAIDRIN DIGIT ONE;No;0;L;;;;1;N;;;;;
+16E82;MEDEFAIDRIN DIGIT TWO;No;0;L;;;;2;N;;;;;
+16E83;MEDEFAIDRIN DIGIT THREE;No;0;L;;;;3;N;;;;;
+16E84;MEDEFAIDRIN DIGIT FOUR;No;0;L;;;;4;N;;;;;
+16E85;MEDEFAIDRIN DIGIT FIVE;No;0;L;;;;5;N;;;;;
+16E86;MEDEFAIDRIN DIGIT SIX;No;0;L;;;;6;N;;;;;
+16E87;MEDEFAIDRIN DIGIT SEVEN;No;0;L;;;;7;N;;;;;
+16E88;MEDEFAIDRIN DIGIT EIGHT;No;0;L;;;;8;N;;;;;
+16E89;MEDEFAIDRIN DIGIT NINE;No;0;L;;;;9;N;;;;;
+16E8A;MEDEFAIDRIN NUMBER TEN;No;0;L;;;;10;N;;;;;
+16E8B;MEDEFAIDRIN NUMBER ELEVEN;No;0;L;;;;11;N;;;;;
+16E8C;MEDEFAIDRIN NUMBER TWELVE;No;0;L;;;;12;N;;;;;
+16E8D;MEDEFAIDRIN NUMBER THIRTEEN;No;0;L;;;;13;N;;;;;
+16E8E;MEDEFAIDRIN NUMBER FOURTEEN;No;0;L;;;;14;N;;;;;
+16E8F;MEDEFAIDRIN NUMBER FIFTEEN;No;0;L;;;;15;N;;;;;
+16E90;MEDEFAIDRIN NUMBER SIXTEEN;No;0;L;;;;16;N;;;;;
+16E91;MEDEFAIDRIN NUMBER SEVENTEEN;No;0;L;;;;17;N;;;;;
+16E92;MEDEFAIDRIN NUMBER EIGHTEEN;No;0;L;;;;18;N;;;;;
+16E93;MEDEFAIDRIN NUMBER NINETEEN;No;0;L;;;;19;N;;;;;
+16E94;MEDEFAIDRIN DIGIT ONE ALTERNATE FORM;No;0;L;;;;1;N;;;;;
+16E95;MEDEFAIDRIN DIGIT TWO ALTERNATE FORM;No;0;L;;;;2;N;;;;;
+16E96;MEDEFAIDRIN DIGIT THREE ALTERNATE FORM;No;0;L;;;;3;N;;;;;
+16E97;MEDEFAIDRIN COMMA;Po;0;L;;;;;N;;;;;
+16E98;MEDEFAIDRIN FULL STOP;Po;0;L;;;;;N;;;;;
+16E99;MEDEFAIDRIN SYMBOL AIVA;Po;0;L;;;;;N;;;;;
+16E9A;MEDEFAIDRIN EXCLAMATION OH;Po;0;L;;;;;N;;;;;
16F00;MIAO LETTER PA;Lo;0;L;;;;;N;;;;;
16F01;MIAO LETTER BA;Lo;0;L;;;;;N;;;;;
16F02;MIAO LETTER YI PA;Lo;0;L;;;;;N;;;;;
@@ -24355,7 +24849,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
16FE0;TANGUT ITERATION MARK;Lm;0;L;;;;;N;;;;;
16FE1;NUSHU ITERATION MARK;Lm;0;L;;;;;N;;;;;
17000;<Tangut Ideograph, First>;Lo;0;L;;;;;N;;;;;
-187EC;<Tangut Ideograph, Last>;Lo;0;L;;;;;N;;;;;
+187F1;<Tangut Ideograph, Last>;Lo;0;L;;;;;N;;;;;
18800;TANGUT COMPONENT-001;Lo;0;L;;;;;N;;;;;
18801;TANGUT COMPONENT-002;Lo;0;L;;;;;N;;;;;
18802;TANGUT COMPONENT-003;Lo;0;L;;;;;N;;;;;
@@ -26488,6 +26982,26 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;;
1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;;
1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;;
+1D2E0;MAYAN NUMERAL ZERO;No;0;L;;;;0;N;;;;;
+1D2E1;MAYAN NUMERAL ONE;No;0;L;;;;1;N;;;;;
+1D2E2;MAYAN NUMERAL TWO;No;0;L;;;;2;N;;;;;
+1D2E3;MAYAN NUMERAL THREE;No;0;L;;;;3;N;;;;;
+1D2E4;MAYAN NUMERAL FOUR;No;0;L;;;;4;N;;;;;
+1D2E5;MAYAN NUMERAL FIVE;No;0;L;;;;5;N;;;;;
+1D2E6;MAYAN NUMERAL SIX;No;0;L;;;;6;N;;;;;
+1D2E7;MAYAN NUMERAL SEVEN;No;0;L;;;;7;N;;;;;
+1D2E8;MAYAN NUMERAL EIGHT;No;0;L;;;;8;N;;;;;
+1D2E9;MAYAN NUMERAL NINE;No;0;L;;;;9;N;;;;;
+1D2EA;MAYAN NUMERAL TEN;No;0;L;;;;10;N;;;;;
+1D2EB;MAYAN NUMERAL ELEVEN;No;0;L;;;;11;N;;;;;
+1D2EC;MAYAN NUMERAL TWELVE;No;0;L;;;;12;N;;;;;
+1D2ED;MAYAN NUMERAL THIRTEEN;No;0;L;;;;13;N;;;;;
+1D2EE;MAYAN NUMERAL FOURTEEN;No;0;L;;;;14;N;;;;;
+1D2EF;MAYAN NUMERAL FIFTEEN;No;0;L;;;;15;N;;;;;
+1D2F0;MAYAN NUMERAL SIXTEEN;No;0;L;;;;16;N;;;;;
+1D2F1;MAYAN NUMERAL SEVENTEEN;No;0;L;;;;17;N;;;;;
+1D2F2;MAYAN NUMERAL EIGHTEEN;No;0;L;;;;18;N;;;;;
+1D2F3;MAYAN NUMERAL NINETEEN;No;0;L;;;;19;N;;;;;
1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;;
1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;;
@@ -26593,6 +27107,13 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;;
1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;;
1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;;
+1D372;IDEOGRAPHIC TALLY MARK ONE;No;0;L;;;;1;N;;;;;
+1D373;IDEOGRAPHIC TALLY MARK TWO;No;0;L;;;;2;N;;;;;
+1D374;IDEOGRAPHIC TALLY MARK THREE;No;0;L;;;;3;N;;;;;
+1D375;IDEOGRAPHIC TALLY MARK FOUR;No;0;L;;;;4;N;;;;;
+1D376;IDEOGRAPHIC TALLY MARK FIVE;No;0;L;;;;5;N;;;;;
+1D377;TALLY MARK ONE;No;0;L;;;;1;N;;;;;
+1D378;TALLY MARK FIVE;No;0;L;;;;5;N;;;;;
1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
@@ -28599,6 +29120,74 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1E959;ADLAM DIGIT NINE;Nd;0;R;;9;9;9;N;;;;;
1E95E;ADLAM INITIAL EXCLAMATION MARK;Po;0;R;;;;;N;;;;;
1E95F;ADLAM INITIAL QUESTION MARK;Po;0;R;;;;;N;;;;;
+1EC71;INDIC SIYAQ NUMBER ONE;No;0;AL;;;;1;N;;;;;
+1EC72;INDIC SIYAQ NUMBER TWO;No;0;AL;;;;2;N;;;;;
+1EC73;INDIC SIYAQ NUMBER THREE;No;0;AL;;;;3;N;;;;;
+1EC74;INDIC SIYAQ NUMBER FOUR;No;0;AL;;;;4;N;;;;;
+1EC75;INDIC SIYAQ NUMBER FIVE;No;0;AL;;;;5;N;;;;;
+1EC76;INDIC SIYAQ NUMBER SIX;No;0;AL;;;;6;N;;;;;
+1EC77;INDIC SIYAQ NUMBER SEVEN;No;0;AL;;;;7;N;;;;;
+1EC78;INDIC SIYAQ NUMBER EIGHT;No;0;AL;;;;8;N;;;;;
+1EC79;INDIC SIYAQ NUMBER NINE;No;0;AL;;;;9;N;;;;;
+1EC7A;INDIC SIYAQ NUMBER TEN;No;0;AL;;;;10;N;;;;;
+1EC7B;INDIC SIYAQ NUMBER TWENTY;No;0;AL;;;;20;N;;;;;
+1EC7C;INDIC SIYAQ NUMBER THIRTY;No;0;AL;;;;30;N;;;;;
+1EC7D;INDIC SIYAQ NUMBER FORTY;No;0;AL;;;;40;N;;;;;
+1EC7E;INDIC SIYAQ NUMBER FIFTY;No;0;AL;;;;50;N;;;;;
+1EC7F;INDIC SIYAQ NUMBER SIXTY;No;0;AL;;;;60;N;;;;;
+1EC80;INDIC SIYAQ NUMBER SEVENTY;No;0;AL;;;;70;N;;;;;
+1EC81;INDIC SIYAQ NUMBER EIGHTY;No;0;AL;;;;80;N;;;;;
+1EC82;INDIC SIYAQ NUMBER NINETY;No;0;AL;;;;90;N;;;;;
+1EC83;INDIC SIYAQ NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;;
+1EC84;INDIC SIYAQ NUMBER TWO HUNDRED;No;0;AL;;;;200;N;;;;;
+1EC85;INDIC SIYAQ NUMBER THREE HUNDRED;No;0;AL;;;;300;N;;;;;
+1EC86;INDIC SIYAQ NUMBER FOUR HUNDRED;No;0;AL;;;;400;N;;;;;
+1EC87;INDIC SIYAQ NUMBER FIVE HUNDRED;No;0;AL;;;;500;N;;;;;
+1EC88;INDIC SIYAQ NUMBER SIX HUNDRED;No;0;AL;;;;600;N;;;;;
+1EC89;INDIC SIYAQ NUMBER SEVEN HUNDRED;No;0;AL;;;;700;N;;;;;
+1EC8A;INDIC SIYAQ NUMBER EIGHT HUNDRED;No;0;AL;;;;800;N;;;;;
+1EC8B;INDIC SIYAQ NUMBER NINE HUNDRED;No;0;AL;;;;900;N;;;;;
+1EC8C;INDIC SIYAQ NUMBER ONE THOUSAND;No;0;AL;;;;1000;N;;;;;
+1EC8D;INDIC SIYAQ NUMBER TWO THOUSAND;No;0;AL;;;;2000;N;;;;;
+1EC8E;INDIC SIYAQ NUMBER THREE THOUSAND;No;0;AL;;;;3000;N;;;;;
+1EC8F;INDIC SIYAQ NUMBER FOUR THOUSAND;No;0;AL;;;;4000;N;;;;;
+1EC90;INDIC SIYAQ NUMBER FIVE THOUSAND;No;0;AL;;;;5000;N;;;;;
+1EC91;INDIC SIYAQ NUMBER SIX THOUSAND;No;0;AL;;;;6000;N;;;;;
+1EC92;INDIC SIYAQ NUMBER SEVEN THOUSAND;No;0;AL;;;;7000;N;;;;;
+1EC93;INDIC SIYAQ NUMBER EIGHT THOUSAND;No;0;AL;;;;8000;N;;;;;
+1EC94;INDIC SIYAQ NUMBER NINE THOUSAND;No;0;AL;;;;9000;N;;;;;
+1EC95;INDIC SIYAQ NUMBER TEN THOUSAND;No;0;AL;;;;10000;N;;;;;
+1EC96;INDIC SIYAQ NUMBER TWENTY THOUSAND;No;0;AL;;;;20000;N;;;;;
+1EC97;INDIC SIYAQ NUMBER THIRTY THOUSAND;No;0;AL;;;;30000;N;;;;;
+1EC98;INDIC SIYAQ NUMBER FORTY THOUSAND;No;0;AL;;;;40000;N;;;;;
+1EC99;INDIC SIYAQ NUMBER FIFTY THOUSAND;No;0;AL;;;;50000;N;;;;;
+1EC9A;INDIC SIYAQ NUMBER SIXTY THOUSAND;No;0;AL;;;;60000;N;;;;;
+1EC9B;INDIC SIYAQ NUMBER SEVENTY THOUSAND;No;0;AL;;;;70000;N;;;;;
+1EC9C;INDIC SIYAQ NUMBER EIGHTY THOUSAND;No;0;AL;;;;80000;N;;;;;
+1EC9D;INDIC SIYAQ NUMBER NINETY THOUSAND;No;0;AL;;;;90000;N;;;;;
+1EC9E;INDIC SIYAQ NUMBER LAKH;No;0;AL;;;;100000;N;;;;;
+1EC9F;INDIC SIYAQ NUMBER LAKHAN;No;0;AL;;;;200000;N;;;;;
+1ECA0;INDIC SIYAQ LAKH MARK;No;0;AL;;;;100000;N;;;;;
+1ECA1;INDIC SIYAQ NUMBER KAROR;No;0;AL;;;;10000000;N;;;;;
+1ECA2;INDIC SIYAQ NUMBER KARORAN;No;0;AL;;;;20000000;N;;;;;
+1ECA3;INDIC SIYAQ NUMBER PREFIXED ONE;No;0;AL;;;;1;N;;;;;
+1ECA4;INDIC SIYAQ NUMBER PREFIXED TWO;No;0;AL;;;;2;N;;;;;
+1ECA5;INDIC SIYAQ NUMBER PREFIXED THREE;No;0;AL;;;;3;N;;;;;
+1ECA6;INDIC SIYAQ NUMBER PREFIXED FOUR;No;0;AL;;;;4;N;;;;;
+1ECA7;INDIC SIYAQ NUMBER PREFIXED FIVE;No;0;AL;;;;5;N;;;;;
+1ECA8;INDIC SIYAQ NUMBER PREFIXED SIX;No;0;AL;;;;6;N;;;;;
+1ECA9;INDIC SIYAQ NUMBER PREFIXED SEVEN;No;0;AL;;;;7;N;;;;;
+1ECAA;INDIC SIYAQ NUMBER PREFIXED EIGHT;No;0;AL;;;;8;N;;;;;
+1ECAB;INDIC SIYAQ NUMBER PREFIXED NINE;No;0;AL;;;;9;N;;;;;
+1ECAC;INDIC SIYAQ PLACEHOLDER;So;0;AL;;;;;N;;;;;
+1ECAD;INDIC SIYAQ FRACTION ONE QUARTER;No;0;AL;;;;1/4;N;;;;;
+1ECAE;INDIC SIYAQ FRACTION ONE HALF;No;0;AL;;;;1/2;N;;;;;
+1ECAF;INDIC SIYAQ FRACTION THREE QUARTERS;No;0;AL;;;;3/4;N;;;;;
+1ECB0;INDIC SIYAQ RUPEE MARK;Sc;0;AL;;;;;N;;;;;
+1ECB1;INDIC SIYAQ NUMBER ALTERNATE ONE;No;0;AL;;;;1;N;;;;;
+1ECB2;INDIC SIYAQ NUMBER ALTERNATE TWO;No;0;AL;;;;2;N;;;;;
+1ECB3;INDIC SIYAQ NUMBER ALTERNATE TEN THOUSAND;No;0;AL;;;;10000;N;;;;;
+1ECB4;INDIC SIYAQ ALTERNATE LAKH MARK;No;0;AL;;;;100000;N;;;;;
1EE00;ARABIC MATHEMATICAL ALEF;Lo;0;AL;<font> 0627;;;;N;;;;;
1EE01;ARABIC MATHEMATICAL BEH;Lo;0;AL;<font> 0628;;;;N;;;;;
1EE02;ARABIC MATHEMATICAL JEEM;Lo;0;AL;<font> 062C;;;;N;;;;;
@@ -29012,6 +29601,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F12C;CIRCLED ITALIC LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;;
1F12D;CIRCLED CD;So;0;L;<circle> 0043 0044;;;;N;;;;;
1F12E;CIRCLED WZ;So;0;L;<circle> 0057 005A;;;;N;;;;;
+1F12F;COPYLEFT SYMBOL;So;0;ON;;;;;N;;;;;
1F130;SQUARED LATIN CAPITAL LETTER A;So;0;L;<square> 0041;;;;N;;;;;
1F131;SQUARED LATIN CAPITAL LETTER B;So;0;L;<square> 0042;;;;N;;;;;
1F132;SQUARED LATIN CAPITAL LETTER C;So;0;L;<square> 0043;;;;N;;;;;
@@ -30226,6 +30816,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F6F6;CANOE;So;0;ON;;;;;N;;;;;
1F6F7;SLED;So;0;ON;;;;;N;;;;;
1F6F8;FLYING SAUCER;So;0;ON;;;;;N;;;;;
+1F6F9;SKATEBOARD;So;0;ON;;;;;N;;;;;
1F700;ALCHEMICAL SYMBOL FOR QUINTESSENCE;So;0;ON;;;;;N;;;;;
1F701;ALCHEMICAL SYMBOL FOR AIR;So;0;ON;;;;;N;;;;;
1F702;ALCHEMICAL SYMBOL FOR FIRE;So;0;ON;;;;;N;;;;;
@@ -30427,6 +31018,10 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F7D2;LIGHT TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
1F7D3;HEAVY TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
1F7D4;HEAVY TWELVE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+1F7D5;CIRCLED TRIANGLE;So;0;ON;;;;;N;;;;;
+1F7D6;NEGATIVE CIRCLED TRIANGLE;So;0;ON;;;;;N;;;;;
+1F7D7;CIRCLED SQUARE;So;0;ON;;;;;N;;;;;
+1F7D8;NEGATIVE CIRCLED SQUARE;So;0;ON;;;;;N;;;;;
1F800;LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
1F801;UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
1F802;RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
@@ -30647,6 +31242,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F94A;BOXING GLOVE;So;0;ON;;;;;N;;;;;
1F94B;MARTIAL ARTS UNIFORM;So;0;ON;;;;;N;;;;;
1F94C;CURLING STONE;So;0;ON;;;;;N;;;;;
+1F94D;LACROSSE STICK AND BALL;So;0;ON;;;;;N;;;;;
+1F94E;SOFTBALL;So;0;ON;;;;;N;;;;;
+1F94F;FLYING DISC;So;0;ON;;;;;N;;;;;
1F950;CROISSANT;So;0;ON;;;;;N;;;;;
1F951;AVOCADO;So;0;ON;;;;;N;;;;;
1F952;CUCUMBER;So;0;ON;;;;;N;;;;;
@@ -30675,6 +31273,20 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F969;CUT OF MEAT;So;0;ON;;;;;N;;;;;
1F96A;SANDWICH;So;0;ON;;;;;N;;;;;
1F96B;CANNED FOOD;So;0;ON;;;;;N;;;;;
+1F96C;LEAFY GREEN;So;0;ON;;;;;N;;;;;
+1F96D;MANGO;So;0;ON;;;;;N;;;;;
+1F96E;MOON CAKE;So;0;ON;;;;;N;;;;;
+1F96F;BAGEL;So;0;ON;;;;;N;;;;;
+1F970;SMILING FACE WITH SMILING EYES AND THREE HEARTS;So;0;ON;;;;;N;;;;;
+1F973;FACE WITH PARTY HORN AND PARTY HAT;So;0;ON;;;;;N;;;;;
+1F974;FACE WITH UNEVEN EYES AND WAVY MOUTH;So;0;ON;;;;;N;;;;;
+1F975;OVERHEATED FACE;So;0;ON;;;;;N;;;;;
+1F976;FREEZING FACE;So;0;ON;;;;;N;;;;;
+1F97A;FACE WITH PLEADING EYES;So;0;ON;;;;;N;;;;;
+1F97C;LAB COAT;So;0;ON;;;;;N;;;;;
+1F97D;GOGGLES;So;0;ON;;;;;N;;;;;
+1F97E;HIKING BOOT;So;0;ON;;;;;N;;;;;
+1F97F;FLAT SHOE;So;0;ON;;;;;N;;;;;
1F980;CRAB;So;0;ON;;;;;N;;;;;
1F981;LION FACE;So;0;ON;;;;;N;;;;;
1F982;SCORPION;So;0;ON;;;;;N;;;;;
@@ -30699,7 +31311,30 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F995;SAUROPOD;So;0;ON;;;;;N;;;;;
1F996;T-REX;So;0;ON;;;;;N;;;;;
1F997;CRICKET;So;0;ON;;;;;N;;;;;
+1F998;KANGAROO;So;0;ON;;;;;N;;;;;
+1F999;LLAMA;So;0;ON;;;;;N;;;;;
+1F99A;PEACOCK;So;0;ON;;;;;N;;;;;
+1F99B;HIPPOPOTAMUS;So;0;ON;;;;;N;;;;;
+1F99C;PARROT;So;0;ON;;;;;N;;;;;
+1F99D;RACCOON;So;0;ON;;;;;N;;;;;
+1F99E;LOBSTER;So;0;ON;;;;;N;;;;;
+1F99F;MOSQUITO;So;0;ON;;;;;N;;;;;
+1F9A0;MICROBE;So;0;ON;;;;;N;;;;;
+1F9A1;BADGER;So;0;ON;;;;;N;;;;;
+1F9A2;SWAN;So;0;ON;;;;;N;;;;;
+1F9B0;EMOJI COMPONENT RED HAIR;So;0;ON;;;;;N;;;;;
+1F9B1;EMOJI COMPONENT CURLY HAIR;So;0;ON;;;;;N;;;;;
+1F9B2;EMOJI COMPONENT BALD;So;0;ON;;;;;N;;;;;
+1F9B3;EMOJI COMPONENT WHITE HAIR;So;0;ON;;;;;N;;;;;
+1F9B4;BONE;So;0;ON;;;;;N;;;;;
+1F9B5;LEG;So;0;ON;;;;;N;;;;;
+1F9B6;FOOT;So;0;ON;;;;;N;;;;;
+1F9B7;TOOTH;So;0;ON;;;;;N;;;;;
+1F9B8;SUPERHERO;So;0;ON;;;;;N;;;;;
+1F9B9;SUPERVILLAIN;So;0;ON;;;;;N;;;;;
1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;;
+1F9C1;CUPCAKE;So;0;ON;;;;;N;;;;;
+1F9C2;SALT SHAKER;So;0;ON;;;;;N;;;;;
1F9D0;FACE WITH MONOCLE;So;0;ON;;;;;N;;;;;
1F9D1;ADULT;So;0;ON;;;;;N;;;;;
1F9D2;CHILD;So;0;ON;;;;;N;;;;;
@@ -30723,6 +31358,45 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F9E4;GLOVES;So;0;ON;;;;;N;;;;;
1F9E5;COAT;So;0;ON;;;;;N;;;;;
1F9E6;SOCKS;So;0;ON;;;;;N;;;;;
+1F9E7;RED GIFT ENVELOPE;So;0;ON;;;;;N;;;;;
+1F9E8;FIRECRACKER;So;0;ON;;;;;N;;;;;
+1F9E9;JIGSAW PUZZLE PIECE;So;0;ON;;;;;N;;;;;
+1F9EA;TEST TUBE;So;0;ON;;;;;N;;;;;
+1F9EB;PETRI DISH;So;0;ON;;;;;N;;;;;
+1F9EC;DNA DOUBLE HELIX;So;0;ON;;;;;N;;;;;
+1F9ED;COMPASS;So;0;ON;;;;;N;;;;;
+1F9EE;ABACUS;So;0;ON;;;;;N;;;;;
+1F9EF;FIRE EXTINGUISHER;So;0;ON;;;;;N;;;;;
+1F9F0;TOOLBOX;So;0;ON;;;;;N;;;;;
+1F9F1;BRICK;So;0;ON;;;;;N;;;;;
+1F9F2;MAGNET;So;0;ON;;;;;N;;;;;
+1F9F3;LUGGAGE;So;0;ON;;;;;N;;;;;
+1F9F4;LOTION BOTTLE;So;0;ON;;;;;N;;;;;
+1F9F5;SPOOL OF THREAD;So;0;ON;;;;;N;;;;;
+1F9F6;BALL OF YARN;So;0;ON;;;;;N;;;;;
+1F9F7;SAFETY PIN;So;0;ON;;;;;N;;;;;
+1F9F8;TEDDY BEAR;So;0;ON;;;;;N;;;;;
+1F9F9;BROOM;So;0;ON;;;;;N;;;;;
+1F9FA;BASKET;So;0;ON;;;;;N;;;;;
+1F9FB;ROLL OF PAPER;So;0;ON;;;;;N;;;;;
+1F9FC;BAR OF SOAP;So;0;ON;;;;;N;;;;;
+1F9FD;SPONGE;So;0;ON;;;;;N;;;;;
+1F9FE;RECEIPT;So;0;ON;;;;;N;;;;;
+1F9FF;NAZAR AMULET;So;0;ON;;;;;N;;;;;
+1FA60;XIANGQI RED GENERAL;So;0;ON;;;;;N;;;;;
+1FA61;XIANGQI RED MANDARIN;So;0;ON;;;;;N;;;;;
+1FA62;XIANGQI RED ELEPHANT;So;0;ON;;;;;N;;;;;
+1FA63;XIANGQI RED HORSE;So;0;ON;;;;;N;;;;;
+1FA64;XIANGQI RED CHARIOT;So;0;ON;;;;;N;;;;;
+1FA65;XIANGQI RED CANNON;So;0;ON;;;;;N;;;;;
+1FA66;XIANGQI RED SOLDIER;So;0;ON;;;;;N;;;;;
+1FA67;XIANGQI BLACK GENERAL;So;0;ON;;;;;N;;;;;
+1FA68;XIANGQI BLACK MANDARIN;So;0;ON;;;;;N;;;;;
+1FA69;XIANGQI BLACK ELEPHANT;So;0;ON;;;;;N;;;;;
+1FA6A;XIANGQI BLACK HORSE;So;0;ON;;;;;N;;;;;
+1FA6B;XIANGQI BLACK CHARIOT;So;0;ON;;;;;N;;;;;
+1FA6C;XIANGQI BLACK CANNON;So;0;ON;;;;;N;;;;;
+1FA6D;XIANGQI BLACK SOLDIER;So;0;ON;;;;;N;;;;;
20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;;
2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;;
2A700;<CJK Ideograph Extension C, First>;Lo;0;L;;;;;N;;;;;
diff --git a/lib/stdlib/uc_spec/emoji-data.txt b/lib/stdlib/uc_spec/emoji-data.txt
new file mode 100644
index 0000000000..6e66455252
--- /dev/null
+++ b/lib/stdlib/uc_spec/emoji-data.txt
@@ -0,0 +1,714 @@
+# emoji-data.txt
+# Date: 2018-02-07, 07:55:18 GMT
+# ยฉ 2018 Unicodeยฎ, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Emoji Data for UTS #51
+# Version: 11.0
+#
+# For documentation and usage, see http://www.unicode.org/reports/tr51
+#
+# Format:
+# <codepoint(s)> ; <property> # <comments>
+# Note: there is no guarantee as to the structure of whitespace or comments
+#
+# Characters and sequences are listed in code point order. Users should be shown a more natural order.
+# See the CLDR collation order for Emoji.
+
+
+# ================================================
+
+# All omitted code points have Emoji=No
+# @missing: 0000..10FFFF ; Emoji ; No
+
+0023 ; Emoji # 1.1 [1] (#๏ธ) number sign
+002A ; Emoji # 1.1 [1] (*๏ธ) asterisk
+0030..0039 ; Emoji # 1.1 [10] (0๏ธ..9๏ธ) digit zero..digit nine
+00A9 ; Emoji # 1.1 [1] (ยฉ๏ธ) copyright
+00AE ; Emoji # 1.1 [1] (ยฎ๏ธ) registered
+203C ; Emoji # 1.1 [1] (โ€ผ๏ธ) double exclamation mark
+2049 ; Emoji # 3.0 [1] (โ‰๏ธ) exclamation question mark
+2122 ; Emoji # 1.1 [1] (โ„ข๏ธ) trade mark
+2139 ; Emoji # 3.0 [1] (โ„น๏ธ) information
+2194..2199 ; Emoji # 1.1 [6] (โ†”๏ธ..โ†™๏ธ) left-right arrow..down-left arrow
+21A9..21AA ; Emoji # 1.1 [2] (โ†ฉ๏ธ..โ†ช๏ธ) right arrow curving left..left arrow curving right
+231A..231B ; Emoji # 1.1 [2] (โŒš..โŒ›) watch..hourglass done
+2328 ; Emoji # 1.1 [1] (โŒจ๏ธ) keyboard
+23CF ; Emoji # 4.0 [1] (โ๏ธ) eject button
+23E9..23F3 ; Emoji # 6.0 [11] (โฉ..โณ) fast-forward button..hourglass not done
+23F8..23FA ; Emoji # 7.0 [3] (โธ๏ธ..โบ๏ธ) pause button..record button
+24C2 ; Emoji # 1.1 [1] (โ“‚๏ธ) circled M
+25AA..25AB ; Emoji # 1.1 [2] (โ–ช๏ธ..โ–ซ๏ธ) black small square..white small square
+25B6 ; Emoji # 1.1 [1] (โ–ถ๏ธ) play button
+25C0 ; Emoji # 1.1 [1] (โ—€๏ธ) reverse button
+25FB..25FE ; Emoji # 3.2 [4] (โ—ป๏ธ..โ—พ) white medium square..black medium-small square
+2600..2604 ; Emoji # 1.1 [5] (โ˜€๏ธ..โ˜„๏ธ) sun..comet
+260E ; Emoji # 1.1 [1] (โ˜Ž๏ธ) telephone
+2611 ; Emoji # 1.1 [1] (โ˜‘๏ธ) ballot box with check
+2614..2615 ; Emoji # 4.0 [2] (โ˜”..โ˜•) umbrella with rain drops..hot beverage
+2618 ; Emoji # 4.1 [1] (โ˜˜๏ธ) shamrock
+261D ; Emoji # 1.1 [1] (โ˜๏ธ) index pointing up
+2620 ; Emoji # 1.1 [1] (โ˜ ๏ธ) skull and crossbones
+2622..2623 ; Emoji # 1.1 [2] (โ˜ข๏ธ..โ˜ฃ๏ธ) radioactive..biohazard
+2626 ; Emoji # 1.1 [1] (โ˜ฆ๏ธ) orthodox cross
+262A ; Emoji # 1.1 [1] (โ˜ช๏ธ) star and crescent
+262E..262F ; Emoji # 1.1 [2] (โ˜ฎ๏ธ..โ˜ฏ๏ธ) peace symbol..yin yang
+2638..263A ; Emoji # 1.1 [3] (โ˜ธ๏ธ..โ˜บ๏ธ) wheel of dharma..smiling face
+2640 ; Emoji # 1.1 [1] (โ™€๏ธ) female sign
+2642 ; Emoji # 1.1 [1] (โ™‚๏ธ) male sign
+2648..2653 ; Emoji # 1.1 [12] (โ™ˆ..โ™“) Aries..Pisces
+265F..2660 ; Emoji # 1.1 [2] (โ™Ÿ๏ธ..โ™ ๏ธ) chess pawn..spade suit
+2663 ; Emoji # 1.1 [1] (โ™ฃ๏ธ) club suit
+2665..2666 ; Emoji # 1.1 [2] (โ™ฅ๏ธ..โ™ฆ๏ธ) heart suit..diamond suit
+2668 ; Emoji # 1.1 [1] (โ™จ๏ธ) hot springs
+267B ; Emoji # 3.2 [1] (โ™ป๏ธ) recycling symbol
+267E..267F ; Emoji # 4.1 [2] (โ™พ๏ธ..โ™ฟ) infinity..wheelchair symbol
+2692..2697 ; Emoji # 4.1 [6] (โš’๏ธ..โš—๏ธ) hammer and pick..alembic
+2699 ; Emoji # 4.1 [1] (โš™๏ธ) gear
+269B..269C ; Emoji # 4.1 [2] (โš›๏ธ..โšœ๏ธ) atom symbol..fleur-de-lis
+26A0..26A1 ; Emoji # 4.0 [2] (โš ๏ธ..โšก) warning..high voltage
+26AA..26AB ; Emoji # 4.1 [2] (โšช..โšซ) white circle..black circle
+26B0..26B1 ; Emoji # 4.1 [2] (โšฐ๏ธ..โšฑ๏ธ) coffin..funeral urn
+26BD..26BE ; Emoji # 5.2 [2] (โšฝ..โšพ) soccer ball..baseball
+26C4..26C5 ; Emoji # 5.2 [2] (โ›„..โ›…) snowman without snow..sun behind cloud
+26C8 ; Emoji # 5.2 [1] (โ›ˆ๏ธ) cloud with lightning and rain
+26CE ; Emoji # 6.0 [1] (โ›Ž) Ophiuchus
+26CF ; Emoji # 5.2 [1] (โ›๏ธ) pick
+26D1 ; Emoji # 5.2 [1] (โ›‘๏ธ) rescue workerโ€™s helmet
+26D3..26D4 ; Emoji # 5.2 [2] (โ›“๏ธ..โ›”) chains..no entry
+26E9..26EA ; Emoji # 5.2 [2] (โ›ฉ๏ธ..โ›ช) shinto shrine..church
+26F0..26F5 ; Emoji # 5.2 [6] (โ›ฐ๏ธ..โ›ต) mountain..sailboat
+26F7..26FA ; Emoji # 5.2 [4] (โ›ท๏ธ..โ›บ) skier..tent
+26FD ; Emoji # 5.2 [1] (โ›ฝ) fuel pump
+2702 ; Emoji # 1.1 [1] (โœ‚๏ธ) scissors
+2705 ; Emoji # 6.0 [1] (โœ…) white heavy check mark
+2708..2709 ; Emoji # 1.1 [2] (โœˆ๏ธ..โœ‰๏ธ) airplane..envelope
+270A..270B ; Emoji # 6.0 [2] (โœŠ..โœ‹) raised fist..raised hand
+270C..270D ; Emoji # 1.1 [2] (โœŒ๏ธ..โœ๏ธ) victory hand..writing hand
+270F ; Emoji # 1.1 [1] (โœ๏ธ) pencil
+2712 ; Emoji # 1.1 [1] (โœ’๏ธ) black nib
+2714 ; Emoji # 1.1 [1] (โœ”๏ธ) heavy check mark
+2716 ; Emoji # 1.1 [1] (โœ–๏ธ) heavy multiplication x
+271D ; Emoji # 1.1 [1] (โœ๏ธ) latin cross
+2721 ; Emoji # 1.1 [1] (โœก๏ธ) star of David
+2728 ; Emoji # 6.0 [1] (โœจ) sparkles
+2733..2734 ; Emoji # 1.1 [2] (โœณ๏ธ..โœด๏ธ) eight-spoked asterisk..eight-pointed star
+2744 ; Emoji # 1.1 [1] (โ„๏ธ) snowflake
+2747 ; Emoji # 1.1 [1] (โ‡๏ธ) sparkle
+274C ; Emoji # 6.0 [1] (โŒ) cross mark
+274E ; Emoji # 6.0 [1] (โŽ) cross mark button
+2753..2755 ; Emoji # 6.0 [3] (โ“..โ•) question mark..white exclamation mark
+2757 ; Emoji # 5.2 [1] (โ—) exclamation mark
+2763..2764 ; Emoji # 1.1 [2] (โฃ๏ธ..โค๏ธ) heavy heart exclamation..red heart
+2795..2797 ; Emoji # 6.0 [3] (โž•..โž—) heavy plus sign..heavy division sign
+27A1 ; Emoji # 1.1 [1] (โžก๏ธ) right arrow
+27B0 ; Emoji # 6.0 [1] (โžฐ) curly loop
+27BF ; Emoji # 6.0 [1] (โžฟ) double curly loop
+2934..2935 ; Emoji # 3.2 [2] (โคด๏ธ..โคต๏ธ) right arrow curving up..right arrow curving down
+2B05..2B07 ; Emoji # 4.0 [3] (โฌ…๏ธ..โฌ‡๏ธ) left arrow..down arrow
+2B1B..2B1C ; Emoji # 5.1 [2] (โฌ›..โฌœ) black large square..white large square
+2B50 ; Emoji # 5.1 [1] (โญ) star
+2B55 ; Emoji # 5.2 [1] (โญ•) heavy large circle
+3030 ; Emoji # 1.1 [1] (ใ€ฐ๏ธ) wavy dash
+303D ; Emoji # 3.2 [1] (ใ€ฝ๏ธ) part alternation mark
+3297 ; Emoji # 1.1 [1] (ใŠ—๏ธ) Japanese โ€œcongratulationsโ€ button
+3299 ; Emoji # 1.1 [1] (ใŠ™๏ธ) Japanese โ€œsecretโ€ button
+1F004 ; Emoji # 5.1 [1] (๐Ÿ€„) mahjong red dragon
+1F0CF ; Emoji # 6.0 [1] (๐Ÿƒ) joker
+1F170..1F171 ; Emoji # 6.0 [2] (๐Ÿ…ฐ๏ธ..๐Ÿ…ฑ๏ธ) A button (blood type)..B button (blood type)
+1F17E ; Emoji # 6.0 [1] (๐Ÿ…พ๏ธ) O button (blood type)
+1F17F ; Emoji # 5.2 [1] (๐Ÿ…ฟ๏ธ) P button
+1F18E ; Emoji # 6.0 [1] (๐Ÿ†Ž) AB button (blood type)
+1F191..1F19A ; Emoji # 6.0 [10] (๐Ÿ†‘..๐Ÿ†š) CL button..VS button
+1F1E6..1F1FF ; Emoji # 6.0 [26] (๐Ÿ‡ฆ..๐Ÿ‡ฟ) regional indicator symbol letter a..regional indicator symbol letter z
+1F201..1F202 ; Emoji # 6.0 [2] (๐Ÿˆ..๐Ÿˆ‚๏ธ) Japanese โ€œhereโ€ button..Japanese โ€œservice chargeโ€ button
+1F21A ; Emoji # 5.2 [1] (๐Ÿˆš) Japanese โ€œfree of chargeโ€ button
+1F22F ; Emoji # 5.2 [1] (๐Ÿˆฏ) Japanese โ€œreservedโ€ button
+1F232..1F23A ; Emoji # 6.0 [9] (๐Ÿˆฒ..๐Ÿˆบ) Japanese โ€œprohibitedโ€ button..Japanese โ€œopen for businessโ€ button
+1F250..1F251 ; Emoji # 6.0 [2] (๐Ÿ‰..๐Ÿ‰‘) Japanese โ€œbargainโ€ button..Japanese โ€œacceptableโ€ button
+1F300..1F320 ; Emoji # 6.0 [33] (๐ŸŒ€..๐ŸŒ ) cyclone..shooting star
+1F321 ; Emoji # 7.0 [1] (๐ŸŒก๏ธ) thermometer
+1F324..1F32C ; Emoji # 7.0 [9] (๐ŸŒค๏ธ..๐ŸŒฌ๏ธ) sun behind small cloud..wind face
+1F32D..1F32F ; Emoji # 8.0 [3] (๐ŸŒญ..๐ŸŒฏ) hot dog..burrito
+1F330..1F335 ; Emoji # 6.0 [6] (๐ŸŒฐ..๐ŸŒต) chestnut..cactus
+1F336 ; Emoji # 7.0 [1] (๐ŸŒถ๏ธ) hot pepper
+1F337..1F37C ; Emoji # 6.0 [70] (๐ŸŒท..๐Ÿผ) tulip..baby bottle
+1F37D ; Emoji # 7.0 [1] (๐Ÿฝ๏ธ) fork and knife with plate
+1F37E..1F37F ; Emoji # 8.0 [2] (๐Ÿพ..๐Ÿฟ) bottle with popping cork..popcorn
+1F380..1F393 ; Emoji # 6.0 [20] (๐ŸŽ€..๐ŸŽ“) ribbon..graduation cap
+1F396..1F397 ; Emoji # 7.0 [2] (๐ŸŽ–๏ธ..๐ŸŽ—๏ธ) military medal..reminder ribbon
+1F399..1F39B ; Emoji # 7.0 [3] (๐ŸŽ™๏ธ..๐ŸŽ›๏ธ) studio microphone..control knobs
+1F39E..1F39F ; Emoji # 7.0 [2] (๐ŸŽž๏ธ..๐ŸŽŸ๏ธ) film frames..admission tickets
+1F3A0..1F3C4 ; Emoji # 6.0 [37] (๐ŸŽ ..๐Ÿ„) carousel horse..person surfing
+1F3C5 ; Emoji # 7.0 [1] (๐Ÿ…) sports medal
+1F3C6..1F3CA ; Emoji # 6.0 [5] (๐Ÿ†..๐ŸŠ) trophy..person swimming
+1F3CB..1F3CE ; Emoji # 7.0 [4] (๐Ÿ‹๏ธ..๐ŸŽ๏ธ) person lifting weights..racing car
+1F3CF..1F3D3 ; Emoji # 8.0 [5] (๐Ÿ..๐Ÿ“) cricket game..ping pong
+1F3D4..1F3DF ; Emoji # 7.0 [12] (๐Ÿ”๏ธ..๐ŸŸ๏ธ) snow-capped mountain..stadium
+1F3E0..1F3F0 ; Emoji # 6.0 [17] (๐Ÿ ..๐Ÿฐ) house..castle
+1F3F3..1F3F5 ; Emoji # 7.0 [3] (๐Ÿณ๏ธ..๐Ÿต๏ธ) white flag..rosette
+1F3F7 ; Emoji # 7.0 [1] (๐Ÿท๏ธ) label
+1F3F8..1F3FF ; Emoji # 8.0 [8] (๐Ÿธ..๐Ÿฟ) badminton..dark skin tone
+1F400..1F43E ; Emoji # 6.0 [63] (๐Ÿ€..๐Ÿพ) rat..paw prints
+1F43F ; Emoji # 7.0 [1] (๐Ÿฟ๏ธ) chipmunk
+1F440 ; Emoji # 6.0 [1] (๐Ÿ‘€) eyes
+1F441 ; Emoji # 7.0 [1] (๐Ÿ‘๏ธ) eye
+1F442..1F4F7 ; Emoji # 6.0[182] (๐Ÿ‘‚..๐Ÿ“ท) ear..camera
+1F4F8 ; Emoji # 7.0 [1] (๐Ÿ“ธ) camera with flash
+1F4F9..1F4FC ; Emoji # 6.0 [4] (๐Ÿ“น..๐Ÿ“ผ) video camera..videocassette
+1F4FD ; Emoji # 7.0 [1] (๐Ÿ“ฝ๏ธ) film projector
+1F4FF ; Emoji # 8.0 [1] (๐Ÿ“ฟ) prayer beads
+1F500..1F53D ; Emoji # 6.0 [62] (๐Ÿ”€..๐Ÿ”ฝ) shuffle tracks button..downwards button
+1F549..1F54A ; Emoji # 7.0 [2] (๐Ÿ•‰๏ธ..๐Ÿ•Š๏ธ) om..dove
+1F54B..1F54E ; Emoji # 8.0 [4] (๐Ÿ•‹..๐Ÿ•Ž) kaaba..menorah
+1F550..1F567 ; Emoji # 6.0 [24] (๐Ÿ•..๐Ÿ•ง) one oโ€™clock..twelve-thirty
+1F56F..1F570 ; Emoji # 7.0 [2] (๐Ÿ•ฏ๏ธ..๐Ÿ•ฐ๏ธ) candle..mantelpiece clock
+1F573..1F579 ; Emoji # 7.0 [7] (๐Ÿ•ณ๏ธ..๐Ÿ•น๏ธ) hole..joystick
+1F57A ; Emoji # 9.0 [1] (๐Ÿ•บ) man dancing
+1F587 ; Emoji # 7.0 [1] (๐Ÿ–‡๏ธ) linked paperclips
+1F58A..1F58D ; Emoji # 7.0 [4] (๐Ÿ–Š๏ธ..๐Ÿ–๏ธ) pen..crayon
+1F590 ; Emoji # 7.0 [1] (๐Ÿ–๏ธ) hand with fingers splayed
+1F595..1F596 ; Emoji # 7.0 [2] (๐Ÿ–•..๐Ÿ––) middle finger..vulcan salute
+1F5A4 ; Emoji # 9.0 [1] (๐Ÿ–ค) black heart
+1F5A5 ; Emoji # 7.0 [1] (๐Ÿ–ฅ๏ธ) desktop computer
+1F5A8 ; Emoji # 7.0 [1] (๐Ÿ–จ๏ธ) printer
+1F5B1..1F5B2 ; Emoji # 7.0 [2] (๐Ÿ–ฑ๏ธ..๐Ÿ–ฒ๏ธ) computer mouse..trackball
+1F5BC ; Emoji # 7.0 [1] (๐Ÿ–ผ๏ธ) framed picture
+1F5C2..1F5C4 ; Emoji # 7.0 [3] (๐Ÿ—‚๏ธ..๐Ÿ—„๏ธ) card index dividers..file cabinet
+1F5D1..1F5D3 ; Emoji # 7.0 [3] (๐Ÿ—‘๏ธ..๐Ÿ—“๏ธ) wastebasket..spiral calendar
+1F5DC..1F5DE ; Emoji # 7.0 [3] (๐Ÿ—œ๏ธ..๐Ÿ—ž๏ธ) clamp..rolled-up newspaper
+1F5E1 ; Emoji # 7.0 [1] (๐Ÿ—ก๏ธ) dagger
+1F5E3 ; Emoji # 7.0 [1] (๐Ÿ—ฃ๏ธ) speaking head
+1F5E8 ; Emoji # 7.0 [1] (๐Ÿ—จ๏ธ) left speech bubble
+1F5EF ; Emoji # 7.0 [1] (๐Ÿ—ฏ๏ธ) right anger bubble
+1F5F3 ; Emoji # 7.0 [1] (๐Ÿ—ณ๏ธ) ballot box with ballot
+1F5FA ; Emoji # 7.0 [1] (๐Ÿ—บ๏ธ) world map
+1F5FB..1F5FF ; Emoji # 6.0 [5] (๐Ÿ—ป..๐Ÿ—ฟ) mount fuji..moai
+1F600 ; Emoji # 6.1 [1] (๐Ÿ˜€) grinning face
+1F601..1F610 ; Emoji # 6.0 [16] (๐Ÿ˜..๐Ÿ˜) beaming face with smiling eyes..neutral face
+1F611 ; Emoji # 6.1 [1] (๐Ÿ˜‘) expressionless face
+1F612..1F614 ; Emoji # 6.0 [3] (๐Ÿ˜’..๐Ÿ˜”) unamused face..pensive face
+1F615 ; Emoji # 6.1 [1] (๐Ÿ˜•) confused face
+1F616 ; Emoji # 6.0 [1] (๐Ÿ˜–) confounded face
+1F617 ; Emoji # 6.1 [1] (๐Ÿ˜—) kissing face
+1F618 ; Emoji # 6.0 [1] (๐Ÿ˜˜) face blowing a kiss
+1F619 ; Emoji # 6.1 [1] (๐Ÿ˜™) kissing face with smiling eyes
+1F61A ; Emoji # 6.0 [1] (๐Ÿ˜š) kissing face with closed eyes
+1F61B ; Emoji # 6.1 [1] (๐Ÿ˜›) face with tongue
+1F61C..1F61E ; Emoji # 6.0 [3] (๐Ÿ˜œ..๐Ÿ˜ž) winking face with tongue..disappointed face
+1F61F ; Emoji # 6.1 [1] (๐Ÿ˜Ÿ) worried face
+1F620..1F625 ; Emoji # 6.0 [6] (๐Ÿ˜ ..๐Ÿ˜ฅ) angry face..sad but relieved face
+1F626..1F627 ; Emoji # 6.1 [2] (๐Ÿ˜ฆ..๐Ÿ˜ง) frowning face with open mouth..anguished face
+1F628..1F62B ; Emoji # 6.0 [4] (๐Ÿ˜จ..๐Ÿ˜ซ) fearful face..tired face
+1F62C ; Emoji # 6.1 [1] (๐Ÿ˜ฌ) grimacing face
+1F62D ; Emoji # 6.0 [1] (๐Ÿ˜ญ) loudly crying face
+1F62E..1F62F ; Emoji # 6.1 [2] (๐Ÿ˜ฎ..๐Ÿ˜ฏ) face with open mouth..hushed face
+1F630..1F633 ; Emoji # 6.0 [4] (๐Ÿ˜ฐ..๐Ÿ˜ณ) anxious face with sweat..flushed face
+1F634 ; Emoji # 6.1 [1] (๐Ÿ˜ด) sleeping face
+1F635..1F640 ; Emoji # 6.0 [12] (๐Ÿ˜ต..๐Ÿ™€) dizzy face..weary cat face
+1F641..1F642 ; Emoji # 7.0 [2] (๐Ÿ™..๐Ÿ™‚) slightly frowning face..slightly smiling face
+1F643..1F644 ; Emoji # 8.0 [2] (๐Ÿ™ƒ..๐Ÿ™„) upside-down face..face with rolling eyes
+1F645..1F64F ; Emoji # 6.0 [11] (๐Ÿ™…..๐Ÿ™) person gesturing NO..folded hands
+1F680..1F6C5 ; Emoji # 6.0 [70] (๐Ÿš€..๐Ÿ›…) rocket..left luggage
+1F6CB..1F6CF ; Emoji # 7.0 [5] (๐Ÿ›‹๏ธ..๐Ÿ›๏ธ) couch and lamp..bed
+1F6D0 ; Emoji # 8.0 [1] (๐Ÿ›) place of worship
+1F6D1..1F6D2 ; Emoji # 9.0 [2] (๐Ÿ›‘..๐Ÿ›’) stop sign..shopping cart
+1F6E0..1F6E5 ; Emoji # 7.0 [6] (๐Ÿ› ๏ธ..๐Ÿ›ฅ๏ธ) hammer and wrench..motor boat
+1F6E9 ; Emoji # 7.0 [1] (๐Ÿ›ฉ๏ธ) small airplane
+1F6EB..1F6EC ; Emoji # 7.0 [2] (๐Ÿ›ซ..๐Ÿ›ฌ) airplane departure..airplane arrival
+1F6F0 ; Emoji # 7.0 [1] (๐Ÿ›ฐ๏ธ) satellite
+1F6F3 ; Emoji # 7.0 [1] (๐Ÿ›ณ๏ธ) passenger ship
+1F6F4..1F6F6 ; Emoji # 9.0 [3] (๐Ÿ›ด..๐Ÿ›ถ) kick scooter..canoe
+1F6F7..1F6F8 ; Emoji # 10.0 [2] (๐Ÿ›ท..๐Ÿ›ธ) sled..flying saucer
+1F6F9 ; Emoji # 11.0 [1] (๐Ÿ›น) skateboard
+1F910..1F918 ; Emoji # 8.0 [9] (๐Ÿค..๐Ÿค˜) zipper-mouth face..sign of the horns
+1F919..1F91E ; Emoji # 9.0 [6] (๐Ÿค™..๐Ÿคž) call me hand..crossed fingers
+1F91F ; Emoji # 10.0 [1] (๐ŸคŸ) love-you gesture
+1F920..1F927 ; Emoji # 9.0 [8] (๐Ÿค ..๐Ÿคง) cowboy hat face..sneezing face
+1F928..1F92F ; Emoji # 10.0 [8] (๐Ÿคจ..๐Ÿคฏ) face with raised eyebrow..exploding head
+1F930 ; Emoji # 9.0 [1] (๐Ÿคฐ) pregnant woman
+1F931..1F932 ; Emoji # 10.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together
+1F933..1F93A ; Emoji # 9.0 [8] (๐Ÿคณ..๐Ÿคบ) selfie..person fencing
+1F93C..1F93E ; Emoji # 9.0 [3] (๐Ÿคผ..๐Ÿคพ) people wrestling..person playing handball
+1F940..1F945 ; Emoji # 9.0 [6] (๐Ÿฅ€..๐Ÿฅ…) wilted flower..goal net
+1F947..1F94B ; Emoji # 9.0 [5] (๐Ÿฅ‡..๐Ÿฅ‹) 1st place medal..martial arts uniform
+1F94C ; Emoji # 10.0 [1] (๐ŸฅŒ) curling stone
+1F94D..1F94F ; Emoji # 11.0 [3] (๐Ÿฅ..๐Ÿฅ) lacrosse..flying disc
+1F950..1F95E ; Emoji # 9.0 [15] (๐Ÿฅ..๐Ÿฅž) croissant..pancakes
+1F95F..1F96B ; Emoji # 10.0 [13] (๐ŸฅŸ..๐Ÿฅซ) dumpling..canned food
+1F96C..1F970 ; Emoji # 11.0 [5] (๐Ÿฅฌ..๐Ÿฅฐ) leafy green..smiling face with 3 hearts
+1F973..1F976 ; Emoji # 11.0 [4] (๐Ÿฅณ..๐Ÿฅถ) partying face..cold face
+1F97A ; Emoji # 11.0 [1] (๐Ÿฅบ) pleading face
+1F97C..1F97F ; Emoji # 11.0 [4] (๐Ÿฅผ..๐Ÿฅฟ) lab coat..womanโ€™s flat shoe
+1F980..1F984 ; Emoji # 8.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn face
+1F985..1F991 ; Emoji # 9.0 [13] (๐Ÿฆ…..๐Ÿฆ‘) eagle..squid
+1F992..1F997 ; Emoji # 10.0 [6] (๐Ÿฆ’..๐Ÿฆ—) giraffe..cricket
+1F998..1F9A2 ; Emoji # 11.0 [11] (๐Ÿฆ˜..๐Ÿฆข) kangaroo..swan
+1F9B0..1F9B9 ; Emoji # 11.0 [10] (๐Ÿฆฐ..๐Ÿฆน) red-haired..supervillain
+1F9C0 ; Emoji # 8.0 [1] (๐Ÿง€) cheese wedge
+1F9C1..1F9C2 ; Emoji # 11.0 [2] (๐Ÿง..๐Ÿง‚) cupcake..salt
+1F9D0..1F9E6 ; Emoji # 10.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks
+1F9E7..1F9FF ; Emoji # 11.0 [25] (๐Ÿงง..๐Ÿงฟ) red envelope..nazar amulet
+
+# Total elements: 1250
+
+# ================================================
+
+# All omitted code points have Emoji_Presentation=No
+# @missing: 0000..10FFFF ; Emoji_Presentation ; No
+
+231A..231B ; Emoji_Presentation # 1.1 [2] (โŒš..โŒ›) watch..hourglass done
+23E9..23EC ; Emoji_Presentation # 6.0 [4] (โฉ..โฌ) fast-forward button..fast down button
+23F0 ; Emoji_Presentation # 6.0 [1] (โฐ) alarm clock
+23F3 ; Emoji_Presentation # 6.0 [1] (โณ) hourglass not done
+25FD..25FE ; Emoji_Presentation # 3.2 [2] (โ—ฝ..โ—พ) white medium-small square..black medium-small square
+2614..2615 ; Emoji_Presentation # 4.0 [2] (โ˜”..โ˜•) umbrella with rain drops..hot beverage
+2648..2653 ; Emoji_Presentation # 1.1 [12] (โ™ˆ..โ™“) Aries..Pisces
+267F ; Emoji_Presentation # 4.1 [1] (โ™ฟ) wheelchair symbol
+2693 ; Emoji_Presentation # 4.1 [1] (โš“) anchor
+26A1 ; Emoji_Presentation # 4.0 [1] (โšก) high voltage
+26AA..26AB ; Emoji_Presentation # 4.1 [2] (โšช..โšซ) white circle..black circle
+26BD..26BE ; Emoji_Presentation # 5.2 [2] (โšฝ..โšพ) soccer ball..baseball
+26C4..26C5 ; Emoji_Presentation # 5.2 [2] (โ›„..โ›…) snowman without snow..sun behind cloud
+26CE ; Emoji_Presentation # 6.0 [1] (โ›Ž) Ophiuchus
+26D4 ; Emoji_Presentation # 5.2 [1] (โ›”) no entry
+26EA ; Emoji_Presentation # 5.2 [1] (โ›ช) church
+26F2..26F3 ; Emoji_Presentation # 5.2 [2] (โ›ฒ..โ›ณ) fountain..flag in hole
+26F5 ; Emoji_Presentation # 5.2 [1] (โ›ต) sailboat
+26FA ; Emoji_Presentation # 5.2 [1] (โ›บ) tent
+26FD ; Emoji_Presentation # 5.2 [1] (โ›ฝ) fuel pump
+2705 ; Emoji_Presentation # 6.0 [1] (โœ…) white heavy check mark
+270A..270B ; Emoji_Presentation # 6.0 [2] (โœŠ..โœ‹) raised fist..raised hand
+2728 ; Emoji_Presentation # 6.0 [1] (โœจ) sparkles
+274C ; Emoji_Presentation # 6.0 [1] (โŒ) cross mark
+274E ; Emoji_Presentation # 6.0 [1] (โŽ) cross mark button
+2753..2755 ; Emoji_Presentation # 6.0 [3] (โ“..โ•) question mark..white exclamation mark
+2757 ; Emoji_Presentation # 5.2 [1] (โ—) exclamation mark
+2795..2797 ; Emoji_Presentation # 6.0 [3] (โž•..โž—) heavy plus sign..heavy division sign
+27B0 ; Emoji_Presentation # 6.0 [1] (โžฐ) curly loop
+27BF ; Emoji_Presentation # 6.0 [1] (โžฟ) double curly loop
+2B1B..2B1C ; Emoji_Presentation # 5.1 [2] (โฌ›..โฌœ) black large square..white large square
+2B50 ; Emoji_Presentation # 5.1 [1] (โญ) star
+2B55 ; Emoji_Presentation # 5.2 [1] (โญ•) heavy large circle
+1F004 ; Emoji_Presentation # 5.1 [1] (๐Ÿ€„) mahjong red dragon
+1F0CF ; Emoji_Presentation # 6.0 [1] (๐Ÿƒ) joker
+1F18E ; Emoji_Presentation # 6.0 [1] (๐Ÿ†Ž) AB button (blood type)
+1F191..1F19A ; Emoji_Presentation # 6.0 [10] (๐Ÿ†‘..๐Ÿ†š) CL button..VS button
+1F1E6..1F1FF ; Emoji_Presentation # 6.0 [26] (๐Ÿ‡ฆ..๐Ÿ‡ฟ) regional indicator symbol letter a..regional indicator symbol letter z
+1F201 ; Emoji_Presentation # 6.0 [1] (๐Ÿˆ) Japanese โ€œhereโ€ button
+1F21A ; Emoji_Presentation # 5.2 [1] (๐Ÿˆš) Japanese โ€œfree of chargeโ€ button
+1F22F ; Emoji_Presentation # 5.2 [1] (๐Ÿˆฏ) Japanese โ€œreservedโ€ button
+1F232..1F236 ; Emoji_Presentation # 6.0 [5] (๐Ÿˆฒ..๐Ÿˆถ) Japanese โ€œprohibitedโ€ button..Japanese โ€œnot free of chargeโ€ button
+1F238..1F23A ; Emoji_Presentation # 6.0 [3] (๐Ÿˆธ..๐Ÿˆบ) Japanese โ€œapplicationโ€ button..Japanese โ€œopen for businessโ€ button
+1F250..1F251 ; Emoji_Presentation # 6.0 [2] (๐Ÿ‰..๐Ÿ‰‘) Japanese โ€œbargainโ€ button..Japanese โ€œacceptableโ€ button
+1F300..1F320 ; Emoji_Presentation # 6.0 [33] (๐ŸŒ€..๐ŸŒ ) cyclone..shooting star
+1F32D..1F32F ; Emoji_Presentation # 8.0 [3] (๐ŸŒญ..๐ŸŒฏ) hot dog..burrito
+1F330..1F335 ; Emoji_Presentation # 6.0 [6] (๐ŸŒฐ..๐ŸŒต) chestnut..cactus
+1F337..1F37C ; Emoji_Presentation # 6.0 [70] (๐ŸŒท..๐Ÿผ) tulip..baby bottle
+1F37E..1F37F ; Emoji_Presentation # 8.0 [2] (๐Ÿพ..๐Ÿฟ) bottle with popping cork..popcorn
+1F380..1F393 ; Emoji_Presentation # 6.0 [20] (๐ŸŽ€..๐ŸŽ“) ribbon..graduation cap
+1F3A0..1F3C4 ; Emoji_Presentation # 6.0 [37] (๐ŸŽ ..๐Ÿ„) carousel horse..person surfing
+1F3C5 ; Emoji_Presentation # 7.0 [1] (๐Ÿ…) sports medal
+1F3C6..1F3CA ; Emoji_Presentation # 6.0 [5] (๐Ÿ†..๐ŸŠ) trophy..person swimming
+1F3CF..1F3D3 ; Emoji_Presentation # 8.0 [5] (๐Ÿ..๐Ÿ“) cricket game..ping pong
+1F3E0..1F3F0 ; Emoji_Presentation # 6.0 [17] (๐Ÿ ..๐Ÿฐ) house..castle
+1F3F4 ; Emoji_Presentation # 7.0 [1] (๐Ÿด) black flag
+1F3F8..1F3FF ; Emoji_Presentation # 8.0 [8] (๐Ÿธ..๐Ÿฟ) badminton..dark skin tone
+1F400..1F43E ; Emoji_Presentation # 6.0 [63] (๐Ÿ€..๐Ÿพ) rat..paw prints
+1F440 ; Emoji_Presentation # 6.0 [1] (๐Ÿ‘€) eyes
+1F442..1F4F7 ; Emoji_Presentation # 6.0[182] (๐Ÿ‘‚..๐Ÿ“ท) ear..camera
+1F4F8 ; Emoji_Presentation # 7.0 [1] (๐Ÿ“ธ) camera with flash
+1F4F9..1F4FC ; Emoji_Presentation # 6.0 [4] (๐Ÿ“น..๐Ÿ“ผ) video camera..videocassette
+1F4FF ; Emoji_Presentation # 8.0 [1] (๐Ÿ“ฟ) prayer beads
+1F500..1F53D ; Emoji_Presentation # 6.0 [62] (๐Ÿ”€..๐Ÿ”ฝ) shuffle tracks button..downwards button
+1F54B..1F54E ; Emoji_Presentation # 8.0 [4] (๐Ÿ•‹..๐Ÿ•Ž) kaaba..menorah
+1F550..1F567 ; Emoji_Presentation # 6.0 [24] (๐Ÿ•..๐Ÿ•ง) one oโ€™clock..twelve-thirty
+1F57A ; Emoji_Presentation # 9.0 [1] (๐Ÿ•บ) man dancing
+1F595..1F596 ; Emoji_Presentation # 7.0 [2] (๐Ÿ–•..๐Ÿ––) middle finger..vulcan salute
+1F5A4 ; Emoji_Presentation # 9.0 [1] (๐Ÿ–ค) black heart
+1F5FB..1F5FF ; Emoji_Presentation # 6.0 [5] (๐Ÿ—ป..๐Ÿ—ฟ) mount fuji..moai
+1F600 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜€) grinning face
+1F601..1F610 ; Emoji_Presentation # 6.0 [16] (๐Ÿ˜..๐Ÿ˜) beaming face with smiling eyes..neutral face
+1F611 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜‘) expressionless face
+1F612..1F614 ; Emoji_Presentation # 6.0 [3] (๐Ÿ˜’..๐Ÿ˜”) unamused face..pensive face
+1F615 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜•) confused face
+1F616 ; Emoji_Presentation # 6.0 [1] (๐Ÿ˜–) confounded face
+1F617 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜—) kissing face
+1F618 ; Emoji_Presentation # 6.0 [1] (๐Ÿ˜˜) face blowing a kiss
+1F619 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜™) kissing face with smiling eyes
+1F61A ; Emoji_Presentation # 6.0 [1] (๐Ÿ˜š) kissing face with closed eyes
+1F61B ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜›) face with tongue
+1F61C..1F61E ; Emoji_Presentation # 6.0 [3] (๐Ÿ˜œ..๐Ÿ˜ž) winking face with tongue..disappointed face
+1F61F ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜Ÿ) worried face
+1F620..1F625 ; Emoji_Presentation # 6.0 [6] (๐Ÿ˜ ..๐Ÿ˜ฅ) angry face..sad but relieved face
+1F626..1F627 ; Emoji_Presentation # 6.1 [2] (๐Ÿ˜ฆ..๐Ÿ˜ง) frowning face with open mouth..anguished face
+1F628..1F62B ; Emoji_Presentation # 6.0 [4] (๐Ÿ˜จ..๐Ÿ˜ซ) fearful face..tired face
+1F62C ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜ฌ) grimacing face
+1F62D ; Emoji_Presentation # 6.0 [1] (๐Ÿ˜ญ) loudly crying face
+1F62E..1F62F ; Emoji_Presentation # 6.1 [2] (๐Ÿ˜ฎ..๐Ÿ˜ฏ) face with open mouth..hushed face
+1F630..1F633 ; Emoji_Presentation # 6.0 [4] (๐Ÿ˜ฐ..๐Ÿ˜ณ) anxious face with sweat..flushed face
+1F634 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜ด) sleeping face
+1F635..1F640 ; Emoji_Presentation # 6.0 [12] (๐Ÿ˜ต..๐Ÿ™€) dizzy face..weary cat face
+1F641..1F642 ; Emoji_Presentation # 7.0 [2] (๐Ÿ™..๐Ÿ™‚) slightly frowning face..slightly smiling face
+1F643..1F644 ; Emoji_Presentation # 8.0 [2] (๐Ÿ™ƒ..๐Ÿ™„) upside-down face..face with rolling eyes
+1F645..1F64F ; Emoji_Presentation # 6.0 [11] (๐Ÿ™…..๐Ÿ™) person gesturing NO..folded hands
+1F680..1F6C5 ; Emoji_Presentation # 6.0 [70] (๐Ÿš€..๐Ÿ›…) rocket..left luggage
+1F6CC ; Emoji_Presentation # 7.0 [1] (๐Ÿ›Œ) person in bed
+1F6D0 ; Emoji_Presentation # 8.0 [1] (๐Ÿ›) place of worship
+1F6D1..1F6D2 ; Emoji_Presentation # 9.0 [2] (๐Ÿ›‘..๐Ÿ›’) stop sign..shopping cart
+1F6EB..1F6EC ; Emoji_Presentation # 7.0 [2] (๐Ÿ›ซ..๐Ÿ›ฌ) airplane departure..airplane arrival
+1F6F4..1F6F6 ; Emoji_Presentation # 9.0 [3] (๐Ÿ›ด..๐Ÿ›ถ) kick scooter..canoe
+1F6F7..1F6F8 ; Emoji_Presentation # 10.0 [2] (๐Ÿ›ท..๐Ÿ›ธ) sled..flying saucer
+1F6F9 ; Emoji_Presentation # 11.0 [1] (๐Ÿ›น) skateboard
+1F910..1F918 ; Emoji_Presentation # 8.0 [9] (๐Ÿค..๐Ÿค˜) zipper-mouth face..sign of the horns
+1F919..1F91E ; Emoji_Presentation # 9.0 [6] (๐Ÿค™..๐Ÿคž) call me hand..crossed fingers
+1F91F ; Emoji_Presentation # 10.0 [1] (๐ŸคŸ) love-you gesture
+1F920..1F927 ; Emoji_Presentation # 9.0 [8] (๐Ÿค ..๐Ÿคง) cowboy hat face..sneezing face
+1F928..1F92F ; Emoji_Presentation # 10.0 [8] (๐Ÿคจ..๐Ÿคฏ) face with raised eyebrow..exploding head
+1F930 ; Emoji_Presentation # 9.0 [1] (๐Ÿคฐ) pregnant woman
+1F931..1F932 ; Emoji_Presentation # 10.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together
+1F933..1F93A ; Emoji_Presentation # 9.0 [8] (๐Ÿคณ..๐Ÿคบ) selfie..person fencing
+1F93C..1F93E ; Emoji_Presentation # 9.0 [3] (๐Ÿคผ..๐Ÿคพ) people wrestling..person playing handball
+1F940..1F945 ; Emoji_Presentation # 9.0 [6] (๐Ÿฅ€..๐Ÿฅ…) wilted flower..goal net
+1F947..1F94B ; Emoji_Presentation # 9.0 [5] (๐Ÿฅ‡..๐Ÿฅ‹) 1st place medal..martial arts uniform
+1F94C ; Emoji_Presentation # 10.0 [1] (๐ŸฅŒ) curling stone
+1F94D..1F94F ; Emoji_Presentation # 11.0 [3] (๐Ÿฅ..๐Ÿฅ) lacrosse..flying disc
+1F950..1F95E ; Emoji_Presentation # 9.0 [15] (๐Ÿฅ..๐Ÿฅž) croissant..pancakes
+1F95F..1F96B ; Emoji_Presentation # 10.0 [13] (๐ŸฅŸ..๐Ÿฅซ) dumpling..canned food
+1F96C..1F970 ; Emoji_Presentation # 11.0 [5] (๐Ÿฅฌ..๐Ÿฅฐ) leafy green..smiling face with 3 hearts
+1F973..1F976 ; Emoji_Presentation # 11.0 [4] (๐Ÿฅณ..๐Ÿฅถ) partying face..cold face
+1F97A ; Emoji_Presentation # 11.0 [1] (๐Ÿฅบ) pleading face
+1F97C..1F97F ; Emoji_Presentation # 11.0 [4] (๐Ÿฅผ..๐Ÿฅฟ) lab coat..womanโ€™s flat shoe
+1F980..1F984 ; Emoji_Presentation # 8.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn face
+1F985..1F991 ; Emoji_Presentation # 9.0 [13] (๐Ÿฆ…..๐Ÿฆ‘) eagle..squid
+1F992..1F997 ; Emoji_Presentation # 10.0 [6] (๐Ÿฆ’..๐Ÿฆ—) giraffe..cricket
+1F998..1F9A2 ; Emoji_Presentation # 11.0 [11] (๐Ÿฆ˜..๐Ÿฆข) kangaroo..swan
+1F9B0..1F9B9 ; Emoji_Presentation # 11.0 [10] (๐Ÿฆฐ..๐Ÿฆน) red-haired..supervillain
+1F9C0 ; Emoji_Presentation # 8.0 [1] (๐Ÿง€) cheese wedge
+1F9C1..1F9C2 ; Emoji_Presentation # 11.0 [2] (๐Ÿง..๐Ÿง‚) cupcake..salt
+1F9D0..1F9E6 ; Emoji_Presentation # 10.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks
+1F9E7..1F9FF ; Emoji_Presentation # 11.0 [25] (๐Ÿงง..๐Ÿงฟ) red envelope..nazar amulet
+
+# Total elements: 1032
+
+# ================================================
+
+# All omitted code points have Emoji_Modifier=No
+# @missing: 0000..10FFFF ; Emoji_Modifier ; No
+
+1F3FB..1F3FF ; Emoji_Modifier # 8.0 [5] (๐Ÿป..๐Ÿฟ) light skin tone..dark skin tone
+
+# Total elements: 5
+
+# ================================================
+
+# All omitted code points have Emoji_Modifier_Base=No
+# @missing: 0000..10FFFF ; Emoji_Modifier_Base ; No
+
+261D ; Emoji_Modifier_Base # 1.1 [1] (โ˜๏ธ) index pointing up
+26F9 ; Emoji_Modifier_Base # 5.2 [1] (โ›น๏ธ) person bouncing ball
+270A..270B ; Emoji_Modifier_Base # 6.0 [2] (โœŠ..โœ‹) raised fist..raised hand
+270C..270D ; Emoji_Modifier_Base # 1.1 [2] (โœŒ๏ธ..โœ๏ธ) victory hand..writing hand
+1F385 ; Emoji_Modifier_Base # 6.0 [1] (๐ŸŽ…) Santa Claus
+1F3C2..1F3C4 ; Emoji_Modifier_Base # 6.0 [3] (๐Ÿ‚..๐Ÿ„) snowboarder..person surfing
+1F3C7 ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ‡) horse racing
+1F3CA ; Emoji_Modifier_Base # 6.0 [1] (๐ŸŠ) person swimming
+1F3CB..1F3CC ; Emoji_Modifier_Base # 7.0 [2] (๐Ÿ‹๏ธ..๐ŸŒ๏ธ) person lifting weights..person golfing
+1F442..1F443 ; Emoji_Modifier_Base # 6.0 [2] (๐Ÿ‘‚..๐Ÿ‘ƒ) ear..nose
+1F446..1F450 ; Emoji_Modifier_Base # 6.0 [11] (๐Ÿ‘†..๐Ÿ‘) backhand index pointing up..open hands
+1F466..1F469 ; Emoji_Modifier_Base # 6.0 [4] (๐Ÿ‘ฆ..๐Ÿ‘ฉ) boy..woman
+1F46E ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ‘ฎ) police officer
+1F470..1F478 ; Emoji_Modifier_Base # 6.0 [9] (๐Ÿ‘ฐ..๐Ÿ‘ธ) bride with veil..princess
+1F47C ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ‘ผ) baby angel
+1F481..1F483 ; Emoji_Modifier_Base # 6.0 [3] (๐Ÿ’..๐Ÿ’ƒ) person tipping hand..woman dancing
+1F485..1F487 ; Emoji_Modifier_Base # 6.0 [3] (๐Ÿ’…..๐Ÿ’‡) nail polish..person getting haircut
+1F4AA ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ’ช) flexed biceps
+1F574..1F575 ; Emoji_Modifier_Base # 7.0 [2] (๐Ÿ•ด๏ธ..๐Ÿ•ต๏ธ) man in suit levitating..detective
+1F57A ; Emoji_Modifier_Base # 9.0 [1] (๐Ÿ•บ) man dancing
+1F590 ; Emoji_Modifier_Base # 7.0 [1] (๐Ÿ–๏ธ) hand with fingers splayed
+1F595..1F596 ; Emoji_Modifier_Base # 7.0 [2] (๐Ÿ–•..๐Ÿ––) middle finger..vulcan salute
+1F645..1F647 ; Emoji_Modifier_Base # 6.0 [3] (๐Ÿ™…..๐Ÿ™‡) person gesturing NO..person bowing
+1F64B..1F64F ; Emoji_Modifier_Base # 6.0 [5] (๐Ÿ™‹..๐Ÿ™) person raising hand..folded hands
+1F6A3 ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿšฃ) person rowing boat
+1F6B4..1F6B6 ; Emoji_Modifier_Base # 6.0 [3] (๐Ÿšด..๐Ÿšถ) person biking..person walking
+1F6C0 ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ›€) person taking bath
+1F6CC ; Emoji_Modifier_Base # 7.0 [1] (๐Ÿ›Œ) person in bed
+1F918 ; Emoji_Modifier_Base # 8.0 [1] (๐Ÿค˜) sign of the horns
+1F919..1F91C ; Emoji_Modifier_Base # 9.0 [4] (๐Ÿค™..๐Ÿคœ) call me hand..right-facing fist
+1F91E ; Emoji_Modifier_Base # 9.0 [1] (๐Ÿคž) crossed fingers
+1F91F ; Emoji_Modifier_Base # 10.0 [1] (๐ŸคŸ) love-you gesture
+1F926 ; Emoji_Modifier_Base # 9.0 [1] (๐Ÿคฆ) person facepalming
+1F930 ; Emoji_Modifier_Base # 9.0 [1] (๐Ÿคฐ) pregnant woman
+1F931..1F932 ; Emoji_Modifier_Base # 10.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together
+1F933..1F939 ; Emoji_Modifier_Base # 9.0 [7] (๐Ÿคณ..๐Ÿคน) selfie..person juggling
+1F93D..1F93E ; Emoji_Modifier_Base # 9.0 [2] (๐Ÿคฝ..๐Ÿคพ) person playing water polo..person playing handball
+1F9B5..1F9B6 ; Emoji_Modifier_Base # 11.0 [2] (๐Ÿฆต..๐Ÿฆถ) leg..foot
+1F9B8..1F9B9 ; Emoji_Modifier_Base # 11.0 [2] (๐Ÿฆธ..๐Ÿฆน) superhero..supervillain
+1F9D1..1F9DD ; Emoji_Modifier_Base # 10.0 [13] (๐Ÿง‘..๐Ÿง) adult..elf
+
+# Total elements: 106
+
+# ================================================
+
+# All omitted code points have Emoji_Component=No
+# @missing: 0000..10FFFF ; Emoji_Component ; No
+
+0023 ; Emoji_Component # 1.1 [1] (#๏ธ) number sign
+002A ; Emoji_Component # 1.1 [1] (*๏ธ) asterisk
+0030..0039 ; Emoji_Component # 1.1 [10] (0๏ธ..9๏ธ) digit zero..digit nine
+200D ; Emoji_Component # 1.1 [1] (โ€) zero width joiner
+20E3 ; Emoji_Component # 3.0 [1] (โƒฃ) combining enclosing keycap
+FE0F ; Emoji_Component # 3.2 [1] () VARIATION SELECTOR-16
+1F1E6..1F1FF ; Emoji_Component # 6.0 [26] (๐Ÿ‡ฆ..๐Ÿ‡ฟ) regional indicator symbol letter a..regional indicator symbol letter z
+1F3FB..1F3FF ; Emoji_Component # 8.0 [5] (๐Ÿป..๐Ÿฟ) light skin tone..dark skin tone
+1F9B0..1F9B3 ; Emoji_Component # 11.0 [4] (๐Ÿฆฐ..๐Ÿฆณ) red-haired..white-haired
+E0020..E007F ; Emoji_Component # 3.1 [96] (๓ € ..๓ ฟ) tag space..cancel tag
+
+# Total elements: 146
+
+# ================================================
+
+# All omitted code points have Extended_Pictographic=No
+# @missing: 0000..10FFFF ; Extended_Pictographic ; No
+
+00A9 ; Extended_Pictographic# 1.1 [1] (ยฉ๏ธ) copyright
+00AE ; Extended_Pictographic# 1.1 [1] (ยฎ๏ธ) registered
+203C ; Extended_Pictographic# 1.1 [1] (โ€ผ๏ธ) double exclamation mark
+2049 ; Extended_Pictographic# 3.0 [1] (โ‰๏ธ) exclamation question mark
+2122 ; Extended_Pictographic# 1.1 [1] (โ„ข๏ธ) trade mark
+2139 ; Extended_Pictographic# 3.0 [1] (โ„น๏ธ) information
+2194..2199 ; Extended_Pictographic# 1.1 [6] (โ†”๏ธ..โ†™๏ธ) left-right arrow..down-left arrow
+21A9..21AA ; Extended_Pictographic# 1.1 [2] (โ†ฉ๏ธ..โ†ช๏ธ) right arrow curving left..left arrow curving right
+231A..231B ; Extended_Pictographic# 1.1 [2] (โŒš..โŒ›) watch..hourglass done
+2328 ; Extended_Pictographic# 1.1 [1] (โŒจ๏ธ) keyboard
+2388 ; Extended_Pictographic# 3.0 [1] (โŽˆ๏ธ) HELM SYMBOL
+23CF ; Extended_Pictographic# 4.0 [1] (โ๏ธ) eject button
+23E9..23F3 ; Extended_Pictographic# 6.0 [11] (โฉ..โณ) fast-forward button..hourglass not done
+23F8..23FA ; Extended_Pictographic# 7.0 [3] (โธ๏ธ..โบ๏ธ) pause button..record button
+24C2 ; Extended_Pictographic# 1.1 [1] (โ“‚๏ธ) circled M
+25AA..25AB ; Extended_Pictographic# 1.1 [2] (โ–ช๏ธ..โ–ซ๏ธ) black small square..white small square
+25B6 ; Extended_Pictographic# 1.1 [1] (โ–ถ๏ธ) play button
+25C0 ; Extended_Pictographic# 1.1 [1] (โ—€๏ธ) reverse button
+25FB..25FE ; Extended_Pictographic# 3.2 [4] (โ—ป๏ธ..โ—พ) white medium square..black medium-small square
+2600..2605 ; Extended_Pictographic# 1.1 [6] (โ˜€๏ธ..โ˜…๏ธ) sun..BLACK STAR
+2607..2612 ; Extended_Pictographic# 1.1 [12] (โ˜‡๏ธ..โ˜’๏ธ) LIGHTNING..BALLOT BOX WITH X
+2614..2615 ; Extended_Pictographic# 4.0 [2] (โ˜”..โ˜•) umbrella with rain drops..hot beverage
+2616..2617 ; Extended_Pictographic# 3.2 [2] (โ˜–๏ธ..โ˜—๏ธ) WHITE SHOGI PIECE..BLACK SHOGI PIECE
+2618 ; Extended_Pictographic# 4.1 [1] (โ˜˜๏ธ) shamrock
+2619 ; Extended_Pictographic# 3.0 [1] (โ˜™๏ธ) REVERSED ROTATED FLORAL HEART BULLET
+261A..266F ; Extended_Pictographic# 1.1 [86] (โ˜š๏ธ..โ™ฏ๏ธ) BLACK LEFT POINTING INDEX..MUSIC SHARP SIGN
+2670..2671 ; Extended_Pictographic# 3.0 [2] (โ™ฐ๏ธ..โ™ฑ๏ธ) WEST SYRIAC CROSS..EAST SYRIAC CROSS
+2672..267D ; Extended_Pictographic# 3.2 [12] (โ™ฒ๏ธ..โ™ฝ๏ธ) UNIVERSAL RECYCLING SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL
+267E..267F ; Extended_Pictographic# 4.1 [2] (โ™พ๏ธ..โ™ฟ) infinity..wheelchair symbol
+2680..2685 ; Extended_Pictographic# 3.2 [6] (โš€๏ธ..โš…๏ธ) DIE FACE-1..DIE FACE-6
+2690..2691 ; Extended_Pictographic# 4.0 [2] (โš๏ธ..โš‘๏ธ) WHITE FLAG..BLACK FLAG
+2692..269C ; Extended_Pictographic# 4.1 [11] (โš’๏ธ..โšœ๏ธ) hammer and pick..fleur-de-lis
+269D ; Extended_Pictographic# 5.1 [1] (โš๏ธ) OUTLINED WHITE STAR
+269E..269F ; Extended_Pictographic# 5.2 [2] (โšž๏ธ..โšŸ๏ธ) THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT
+26A0..26A1 ; Extended_Pictographic# 4.0 [2] (โš ๏ธ..โšก) warning..high voltage
+26A2..26B1 ; Extended_Pictographic# 4.1 [16] (โšข๏ธ..โšฑ๏ธ) DOUBLED FEMALE SIGN..funeral urn
+26B2 ; Extended_Pictographic# 5.0 [1] (โšฒ๏ธ) NEUTER
+26B3..26BC ; Extended_Pictographic# 5.1 [10] (โšณ๏ธ..โšผ๏ธ) CERES..SESQUIQUADRATE
+26BD..26BF ; Extended_Pictographic# 5.2 [3] (โšฝ..โšฟ๏ธ) soccer ball..SQUARED KEY
+26C0..26C3 ; Extended_Pictographic# 5.1 [4] (โ›€๏ธ..โ›ƒ๏ธ) WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING
+26C4..26CD ; Extended_Pictographic# 5.2 [10] (โ›„..โ›๏ธ) snowman without snow..DISABLED CAR
+26CE ; Extended_Pictographic# 6.0 [1] (โ›Ž) Ophiuchus
+26CF..26E1 ; Extended_Pictographic# 5.2 [19] (โ›๏ธ..โ›ก๏ธ) pick..RESTRICTED LEFT ENTRY-2
+26E2 ; Extended_Pictographic# 6.0 [1] (โ›ข๏ธ) ASTRONOMICAL SYMBOL FOR URANUS
+26E3 ; Extended_Pictographic# 5.2 [1] (โ›ฃ๏ธ) HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE
+26E4..26E7 ; Extended_Pictographic# 6.0 [4] (โ›ค๏ธ..โ›ง๏ธ) PENTAGRAM..INVERTED PENTAGRAM
+26E8..26FF ; Extended_Pictographic# 5.2 [24] (โ›จ๏ธ..โ›ฟ๏ธ) BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE
+2700 ; Extended_Pictographic# 7.0 [1] (โœ€๏ธ) BLACK SAFETY SCISSORS
+2701..2704 ; Extended_Pictographic# 1.1 [4] (โœ๏ธ..โœ„๏ธ) UPPER BLADE SCISSORS..WHITE SCISSORS
+2705 ; Extended_Pictographic# 6.0 [1] (โœ…) white heavy check mark
+2708..2709 ; Extended_Pictographic# 1.1 [2] (โœˆ๏ธ..โœ‰๏ธ) airplane..envelope
+270A..270B ; Extended_Pictographic# 6.0 [2] (โœŠ..โœ‹) raised fist..raised hand
+270C..2712 ; Extended_Pictographic# 1.1 [7] (โœŒ๏ธ..โœ’๏ธ) victory hand..black nib
+2714 ; Extended_Pictographic# 1.1 [1] (โœ”๏ธ) heavy check mark
+2716 ; Extended_Pictographic# 1.1 [1] (โœ–๏ธ) heavy multiplication x
+271D ; Extended_Pictographic# 1.1 [1] (โœ๏ธ) latin cross
+2721 ; Extended_Pictographic# 1.1 [1] (โœก๏ธ) star of David
+2728 ; Extended_Pictographic# 6.0 [1] (โœจ) sparkles
+2733..2734 ; Extended_Pictographic# 1.1 [2] (โœณ๏ธ..โœด๏ธ) eight-spoked asterisk..eight-pointed star
+2744 ; Extended_Pictographic# 1.1 [1] (โ„๏ธ) snowflake
+2747 ; Extended_Pictographic# 1.1 [1] (โ‡๏ธ) sparkle
+274C ; Extended_Pictographic# 6.0 [1] (โŒ) cross mark
+274E ; Extended_Pictographic# 6.0 [1] (โŽ) cross mark button
+2753..2755 ; Extended_Pictographic# 6.0 [3] (โ“..โ•) question mark..white exclamation mark
+2757 ; Extended_Pictographic# 5.2 [1] (โ—) exclamation mark
+2763..2767 ; Extended_Pictographic# 1.1 [5] (โฃ๏ธ..โง๏ธ) heavy heart exclamation..ROTATED FLORAL HEART BULLET
+2795..2797 ; Extended_Pictographic# 6.0 [3] (โž•..โž—) heavy plus sign..heavy division sign
+27A1 ; Extended_Pictographic# 1.1 [1] (โžก๏ธ) right arrow
+27B0 ; Extended_Pictographic# 6.0 [1] (โžฐ) curly loop
+27BF ; Extended_Pictographic# 6.0 [1] (โžฟ) double curly loop
+2934..2935 ; Extended_Pictographic# 3.2 [2] (โคด๏ธ..โคต๏ธ) right arrow curving up..right arrow curving down
+2B05..2B07 ; Extended_Pictographic# 4.0 [3] (โฌ…๏ธ..โฌ‡๏ธ) left arrow..down arrow
+2B1B..2B1C ; Extended_Pictographic# 5.1 [2] (โฌ›..โฌœ) black large square..white large square
+2B50 ; Extended_Pictographic# 5.1 [1] (โญ) star
+2B55 ; Extended_Pictographic# 5.2 [1] (โญ•) heavy large circle
+3030 ; Extended_Pictographic# 1.1 [1] (ใ€ฐ๏ธ) wavy dash
+303D ; Extended_Pictographic# 3.2 [1] (ใ€ฝ๏ธ) part alternation mark
+3297 ; Extended_Pictographic# 1.1 [1] (ใŠ—๏ธ) Japanese โ€œcongratulationsโ€ button
+3299 ; Extended_Pictographic# 1.1 [1] (ใŠ™๏ธ) Japanese โ€œsecretโ€ button
+1F000..1F02B ; Extended_Pictographic# 5.1 [44] (๐Ÿ€€๏ธ..๐Ÿ€ซ๏ธ) MAHJONG TILE EAST WIND..MAHJONG TILE BACK
+1F02C..1F02F ; Extended_Pictographic# NA [4] (๐Ÿ€ฌ๏ธ..๐Ÿ€ฏ๏ธ) <reserved-1F02C>..<reserved-1F02F>
+1F030..1F093 ; Extended_Pictographic# 5.1[100] (๐Ÿ€ฐ๏ธ..๐Ÿ‚“๏ธ) DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06
+1F094..1F09F ; Extended_Pictographic# NA [12] (๐Ÿ‚”๏ธ..๐Ÿ‚Ÿ๏ธ) <reserved-1F094>..<reserved-1F09F>
+1F0A0..1F0AE ; Extended_Pictographic# 6.0 [15] (๐Ÿ‚ ๏ธ..๐Ÿ‚ฎ๏ธ) PLAYING CARD BACK..PLAYING CARD KING OF SPADES
+1F0AF..1F0B0 ; Extended_Pictographic# NA [2] (๐Ÿ‚ฏ๏ธ..๐Ÿ‚ฐ๏ธ) <reserved-1F0AF>..<reserved-1F0B0>
+1F0B1..1F0BE ; Extended_Pictographic# 6.0 [14] (๐Ÿ‚ฑ๏ธ..๐Ÿ‚พ๏ธ) PLAYING CARD ACE OF HEARTS..PLAYING CARD KING OF HEARTS
+1F0BF ; Extended_Pictographic# 7.0 [1] (๐Ÿ‚ฟ๏ธ) PLAYING CARD RED JOKER
+1F0C0 ; Extended_Pictographic# NA [1] (๐Ÿƒ€๏ธ) <reserved-1F0C0>
+1F0C1..1F0CF ; Extended_Pictographic# 6.0 [15] (๐Ÿƒ๏ธ..๐Ÿƒ) PLAYING CARD ACE OF DIAMONDS..joker
+1F0D0 ; Extended_Pictographic# NA [1] (๐Ÿƒ๏ธ) <reserved-1F0D0>
+1F0D1..1F0DF ; Extended_Pictographic# 6.0 [15] (๐Ÿƒ‘๏ธ..๐ŸƒŸ๏ธ) PLAYING CARD ACE OF CLUBS..PLAYING CARD WHITE JOKER
+1F0E0..1F0F5 ; Extended_Pictographic# 7.0 [22] (๐Ÿƒ ๏ธ..๐Ÿƒต๏ธ) PLAYING CARD FOOL..PLAYING CARD TRUMP-21
+1F0F6..1F0FF ; Extended_Pictographic# NA [10] (๐Ÿƒถ๏ธ..๐Ÿƒฟ๏ธ) <reserved-1F0F6>..<reserved-1F0FF>
+1F10D..1F10F ; Extended_Pictographic# NA [3] (๐Ÿ„๏ธ..๐Ÿ„๏ธ) <reserved-1F10D>..<reserved-1F10F>
+1F12F ; Extended_Pictographic# 11.0 [1] (๐Ÿ„ฏ๏ธ) COPYLEFT SYMBOL
+1F16C..1F16F ; Extended_Pictographic# NA [4] (๐Ÿ…ฌ๏ธ..๐Ÿ…ฏ๏ธ) <reserved-1F16C>..<reserved-1F16F>
+1F170..1F171 ; Extended_Pictographic# 6.0 [2] (๐Ÿ…ฐ๏ธ..๐Ÿ…ฑ๏ธ) A button (blood type)..B button (blood type)
+1F17E ; Extended_Pictographic# 6.0 [1] (๐Ÿ…พ๏ธ) O button (blood type)
+1F17F ; Extended_Pictographic# 5.2 [1] (๐Ÿ…ฟ๏ธ) P button
+1F18E ; Extended_Pictographic# 6.0 [1] (๐Ÿ†Ž) AB button (blood type)
+1F191..1F19A ; Extended_Pictographic# 6.0 [10] (๐Ÿ†‘..๐Ÿ†š) CL button..VS button
+1F1AD..1F1E5 ; Extended_Pictographic# NA [57] (๐Ÿ†ญ๏ธ..๐Ÿ‡ฅ๏ธ) <reserved-1F1AD>..<reserved-1F1E5>
+1F201..1F202 ; Extended_Pictographic# 6.0 [2] (๐Ÿˆ..๐Ÿˆ‚๏ธ) Japanese โ€œhereโ€ button..Japanese โ€œservice chargeโ€ button
+1F203..1F20F ; Extended_Pictographic# NA [13] (๐Ÿˆƒ๏ธ..๐Ÿˆ๏ธ) <reserved-1F203>..<reserved-1F20F>
+1F21A ; Extended_Pictographic# 5.2 [1] (๐Ÿˆš) Japanese โ€œfree of chargeโ€ button
+1F22F ; Extended_Pictographic# 5.2 [1] (๐Ÿˆฏ) Japanese โ€œreservedโ€ button
+1F232..1F23A ; Extended_Pictographic# 6.0 [9] (๐Ÿˆฒ..๐Ÿˆบ) Japanese โ€œprohibitedโ€ button..Japanese โ€œopen for businessโ€ button
+1F23C..1F23F ; Extended_Pictographic# NA [4] (๐Ÿˆผ๏ธ..๐Ÿˆฟ๏ธ) <reserved-1F23C>..<reserved-1F23F>
+1F249..1F24F ; Extended_Pictographic# NA [7] (๐Ÿ‰‰๏ธ..๐Ÿ‰๏ธ) <reserved-1F249>..<reserved-1F24F>
+1F250..1F251 ; Extended_Pictographic# 6.0 [2] (๐Ÿ‰..๐Ÿ‰‘) Japanese โ€œbargainโ€ button..Japanese โ€œacceptableโ€ button
+1F252..1F25F ; Extended_Pictographic# NA [14] (๐Ÿ‰’๏ธ..๐Ÿ‰Ÿ๏ธ) <reserved-1F252>..<reserved-1F25F>
+1F260..1F265 ; Extended_Pictographic# 10.0 [6] (๐Ÿ‰ ๏ธ..๐Ÿ‰ฅ๏ธ) ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI
+1F266..1F2FF ; Extended_Pictographic# NA[154] (๐Ÿ‰ฆ๏ธ..๐Ÿ‹ฟ๏ธ) <reserved-1F266>..<reserved-1F2FF>
+1F300..1F320 ; Extended_Pictographic# 6.0 [33] (๐ŸŒ€..๐ŸŒ ) cyclone..shooting star
+1F321..1F32C ; Extended_Pictographic# 7.0 [12] (๐ŸŒก๏ธ..๐ŸŒฌ๏ธ) thermometer..wind face
+1F32D..1F32F ; Extended_Pictographic# 8.0 [3] (๐ŸŒญ..๐ŸŒฏ) hot dog..burrito
+1F330..1F335 ; Extended_Pictographic# 6.0 [6] (๐ŸŒฐ..๐ŸŒต) chestnut..cactus
+1F336 ; Extended_Pictographic# 7.0 [1] (๐ŸŒถ๏ธ) hot pepper
+1F337..1F37C ; Extended_Pictographic# 6.0 [70] (๐ŸŒท..๐Ÿผ) tulip..baby bottle
+1F37D ; Extended_Pictographic# 7.0 [1] (๐Ÿฝ๏ธ) fork and knife with plate
+1F37E..1F37F ; Extended_Pictographic# 8.0 [2] (๐Ÿพ..๐Ÿฟ) bottle with popping cork..popcorn
+1F380..1F393 ; Extended_Pictographic# 6.0 [20] (๐ŸŽ€..๐ŸŽ“) ribbon..graduation cap
+1F394..1F39F ; Extended_Pictographic# 7.0 [12] (๐ŸŽ”๏ธ..๐ŸŽŸ๏ธ) HEART WITH TIP ON THE LEFT..admission tickets
+1F3A0..1F3C4 ; Extended_Pictographic# 6.0 [37] (๐ŸŽ ..๐Ÿ„) carousel horse..person surfing
+1F3C5 ; Extended_Pictographic# 7.0 [1] (๐Ÿ…) sports medal
+1F3C6..1F3CA ; Extended_Pictographic# 6.0 [5] (๐Ÿ†..๐ŸŠ) trophy..person swimming
+1F3CB..1F3CE ; Extended_Pictographic# 7.0 [4] (๐Ÿ‹๏ธ..๐ŸŽ๏ธ) person lifting weights..racing car
+1F3CF..1F3D3 ; Extended_Pictographic# 8.0 [5] (๐Ÿ..๐Ÿ“) cricket game..ping pong
+1F3D4..1F3DF ; Extended_Pictographic# 7.0 [12] (๐Ÿ”๏ธ..๐ŸŸ๏ธ) snow-capped mountain..stadium
+1F3E0..1F3F0 ; Extended_Pictographic# 6.0 [17] (๐Ÿ ..๐Ÿฐ) house..castle
+1F3F1..1F3F7 ; Extended_Pictographic# 7.0 [7] (๐Ÿฑ๏ธ..๐Ÿท๏ธ) WHITE PENNANT..label
+1F3F8..1F3FA ; Extended_Pictographic# 8.0 [3] (๐Ÿธ..๐Ÿบ) badminton..amphora
+1F400..1F43E ; Extended_Pictographic# 6.0 [63] (๐Ÿ€..๐Ÿพ) rat..paw prints
+1F43F ; Extended_Pictographic# 7.0 [1] (๐Ÿฟ๏ธ) chipmunk
+1F440 ; Extended_Pictographic# 6.0 [1] (๐Ÿ‘€) eyes
+1F441 ; Extended_Pictographic# 7.0 [1] (๐Ÿ‘๏ธ) eye
+1F442..1F4F7 ; Extended_Pictographic# 6.0[182] (๐Ÿ‘‚..๐Ÿ“ท) ear..camera
+1F4F8 ; Extended_Pictographic# 7.0 [1] (๐Ÿ“ธ) camera with flash
+1F4F9..1F4FC ; Extended_Pictographic# 6.0 [4] (๐Ÿ“น..๐Ÿ“ผ) video camera..videocassette
+1F4FD..1F4FE ; Extended_Pictographic# 7.0 [2] (๐Ÿ“ฝ๏ธ..๐Ÿ“พ๏ธ) film projector..PORTABLE STEREO
+1F4FF ; Extended_Pictographic# 8.0 [1] (๐Ÿ“ฟ) prayer beads
+1F500..1F53D ; Extended_Pictographic# 6.0 [62] (๐Ÿ”€..๐Ÿ”ฝ) shuffle tracks button..downwards button
+1F546..1F54A ; Extended_Pictographic# 7.0 [5] (๐Ÿ•†๏ธ..๐Ÿ•Š๏ธ) WHITE LATIN CROSS..dove
+1F54B..1F54F ; Extended_Pictographic# 8.0 [5] (๐Ÿ•‹..๐Ÿ•๏ธ) kaaba..BOWL OF HYGIEIA
+1F550..1F567 ; Extended_Pictographic# 6.0 [24] (๐Ÿ•..๐Ÿ•ง) one oโ€™clock..twelve-thirty
+1F568..1F579 ; Extended_Pictographic# 7.0 [18] (๐Ÿ•จ๏ธ..๐Ÿ•น๏ธ) RIGHT SPEAKER..joystick
+1F57A ; Extended_Pictographic# 9.0 [1] (๐Ÿ•บ) man dancing
+1F57B..1F5A3 ; Extended_Pictographic# 7.0 [41] (๐Ÿ•ป๏ธ..๐Ÿ–ฃ๏ธ) LEFT HAND TELEPHONE RECEIVER..BLACK DOWN POINTING BACKHAND INDEX
+1F5A4 ; Extended_Pictographic# 9.0 [1] (๐Ÿ–ค) black heart
+1F5A5..1F5FA ; Extended_Pictographic# 7.0 [86] (๐Ÿ–ฅ๏ธ..๐Ÿ—บ๏ธ) desktop computer..world map
+1F5FB..1F5FF ; Extended_Pictographic# 6.0 [5] (๐Ÿ—ป..๐Ÿ—ฟ) mount fuji..moai
+1F600 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜€) grinning face
+1F601..1F610 ; Extended_Pictographic# 6.0 [16] (๐Ÿ˜..๐Ÿ˜) beaming face with smiling eyes..neutral face
+1F611 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜‘) expressionless face
+1F612..1F614 ; Extended_Pictographic# 6.0 [3] (๐Ÿ˜’..๐Ÿ˜”) unamused face..pensive face
+1F615 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜•) confused face
+1F616 ; Extended_Pictographic# 6.0 [1] (๐Ÿ˜–) confounded face
+1F617 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜—) kissing face
+1F618 ; Extended_Pictographic# 6.0 [1] (๐Ÿ˜˜) face blowing a kiss
+1F619 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜™) kissing face with smiling eyes
+1F61A ; Extended_Pictographic# 6.0 [1] (๐Ÿ˜š) kissing face with closed eyes
+1F61B ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜›) face with tongue
+1F61C..1F61E ; Extended_Pictographic# 6.0 [3] (๐Ÿ˜œ..๐Ÿ˜ž) winking face with tongue..disappointed face
+1F61F ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜Ÿ) worried face
+1F620..1F625 ; Extended_Pictographic# 6.0 [6] (๐Ÿ˜ ..๐Ÿ˜ฅ) angry face..sad but relieved face
+1F626..1F627 ; Extended_Pictographic# 6.1 [2] (๐Ÿ˜ฆ..๐Ÿ˜ง) frowning face with open mouth..anguished face
+1F628..1F62B ; Extended_Pictographic# 6.0 [4] (๐Ÿ˜จ..๐Ÿ˜ซ) fearful face..tired face
+1F62C ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜ฌ) grimacing face
+1F62D ; Extended_Pictographic# 6.0 [1] (๐Ÿ˜ญ) loudly crying face
+1F62E..1F62F ; Extended_Pictographic# 6.1 [2] (๐Ÿ˜ฎ..๐Ÿ˜ฏ) face with open mouth..hushed face
+1F630..1F633 ; Extended_Pictographic# 6.0 [4] (๐Ÿ˜ฐ..๐Ÿ˜ณ) anxious face with sweat..flushed face
+1F634 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜ด) sleeping face
+1F635..1F640 ; Extended_Pictographic# 6.0 [12] (๐Ÿ˜ต..๐Ÿ™€) dizzy face..weary cat face
+1F641..1F642 ; Extended_Pictographic# 7.0 [2] (๐Ÿ™..๐Ÿ™‚) slightly frowning face..slightly smiling face
+1F643..1F644 ; Extended_Pictographic# 8.0 [2] (๐Ÿ™ƒ..๐Ÿ™„) upside-down face..face with rolling eyes
+1F645..1F64F ; Extended_Pictographic# 6.0 [11] (๐Ÿ™…..๐Ÿ™) person gesturing NO..folded hands
+1F680..1F6C5 ; Extended_Pictographic# 6.0 [70] (๐Ÿš€..๐Ÿ›…) rocket..left luggage
+1F6C6..1F6CF ; Extended_Pictographic# 7.0 [10] (๐Ÿ›†๏ธ..๐Ÿ›๏ธ) TRIANGLE WITH ROUNDED CORNERS..bed
+1F6D0 ; Extended_Pictographic# 8.0 [1] (๐Ÿ›) place of worship
+1F6D1..1F6D2 ; Extended_Pictographic# 9.0 [2] (๐Ÿ›‘..๐Ÿ›’) stop sign..shopping cart
+1F6D3..1F6D4 ; Extended_Pictographic# 10.0 [2] (๐Ÿ›“๏ธ..๐Ÿ›”๏ธ) STUPA..PAGODA
+1F6D5..1F6DF ; Extended_Pictographic# NA [11] (๐Ÿ›•๏ธ..๐Ÿ›Ÿ๏ธ) <reserved-1F6D5>..<reserved-1F6DF>
+1F6E0..1F6EC ; Extended_Pictographic# 7.0 [13] (๐Ÿ› ๏ธ..๐Ÿ›ฌ) hammer and wrench..airplane arrival
+1F6ED..1F6EF ; Extended_Pictographic# NA [3] (๐Ÿ›ญ๏ธ..๐Ÿ›ฏ๏ธ) <reserved-1F6ED>..<reserved-1F6EF>
+1F6F0..1F6F3 ; Extended_Pictographic# 7.0 [4] (๐Ÿ›ฐ๏ธ..๐Ÿ›ณ๏ธ) satellite..passenger ship
+1F6F4..1F6F6 ; Extended_Pictographic# 9.0 [3] (๐Ÿ›ด..๐Ÿ›ถ) kick scooter..canoe
+1F6F7..1F6F8 ; Extended_Pictographic# 10.0 [2] (๐Ÿ›ท..๐Ÿ›ธ) sled..flying saucer
+1F6F9 ; Extended_Pictographic# 11.0 [1] (๐Ÿ›น) skateboard
+1F6FA..1F6FF ; Extended_Pictographic# NA [6] (๐Ÿ›บ๏ธ..๐Ÿ›ฟ๏ธ) <reserved-1F6FA>..<reserved-1F6FF>
+1F774..1F77F ; Extended_Pictographic# NA [12] (๐Ÿด๏ธ..๐Ÿฟ๏ธ) <reserved-1F774>..<reserved-1F77F>
+1F7D5..1F7D8 ; Extended_Pictographic# 11.0 [4] (๐ŸŸ•๏ธ..๐ŸŸ˜๏ธ) CIRCLED TRIANGLE..NEGATIVE CIRCLED SQUARE
+1F7D9..1F7FF ; Extended_Pictographic# NA [39] (๐ŸŸ™๏ธ..๐ŸŸฟ๏ธ) <reserved-1F7D9>..<reserved-1F7FF>
+1F80C..1F80F ; Extended_Pictographic# NA [4] (๐Ÿ Œ๏ธ..๐Ÿ ๏ธ) <reserved-1F80C>..<reserved-1F80F>
+1F848..1F84F ; Extended_Pictographic# NA [8] (๐Ÿกˆ๏ธ..๐Ÿก๏ธ) <reserved-1F848>..<reserved-1F84F>
+1F85A..1F85F ; Extended_Pictographic# NA [6] (๐Ÿกš๏ธ..๐ŸกŸ๏ธ) <reserved-1F85A>..<reserved-1F85F>
+1F888..1F88F ; Extended_Pictographic# NA [8] (๐Ÿขˆ๏ธ..๐Ÿข๏ธ) <reserved-1F888>..<reserved-1F88F>
+1F8AE..1F8FF ; Extended_Pictographic# NA [82] (๐Ÿขฎ๏ธ..๐Ÿฃฟ๏ธ) <reserved-1F8AE>..<reserved-1F8FF>
+1F90C..1F90F ; Extended_Pictographic# NA [4] (๐ŸคŒ๏ธ..๐Ÿค๏ธ) <reserved-1F90C>..<reserved-1F90F>
+1F910..1F918 ; Extended_Pictographic# 8.0 [9] (๐Ÿค..๐Ÿค˜) zipper-mouth face..sign of the horns
+1F919..1F91E ; Extended_Pictographic# 9.0 [6] (๐Ÿค™..๐Ÿคž) call me hand..crossed fingers
+1F91F ; Extended_Pictographic# 10.0 [1] (๐ŸคŸ) love-you gesture
+1F920..1F927 ; Extended_Pictographic# 9.0 [8] (๐Ÿค ..๐Ÿคง) cowboy hat face..sneezing face
+1F928..1F92F ; Extended_Pictographic# 10.0 [8] (๐Ÿคจ..๐Ÿคฏ) face with raised eyebrow..exploding head
+1F930 ; Extended_Pictographic# 9.0 [1] (๐Ÿคฐ) pregnant woman
+1F931..1F932 ; Extended_Pictographic# 10.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together
+1F933..1F93A ; Extended_Pictographic# 9.0 [8] (๐Ÿคณ..๐Ÿคบ) selfie..person fencing
+1F93C..1F93E ; Extended_Pictographic# 9.0 [3] (๐Ÿคผ..๐Ÿคพ) people wrestling..person playing handball
+1F93F ; Extended_Pictographic# NA [1] (๐Ÿคฟ๏ธ) <reserved-1F93F>
+1F940..1F945 ; Extended_Pictographic# 9.0 [6] (๐Ÿฅ€..๐Ÿฅ…) wilted flower..goal net
+1F947..1F94B ; Extended_Pictographic# 9.0 [5] (๐Ÿฅ‡..๐Ÿฅ‹) 1st place medal..martial arts uniform
+1F94C ; Extended_Pictographic# 10.0 [1] (๐ŸฅŒ) curling stone
+1F94D..1F94F ; Extended_Pictographic# 11.0 [3] (๐Ÿฅ..๐Ÿฅ) lacrosse..flying disc
+1F950..1F95E ; Extended_Pictographic# 9.0 [15] (๐Ÿฅ..๐Ÿฅž) croissant..pancakes
+1F95F..1F96B ; Extended_Pictographic# 10.0 [13] (๐ŸฅŸ..๐Ÿฅซ) dumpling..canned food
+1F96C..1F970 ; Extended_Pictographic# 11.0 [5] (๐Ÿฅฌ..๐Ÿฅฐ) leafy green..smiling face with 3 hearts
+1F971..1F972 ; Extended_Pictographic# NA [2] (๐Ÿฅฑ๏ธ..๐Ÿฅฒ๏ธ) <reserved-1F971>..<reserved-1F972>
+1F973..1F976 ; Extended_Pictographic# 11.0 [4] (๐Ÿฅณ..๐Ÿฅถ) partying face..cold face
+1F977..1F979 ; Extended_Pictographic# NA [3] (๐Ÿฅท๏ธ..๐Ÿฅน๏ธ) <reserved-1F977>..<reserved-1F979>
+1F97A ; Extended_Pictographic# 11.0 [1] (๐Ÿฅบ) pleading face
+1F97B ; Extended_Pictographic# NA [1] (๐Ÿฅป๏ธ) <reserved-1F97B>
+1F97C..1F97F ; Extended_Pictographic# 11.0 [4] (๐Ÿฅผ..๐Ÿฅฟ) lab coat..womanโ€™s flat shoe
+1F980..1F984 ; Extended_Pictographic# 8.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn face
+1F985..1F991 ; Extended_Pictographic# 9.0 [13] (๐Ÿฆ…..๐Ÿฆ‘) eagle..squid
+1F992..1F997 ; Extended_Pictographic# 10.0 [6] (๐Ÿฆ’..๐Ÿฆ—) giraffe..cricket
+1F998..1F9A2 ; Extended_Pictographic# 11.0 [11] (๐Ÿฆ˜..๐Ÿฆข) kangaroo..swan
+1F9A3..1F9AF ; Extended_Pictographic# NA [13] (๐Ÿฆฃ๏ธ..๐Ÿฆฏ๏ธ) <reserved-1F9A3>..<reserved-1F9AF>
+1F9B0..1F9B9 ; Extended_Pictographic# 11.0 [10] (๐Ÿฆฐ..๐Ÿฆน) red-haired..supervillain
+1F9BA..1F9BF ; Extended_Pictographic# NA [6] (๐Ÿฆบ๏ธ..๐Ÿฆฟ๏ธ) <reserved-1F9BA>..<reserved-1F9BF>
+1F9C0 ; Extended_Pictographic# 8.0 [1] (๐Ÿง€) cheese wedge
+1F9C1..1F9C2 ; Extended_Pictographic# 11.0 [2] (๐Ÿง..๐Ÿง‚) cupcake..salt
+1F9C3..1F9CF ; Extended_Pictographic# NA [13] (๐Ÿงƒ๏ธ..๐Ÿง๏ธ) <reserved-1F9C3>..<reserved-1F9CF>
+1F9D0..1F9E6 ; Extended_Pictographic# 10.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks
+1F9E7..1F9FF ; Extended_Pictographic# 11.0 [25] (๐Ÿงง..๐Ÿงฟ) red envelope..nazar amulet
+1FA00..1FA5F ; Extended_Pictographic# NA [96] (๐Ÿจ€๏ธ..๐ŸฉŸ๏ธ) <reserved-1FA00>..<reserved-1FA5F>
+1FA60..1FA6D ; Extended_Pictographic# 11.0 [14] (๐Ÿฉ ๏ธ..๐Ÿฉญ๏ธ) XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
+1FA6E..1FFFD ; Extended_Pictographic# NA[1424] (๐Ÿฉฎ๏ธ..๐Ÿฟฝ๏ธ) <reserved-1FA6E>..<reserved-1FFFD>
+
+# Total elements: 3793
+
+#EOF
diff --git a/lib/stdlib/uc_spec/gen_unicode_mod.escript b/lib/stdlib/uc_spec/gen_unicode_mod.escript
index fe5a860d45..70eec1a6f2 100755
--- a/lib/stdlib/uc_spec/gen_unicode_mod.escript
+++ b/lib/stdlib/uc_spec/gen_unicode_mod.escript
@@ -48,13 +48,18 @@ main(_) ->
ok = file:close(ExclF),
%% GraphemeBreakProperty table
+ {ok, Emoji} = file:open("../uc_spec/emoji-data.txt", [read, raw, {read_ahead, 1000000}]),
+ Props00 = foldl(fun parse_properties/2, [], Emoji),
+ %% Filter Extended_Pictographic class which we are interested in.
+ Props0 = [EP || {extended_pictographic, _} = EP <- Props00],
+ ok = file:close(Emoji),
{ok, GBPF} = file:open("../uc_spec/GraphemeBreakProperty.txt", [read, raw, {read_ahead, 1000000}]),
- Props0 = foldl(fun parse_properties/2, [], GBPF),
+ Props1 = foldl(fun parse_properties/2, Props0, GBPF),
ok = file:close(GBPF),
{ok, PropF} = file:open("../uc_spec/PropList.txt", [read, raw, {read_ahead, 1000000}]),
- Props1 = foldl(fun parse_properties/2, Props0, PropF),
+ Props2 = foldl(fun parse_properties/2, Props1, PropF),
ok = file:close(PropF),
- Props = sofs:to_external(sofs:relation_to_family(sofs:relation(Props1))),
+ Props = sofs:to_external(sofs:relation_to_family(sofs:relation(Props2))),
%% Make module
{ok, Out} = file:open(?MOD++".erl", [write]),
@@ -170,7 +175,7 @@ gen_header(Fd) ->
io:put_chars(Fd, "-export([spec_version/0, lookup/1, get_case/1]).\n"),
io:put_chars(Fd, "-inline([class/1]).\n"),
io:put_chars(Fd, "-compile(nowarn_unused_vars).\n"),
- io:put_chars(Fd, "-dialyzer({no_improper_lists, [cp/1, gc/1, gc_prepend/2, gc_e_cont/2]}).\n"),
+ io:put_chars(Fd, "-dialyzer({no_improper_lists, [cp/1, gc/1, gc_prepend/2]}).\n"),
io:put_chars(Fd, "-type gc() :: char()|[char()].\n\n\n"),
ok.
@@ -186,7 +191,7 @@ gen_static(Fd) ->
" {U,L} -> #{upper=>U,lower=>L,title=>U,fold=>L};\n"
" {U,L,T,F} -> #{upper=>U,lower=>L,title=>T,fold=>F}\n"
" end.\n\n"),
- io:put_chars(Fd, "spec_version() -> {10,0}.\n\n\n"),
+ io:put_chars(Fd, "spec_version() -> {11,0}.\n\n\n"),
io:put_chars(Fd, "class(Codepoint) -> {CCC,_,_} = unicode_table(Codepoint),\n CCC.\n\n"),
io:put_chars(Fd, "-spec uppercase(unicode:chardata()) -> "
"maybe_improper_list(gc(),unicode:chardata()).\n"),
@@ -495,33 +500,34 @@ gen_gc(Fd, GBP) ->
" [$\\n|R1] -> [[$\\r,$\\n]|R1];\n"
" _ -> R\n"
" end;\n"
- %% "gc_1([CP1, CP2|_]=T) when CP1 < 256, CP2 < 256 ->\n"
- %% " T; %% Fast path\n"
- %% "gc_1([CP1|<<CP2/utf8, _/binary>>]=T) when CP1 < 256, CP2 < 256 ->\n"
- %% " T; %% Fast path\n"
),
- io:put_chars(Fd, "%% Handle control\n"),
+ GenExtP = fun(Range) -> io:format(Fd, "gc_1~s gc_ext_pict(R1,[CP]);\n", [gen_clause(Range)]) end,
+ ExtendedPictographic0 = merge_ranges(maps:get(extended_pictographic,GBP)),
+ %% Pick codepoints below 256 (some data knowledge here)
+ {ExtendedPictographicLow,ExtendedPictographicHigh} =
+ lists:splitwith(fun({Start,undefined}) -> Start < 256 end,ExtendedPictographic0),
+
+ io:put_chars(Fd, "\n%% Handle control\n"),
GenControl = fun(Range) -> io:format(Fd, "gc_1~s R0;\n", [gen_clause(Range)]) end,
CRs0 = merge_ranges(maps:get(cr, GBP) ++ maps:get(lf, GBP) ++ maps:get(control, GBP), false),
[R1,R2,R3|Crs] = CRs0,
[GenControl(CP) || CP <- merge_ranges([R1,R2,R3], split), CP =/= {$\r, undefined}],
%%GenControl(R1),GenControl(R2),GenControl(R3),
- io:format(Fd, "gc_1([CP|R]) when CP < 256 -> gc_extend(R,CP);\n", []),
+ io:put_chars(Fd, "\n%% Optimize Latin-1\n"),
+ [GenExtP(CP) || CP <- merge_ranges(ExtendedPictographicLow)],
+ io:format(Fd, "gc_1([CP|R]) when CP < 256 -> gc_extend(R,CP);\n\n", []),
+ io:put_chars(Fd, "\n%% Continue control\n"),
[GenControl(CP) || CP <- Crs],
%% One clause per CP
%% CRs0 = merge_ranges(maps:get(cr, GBP) ++ maps:get(lf, GBP) ++ maps:get(control, GBP)),
%% [GenControl(CP) || CP <- CRs0, CP =/= {$\r, undefined}],
- io:put_chars(Fd, "%% Handle ZWJ\n"),
- GenZWJ = fun(Range) -> io:format(Fd, "gc_1~s gc_zwj(R1, [CP]);\n", [gen_clause(Range)]) end,
- [GenZWJ(CP) || CP <- merge_ranges(maps:get(zwj,GBP))],
-
- io:put_chars(Fd, "%% Handle prepend\n"),
+ io:put_chars(Fd, "\n%% Handle prepend\n"),
GenPrepend = fun(Range) -> io:format(Fd, "gc_1~s gc_prepend(R1, CP);\n", [gen_clause(Range)]) end,
[GenPrepend(CP) || CP <- merge_ranges(maps:get(prepend,GBP))],
- io:put_chars(Fd, "%% Handle Hangul L\n"),
+ io:put_chars(Fd, "\n%% Handle Hangul L\n"),
GenHangulL = fun(Range) -> io:format(Fd, "gc_1~s gc_h_L(R1,[CP]);\n", [gen_clause(Range)]) end,
[GenHangulL(CP) || CP <- merge_ranges(maps:get(l,GBP))],
io:put_chars(Fd, "%% Handle Hangul V\n"),
@@ -533,16 +539,19 @@ gen_gc(Fd, GBP) ->
io:put_chars(Fd, "%% Handle Hangul LV and LVT special, since they are large\n"),
io:put_chars(Fd, "gc_1([CP|_]=R0) when 44000 < CP, CP < 56000 -> gc_h_lv_lvt(R0, []);\n"),
- io:put_chars(Fd, "%% Handle Regional\n"),
+ io:put_chars(Fd, "\n%% Handle Regional\n"),
GenRegional = fun(Range) -> io:format(Fd, "gc_1~s gc_regional(R1,[CP]);\n", [gen_clause(Range)]) end,
[GenRegional(CP) || CP <- merge_ranges(maps:get(regional_indicator,GBP))],
- io:put_chars(Fd, "%% Handle E_Base\n"),
- GenEBase = fun(Range) -> io:format(Fd, "gc_1~s gc_e_cont(R1,[CP]);\n", [gen_clause(Range)]) end,
- [GenEBase(CP) || CP <- merge_ranges(maps:get(e_base,GBP))],
- io:put_chars(Fd, "%% Handle EBG\n"),
- GenEBG = fun(Range) -> io:format(Fd, "gc_1~s gc_e_cont(R1,[CP]);\n", [gen_clause(Range)]) end,
- [GenEBG(CP) || CP <- merge_ranges(maps:get(e_base_gaz,GBP))],
-
+ %% io:put_chars(Fd, "%% Handle E_Base\n"),
+ %% GenEBase = fun(Range) -> io:format(Fd, "gc_1~s gc_e_cont(R1,[CP]);\n", [gen_clause(Range)]) end,
+ %% [GenEBase(CP) || CP <- merge_ranges(maps:get(e_base,GBP))],
+ %% io:put_chars(Fd, "%% Handle EBG\n"),
+ %% GenEBG = fun(Range) -> io:format(Fd, "gc_1~s gc_e_cont(R1,[CP]);\n", [gen_clause(Range)]) end,
+ %% [GenEBG(CP) || CP <- merge_ranges(maps:get(e_base_gaz,GBP))],
+
+ io:put_chars(Fd, "%% Handle extended_pictographic\n"),
+ [GenExtP(CP) || CP <- merge_ranges(ExtendedPictographicHigh)],
+ io:put_chars(Fd, "\n%% default clauses\n"),
io:put_chars(Fd, "gc_1([CP|R]) -> gc_extend(R, CP);\n"),
io:put_chars(Fd, "gc_1([]) -> [];\n"),
io:put_chars(Fd, "gc_1({error,_}=Error) -> Error.\n\n"),
@@ -577,21 +586,16 @@ gen_gc(Fd, GBP) ->
io:put_chars(Fd,
"gc_extend([CP|T], T0, Acc0) ->\n"
" case is_extend(CP) of\n"
- " zwj ->\n"
- " case Acc0 of\n"
- " [_|_] -> gc_zwj(T, [CP|Acc0]);\n"
- " Acc -> gc_zwj(T, [CP,Acc])\n"
- " end;\n"
- " true ->\n"
- " case Acc0 of\n"
- " [_|_] -> gc_extend(T, [CP|Acc0]);\n"
- " Acc -> gc_extend(T, [CP,Acc])\n"
- " end;\n"
" false ->\n"
" case Acc0 of\n"
" [Acc] -> [Acc|T0];\n"
" [_|_]=Acc -> [lists:reverse(Acc)|T0];\n"
" Acc -> [Acc|T0]\n"
+ " end;\n"
+ " _TrueOrZWJ ->\n"
+ " case Acc0 of\n"
+ " [_|_] -> gc_extend(T, [CP|Acc0]);\n"
+ " Acc -> gc_extend(T, [CP,Acc])\n"
" end\n"
" end;\n"
"gc_extend([], _, Acc0) ->\n"
@@ -612,49 +616,46 @@ gen_gc(Fd, GBP) ->
io:put_chars(Fd, "is_extend(_) -> false.\n\n"),
io:put_chars(Fd,
- "gc_e_cont(R0, Acc) ->\n"
- " case cp(R0) of\n"
- " [CP|R1] ->\n"
- " case is_extend(CP) of\n"
- " zwj -> gc_zwj(R1, [CP|Acc]);\n"
- " true -> gc_e_cont(R1, [CP|Acc]);\n"
- " false ->\n"
- " case is_emodifier(CP) of\n"
- " true -> [lists:reverse([CP|Acc])|R1];\n"
- " false ->\n"
- " case Acc of\n"
- " [A] -> [A|R0];\n"
- " _ -> [lists:reverse(Acc)|R0]\n"
- " end\n"
- " end\n"
- " end;\n"
- " [] ->\n"
+ "gc_ext_pict(T, Acc) ->\n"
+ " gc_ext_pict(cp(T), T, Acc).\n\n"
+ "gc_ext_pict([CP|R1], T0, Acc) ->\n"
+ " case is_extend(CP) of\n"
+ " zwj -> gc_ext_pict_zwj(cp(R1), R1, [CP|Acc]);\n"
+ " true -> gc_ext_pict(R1, [CP|Acc]);\n"
+ " false ->\n"
" case Acc of\n"
- " [A] -> [A];\n"
- " _ -> [lists:reverse(Acc)]\n"
- " end;\n"
- " {error,R} ->\n"
+ " [A] -> [A|T0];\n"
+ " _ -> [lists:reverse(Acc)|T0]\n"
+ " end\n"
+ " end;\n"
+ "gc_ext_pict([], _T0, Acc) ->\n"
+ " case Acc of\n"
+ " [A] -> [A];\n"
+ " _ -> [lists:reverse(Acc)]\n"
+ " end;\n"
+ "gc_ext_pict({error,R}, T, Acc) ->\n"
+ " gc_ext_pict([], T, Acc) ++ [R].\n\n"),
+ io:put_chars(Fd,
+ "gc_ext_pict_zwj([CP|R1], T0, Acc) ->\n"
+ " case is_ext_pict(CP) of\n"
+ " true -> gc_ext_pict(R1, [CP|Acc]);\n"
+ " false ->\n"
" case Acc of\n"
- " [A] -> [A|R];\n"
- " _ -> [lists:reverse(Acc)|R]\n"
+ " [A] -> [A|T0];\n"
+ " _ -> [lists:reverse(Acc)|T0]\n"
" end\n"
- " end.\n\n"),
-
- GenEMod = fun(Range) -> io:format(Fd, "is_emodifier~s true;\n", [gen_single_clause(Range)]) end,
- EMods = merge_ranges(maps:get(e_modifier, GBP), split),
- [GenEMod(CP) || CP <- EMods],
- io:put_chars(Fd, "is_emodifier(_) -> false.\n\n"),
-
- io:put_chars(Fd, "gc_zwj(R0, Acc) ->\n case cp(R0) of\n"),
- GenZWJGlue = fun(Range) -> io:format(Fd, "~8c~s gc_extend(R1, R0, [CP|Acc]);\n",
- [$\s,gen_case_clause(Range)]) end,
- [GenZWJGlue(CP) || CP <- merge_ranges(maps:get(glue_after_zwj,GBP))],
- GenZWJEBG = fun(Range) -> io:format(Fd, "~8c~s gc_e_cont(R1, [CP|Acc]);\n",
- [$\s,gen_case_clause(Range)]) end,
- [GenZWJEBG(CP) || CP <- merge_ranges(maps:get(e_base_gaz,GBP))],
- io:put_chars(Fd," R1 -> gc_extend(R1, R0, Acc)\n"
- " end.\n\n"),
+ " end;\n"
+ "gc_ext_pict_zwj([], _, Acc) ->\n"
+ " case Acc of\n"
+ " [A] -> [A];\n"
+ " _ -> [lists:reverse(Acc)]\n"
+ " end;\n"
+ "gc_ext_pict_zwj({error,R}, T, Acc) ->\n"
+ " gc_ext_pict_zwj([], T, Acc) ++ [R].\n\n"),
+ GenExtPict = fun(Range) -> io:format(Fd, "is_ext_pict~s true;\n", [gen_single_clause(Range)]) end,
+ [GenExtPict(CP) || CP <- ExtendedPictographic0],
+ io:put_chars(Fd, "is_ext_pict(_) -> false.\n\n"),
%% --------------------
io:put_chars(Fd, "%% Handle Regional\n"),
diff --git a/lib/tools/emacs/Makefile b/lib/tools/emacs/Makefile
index ea4d6cb723..b7775d1c8c 100644
--- a/lib/tools/emacs/Makefile
+++ b/lib/tools/emacs/Makefile
@@ -46,6 +46,7 @@ EMACS_FILES= \
erlang-eunit \
erlang-edoc \
erlang-flymake \
+ erlang-test \
erlang
README_FILES= README
diff --git a/lib/tools/emacs/erlang-edoc.el b/lib/tools/emacs/erlang-edoc.el
index d0dcc81028..ea1e263faf 100644
--- a/lib/tools/emacs/erlang-edoc.el
+++ b/lib/tools/emacs/erlang-edoc.el
@@ -28,6 +28,7 @@
(defcustom erlang-edoc-indent-level 2
"Indentation level of xhtml in Erlang edoc."
+ :type '(integer)
:safe 'integerp
:group 'erlang)
diff --git a/lib/tools/emacs/erlang-eunit.el b/lib/tools/emacs/erlang-eunit.el
index 38c40927f4..53543d7b01 100644
--- a/lib/tools/emacs/erlang-eunit.el
+++ b/lib/tools/emacs/erlang-eunit.el
@@ -23,6 +23,7 @@
(eval-when-compile
(require 'cl))
+(require 'erlang)
(defvar erlang-eunit-src-candidate-dirs '("../src" ".")
"*Name of directories which to search for source files matching
@@ -331,8 +332,7 @@ With prefix arg, compiles for debug and runs tests with the verbose flag set."
t)
(apply test-fun test-args)
(if under-cover
- (save-excursion
- (set-buffer (find-file-noselect src-filename))
+ (with-current-buffer (find-file-noselect src-filename)
(erlang-eunit-analyze-coverage)))))))
(defun erlang-eunit-compile-and-run-module-tests-under-cover ()
@@ -348,8 +348,7 @@ With prefix arg, compiles for debug and runs tests with the verbose flag set."
(defun erlang-eunit-compile-file (file-path &optional under-cover)
(if (file-readable-p file-path)
- (save-excursion
- (set-buffer (find-file-noselect file-path))
+ (with-current-buffer (find-file-noselect file-path)
;; In order to run a code coverage analysis on a
;; module, we have two options:
;;
@@ -376,8 +375,7 @@ With prefix arg, compiles for debug and runs tests with the verbose flag set."
(error msg))))
(defun erlang-eunit-last-compilation-successful-p ()
- (save-excursion
- (set-buffer inferior-erlang-buffer)
+ (with-current-buffer inferior-erlang-buffer
(goto-char compilation-parsing-end)
(erlang-eunit-all-list-elems-fulfill-p
(lambda (re) (let ((continue t)
diff --git a/lib/tools/emacs/erlang-pkg.el b/lib/tools/emacs/erlang-pkg.el
index 02d6bebbf4..7e95e4050e 100644
--- a/lib/tools/emacs/erlang-pkg.el
+++ b/lib/tools/emacs/erlang-pkg.el
@@ -1,3 +1,6 @@
(define-package "erlang" "2.7.0"
"Erlang major mode"
'((emacs "24.1")))
+;; Local Variables:
+;; no-byte-compile: t
+;; End:
diff --git a/lib/tools/emacs/erlang-skels.el b/lib/tools/emacs/erlang-skels.el
index 534f50ab33..3ebc6e8e1e 100644
--- a/lib/tools/emacs/erlang-skels.el
+++ b/lib/tools/emacs/erlang-skels.el
@@ -1985,7 +1985,7 @@ configured off."
The first character of DD is space if the value is less than 10."
(let ((date (current-time-string)))
(format "%2d %s %s"
- (string-to-int (substring date 8 10))
+ (string-to-number (substring date 8 10))
(substring date 4 7)
(substring date -4))))
diff --git a/lib/tools/emacs/erlang-test.el b/lib/tools/emacs/erlang-test.el
index efe3d515e9..2ee584d11a 100644
--- a/lib/tools/emacs/erlang-test.el
+++ b/lib/tools/emacs/erlang-test.el
@@ -29,7 +29,7 @@
;; This library require GNU Emacs 25 or later.
;;
-;; There are two ways to run emacs unit tests.
+;; There are three ways to run the erlang emacs unit tests.
;;
;; 1. Within a running emacs process. Load this file. Then to run
;; all defined test cases:
@@ -49,11 +49,15 @@
;;
;; The -L option adds a directory to the load-path. It should be the
;; directory containing erlang.el and erlang-test.el.
+;;
+;; 3. Call the script test-erlang-mode in this directory. This script
+;; use the second method.
;;; Code:
+(eval-when-compile
+ (require 'cl))
(require 'ert)
-(require 'cl-lib)
(require 'erlang)
(defvar erlang-test-code
@@ -63,7 +67,7 @@
("SYMBOL" . "-define(SYMBOL, value).")
("MACRO" . "-define(MACRO(X), X + X).")
("struct" . "-record(struct, {until,maps,are,everywhere}).")
- ("function". "function() -> #struct{}."))
+ ("function" . "function() -> #struct{}."))
"Alist of erlang test code.
Each entry have the format (TAGNAME . ERLANG_CODE). If TAGNAME
is nil there is no definitions in the ERLANG_CODE. The
@@ -116,8 +120,8 @@ concatenated to form an erlang file to test on.")
(defun erlang-test-create-erlang-file (erlang-file)
(with-temp-file erlang-file
- (cl-loop for (_ . code) in erlang-test-code
- do (insert code "\n"))))
+ (loop for (_ . code) in erlang-test-code
+ do (insert code "\n"))))
(defun erlang-test-compile-tags (erlang-file tags-file)
(should (zerop (call-process "etags" nil nil nil
@@ -132,19 +136,20 @@ concatenated to form an erlang file to test on.")
(sort (erlang-expected-completion-table) #'string-lessp))))
(defun erlang-expected-completion-table ()
- (append (cl-loop for (symbol . _) in erlang-test-code
- when (stringp symbol)
- append (list symbol (concat "erlang_test:" symbol)))
+ (append (loop for (symbol . _) in erlang-test-code
+ when (stringp symbol)
+ append (list symbol (concat "erlang_test:" symbol)))
(list "erlang_test:" "erlang_test:module_info")))
(defun erlang-test-xref-find-definitions (erlang-file erlang-buffer)
- (cl-loop for (tagname . code) in erlang-test-code
- for line = 1 then (1+ line)
- do (when tagname
- (switch-to-buffer erlang-buffer)
- (erlang-test-xref-jump tagname erlang-file line)
- (erlang-test-xref-jump (concat "erlang_test:" tagname)
- erlang-file line)))
+ (loop for (tagname . code) in erlang-test-code
+ for line = 1 then (1+ line)
+ do (when tagname
+ (switch-to-buffer erlang-buffer)
+ (erlang-test-xref-jump tagname erlang-file line)
+ (when (string-equal tagname "function")
+ (erlang-test-xref-jump (concat "erlang_test:" tagname)
+ erlang-file line))))
(erlang-test-xref-jump "erlang_test:" erlang-file 1))
(defun erlang-test-xref-jump (id expected-file expected-line)
@@ -213,27 +218,27 @@ concatenated to form an erlang file to test on.")
(ert-deftest erlang-test-parse-id ()
- (cl-loop for id-string in '("fun/10"
- "qualified-function module:fun/10"
- "record reko"
- "macro _SYMBOL"
- "macro MACRO/10"
- "module modula"
- "macro"
- nil)
- for id-list in '((nil nil "fun" 10)
- (qualified-function "module" "fun" 10)
- (record nil "reko" nil)
- (macro nil "_SYMBOL" nil)
- (macro nil "MACRO" 10)
- (module nil "modula" nil)
- (nil nil "macro" nil)
- nil)
- for id-list2 = (erlang-id-to-list id-string)
- do (should (equal id-list id-list2))
- for id-string2 = (erlang-id-to-string id-list)
- do (should (equal id-string id-string2))
- collect id-list2))
+ (loop for id-string in '("fun/10"
+ "qualified-function module:fun/10"
+ "record reko"
+ "macro _SYMBOL"
+ "macro MACRO/10"
+ "module modula"
+ "macro"
+ nil)
+ for id-list in '((nil nil "fun" 10)
+ (qualified-function "module" "fun" 10)
+ (record nil "reko" nil)
+ (macro nil "_SYMBOL" nil)
+ (macro nil "MACRO" 10)
+ (module nil "modula" nil)
+ (nil nil "macro" nil)
+ nil)
+ for id-list2 = (erlang-id-to-list id-string)
+ do (should (equal id-list id-list2))
+ for id-string2 = (erlang-id-to-string id-list)
+ do (should (equal id-string id-string2))
+ collect id-list2))
(provide 'erlang-test)
diff --git a/lib/tools/emacs/erlang.el b/lib/tools/emacs/erlang.el
index 82e5c2222d..3cbe9daa60 100644
--- a/lib/tools/emacs/erlang.el
+++ b/lib/tools/emacs/erlang.el
@@ -78,6 +78,8 @@
(eval-when-compile (require 'cl))
(require 'align)
+(require 'comint)
+(require 'tempo)
;; Variables:
@@ -334,6 +336,7 @@ when a new function header is generated. When nil, no blank line is
inserted between the current line and the new header. When bound to a
number it represents the number of blank lines which should be
inserted."
+ :type '(restricted-sexp :match-alternatives (integerp 'nil))
:group 'erlang)
(defvar erlang-electric-semicolon-criteria
@@ -1711,10 +1714,10 @@ Personal extensions could be added to `erlang-menu-personal-items'.
This function should be called if any variable describing the
menu configuration is changed."
- (erlang-menu-install "Erlang" erlang-menu-items erlang-mode-map t))
+ (erlang-menu-install "Erlang" erlang-menu-items erlang-mode-map))
-(defun erlang-menu-install (name items keymap &optional popup)
+(defun erlang-menu-install (name items keymap)
"Install a menu in Emacs based on an abstract description.
NAME is the name of the menu.
@@ -3694,16 +3697,17 @@ retried without regard to module.
4. Arity - Integer in case of functions and macros if the number
of arguments could be found, otherwise nil."
(save-excursion
- (save-match-data
- (if (eq (char-syntax (following-char)) ? )
- (skip-chars-backward " \t"))
- (skip-chars-backward "[:word:]_:'")
- (cond ((looking-at erlang-module-function-regexp)
- (erlang-get-qualified-function-id-at-point))
- ((looking-at (concat erlang-atom-regexp ":"))
- (erlang-get-module-id-at-point))
- ((looking-at erlang-name-regexp)
- (erlang-get-some-other-id-at-point))))))
+ (let (case-fold-search)
+ (save-match-data
+ (if (eq (char-syntax (following-char)) ? )
+ (skip-chars-backward " \t"))
+ (skip-chars-backward "[:word:]_:'")
+ (cond ((looking-at erlang-module-function-regexp)
+ (erlang-get-qualified-function-id-at-point))
+ ((looking-at (concat erlang-atom-regexp ":"))
+ (erlang-get-module-id-at-point))
+ ((looking-at erlang-name-regexp)
+ (erlang-get-some-other-id-at-point)))))))
(defun erlang-get-qualified-function-id-at-point ()
(let ((kind 'qualified-function)
@@ -4207,22 +4211,18 @@ Return t if criteria fulfilled, nil otherwise."
nil)))))
-(defun erlang-in-literal (&optional lim)
+(defun erlang-in-literal ()
"Test if point is in string, quoted atom or comment.
Return one of the three atoms `atom', `string', and `comment'.
Should the point be inside none of the above mentioned types of
context, nil is returned."
(save-excursion
- (let* ((lim (or lim (save-excursion
- (erlang-beginning-of-clause)
- (point))))
- (state (funcall (symbol-function 'syntax-ppss))))
- (cond
- ((eq (nth 3 state) ?') 'atom)
- ((nth 3 state) 'string)
- ((nth 4 state) 'comment)
- (t nil)))))
+ (let ((state (funcall (symbol-function 'syntax-ppss))))
+ (cond ((eq (nth 3 state) ?') 'atom)
+ ((nth 3 state) 'string)
+ ((nth 4 state) 'comment)
+ (t nil)))))
(defun erlang-at-end-of-function-p ()
@@ -5041,7 +5041,10 @@ considered first when it is time to jump to the definition.")
(defun erlang-visit-tags-table-buffer (cont cbuf)
(if (< emacs-major-version 26)
(visit-tags-table-buffer cont)
- (visit-tags-table-buffer cont cbuf)))
+ ;; Remove this with-no-warnings when Emacs 26 is the required
+ ;; version minimum.
+ (with-no-warnings
+ (visit-tags-table-buffer cont cbuf))))
(defun erlang-xref-find-definitions-module-tag (module
tag
@@ -5536,7 +5539,7 @@ Return the position after the newly inserted command."
(+ insert-point insert-length)))
-(defun inferior-erlang-strip-delete (&optional s)
+(defun inferior-erlang-strip-delete (&optional _s)
"Remove `^H' (delete) and the characters it was supposed to remove."
(interactive)
(if (and (boundp 'comint-last-input-end)
@@ -5554,7 +5557,7 @@ Return the position after the newly inserted command."
;; Basically `comint-strip-ctrl-m', with a few extra checks.
-(defun inferior-erlang-strip-ctrl-m (&optional string)
+(defun inferior-erlang-strip-ctrl-m (&optional _string)
"Strip trailing `^M' characters from the current output group."
(interactive)
(if (and (boundp 'comint-last-input-end)
@@ -5591,8 +5594,8 @@ There exists two workarounds for this bug:
(let* ((dir (inferior-erlang-compile-outdir))
(noext (substring (erlang-local-buffer-file-name) 0 -4))
(opts (append (list (cons 'outdir dir))
- (if current-prefix-arg
- (list 'debug_info 'export_all))
+ (when arg
+ (list 'debug_info 'export_all))
erlang-compile-extra-opts))
end)
(with-current-buffer inferior-erlang-buffer
@@ -5641,7 +5644,6 @@ unless the optional NO-DISPLAY is non-nil."
(defun inferior-erlang-compute-compile-command (module-name opts)
(let ((ccfn erlang-compile-command-function-alist)
- (res (inferior-erlang-compute-erl-compile-command module-name opts))
ccfn-entry
done
result)
diff --git a/lib/tools/emacs/erlang_appwiz.el b/lib/tools/emacs/erlang_appwiz.el
index ecbce66f47..b71c180739 100644
--- a/lib/tools/emacs/erlang_appwiz.el
+++ b/lib/tools/emacs/erlang_appwiz.el
@@ -103,6 +103,10 @@
;;
;;
+(defvar appwiz-erlang-modulename "foo")
+(defvar appwiz-erlang-ext "_work")
+
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Erlang application wizard
@@ -245,13 +249,6 @@ creating the root directory and for naming application files."
(insert "Application specification file for " name ".")
(save-buffer)))
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;; These are setq:ed
-;;
-
-(defvar appwiz-erlang-modulename "foo")
-(defvar appwiz-erlang-ext "_work")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
@@ -468,7 +465,7 @@ Call the function `erlang-menu-init' after modifying this variable.")
The first character of DD is *not* space if the value is less than 10."
(let ((date (current-time-string)))
(format "%d %s %s"
- (string-to-int (substring date 8 10))
+ (string-to-number (substring date 8 10))
(substring date 4 7)
(substring date -4))))
diff --git a/lib/tools/test/emacs_SUITE.erl b/lib/tools/test/emacs_SUITE.erl
index 5839f9ce5b..a6d43d1816 100644
--- a/lib/tools/test/emacs_SUITE.erl
+++ b/lib/tools/test/emacs_SUITE.erl
@@ -23,18 +23,28 @@
-export([all/0, init_per_testcase/2, end_per_testcase/2]).
--export([bif_highlight/1, indent/1]).
+-export([bif_highlight/1,
+ load_interpreted/1, compile_and_load/1,
+ indent/1,
+ tests_interpreted/1, tests_compiled/1
+ ]).
all() ->
- [bif_highlight, indent].
+ [bif_highlight, load_interpreted, compile_and_load,
+ indent,
+ tests_interpreted, tests_compiled
+ ].
-init_per_testcase(_Case, Config) ->
+init_per_testcase(Case, Config) ->
ErlangEl = filename:join([code:lib_dir(tools),"emacs","erlang.el"]),
case file:read_file_info(ErlangEl) of
- {ok, _} ->
- [{el, ErlangEl}|Config];
- _ ->
- {skip, "Could not find erlang.el"}
+ {ok, _} ->
+ case Case =:= bif_highlight orelse emacs_version_ok(24.1) of
+ false -> {skip, "Old or no emacs found"};
+ _ -> [{el, ErlangEl}|Config]
+ end;
+ _ ->
+ {skip, "Could not find erlang.el"}
end.
end_per_testcase(_Case, _Config) ->
@@ -46,26 +56,26 @@ bif_highlight(Config) ->
%% All auto-imported bifs
IntBifs = lists:usort(
- [F || {F,A} <- erlang:module_info(exports),
- erl_internal:bif(F,A)]),
+ [F || {F,A} <- erlang:module_info(exports),
+ erl_internal:bif(F,A)]),
%% all bif which need erlang: prefix and are not operands
ExtBifs = lists:usort(
- [F || {F,A} <- erlang:module_info(exports),
- not erl_internal:bif(F,A) andalso
- not is_atom(catch erl_internal:op_type(F,A))]),
+ [F || {F,A} <- erlang:module_info(exports),
+ not erl_internal:bif(F,A) andalso
+ not is_atom(catch erl_internal:op_type(F,A))]),
check_bif_highlight(Bin, <<"erlang-int-bifs">>, IntBifs),
check_bif_highlight(Bin, <<"erlang-ext-bifs">>, ExtBifs).
-
+
check_bif_highlight(Bin, Tag, Compare) ->
- [_H,IntMatch,_T] =
- re:split(Bin,<<"defvar ",Tag/binary,
- "[^(]*\\(([^)]*)">>,[]),
- EmacsIntBifs = [list_to_atom(S) ||
- S <- string:tokens(binary_to_list(IntMatch)," '\"\n")],
-
+ [_H,IntMatch,_T] =
+ re:split(Bin,<<"defvar ",Tag/binary,
+ "[^(]*\\(([^)]*)">>,[]),
+ EmacsIntBifs = [list_to_atom(S) ||
+ S <- string:tokens(binary_to_list(IntMatch)," '\"\n")],
+
ct:log("Emacs ~p",[EmacsIntBifs]),
ct:log("Int ~p",[Compare]),
@@ -73,27 +83,92 @@ check_bif_highlight(Bin, Tag, Compare) ->
ct:log("Diff2 ~p",[EmacsIntBifs -- Compare]),
[] = Compare -- EmacsIntBifs,
[] = EmacsIntBifs -- Compare.
-
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-indent(Config) ->
- case emacs_version_ok() of
+load_interpreted(_Config) ->
+ _ = emacs(["-l erlang.el -f erlang-mode"]),
+ ok.
+
+compile_and_load(_Config) ->
+ Dir = emacs_dir(),
+ Files0 = filelib:wildcard("*.el", Dir),
+ Files = case emacs_version_ok(24.3) of
+ %% erldoc.el depends on cl-lib which was introduced in 24.3.
+ false -> Files0 -- ["erldoc.el"];
+ _ -> Files0
+ end,
+ Unforgiving =
+ case emacs_version_ok(24) of
+ Ver when Ver < 25 ->
+ "";
+ Ver when Ver < 26 ->
+ %% Workaround byte-compile-error-on-warn which seem broken in
+ %% Emacs 25.
+ "\"(advice-add #'display-warning :after "
+ "(lambda (_ f _ _) (error \"%s\" f)))\"";
+ _ ->
+ "\"(setq byte-compile-error-on-warn t)\""
+ end,
+ %% Add files here whenever they are cleaned of warnings.
+ NoWarn = ["erlang.el", "erlang-test.el", "erlang-edoc.el", "erlang-start.el", "erldoc.el"],
+ Compile = fun(File) ->
+ Pedantic = case lists:member(File, NoWarn) andalso Unforgiving /= "" of
+ true -> ["--eval ", Unforgiving, " "];
+ false -> " "
+ end,
+ emacs([Pedantic,
+ " -f batch-byte-compile ",filename:join(Dir, File)]),
+ true
+ end,
+ lists:foreach(Compile, Files),
+ emacs(["-l erlang.elc -f erlang-mode"]),
+ ok.
+
+tests_interpreted(_Config) ->
+ case emacs_version_ok(25) of
false -> {skip, "Old or no emacs found"};
- true ->
- Def = filename:dirname(code:which(?MODULE)) ++ "/" ++ ?MODULE_STRING ++ "_data",
- Dir = proplists:get_value(data_dir, Config, Def),
- OrigFs = filelib:wildcard(Dir ++ "/*"),
- io:format("Dir: ~s~nFs: ~p~n", [Dir, OrigFs]),
- Fs = [{File, unindent(File)} || File <- OrigFs,
- filename:extension(File) =:= ""],
- Indent = fun emacs/1,
- [Indent(File) || {_, File} <- Fs],
- Res = [diff(Orig, File) || {Orig, File} <- Fs],
- [file:delete(File) || {ok, File} <- Res], %% Cleanup
- [] = [Fail || {fail, Fail} <- Res],
+ _ ->
+ emacs(["-l erlang.el ",
+ "-l erlang-test.el -f ert-run-tests-batch-and-exit"]),
ok
end.
+tests_compiled(_Config) ->
+ case emacs_version_ok(25) of
+ false -> {skip, "Old or no emacs found"};
+ _ ->
+ emacs(["-l erlang.elc ",
+ "-l erlang-test.elc -f ert-run-tests-batch-and-exit"]),
+ ok
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+indent(Config) ->
+ Def = filename:dirname(code:which(?MODULE))
+ ++ "/"
+ ++ ?MODULE_STRING
+ ++ "_data",
+ Dir = proplists:get_value(data_dir, Config, Def),
+ OrigFs = filelib:wildcard(Dir ++ "/*"),
+ io:format("Dir: ~s~nFs: ~p~n", [Dir, OrigFs]),
+ Fs = [{File, unindent(File)} || File <- OrigFs,
+ filename:extension(File) =:= ""],
+ Indent = fun(File) ->
+ emacs([
+ File, " ",
+ "--eval '(indent-region (point-min) (point-max) nil)' ",
+ "--eval '(save-buffer 0)'"
+ ]),
+ ok
+ end,
+ [Indent(File) || {_, File} <- Fs],
+ Res = [diff(Orig, File) || {Orig, File} <- Fs],
+ [file:delete(File) || {ok, File} <- Res], %% Cleanup
+ [] = [Fail || {fail, Fail} <- Res],
+ ok.
+
unindent(Input) ->
Output = Input ++ ".erl",
{ok, Bin} = file:read_file(Input),
@@ -112,14 +187,13 @@ diff(Orig, File) ->
{fail, File}
end.
-emacs_version_ok() ->
+emacs_version_ok(AcceptVer) ->
case os:cmd("emacs --version | head -1") of
"GNU Emacs " ++ Ver ->
case string:to_float(Ver) of
- {Vsn, _} when Vsn >= 24.1 ->
- true;
+ {Vsn, _} when Vsn >= AcceptVer ->
+ Vsn;
_ ->
- io:format("Emacs version fail~n~s~n~n",[Ver]),
false
end;
Res ->
@@ -127,16 +201,19 @@ emacs_version_ok() ->
false
end.
-emacs(File) ->
- EmacsErlDir = filename:join([code:lib_dir(tools), "emacs"]),
+emacs(EmacsCmds) when is_list(EmacsCmds) ->
Cmd = ["emacs ",
"--batch --quick ",
- "--directory ", EmacsErlDir, " ",
- "--eval \"(require 'erlang-start)\" ",
- File, " ",
- "--eval '(indent-region (point-min) (point-max) nil)' ",
- "--eval '(save-buffer 0)'"
- ],
- _Res = os:cmd(Cmd),
- % io:format("cmd ~s:~n=> ~s~n", [Cmd, _Res]),
- ok.
+ "--directory ", emacs_dir(), " ",
+ "--eval \"(require 'erlang-start)\" "
+ | EmacsCmds],
+ Res0 = os:cmd(Cmd ++ " ; echo $?"),
+ Rows = string:lexemes(Res0, ["\r\n", $\n]),
+ Res = lists:last(Rows),
+ Output = string:join(lists:droplast(Rows), "\n"),
+ io:format("Cmd ~s:~n => ~s ~ts~n", [Cmd, Res, Output]),
+ "0" = Res,
+ Output.
+
+emacs_dir() ->
+ filename:join([code:lib_dir(tools), "emacs"]).