From ff32b692e4a7d002283ab98869b7ac6d0efead77 Mon Sep 17 00:00:00 2001 From: mamod Date: Mon, 23 Jan 2017 03:10:51 +0300 Subject: [PATCH] v2.0.0 This commit is mainly to update duktape to version 2.0.0 and since duktape v2.0.0 has API incompatible changes we need to release JavaScript::Duktape under v2.0.0 too Nothing much has been changed here, except some minor fixes, better namings of files, tests updates to match new duktape api and some code stylings Much of the code generated automatically (see Dev) folder --- Dev/FunctionsMap.pl | 314 +- Dev/README.md | 9 + Dev/api.h | 324 +- Dev/api.html | 3810 +- Dev/bench.pl | 66 +- Dev/bench_results.txt | 78 + Dev/duktape_wrapper.c | 1063 +- Dev/{jQuery.pl => extract.pl} | 0 lib/JavaScript/Duktape.pm | 49 +- lib/JavaScript/Duktape/C/FunctionsMap.pl | 314 +- lib/JavaScript/Duktape/C/como.h | 38 - lib/JavaScript/Duktape/C/duk_perl.c | 1781 + lib/JavaScript/Duktape/C/duk_perl.h | 38 + lib/JavaScript/Duktape/C/duktape_wrap.c | 1601 - .../Duktape/C/{ => lib}/duk_config.h | 1569 +- .../Duktape/C/lib/duk_source_meta.json | 1826 + lib/JavaScript/Duktape/C/{ => lib}/duktape.c | 43609 +++++++++------- lib/JavaScript/Duktape/C/{ => lib}/duktape.h | 958 +- lib/JavaScript/Duktape/C/metadata.json | 629 - t/api/base64.t | 2 +- t/api/c-constructor.t | 2 + t/api/call-prop.t | 6 +- t/api/compile.t | 1 + t/api/dev-cfunc-name.t | 11 +- t/api/dup.t | 8 +- t/api/eval-string.t | 1 + t/api/hex.t | 6 +- t/api/internal-property-basics.t | 4 +- t/api/pcall-method.t | 1 + t/api/pcall-perl-function.t | 2 +- t/api/pcall-prop.t | 6 +- t/api/pcompile-nofile.t | 2 +- t/api/push_this.t | 2 +- t/buffer.t | 19 +- t/circular.t | 2 +- t/deep_objects.t | 2 +- t/dll.c | 2 +- t/dll.t | 9 +- t/eval-function.t | 2 - t/helper.pl | 15 + t/objects/this.t | 7 +- t/perl-data.t | 2 +- t/safe-call.t | 6 +- t/typescript.t | 24 +- t/uncaught.t | 20 +- 45 files changed, 33290 insertions(+), 24950 deletions(-) create mode 100644 Dev/bench_results.txt rename Dev/{jQuery.pl => extract.pl} (100%) delete mode 100644 lib/JavaScript/Duktape/C/como.h create mode 100644 lib/JavaScript/Duktape/C/duk_perl.c create mode 100644 lib/JavaScript/Duktape/C/duk_perl.h delete mode 100644 lib/JavaScript/Duktape/C/duktape_wrap.c rename lib/JavaScript/Duktape/C/{ => lib}/duk_config.h (84%) create mode 100644 lib/JavaScript/Duktape/C/lib/duk_source_meta.json rename lib/JavaScript/Duktape/C/{ => lib}/duktape.c (70%) rename lib/JavaScript/Duktape/C/{ => lib}/duktape.h (68%) delete mode 100644 lib/JavaScript/Duktape/C/metadata.json diff --git a/Dev/FunctionsMap.pl b/Dev/FunctionsMap.pl index 6857bdc..2804d40 100644 --- a/Dev/FunctionsMap.pl +++ b/Dev/FunctionsMap.pl @@ -35,6 +35,13 @@ =cut *base64_encode = \&aperl_duk_base64_encode; +=item C + +see L + +=cut +*buffer_to_string = \&aperl_duk_buffer_to_string; + =item C see L @@ -105,13 +112,6 @@ =cut *compile = \&aperl_duk_compile; -=item C - -see L - -=cut -*compile_file = \&aperl_duk_compile_file; - =item C see L @@ -140,6 +140,13 @@ =cut *compile_string_filename = \&aperl_duk_compile_string_filename; +=item C + +see L + +=cut +*components_to_time = \&aperl_duk_components_to_time; + =item C see L @@ -189,6 +196,13 @@ =cut *del_prop_index = \&aperl_duk_del_prop_index; +=item C + +see L + +=cut +*del_prop_lstring = \&aperl_duk_del_prop_lstring; + =item C see L @@ -203,20 +217,6 @@ =cut *destroy_heap = \&aperl_duk_destroy_heap; -=item C - -see L - -=cut -*dump_context_stderr = \&aperl_duk_dump_context_stderr; - -=item C - -see L - -=cut -*dump_context_stdout = \&aperl_duk_dump_context_stdout; - =item C see L @@ -266,19 +266,12 @@ =cut *eval = \&aperl_duk_eval; -=item C - -see L - -=cut -*eval_file = \&aperl_duk_eval_file; - -=item C +=item C -see L +see L =cut -*eval_file_noresult = \&aperl_duk_eval_file_noresult; +*eval_error_va = \&aperl_duk_eval_error_va; =item C @@ -343,6 +336,13 @@ =cut *gc = \&aperl_duk_gc; +=item C + +see L + +=cut +*generic_error_va = \&aperl_duk_generic_error_va; + =item C see L @@ -399,6 +399,13 @@ =cut *get_finalizer = \&aperl_duk_get_finalizer; +=item C + +see L + +=cut +*get_global_lstring = \&aperl_duk_get_global_lstring; + =item C see L @@ -448,6 +455,13 @@ =cut *get_memory_functions = \&aperl_duk_get_memory_functions; +=item C + +see L + +=cut +*get_now = \&aperl_duk_get_now; + =item C see L @@ -469,6 +483,13 @@ =cut *get_prop = \&aperl_duk_get_prop; +=item C + +see L + +=cut +*get_prop_desc = \&aperl_duk_get_prop_desc; + =item C see L @@ -476,6 +497,13 @@ =cut *get_prop_index = \&aperl_duk_get_prop_index; +=item C + +see L + +=cut +*get_prop_lstring = \&aperl_duk_get_prop_lstring; + =item C see L @@ -546,6 +574,13 @@ =cut *has_prop_index = \&aperl_duk_has_prop_index; +=item C + +see L + +=cut +*has_prop_lstring = \&aperl_duk_has_prop_lstring; + =item C see L @@ -574,6 +609,20 @@ =cut *insert = \&aperl_duk_insert; +=item C + +see L + +=cut +*inspect_callstack_entry = \&aperl_duk_inspect_callstack_entry; + +=item C + +see L + +=cut +*inspect_value = \&aperl_duk_inspect_value; + =item C see L @@ -609,6 +658,13 @@ =cut *is_buffer = \&aperl_duk_is_buffer; +=item C + +see L + +=cut +*is_buffer_data = \&aperl_duk_is_buffer_data; + =item C see L @@ -651,6 +707,13 @@ =cut *is_error = \&aperl_duk_is_error; +=item C + +see L + +=cut +*is_eval_error = \&aperl_duk_is_eval_error; + =item C see L @@ -728,6 +791,20 @@ =cut *is_primitive = \&aperl_duk_is_primitive; +=item C + +see L + +=cut +*is_range_error = \&aperl_duk_is_range_error; + +=item C + +see L + +=cut +*is_reference_error = \&aperl_duk_is_reference_error; + =item C see L @@ -742,6 +819,20 @@ =cut *is_string = \&aperl_duk_is_string; +=item C + +see L + +=cut +*is_symbol = \&aperl_duk_is_symbol; + +=item C + +see L + +=cut +*is_syntax_error = \&aperl_duk_is_syntax_error; + =item C see L @@ -749,6 +840,13 @@ =cut *is_thread = \&aperl_duk_is_thread; +=item C + +see L + +=cut +*is_type_error = \&aperl_duk_is_type_error; + =item C see L @@ -756,6 +854,13 @@ =cut *is_undefined = \&aperl_duk_is_undefined; +=item C + +see L + +=cut +*is_uri_error = \&aperl_duk_is_uri_error; + =item C see L @@ -791,13 +896,6 @@ =cut *load_function = \&aperl_duk_load_function; -=item C - -see L - -=cut -*log_va = \&aperl_duk_log_va; - =item C see L @@ -854,13 +952,6 @@ =cut *pcompile = \&aperl_duk_pcompile; -=item C - -see L - -=cut -*pcompile_file = \&aperl_duk_pcompile_file; - =item C see L @@ -896,20 +987,6 @@ =cut *peval = \&aperl_duk_peval; -=item C - -see L - -=cut -*peval_file = \&aperl_duk_peval_file; - -=item C - -see L - -=cut -*peval_file_noresult = \&aperl_duk_peval_file_noresult; - =item C see L @@ -987,6 +1064,13 @@ =cut *push_array = \&aperl_duk_push_array; +=item C + +see L + +=cut +*push_bare_object = \&aperl_duk_push_bare_object; + =item C see L @@ -1162,13 +1246,6 @@ =cut *push_string = \&aperl_duk_push_string; -=item C - -see L - -=cut -*push_string_file = \&aperl_duk_push_string_file; - =item C see L @@ -1232,6 +1309,13 @@ =cut *put_function_list = \&aperl_duk_put_function_list; +=item C + +see L + +=cut +*put_global_lstring = \&aperl_duk_put_global_lstring; + =item C see L @@ -1260,6 +1344,13 @@ =cut *put_prop_index = \&aperl_duk_put_prop_index; +=item C + +see L + +=cut +*put_prop_lstring = \&aperl_duk_put_prop_lstring; + =item C see L @@ -1267,6 +1358,13 @@ =cut *put_prop_string = \&aperl_duk_put_prop_string; +=item C + +see L + +=cut +*range_error_va = \&aperl_duk_range_error_va; + =item C see L @@ -1281,6 +1379,13 @@ =cut *realloc_raw = \&aperl_duk_realloc_raw; +=item C + +see L + +=cut +*reference_error_va = \&aperl_duk_reference_error_va; + =item C see L @@ -1323,6 +1428,13 @@ =cut *require_c_function = \&aperl_duk_require_c_function; +=item C + +see L + +=cut +*require_callable = \&aperl_duk_require_callable; + =item C see L @@ -1330,6 +1442,13 @@ =cut *require_context = \&aperl_duk_require_context; +=item C + +see L + +=cut +*require_function = \&aperl_duk_require_function; + =item C see L @@ -1449,6 +1568,13 @@ =cut *resize_buffer = \&aperl_duk_resize_buffer; +=item C + +see L + +=cut +*resume = \&aperl_duk_resume; + =item C see L @@ -1470,6 +1596,13 @@ =cut *safe_to_string = \&aperl_duk_safe_to_string; +=item C + +see L + +=cut +*samevalue = \&aperl_duk_samevalue; + =item C see L @@ -1484,6 +1617,13 @@ =cut *set_global_object = \&aperl_duk_set_global_object; +=item C + +see L + +=cut +*set_length = \&aperl_duk_set_length; + =item C see L @@ -1526,6 +1666,13 @@ =cut *substring = \&aperl_duk_substring; +=item C + +see L + +=cut +*suspend = \&aperl_duk_suspend; + =item C see L @@ -1540,6 +1687,13 @@ =cut *swap_top = \&aperl_duk_swap_top; +=item C + +see L + +=cut +*syntax_error_va = \&aperl_duk_syntax_error_va; + =item C see L @@ -1547,6 +1701,13 @@ =cut *throw = \&aperl_duk_throw; +=item C + +see L + +=cut +*time_to_components = \&aperl_duk_time_to_components; + =item C see L @@ -1561,13 +1722,6 @@ =cut *to_buffer = \&aperl_duk_to_buffer; -=item C - -see L - -=cut -*to_defaultvalue = \&aperl_duk_to_defaultvalue; - =item C see L @@ -1680,6 +1834,20 @@ =cut *trim = \&aperl_duk_trim; +=item C + +see L + +=cut +*type_error_va = \&aperl_duk_type_error_va; + +=item C + +see L + +=cut +*uri_error_va = \&aperl_duk_uri_error_va; + =back diff --git a/Dev/README.md b/Dev/README.md index d48f5fc..652c439 100644 --- a/Dev/README.md +++ b/Dev/README.md @@ -1,3 +1,12 @@ # For Development Only This is a development helper files, it parses [duktape api](http://duktape.org/api.htm) and generates a file with all duktape api using jQuery.pl then create both ``FunctionsMap.pl`` and ``duktape_wrapper.c`` using parse.pl which will be used in ``JavaScript::Duktape`` release + + +# HOW + +- extract api.html file from duktape.org API +- run ``perl extract.pl`` +- run ``perl parse.pl`` +- copy new generated file ``FunctionsMap.pl`` to lib/JavaScript/Duktape/C +- copy content from ``duktape_wrapper.c`` to lib/JavaScript/Duktape/C/duk_perl.c diff --git a/Dev/api.h b/Dev/api.h index 10bdbd4..3538d5a 100644 --- a/Dev/api.h +++ b/Dev/api.h @@ -1,136 +1,148 @@ DUK_EXTERNAL_DECL void *duk_alloc(duk_context *ctx, duk_size_t size); DUK_EXTERNAL_DECL void *duk_alloc_raw(duk_context *ctx, duk_size_t size); -DUK_EXTERNAL_DECL void duk_base64_decode(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL const char *duk_base64_encode(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL void duk_base64_decode(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_base64_encode(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_buffer_to_string(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_call(duk_context *ctx, duk_idx_t nargs); DUK_EXTERNAL_DECL void duk_call_method(duk_context *ctx, duk_idx_t nargs); -DUK_EXTERNAL_DECL void duk_call_prop(duk_context *ctx, duk_idx_t obj_index, duk_idx_t nargs); -DUK_EXTERNAL_DECL duk_codepoint_t duk_char_code_at(duk_context *ctx, duk_idx_t index, duk_size_t char_offset); +DUK_EXTERNAL_DECL void duk_call_prop(duk_context *ctx, duk_idx_t obj_idx, duk_idx_t nargs); +DUK_EXTERNAL_DECL duk_codepoint_t duk_char_code_at(duk_context *ctx, duk_idx_t idx, duk_size_t char_offset); DUK_EXTERNAL_DECL duk_bool_t duk_check_stack(duk_context *ctx, duk_idx_t extra); DUK_EXTERNAL_DECL duk_bool_t duk_check_stack_top(duk_context *ctx, duk_idx_t top); -DUK_EXTERNAL_DECL duk_bool_t duk_check_type(duk_context *ctx, duk_idx_t index, duk_int_t type); -DUK_EXTERNAL_DECL duk_bool_t duk_check_type_mask(duk_context *ctx, duk_idx_t index, duk_uint_t mask); -DUK_EXTERNAL_DECL void duk_compact(duk_context *ctx, duk_idx_t obj_index); +DUK_EXTERNAL_DECL duk_bool_t duk_check_type(duk_context *ctx, duk_idx_t idx, duk_int_t type); +DUK_EXTERNAL_DECL duk_bool_t duk_check_type_mask(duk_context *ctx, duk_idx_t idx, duk_uint_t mask); +DUK_EXTERNAL_DECL void duk_compact(duk_context *ctx, duk_idx_t obj_idx); DUK_EXTERNAL_DECL void duk_compile(duk_context *ctx, duk_uint_t flags); -DUK_EXTERNAL_DECL void duk_compile_file(duk_context *ctx, duk_uint_t flags, const char *path); DUK_EXTERNAL_DECL void duk_compile_lstring(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len); DUK_EXTERNAL_DECL void duk_compile_lstring_filename(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len); DUK_EXTERNAL_DECL void duk_compile_string(duk_context *ctx, duk_uint_t flags, const char *src); DUK_EXTERNAL_DECL void duk_compile_string_filename(duk_context *ctx, duk_uint_t flags, const char *src); +DUK_EXTERNAL_DECL duk_double_t duk_components_to_time(duk_context *ctx, duk_time_components *comp); DUK_EXTERNAL_DECL void duk_concat(duk_context *ctx, duk_idx_t count); -DUK_EXTERNAL_DECL void duk_config_buffer(duk_context *ctx, duk_idx_t index, void *ptr, duk_size_t len); -DUK_EXTERNAL_DECL void duk_copy(duk_context *ctx, duk_idx_t from_index, duk_idx_t to_index); +DUK_EXTERNAL_DECL void duk_config_buffer(duk_context *ctx, duk_idx_t idx, void *ptr, duk_size_t len); +DUK_EXTERNAL_DECL void duk_copy(duk_context *ctx, duk_idx_t from_idx, duk_idx_t to_idx); DUK_EXTERNAL_DECL duk_context *duk_create_heap(duk_alloc_function alloc_func, duk_realloc_function realloc_func, duk_free_function free_func, void *heap_udata, duk_fatal_function fatal_handler); DUK_EXTERNAL_DECL duk_context *duk_create_heap_default(void); -DUK_EXTERNAL_DECL void duk_decode_string(duk_context *ctx, duk_idx_t index, duk_decode_char_function callback, void *udata); -DUK_EXTERNAL_DECL void duk_def_prop(duk_context *ctx, duk_idx_t obj_index, duk_uint_t flags); -DUK_EXTERNAL_DECL duk_bool_t duk_del_prop(duk_context *ctx, duk_idx_t obj_index); -DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index); -DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key); +DUK_EXTERNAL_DECL void duk_decode_string(duk_context *ctx, duk_idx_t idx, duk_decode_char_function callback, void *udata); +DUK_EXTERNAL_DECL void duk_def_prop(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t flags); +DUK_EXTERNAL_DECL duk_bool_t duk_del_prop(duk_context *ctx, duk_idx_t obj_idx); +DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); +DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); +DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); DUK_EXTERNAL_DECL void duk_destroy_heap(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_dump_context_stderr(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_dump_context_stdout(duk_context *ctx); DUK_EXTERNAL_DECL void duk_dump_function(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_dup(duk_context *ctx, duk_idx_t from_index); +DUK_EXTERNAL_DECL void duk_dup(duk_context *ctx, duk_idx_t from_idx); DUK_EXTERNAL_DECL void duk_dup_top(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_enum(duk_context *ctx, duk_idx_t obj_index, duk_uint_t enum_flags); -DUK_EXTERNAL_DECL duk_bool_t duk_equals(duk_context *ctx, duk_idx_t index1, duk_idx_t index2); -DUK_EXTERNAL_DECL void duk_error(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...); -DUK_EXTERNAL_DECL void duk_error_va(duk_context *ctx, duk_errcode_t err_code, const char *fmt, va_list ap); +DUK_EXTERNAL_DECL void duk_enum(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t enum_flags); +DUK_EXTERNAL_DECL duk_bool_t duk_equals(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); +DUK_EXTERNAL_DECL duk_ret_t duk_error(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...); +DUK_EXTERNAL_DECL duk_ret_t duk_error_va(duk_context *ctx, duk_errcode_t err_code, const char *fmt, va_list ap); DUK_EXTERNAL_DECL void duk_eval(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_eval_file(duk_context *ctx, const char *path); -DUK_EXTERNAL_DECL void duk_eval_file_noresult(duk_context *ctx, const char *path); +DUK_EXTERNAL_DECL duk_ret_t duk_eval_error(duk_context *ctx, const char *fmt, ...); +DUK_EXTERNAL_DECL duk_ret_t duk_eval_error_va(duk_context *ctx, const char *fmt, va_list ap); DUK_EXTERNAL_DECL void duk_eval_lstring(duk_context *ctx, const char *src, duk_size_t len); DUK_EXTERNAL_DECL void duk_eval_lstring_noresult(duk_context *ctx, const char *src, duk_size_t len); DUK_EXTERNAL_DECL void duk_eval_noresult(duk_context *ctx); DUK_EXTERNAL_DECL void duk_eval_string(duk_context *ctx, const char *src); DUK_EXTERNAL_DECL void duk_eval_string_noresult(duk_context *ctx, const char *src); -DUK_EXTERNAL_DECL void duk_fatal(duk_context *ctx, duk_errcode_t err_code, const char *err_msg); +DUK_EXTERNAL_DECL duk_ret_t duk_fatal(duk_context *ctx, const char *err_msg); DUK_EXTERNAL_DECL void duk_free(duk_context *ctx, void *ptr); DUK_EXTERNAL_DECL void duk_free_raw(duk_context *ctx, void *ptr); DUK_EXTERNAL_DECL void duk_gc(duk_context *ctx, duk_uint_t flags); -DUK_EXTERNAL_DECL duk_bool_t duk_get_boolean(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void *duk_get_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size); -DUK_EXTERNAL_DECL void *duk_get_buffer_data(duk_context *ctx, duk_idx_t index, duk_size_t *out_size); -DUK_EXTERNAL_DECL duk_c_function duk_get_c_function(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_context *duk_get_context(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL duk_ret_t duk_generic_error(duk_context *ctx, const char *fmt, ...); +DUK_EXTERNAL_DECL duk_ret_t duk_generic_error_va(duk_context *ctx, const char *fmt, va_list ap); +DUK_EXTERNAL_DECL duk_bool_t duk_get_boolean(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void *duk_get_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); +DUK_EXTERNAL_DECL void *duk_get_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); +DUK_EXTERNAL_DECL duk_c_function duk_get_c_function(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_context *duk_get_context(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_int_t duk_get_current_magic(duk_context *ctx); -DUK_EXTERNAL_DECL duk_errcode_t duk_get_error_code(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_get_finalizer(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL duk_errcode_t duk_get_error_code(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_get_finalizer(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_get_global_lstring(duk_context *ctx, const char *key, duk_size_t key_len); DUK_EXTERNAL_DECL duk_bool_t duk_get_global_string(duk_context *ctx, const char *key); -DUK_EXTERNAL_DECL void *duk_get_heapptr(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_int_t duk_get_int(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_size_t duk_get_length(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL const char *duk_get_lstring(duk_context *ctx, duk_idx_t index, duk_size_t *out_len); -DUK_EXTERNAL_DECL duk_int_t duk_get_magic(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL void *duk_get_heapptr(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_int_t duk_get_int(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_size_t duk_get_length(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_get_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); +DUK_EXTERNAL_DECL duk_int_t duk_get_magic(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_get_memory_functions(duk_context *ctx, duk_memory_functions *out_funcs); -DUK_EXTERNAL_DECL duk_double_t duk_get_number(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void *duk_get_pointer(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_get_prop(duk_context *ctx, duk_idx_t obj_index); -DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index); -DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key); -DUK_EXTERNAL_DECL void duk_get_prototype(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL const char *duk_get_string(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL duk_double_t duk_get_now(duk_context *ctx); +DUK_EXTERNAL_DECL duk_double_t duk_get_number(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void *duk_get_pointer(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_get_prop(duk_context *ctx, duk_idx_t obj_idx); +DUK_EXTERNAL_DECL void duk_get_prop_desc(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t flags); +DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); +DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); +DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); +DUK_EXTERNAL_DECL void duk_get_prototype(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_get_string(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_idx_t duk_get_top(duk_context *ctx); DUK_EXTERNAL_DECL duk_idx_t duk_get_top_index(duk_context *ctx); -DUK_EXTERNAL_DECL duk_int_t duk_get_type(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_uint_t duk_get_type_mask(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_uint_t duk_get_uint(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_has_prop(duk_context *ctx, duk_idx_t obj_index); -DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index); -DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key); -DUK_EXTERNAL_DECL void duk_hex_decode(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL const char *duk_hex_encode(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_insert(duk_context *ctx, duk_idx_t to_index); -DUK_EXTERNAL_DECL duk_bool_t duk_instanceof(duk_context *ctx, duk_idx_t index1, duk_idx_t index2); -DUK_EXTERNAL_DECL duk_bool_t duk_is_array(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_boolean(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_bound_function(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_buffer(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_c_function(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_callable(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL duk_int_t duk_get_type(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_uint_t duk_get_type_mask(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_uint_t duk_get_uint(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_has_prop(duk_context *ctx, duk_idx_t obj_idx); +DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); +DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); +DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); +DUK_EXTERNAL_DECL void duk_hex_decode(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_hex_encode(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_insert(duk_context *ctx, duk_idx_t to_idx); +DUK_EXTERNAL_DECL void duk_inspect_callstack_entry(duk_context *ctx, duk_int_t level); +DUK_EXTERNAL_DECL void duk_inspect_value(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_instanceof(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); +DUK_EXTERNAL_DECL duk_bool_t duk_is_array(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_boolean(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_bound_function(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_buffer(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_buffer_data(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_c_function(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_callable(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_constructor_call(duk_context *ctx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_dynamic_buffer(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_ecmascript_function(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_error(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_fixed_buffer(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_function(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_lightfunc(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_nan(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_null(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_null_or_undefined(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_number(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_object(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_object_coercible(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_pointer(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_primitive(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL duk_bool_t duk_is_dynamic_buffer(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_ecmascript_function(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_error(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_eval_error(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_fixed_buffer(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_function(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_lightfunc(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_nan(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_null(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_null_or_undefined(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_number(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_object(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_object_coercible(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_pointer(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_primitive(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_range_error(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_reference_error(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_strict_call(duk_context *ctx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_string(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_thread(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_undefined(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_valid_index(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL duk_bool_t duk_is_string(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_symbol(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_syntax_error(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_thread(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_type_error(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_undefined(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_uri_error(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_valid_index(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_join(duk_context *ctx, duk_idx_t count); -DUK_EXTERNAL_DECL void duk_json_decode(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL const char *duk_json_encode(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL void duk_json_decode(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_json_encode(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_load_function(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_log(duk_context *ctx, duk_int_t level, const char *fmt, ...); -DUK_EXTERNAL_DECL void duk_log_va(duk_context *ctx, duk_int_t level, const char *fmt, va_list ap); -DUK_EXTERNAL_DECL void duk_map_string(duk_context *ctx, duk_idx_t index, duk_map_char_function callback, void *udata); +DUK_EXTERNAL_DECL void duk_map_string(duk_context *ctx, duk_idx_t idx, duk_map_char_function callback, void *udata); DUK_EXTERNAL_DECL void duk_new(duk_context *ctx, duk_idx_t nargs); -DUK_EXTERNAL_DECL duk_bool_t duk_next(duk_context *ctx, duk_idx_t enum_index, duk_bool_t get_value); -DUK_EXTERNAL_DECL duk_idx_t duk_normalize_index(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL duk_bool_t duk_next(duk_context *ctx, duk_idx_t enum_idx, duk_bool_t get_value); +DUK_EXTERNAL_DECL duk_idx_t duk_normalize_index(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_int_t duk_pcall(duk_context *ctx, duk_idx_t nargs); DUK_EXTERNAL_DECL duk_int_t duk_pcall_method(duk_context *ctx, duk_idx_t nargs); -DUK_EXTERNAL_DECL duk_int_t duk_pcall_prop(duk_context *ctx, duk_idx_t obj_index, duk_idx_t nargs); +DUK_EXTERNAL_DECL duk_int_t duk_pcall_prop(duk_context *ctx, duk_idx_t obj_idx, duk_idx_t nargs); DUK_EXTERNAL_DECL duk_int_t duk_pcompile(duk_context *ctx, duk_uint_t flags); -DUK_EXTERNAL_DECL duk_int_t duk_pcompile_file(duk_context *ctx, duk_uint_t flags, const char *path); DUK_EXTERNAL_DECL duk_int_t duk_pcompile_lstring(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len); DUK_EXTERNAL_DECL duk_int_t duk_pcompile_lstring_filename(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len); DUK_EXTERNAL_DECL duk_int_t duk_pcompile_string(duk_context *ctx, duk_uint_t flags, const char *src); DUK_EXTERNAL_DECL duk_int_t duk_pcompile_string_filename(duk_context *ctx, duk_uint_t flags, const char *src); DUK_EXTERNAL_DECL duk_int_t duk_peval(duk_context *ctx); -DUK_EXTERNAL_DECL duk_int_t duk_peval_file(duk_context *ctx, const char *path); -DUK_EXTERNAL_DECL duk_int_t duk_peval_file_noresult(duk_context *ctx, const char *path); DUK_EXTERNAL_DECL duk_int_t duk_peval_lstring(duk_context *ctx, const char *src, duk_size_t len); DUK_EXTERNAL_DECL duk_int_t duk_peval_lstring_noresult(duk_context *ctx, const char *src, duk_size_t len); DUK_EXTERNAL_DECL duk_int_t duk_peval_noresult(duk_context *ctx); @@ -142,6 +154,7 @@ DUK_EXTERNAL_DECL void duk_pop_2(duk_context *ctx); DUK_EXTERNAL_DECL void duk_pop_3(duk_context *ctx); DUK_EXTERNAL_DECL void duk_pop_n(duk_context *ctx, duk_idx_t count); DUK_EXTERNAL_DECL duk_idx_t duk_push_array(duk_context *ctx); +DUK_EXTERNAL_DECL duk_idx_t duk_push_bare_object(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_boolean(duk_context *ctx, duk_bool_t val); DUK_EXTERNAL_DECL void *duk_push_buffer(duk_context *ctx, duk_size_t size, duk_bool_t dynamic); DUK_EXTERNAL_DECL void duk_push_buffer_object(duk_context *ctx, duk_idx_t idx_buffer, duk_size_t byte_offset, duk_size_t byte_length, duk_uint_t flags); @@ -169,7 +182,6 @@ DUK_EXTERNAL_DECL duk_idx_t duk_push_object(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_pointer(duk_context *ctx, void *p); DUK_EXTERNAL_DECL const char *duk_push_sprintf(duk_context *ctx, const char *fmt, ...); DUK_EXTERNAL_DECL const char *duk_push_string(duk_context *ctx, const char *str); -DUK_EXTERNAL_DECL const char *duk_push_string_file(duk_context *ctx, const char *path); DUK_EXTERNAL_DECL void duk_push_this(duk_context *ctx); DUK_EXTERNAL_DECL duk_idx_t duk_push_thread(duk_context *ctx); DUK_EXTERNAL_DECL duk_idx_t duk_push_thread_new_globalenv(duk_context *ctx); @@ -178,70 +190,88 @@ DUK_EXTERNAL_DECL void duk_push_true(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_uint(duk_context *ctx, duk_uint_t val); DUK_EXTERNAL_DECL void duk_push_undefined(duk_context *ctx); DUK_EXTERNAL_DECL const char *duk_push_vsprintf(duk_context *ctx, const char *fmt, va_list ap); -DUK_EXTERNAL_DECL void duk_put_function_list(duk_context *ctx, duk_idx_t obj_index, const duk_function_list_entry *funcs); +DUK_EXTERNAL_DECL void duk_put_function_list(duk_context *ctx, duk_idx_t obj_idx, const duk_function_list_entry *funcs); +DUK_EXTERNAL_DECL duk_bool_t duk_put_global_lstring(duk_context *ctx, const char *key, duk_size_t key_len); DUK_EXTERNAL_DECL duk_bool_t duk_put_global_string(duk_context *ctx, const char *key); -DUK_EXTERNAL_DECL void duk_put_number_list(duk_context *ctx, duk_idx_t obj_index, const duk_number_list_entry *numbers); -DUK_EXTERNAL_DECL duk_bool_t duk_put_prop(duk_context *ctx, duk_idx_t obj_index); -DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index); -DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key); +DUK_EXTERNAL_DECL void duk_put_number_list(duk_context *ctx, duk_idx_t obj_idx, const duk_number_list_entry *numbers); +DUK_EXTERNAL_DECL duk_bool_t duk_put_prop(duk_context *ctx, duk_idx_t obj_idx); +DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); +DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); +DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); +DUK_EXTERNAL_DECL duk_ret_t duk_range_error(duk_context *ctx, const char *fmt, ...); +DUK_EXTERNAL_DECL duk_ret_t duk_range_error_va(duk_context *ctx, const char *fmt, va_list ap); DUK_EXTERNAL_DECL void *duk_realloc(duk_context *ctx, void *ptr, duk_size_t size); DUK_EXTERNAL_DECL void *duk_realloc_raw(duk_context *ctx, void *ptr, duk_size_t size); -DUK_EXTERNAL_DECL void duk_remove(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_replace(duk_context *ctx, duk_idx_t to_index); -DUK_EXTERNAL_DECL duk_bool_t duk_require_boolean(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void *duk_require_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size); -DUK_EXTERNAL_DECL void *duk_require_buffer_data(duk_context *ctx, duk_idx_t index, duk_size_t *out_size); -DUK_EXTERNAL_DECL duk_c_function duk_require_c_function(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_context *duk_require_context(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void *duk_require_heapptr(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_int_t duk_require_int(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL const char *duk_require_lstring(duk_context *ctx, duk_idx_t index, duk_size_t *out_len); -DUK_EXTERNAL_DECL duk_idx_t duk_require_normalize_index(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_require_null(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_double_t duk_require_number(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_require_object_coercible(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void *duk_require_pointer(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL duk_ret_t duk_reference_error(duk_context *ctx, const char *fmt, ...); +DUK_EXTERNAL_DECL duk_ret_t duk_reference_error_va(duk_context *ctx, const char *fmt, va_list ap); +DUK_EXTERNAL_DECL void duk_remove(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_replace(duk_context *ctx, duk_idx_t to_idx); +DUK_EXTERNAL_DECL duk_bool_t duk_require_boolean(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void *duk_require_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); +DUK_EXTERNAL_DECL void *duk_require_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); +DUK_EXTERNAL_DECL duk_c_function duk_require_c_function(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_require_callable(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_context *duk_require_context(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_require_function(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void *duk_require_heapptr(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_int_t duk_require_int(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_require_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); +DUK_EXTERNAL_DECL duk_idx_t duk_require_normalize_index(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_require_null(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_double_t duk_require_number(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_require_object_coercible(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void *duk_require_pointer(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_require_stack(duk_context *ctx, duk_idx_t extra); DUK_EXTERNAL_DECL void duk_require_stack_top(duk_context *ctx, duk_idx_t top); -DUK_EXTERNAL_DECL const char *duk_require_string(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL const char *duk_require_string(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_idx_t duk_require_top_index(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_require_type_mask(duk_context *ctx, duk_idx_t index, duk_uint_t mask); -DUK_EXTERNAL_DECL duk_uint_t duk_require_uint(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_require_undefined(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_require_valid_index(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void *duk_resize_buffer(duk_context *ctx, duk_idx_t index, duk_size_t new_size); -DUK_EXTERNAL_DECL duk_int_t duk_safe_call(duk_context *ctx, duk_safe_call_function func, duk_idx_t nargs, duk_idx_t nrets); -DUK_EXTERNAL_DECL const char *duk_safe_to_lstring(duk_context *ctx, duk_idx_t index, duk_size_t *out_len); -DUK_EXTERNAL_DECL const char *duk_safe_to_string(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_set_finalizer(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL void duk_require_type_mask(duk_context *ctx, duk_idx_t idx, duk_uint_t mask); +DUK_EXTERNAL_DECL duk_uint_t duk_require_uint(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_require_undefined(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_require_valid_index(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void *duk_resize_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t new_size); +DUK_EXTERNAL_DECL void duk_resume(duk_context *ctx, const duk_thread_state *state); +DUK_EXTERNAL_DECL duk_int_t duk_safe_call(duk_context *ctx, duk_safe_call_function func, void *udata, duk_idx_t nargs, duk_idx_t nrets); +DUK_EXTERNAL_DECL const char *duk_safe_to_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); +DUK_EXTERNAL_DECL const char *duk_safe_to_string(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_samevalue(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); +DUK_EXTERNAL_DECL void duk_set_finalizer(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_set_global_object(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_set_magic(duk_context *ctx, duk_idx_t index, duk_int_t magic); -DUK_EXTERNAL_DECL void duk_set_prototype(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_set_top(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void *duk_steal_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size); -DUK_EXTERNAL_DECL duk_bool_t duk_strict_equals(duk_context *ctx, duk_idx_t index1, duk_idx_t index2); -DUK_EXTERNAL_DECL void duk_substring(duk_context *ctx, duk_idx_t index, duk_size_t start_char_offset, duk_size_t end_char_offset); -DUK_EXTERNAL_DECL void duk_swap(duk_context *ctx, duk_idx_t index1, duk_idx_t index2); -DUK_EXTERNAL_DECL void duk_swap_top(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_throw(duk_context *ctx); -DUK_EXTERNAL_DECL duk_bool_t duk_to_boolean(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void *duk_to_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size); -DUK_EXTERNAL_DECL void duk_to_defaultvalue(duk_context *ctx, duk_idx_t index, duk_int_t hint); -DUK_EXTERNAL_DECL void *duk_to_dynamic_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size); -DUK_EXTERNAL_DECL void *duk_to_fixed_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size); +DUK_EXTERNAL_DECL void duk_set_length(duk_context *ctx, duk_idx_t idx, duk_size_t len); +DUK_EXTERNAL_DECL void duk_set_magic(duk_context *ctx, duk_idx_t idx, duk_int_t magic); +DUK_EXTERNAL_DECL void duk_set_prototype(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_set_top(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void *duk_steal_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); +DUK_EXTERNAL_DECL duk_bool_t duk_strict_equals(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); +DUK_EXTERNAL_DECL void duk_substring(duk_context *ctx, duk_idx_t idx, duk_size_t start_char_offset, duk_size_t end_char_offset); +DUK_EXTERNAL_DECL void duk_suspend(duk_context *ctx, duk_thread_state *state); +DUK_EXTERNAL_DECL void duk_swap(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); +DUK_EXTERNAL_DECL void duk_swap_top(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_ret_t duk_syntax_error(duk_context *ctx, const char *fmt, ...); +DUK_EXTERNAL_DECL duk_ret_t duk_syntax_error_va(duk_context *ctx, const char *fmt, va_list ap); +DUK_EXTERNAL_DECL duk_ret_t duk_throw(duk_context *ctx); +DUK_EXTERNAL_DECL void duk_time_to_components(duk_context *ctx, duk_double_t time, duk_time_components *comp); +DUK_EXTERNAL_DECL duk_bool_t duk_to_boolean(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void *duk_to_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); +DUK_EXTERNAL_DECL void *duk_to_dynamic_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); +DUK_EXTERNAL_DECL void *duk_to_fixed_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); DUK_EXTERNAL_DECL duk_int_t duk_to_int(duk_context *ctx, duk_int_t index); -DUK_EXTERNAL_DECL duk_int32_t duk_to_int32(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL const char *duk_to_lstring(duk_context *ctx, duk_idx_t index, duk_size_t *out_len); -DUK_EXTERNAL_DECL void duk_to_null(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_double_t duk_to_number(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_to_object(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void *duk_to_pointer(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_to_primitive(duk_context *ctx, duk_idx_t index, duk_int_t hint); -DUK_EXTERNAL_DECL const char *duk_to_string(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_uint_t duk_to_uint(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_uint16_t duk_to_uint16(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_uint32_t duk_to_uint32(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_to_undefined(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_trim(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL duk_int32_t duk_to_int32(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_to_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); +DUK_EXTERNAL_DECL void duk_to_null(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_double_t duk_to_number(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_to_object(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void *duk_to_pointer(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_to_primitive(duk_context *ctx, duk_idx_t idx, duk_int_t hint); +DUK_EXTERNAL_DECL const char *duk_to_string(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_uint_t duk_to_uint(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_uint16_t duk_to_uint16(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_uint32_t duk_to_uint32(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_to_undefined(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_trim(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_ret_t duk_type_error(duk_context *ctx, const char *fmt, ...); +DUK_EXTERNAL_DECL duk_ret_t duk_type_error_va(duk_context *ctx, const char *fmt, va_list ap); +DUK_EXTERNAL_DECL duk_ret_t duk_uri_error(duk_context *ctx, const char *fmt, ...); +DUK_EXTERNAL_DECL duk_ret_t duk_uri_error_va(duk_context *ctx, const char *fmt, va_list ap); DUK_EXTERNAL_DECL void duk_xcopy_top(duk_context *to_ctx, duk_context *from_ctx, duk_idx_t count); DUK_EXTERNAL_DECL void duk_xmove_top(duk_context *to_ctx, duk_context *from_ctx, duk_idx_t count); diff --git a/Dev/api.html b/Dev/api.html index a6ab8ba..dad8faf 100644 --- a/Dev/api.html +++ b/Dev/api.html @@ -83,6 +83,7 @@
  • duk_alloc_raw
  • duk_base64_decode
  • duk_base64_encode
  • +
  • duk_buffer_to_string
  • duk_call
  • duk_call_method
  • duk_call_prop
  • @@ -93,11 +94,11 @@
  • duk_check_type_mask
  • duk_compact
  • duk_compile
  • -
  • duk_compile_file
  • duk_compile_lstring
  • duk_compile_lstring_filename
  • duk_compile_string
  • duk_compile_string_filename
  • +
  • duk_components_to_time
  • duk_concat
  • duk_config_buffer
  • duk_copy
  • @@ -106,14 +107,15 @@
  • duk_debugger_attach
  • duk_debugger_cooperate
  • duk_debugger_detach
  • +
  • duk_debugger_notify
  • +
  • duk_debugger_pause
  • duk_decode_string
  • duk_def_prop
  • duk_del_prop
  • duk_del_prop_index
  • +
  • duk_del_prop_lstring
  • duk_del_prop_string
  • duk_destroy_heap
  • -
  • duk_dump_context_stderr
  • -
  • duk_dump_context_stdout
  • duk_dump_function
  • duk_dup
  • duk_dup_top
  • @@ -122,8 +124,8 @@
  • duk_error
  • duk_error_va
  • duk_eval
  • -
  • duk_eval_file
  • -
  • duk_eval_file_noresult
  • +
  • duk_eval_error
  • +
  • duk_eval_error_va
  • duk_eval_lstring
  • duk_eval_lstring_noresult
  • duk_eval_noresult
  • @@ -133,6 +135,8 @@
  • duk_free
  • duk_free_raw
  • duk_gc
  • +
  • duk_generic_error
  • +
  • duk_generic_error_va
  • duk_get_boolean
  • duk_get_buffer
  • duk_get_buffer_data
  • @@ -141,6 +145,7 @@
  • duk_get_current_magic
  • duk_get_error_code
  • duk_get_finalizer
  • +
  • duk_get_global_lstring
  • duk_get_global_string
  • duk_get_heapptr
  • duk_get_int
  • @@ -148,10 +153,13 @@
  • duk_get_lstring
  • duk_get_magic
  • duk_get_memory_functions
  • +
  • duk_get_now
  • duk_get_number
  • duk_get_pointer
  • duk_get_prop
  • +
  • duk_get_prop_desc
  • duk_get_prop_index
  • +
  • duk_get_prop_lstring
  • duk_get_prop_string
  • duk_get_prototype
  • duk_get_string
  • @@ -162,21 +170,26 @@
  • duk_get_uint
  • duk_has_prop
  • duk_has_prop_index
  • +
  • duk_has_prop_lstring
  • duk_has_prop_string
  • duk_hex_decode
  • duk_hex_encode
  • duk_insert
  • +
  • duk_inspect_callstack_entry
  • +
  • duk_inspect_value
  • duk_instanceof
  • duk_is_array
  • duk_is_boolean
  • duk_is_bound_function
  • duk_is_buffer
  • +
  • duk_is_buffer_data
  • duk_is_c_function
  • duk_is_callable
  • duk_is_constructor_call
  • duk_is_dynamic_buffer
  • duk_is_ecmascript_function
  • duk_is_error
  • +
  • duk_is_eval_error
  • duk_is_fixed_buffer
  • duk_is_function
  • duk_is_lightfunc
  • @@ -188,17 +201,21 @@
  • duk_is_object_coercible
  • duk_is_pointer
  • duk_is_primitive
  • +
  • duk_is_range_error
  • +
  • duk_is_reference_error
  • duk_is_strict_call
  • duk_is_string
  • +
  • duk_is_symbol
  • +
  • duk_is_syntax_error
  • duk_is_thread
  • +
  • duk_is_type_error
  • duk_is_undefined
  • +
  • duk_is_uri_error
  • duk_is_valid_index
  • duk_join
  • duk_json_decode
  • duk_json_encode
  • duk_load_function
  • -
  • duk_log
  • -
  • duk_log_va
  • duk_map_string
  • duk_new
  • duk_next
  • @@ -207,14 +224,11 @@
  • duk_pcall_method
  • duk_pcall_prop
  • duk_pcompile
  • -
  • duk_pcompile_file
  • duk_pcompile_lstring
  • duk_pcompile_lstring_filename
  • duk_pcompile_string
  • duk_pcompile_string_filename
  • duk_peval
  • -
  • duk_peval_file
  • -
  • duk_peval_file_noresult
  • duk_peval_lstring
  • duk_peval_lstring_noresult
  • duk_peval_noresult
  • @@ -226,6 +240,7 @@
  • duk_pop_3
  • duk_pop_n
  • duk_push_array
  • +
  • duk_push_bare_object
  • duk_push_boolean
  • duk_push_buffer
  • duk_push_buffer_object
  • @@ -253,7 +268,6 @@
  • duk_push_pointer
  • duk_push_sprintf
  • duk_push_string
  • -
  • duk_push_string_file
  • duk_push_this
  • duk_push_thread
  • duk_push_thread_new_globalenv
  • @@ -263,20 +277,28 @@
  • duk_push_undefined
  • duk_push_vsprintf
  • duk_put_function_list
  • +
  • duk_put_global_lstring
  • duk_put_global_string
  • duk_put_number_list
  • duk_put_prop
  • duk_put_prop_index
  • +
  • duk_put_prop_lstring
  • duk_put_prop_string
  • +
  • duk_range_error
  • +
  • duk_range_error_va
  • duk_realloc
  • duk_realloc_raw
  • +
  • duk_reference_error
  • +
  • duk_reference_error_va
  • duk_remove
  • duk_replace
  • duk_require_boolean
  • duk_require_buffer
  • duk_require_buffer_data
  • duk_require_c_function
  • +
  • duk_require_callable
  • duk_require_context
  • +
  • duk_require_function
  • duk_require_heapptr
  • duk_require_int
  • duk_require_lstring
  • @@ -294,23 +316,29 @@
  • duk_require_undefined
  • duk_require_valid_index
  • duk_resize_buffer
  • +
  • duk_resume
  • duk_safe_call
  • duk_safe_to_lstring
  • duk_safe_to_string
  • +
  • duk_samevalue
  • duk_set_finalizer
  • duk_set_global_object
  • +
  • duk_set_length
  • duk_set_magic
  • duk_set_prototype
  • duk_set_top
  • duk_steal_buffer
  • duk_strict_equals
  • duk_substring
  • +
  • duk_suspend
  • duk_swap
  • duk_swap_top
  • +
  • duk_syntax_error
  • +
  • duk_syntax_error_va
  • duk_throw
  • +
  • duk_time_to_components
  • duk_to_boolean
  • duk_to_buffer
  • -
  • duk_to_defaultvalue
  • duk_to_dynamic_buffer
  • duk_to_fixed_buffer
  • duk_to_int
  • @@ -327,10 +355,14 @@
  • duk_to_uint32
  • duk_to_undefined
  • duk_trim
  • +
  • duk_type_error
  • +
  • duk_type_error_va
  • +
  • duk_uri_error
  • +
  • duk_uri_error_va
  • duk_xcopy_top
  • duk_xmove_top
  • -
    Duktape API

    Introduction §

    Version: 1.3.0 (2015-09-12)

    Document scope §

    The Duktape API (defined in duktape.h) is a set of constants +

    Duktape API

    Introduction §

    Version: 2.0.0 (2017-01-02)

    Document scope §

    The Duktape API (defined in duktape.h) is a set of constants and API calls which allows C/C++ programs to interface with Ecmascript code and shields them from internal details like value representation.

    This document provides a concise reference for the Duktape API and @@ -338,14 +370,7 @@ Duktape Programmer's Guide first.

    Searching for functions using browser search §

    You can use browser search (typically CTRL-F) to search for function definitions by prepending a dot to the search term. For instance, use ".duk_example_func" to look for duk_example_func(). In most -browsers only the actual section defining the function should be found.

    Portability §

    Some convenience API calls are not fully portable because they involve -file I/O to the filesystem or stdout/stderr. If -you want to keep your code maximally portable, avoid these calls. The -non-portable calls are marked with a nonportable tag.

    -Because the Duktape core APIs are intended to be maximally portable, the -nonportable calls may be moved to an optional utility library in future -versions for clarity. -

    API safety §

    As a general rule, API calls check all their parameters and tolerate +browsers only the actual section defining the function should be found.

    API safety §

    As a general rule, API calls check all their parameters and tolerate NULL arguments and invalid value stack indices without unsafe behavior (crashes).

    One major exception is the Duktape context argument, ctx. Unless stated otherwise, it is not checked and is required to be @@ -353,10 +378,10 @@ because explicit checks for the argument would increase code footprint for little practical gain.

    Also see Error handling best practices, especially to avoid uncaught errors which lead to difficult -to diagnose fatal errors.

    API calls may be macros §

    All Duktape API calls are potentially macros. The implementation of a +to diagnose fatal errors.

    API calls may be macros §

    All Duktape API calls are potentially macros. The implementation of a certain API call may change between a macro and an actual function even between compatible releases. See Duktape API -for more discussion.

    Minimal Duktape program §

    #include "duktape.h"
    +for more discussion.

    Minimal Duktape program §

    #include "duktape.h"
     
     int main(int argc, char *argv[]) {
         duk_context *ctx = duk_create_heap_default();
    @@ -464,33 +489,48 @@
     
  • Thread stash: specific to a certain thread.

  • Header definitions §

    This section summarizes some commonly needed header definitions in duktape.h. It is not exhaustive and the excerpts have been -reorganized for readability; when in doubt, consult the header directly.

    Duktape version §

    The Duktape version is available through the DUK_VERSION define, +reorganized for readability. Don't rely on the specific define values +shown below for e.g. flags fields. When in doubt, consult the header +directly.

    Duktape version §

    Duktape version is available through the DUK_VERSION define, with the numeric value (major * 10000 + minor * 100 + patch). The same value is available to Ecmascript code through Duktape.version. For example, version 1.2.3 would have DUK_VERSION and -Duktape.version set to 10203.

    The value of DUK_VERSION for pre-releases is one less than the -actual release, e.g. 1199 for a 0.12.0 pre-release and 10299 for a 1.3.0 -pre-release. See Versioning.

    The DUK_GIT_DESCRIBE define provides a git describe string for -the Duktape build. For official releases this is just "v1.0.0" or similar, -but for snapshot builds it provides useful version information (e.g. -"v1.0.0-155-g5b7ef1f-dirty"). There is no equivalent of this define in the -Ecmascript environment.

    Debug protocol version §

    The version number of the debug protocol (a single integer) is available as -the define DUK_DEBUG_PROTOCOL_VERSION.

    Structs and typedefs §

    typedef struct duk_hthread duk_context;
    +Duktape.version set to 10203.  For pre-releases DUK_VERSION
    +is one less than the actual release, e.g. 1199 for a 0.12.0 pre-release and 10299
    +for a 1.3.0 pre-release.  See Versioning.

    Git information §

    The following Git identifiers are available (all refer to the +Duktape GitHub repo):

    + + + + + + + + + + + + +
    DUK_GIT_DESCRIBEGit describe string for the Duktape build. For official releases this +is just "v1.0.0" or similar, but for snapshot builds it provides useful +version information, e.g. "v1.0.0-155-g5b7ef1f-dirty".
    DUK_GIT_COMMITExact commit hash where distributable was built from.
    DUK_GIT_BRANCHBranch where the distributable was built from. This is useful to +identify prototypes built from a development branch.

    There are no equivalent defines in the Ecmascript environment.

    Debug protocol version §

    The version number of the debug protocol (a single integer) is available as +the define DUK_DEBUG_PROTOCOL_VERSION.

    Structs and typedefs §

    typedef struct duk_hthread duk_context;
     
     typedef duk_ret_t (*duk_c_function)(duk_context *ctx);
     typedef void *(*duk_alloc_function) (void *udata, duk_size_t size);
     typedef void *(*duk_realloc_function) (void *udata, void *ptr, duk_size_t size);
     typedef void (*duk_free_function) (void *udata, void *ptr);
    -typedef void (*duk_fatal_function) (duk_context *ctx, duk_errcode_t code, const char *msg);
    +typedef void (*duk_fatal_function) (void *udata, const char *msg);
     typedef void (*duk_decode_char_function) (void *udata, duk_codepoint_t codepoint);
     typedef duk_codepoint_t (*duk_map_char_function) (void *udata, duk_codepoint_t codepoint);
    -typedef duk_ret_t (*duk_safe_call_function) (duk_context *ctx);
    +typedef duk_ret_t (*duk_safe_call_function) (duk_context *ctx, void *udata);
     typedef duk_size_t (*duk_debug_read_function) (void *udata, char *buffer, duk_size_t length);
     typedef duk_size_t (*duk_debug_write_function) (void *udata, const char *buffer, duk_size_t length);
     typedef duk_size_t (*duk_debug_peek_function) (void *udata);
     typedef void (*duk_debug_read_flush_function) (void *udata);
     typedef void (*duk_debug_write_flush_function) (void *udata);
    -typedef void (*duk_debug_detached_function) (void *udata);
    +typedef void (*duk_debug_detached_function) (duk_context *ctx, void *udata);
     
     struct duk_memory_functions {
             duk_alloc_function alloc_func;
    @@ -501,28 +541,18 @@
     typedef struct duk_memory_functions duk_memory_functions;
     
     struct duk_function_list_entry {
    -   const char *key;
    -   duk_c_function value;
    -   duk_int_t nargs;
    +	const char *key;
    +	duk_c_function value;
    +	duk_int_t nargs;
     };
     typedef struct duk_function_list_entry duk_function_list_entry;
     
     struct duk_number_list_entry {
    -   const char *key;
    -   duk_double_t value;
    +	const char *key;
    +	duk_double_t value;
     };
     typedef struct duk_number_list_entry duk_number_list_entry;
    -

    Error codes §

    /* Internal error codes */
    -#define DUK_ERR_NONE                 0    /* no error (e.g. from duk_get_error_code()) */
    -#define DUK_ERR_UNIMPLEMENTED_ERROR  50   /* UnimplementedError */
    -#define DUK_ERR_UNSUPPORTED_ERROR    51   /* UnsupportedError */
    -#define DUK_ERR_INTERNAL_ERROR       52   /* InternalError */
    -#define DUK_ERR_ALLOC_ERROR          53   /* AllocError */
    -#define DUK_ERR_ASSERTION_ERROR      54   /* AssertionError */
    -#define DUK_ERR_API_ERROR            55   /* APIError */
    -#define DUK_ERR_UNCAUGHT_ERROR       56   /* UncaughtError */
    -
    -/* Ecmascript E5 specification error codes */
    +

    Error codes §

    #define DUK_ERR_NONE                 0    /* no error (e.g. from duk_get_error_code()) */
     #define DUK_ERR_ERROR                100  /* Error */
     #define DUK_ERR_EVAL_ERROR           101  /* EvalError */
     #define DUK_ERR_RANGE_ERROR          102  /* RangeError */
    @@ -530,14 +560,7 @@
     #define DUK_ERR_SYNTAX_ERROR         104  /* SyntaxError */
     #define DUK_ERR_TYPE_ERROR           105  /* TypeError */
     #define DUK_ERR_URI_ERROR            106  /* URIError */
    -

    Return codes from Duktape/C functions §

    /* Return codes for C functions */
    -#define DUK_RET_UNIMPLEMENTED_ERROR  (-DUK_ERR_UNIMPLEMENTED_ERROR)
    -#define DUK_RET_UNSUPPORTED_ERROR    (-DUK_ERR_UNSUPPORTED_ERROR)
    -#define DUK_RET_INTERNAL_ERROR       (-DUK_ERR_INTERNAL_ERROR)
    -#define DUK_RET_ALLOC_ERROR          (-DUK_ERR_ALLOC_ERROR)
    -#define DUK_RET_ASSERTION_ERROR      (-DUK_ERR_ASSERTION_ERROR)
    -#define DUK_RET_API_ERROR            (-DUK_ERR_API_ERROR)
    -#define DUK_RET_UNCAUGHT_ERROR       (-DUK_ERR_UNCAUGHT_ERROR)
    +

    Return codes from Duktape/C functions §

    /* Return codes for C functions */
     #define DUK_RET_ERROR                (-DUK_ERR_ERROR)
     #define DUK_RET_EVAL_ERROR           (-DUK_ERR_EVAL_ERROR)
     #define DUK_RET_RANGE_ERROR          (-DUK_ERR_RANGE_ERROR)
    @@ -549,11 +572,11 @@
     /* Return codes for protected calls (duk_safe_call(), duk_pcall()). */
     #define DUK_EXEC_SUCCESS             0
     #define DUK_EXEC_ERROR               1
    -

    Compilation flags for duk_compile() §

    /* Compilation flags for duk_compile() and duk_eval() */
    +

    Compilation flags for duk_compile() §

    /* Compilation flags for duk_compile() and duk_eval() */
     #define DUK_COMPILE_EVAL                  (1 << 0)    /* compile eval code (instead of program) */
     #define DUK_COMPILE_FUNCTION              (1 << 1)    /* compile function code (instead of program) */
     #define DUK_COMPILE_STRICT                (1 << 2)    /* use strict (outer) context for program, eval, or function */
    -

    Flags for duk_def_prop() §

    /* Flags for duk_def_prop() and its variants */
    +

    Flags for duk_def_prop() §

    /* Flags for duk_def_prop() and its variants */
     #define DUK_DEFPROP_WRITABLE              (1 << 0)    /* set writable (effective if DUK_DEFPROP_HAVE_WRITABLE set) */
     #define DUK_DEFPROP_ENUMERABLE            (1 << 1)    /* set enumerable (effective if DUK_DEFPROP_HAVE_ENUMERABLE set) */
     #define DUK_DEFPROP_CONFIGURABLE          (1 << 2)    /* set configurable (effective if DUK_DEFPROP_HAVE_CONFIGURABLE set) */
    @@ -564,27 +587,28 @@
     #define DUK_DEFPROP_HAVE_GETTER           (1 << 7)    /* set getter (given on value stack) */
     #define DUK_DEFPROP_HAVE_SETTER           (1 << 8)    /* set setter (given on value stack) */
     #define DUK_DEFPROP_FORCE                 (1 << 9)    /* force change if possible, may still fail for e.g. virtual properties */
    -

    Enumeration flags for duk_enum() §

    /* Enumeration flags for duk_enum() */
    +#define DUK_DEFPROP_SET_WRITABLE          (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_WRITABLE)
    +#define DUK_DEFPROP_CLEAR_WRITABLE        DUK_DEFPROP_HAVE_WRITABLE
    +#define DUK_DEFPROP_SET_ENUMERABLE        (DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_ENUMERABLE)
    +#define DUK_DEFPROP_CLEAR_ENUMERABLE      DUK_DEFPROP_HAVE_ENUMERABLE
    +#define DUK_DEFPROP_SET_CONFIGURABLE      (DUK_DEFPROP_HAVE_CONFIGURABLE | DUK_DEFPROP_CONFIGURABLE)
    +#define DUK_DEFPROP_CLEAR_CONFIGURABLE    DUK_DEFPROP_HAVE_CONFIGURABLE
    +

    Enumeration flags for duk_enum() §

    /* Enumeration flags for duk_enum() */
     #define DUK_ENUM_INCLUDE_NONENUMERABLE    (1 << 0)    /* enumerate non-numerable properties in addition to enumerable */
    -#define DUK_ENUM_INCLUDE_INTERNAL         (1 << 1)    /* enumerate internal properties (regardless of enumerability) */
    +#define DUK_ENUM_INCLUDE_INTERNAL         (1 << 1)    /* enumerate internal properties */
     #define DUK_ENUM_OWN_PROPERTIES_ONLY      (1 << 2)    /* don't walk prototype chain, only check own properties */
     #define DUK_ENUM_ARRAY_INDICES_ONLY       (1 << 3)    /* only enumerate array indices */
    -#define DUK_ENUM_SORT_ARRAY_INDICES       (1 << 4)    /* sort array indices, use with DUK_ENUM_ARRAY_INDICES_ONLY */
    +#define DUK_ENUM_SORT_ARRAY_INDICES       (1 << 4)    /* sort array indices (applied to full enumeration result, including inherited array indices) */
     #define DUK_ENUM_NO_PROXY_BEHAVIOR        (1 << 5)    /* enumerate a proxy object itself without invoking proxy behavior */
    -

    Coercion hints §

    /* Coercion hints */
    +

    Garbage collection flags for duk_gc() §

    /* Flags for duk_gc() */
    +#define DUK_GC_COMPACT                    (1 << 0)    /* compact heap objects */
    +

    Coercion hints §

    /* Coercion hints */
     #define DUK_HINT_NONE         0    /* prefer number, unless coercion input is a Date, in which case prefer string (E5 Section 8.12.8) */
     #define DUK_HINT_STRING       1    /* prefer string */
     #define DUK_HINT_NUMBER       2    /* prefer number */
    -

    Flags for duk_push_thread_raw() §

    /* Flags for duk_push_thread_raw() */
    +

    Flags for duk_push_thread_raw() §

    /* Flags for duk_push_thread_raw() */
     #define DUK_THREAD_NEW_GLOBAL_ENV         (1 << 0)    /* create a new global environment */
    -

    Log levels §

    /* Log levels */
    -#define  DUK_LOG_TRACE                    0
    -#define  DUK_LOG_DEBUG                    1
    -#define  DUK_LOG_INFO                     2
    -#define  DUK_LOG_WARN                     3
    -#define  DUK_LOG_ERROR                    4
    -#define  DUK_LOG_FATAL                    5
    -

    Misc defines §

    #define DUK_INVALID_INDEX     DUK_IDX_MIN
    +

    Misc defines §

    #define DUK_INVALID_INDEX     DUK_IDX_MIN
     
     #define DUK_VARARGS           ((duk_int_t) (-1))
     
    @@ -604,7 +628,6 @@
     
  • duk_check_type_mask
  • duk_compact
  • duk_compile
  • -
  • duk_compile_file
  • duk_compile_lstring
  • duk_compile_lstring_filename
  • duk_compile_string
  • @@ -618,16 +641,12 @@
  • duk_del_prop_index
  • duk_del_prop_string
  • duk_destroy_heap
  • -
  • duk_dump_context_stderr
  • -
  • duk_dump_context_stdout
  • duk_dup
  • duk_dup_top
  • duk_enum
  • duk_equals
  • duk_error
  • duk_eval
  • -
  • duk_eval_file
  • -
  • duk_eval_file_noresult
  • duk_eval_lstring
  • duk_eval_lstring_noresult
  • duk_eval_noresult
  • @@ -694,7 +713,6 @@
  • duk_join
  • duk_json_decode
  • duk_json_encode
  • -
  • duk_log
  • duk_map_string
  • duk_new
  • duk_next
  • @@ -703,14 +721,11 @@
  • duk_pcall_method
  • duk_pcall_prop
  • duk_pcompile
  • -
  • duk_pcompile_file
  • duk_pcompile_lstring
  • duk_pcompile_lstring_filename
  • duk_pcompile_string
  • duk_pcompile_string_filename
  • duk_peval
  • -
  • duk_peval_file
  • -
  • duk_peval_file_noresult
  • duk_peval_lstring
  • duk_peval_lstring_noresult
  • duk_peval_noresult
  • @@ -743,7 +758,6 @@
  • duk_push_pointer
  • duk_push_sprintf
  • duk_push_string
  • -
  • duk_push_string_file
  • duk_push_this
  • duk_push_thread
  • duk_push_thread_new_globalenv
  • @@ -797,7 +811,6 @@
  • duk_throw
  • duk_to_boolean
  • duk_to_buffer
  • -
  • duk_to_defaultvalue
  • duk_to_dynamic_buffer
  • duk_to_fixed_buffer
  • duk_to_int
  • @@ -822,7 +835,6 @@
  • duk_get_error_code
  • duk_get_heapptr
  • duk_is_error
  • -
  • duk_log_va
  • duk_push_error_object_va
  • duk_push_heapptr
  • duk_require_heapptr
  • @@ -841,6 +853,54 @@
  • duk_push_external_buffer
  • duk_require_buffer_data
  • duk_steal_buffer
  • +

    1.4.0 §

    1.5.0 §

    1.6.0 §

    2.0.0 §

    borrowed §

    buffer §

    compare §

    compile §

    debug §

    debugger §

    error §

    experimental §

    finalizer §

    inspect §

    json §

    lightfunc §

    log §

    magic §

    nonportable §

    object §

    protected §

    sandbox §

    stack §

    string §

    symbol §

    thread §

    time §

    vararg §


    .duk_alloc() 1.0.0 @@ -1379,7 +1474,7 @@

    See also §

    Prototype §

    -
    void duk_base64_decode(duk_context *ctx, duk_idx_t index);
    +
    void duk_base64_decode(duk_context *ctx, duk_idx_t idx);
     
    @@ -1416,7 +1511,7 @@

    See also §

    Prototype §

    -
    const char *duk_base64_encode(duk_context *ctx, duk_idx_t index);
    +
    const char *duk_base64_encode(duk_context *ctx, duk_idx_t idx);
     
    @@ -1450,6 +1545,54 @@

    See also duk_base64_decode

    +

    +.duk_buffer_to_string() +2.0.0 +string +stack +buffer + §

    +
    +

    Prototype §

    +
    const char *duk_buffer_to_string(duk_context *ctx, duk_idx_t idx);
    +
    +
    +
    +

    Stack §

    +
    [ . . . val . . . ] [ . . . buffer_to_string(val) . . . ]
    +
    +
    +

    Summary §

    +

    Replace the buffer value (plain buffer or any buffer object) at +idx with a string whose internal byte representation is taken +1:1 from the buffer (same as if the buffer data was pushed using +duk_push_lstring()). Returns a non-NULL +pointer to the read-only, NUL-terminated string data. A TypeError is +thrown if (1) the argument is not a buffer value, (2) the argument is +a buffer object whose backing buffer doesn't cover the apparent +buffer size, (3) the index is invalid.

    +
    +

    Custom type coercion is described in +Type conversion and testing.

    +
    +
    +Since Duktape 2.0 the duk_to_string() coercion for a buffer +value is typically something like "[object Uint8Array]", which is not +usually intended. +
    +
    +
    +

    Example §

    +
    unsigned char *ptr;
    +ptr = (unsigned char *) duk_push_fixed_buffer(ctx, 4);
    +ptr[0] = 0x61;
    +ptr[1] = 0x62;
    +ptr[2] = 0x63;
    +ptr[3] = 0x64;  /* 61 62 63 64 */
    +printf("coerced string: %s\n", duk_buffer_to_string(ctx, -1));
    +duk_pop(ctx);
    +
    +

    .duk_call() 1.0.0 @@ -1566,7 +1709,7 @@

    Example §

    Prototype §

    -
    void duk_call_prop(duk_context *ctx, duk_idx_t obj_index, duk_idx_t nargs);
    +
    void duk_call_prop(duk_context *ctx, duk_idx_t obj_idx, duk_idx_t nargs);
     
    @@ -1618,7 +1761,7 @@

    Example §

    Prototype §

    -
    duk_codepoint_t duk_char_code_at(duk_context *ctx, duk_idx_t index, duk_size_t char_offset);
    +
    duk_codepoint_t duk_char_code_at(duk_context *ctx, duk_idx_t idx, duk_size_t char_offset);
     
    @@ -1628,9 +1771,10 @@

    Stack

    Summary §

    Get the codepoint of a character at character offset char_offset -of a string at index. If the value at index is not -a string, an error is thrown. If char_offset is invalid (outside -the string) a zero is returned.

    +of a string at idx. If the value at idx is not +a string, an error is thrown. If the string cannot be (extended) UTF-8 decoded, +the result is U+FFFD (Unicode replacement character). If char_offset +is invalid (outside the string) a zero is returned.

    Example §

    @@ -1759,7 +1903,7 @@

    See also §

    Prototype §

    -
    duk_bool_t duk_check_type(duk_context *ctx, duk_idx_t index, duk_int_t type);
    +
    duk_bool_t duk_check_type(duk_context *ctx, duk_idx_t idx, duk_int_t type);
     
    @@ -1768,7 +1912,7 @@

    Stack

    Summary §

    -

    Matches the type of the value at index against type. +

    Matches the type of the value at idx against type. Returns 1 if the type matches, zero otherwise.

    @@ -1785,7 +1929,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_check_type_mask(duk_context *ctx, duk_idx_t index, duk_uint_t mask);
    +
    duk_bool_t duk_check_type_mask(duk_context *ctx, duk_idx_t idx, duk_uint_t mask);
     
    @@ -1794,7 +1938,7 @@

    Stack

    Summary §

    -

    Matches the type of the value at index against the type +

    Matches the type of the value at idx against the type mask bits given in mask. Returns 1 if the value type matches one of the type mask bits and zero otherwise.

    @@ -1815,7 +1959,7 @@

    Example §

    Prototype §

    -
    void duk_compact(duk_context *ctx, duk_idx_t obj_index);
    +
    void duk_compact(duk_context *ctx, duk_idx_t obj_idx);
     
    @@ -1826,7 +1970,7 @@

    Stack Summary §

    Resizes an object's internal memory allocation to minimize memory usage. -If the value at obj_index is not an object, does nothing. +If the value at obj_idx is not an object, does nothing. Although compaction is normally safe, it can fail due to an internal error (such as out-of-memory error). Compaction only affects to an object's "own properties", not its inherited properties. @@ -2006,38 +2150,6 @@

    See also duk_compile_file

    -

    -.duk_compile_file() -1.0.0 -nonportable -compile - §

    -
    -

    Prototype §

    -
    void duk_compile_file(duk_context *ctx, duk_uint_t flags, const char *path);
    -
    -
    -
    -

    Stack §

    -
    [ . . . ] [ . . . function ]
    -
    -
    -

    Summary §

    -

    Like -duk_compile(), but the compile input -is given as a filename. The filename associated with the result function -is path as is.

    -
    -The path argument is given directly to fopen(). -The path encoding cannot be specified and there is no support for a wide -character string. -
    -
    -
    -

    Example §

    -
    duk_compile_file(ctx, 0, "test.js");
    -
    -

    .duk_compile_lstring() 1.0.0 @@ -2057,8 +2169,7 @@

    Summary Like duk_compile(), but the compile input is given as a C string with explicit length. The filename associated with the -function is automatically provided from the __FILE__ preprocessor -define of the caller.

    +function is "input".

    With this variant, the input source code is not interned by Duktape which is useful in low memory environments. @@ -2124,8 +2235,7 @@

    Summary Like duk_compile(), but the compile input is given as a C string. The filename associated with the function is -automatically provided from the __FILE__ preprocessor define of -the caller.

    +"input".

    With this variant, the input source code is not interned by Duktape which is useful in low memory environments. @@ -2166,6 +2276,65 @@

    Example duk_compile_string_filename(ctx, 0, "print('program code');");

    +

    +.duk_components_to_time() +2.0.0 +time +experimental + §

    +
    +

    Prototype §

    +
    duk_double_t duk_components_to_time(duk_context *ctx, duk_time_components *comp);
    +
    +
    +
    +

    Stack §

    +

    (No effect on value stack.)

    +
    +
    +

    Summary §

    +

    Convert components (year, month, day, etc), interpreted in UTC, into a +time value. The comp->weekday argument is ignored in the +conversion. If the component values are invalid, an error is thrown.

    +

    There are some differences to the Ecmascript Date.UTC() +built-in:

    +
      +
    • There's no special handling of two-digit years. For example, + Date.UTC(99, 0, 1) gets interpreted as 1999-01-01. + If comp->time is 99, it's interpreted as the year 99.
    • +
    • The milliseconds component is allowed fractions (sub-millisecond + resolution) so that the resulting time value may have fractions.
    • +
    +

    Like the Ecmascript primitives, the components can exceed their natural +range and are normalized. For example, specifying comp->minutes +as 120 is interpreted as adding 2 hours to the time value. The components are +expressed as IEEE doubles to allow large and negative values to be used.

    +
    +
    +

    Example §

    +
    duk_time_components comp;
    +duk_double_t time;
    +
    +memset((void *) &comp, 0, sizeof(comp));  /* good practice even if fully initialized */
    +comp.year = 2016;
    +comp.month = 0;  /* 0-based, 1=January */
    +comp.day = 2;    /* 1-based: second of January */
    +comp.hours = 3;
    +comp.minutes = 4;
    +comp.seconds = 5;
    +comp.milliseconds = 6.0;  /* allows sub-millisecond resolution */
    +comp.weekday = 0;  /* ignored */
    +
    +time = duk_components_to_time(ctx, &comp);
    +printf("2016-01-02 03:04:05.006Z -> %lf\n", (double) time);
    +
    +
    +
    +

    See also §

    + +

    .duk_concat() 1.0.0 @@ -2209,12 +2378,11 @@

    See also .duk_config_buffer() 1.3.0 stack -experimental buffer §

    Prototype §

    -
    void duk_config_buffer(duk_context *ctx, duk_idx_t index, void *ptr, duk_size_t len);
    +
    void duk_config_buffer(duk_context *ctx, duk_idx_t idx, void *ptr, duk_size_t len);
     
    @@ -2247,25 +2415,25 @@

    See also §

    Prototype §

    -
    void duk_copy(duk_context *ctx, duk_idx_t from_index, duk_idx_t to_index);
    +
    void duk_copy(duk_context *ctx, duk_idx_t from_idx, duk_idx_t to_idx);
     

    Stack §

    -
    [ . . . old(to_index) . . . val(from_index) . . . ] [ . . . val(to_index) . . . val(from_index) . . . ]
    +
    [ . . . old(to_idx) . . . val(from_idx) . . . ] [ . . . val(to_idx) . . . val(from_idx) . . . ]

    Summary §

    -

    Copy a value from from_index to to_index, +

    Copy a value from from_idx to to_idx, overwriting the previous value. If either index is invalid, throws an error.

    This is a shorthand for:

    /* to_index must be normalize in case it is negative and would change its
      * meaning after duk_dup().
      */
    -to_index = duk_normalize_index(ctx, to_index);
    -duk_dup(ctx, from_index);
    -duk_replace(ctx, to_index);
    +to_idx = duk_normalize_idx(ctx, to_idx);
    +duk_dup(ctx, from_idx);
    +duk_replace(ctx, to_idx);
     
    @@ -2314,15 +2482,18 @@

    Summary +for more detail and examples.

    To create a Duktape heap with default settings, use duk_create_heap_default().

    New contexts linked to the same heap can be created with @@ -2405,7 +2576,7 @@

    Example

    .duk_debugger_attach() 1.2.0 -debug +debugger §

    Prototype §

    @@ -2415,6 +2586,7 @@

    Prototype void duk_debugger_attach(duk_context *ctx, duk_debug_read_function read_cb, @@ -2422,6 +2594,7 @@

    Prototype duk_debug_peek_function peek_cb, duk_debug_read_flush_function read_flush_cb, duk_debug_write_flush_function write_flush_cb, + duk_debug_request_function request_cb, duk_debug_detached_function detached_cb, void *udata); @@ -2432,14 +2605,54 @@

    Stack

    Summary §

    -

    Attach a debugger to the Duktape heap. If debugger support is not +

    Attach a debugger to the Duktape heap. The debugger will automatically +enter paused state when the attach is complete. If debugger support is not compiled into Duktape, throws an error. See debugger.rst -for more information.

    -

    The read_cb and write_cb callbacks are mandatory. -The peek_cb is strongly recommended but optional. The -read_flush_cb and write_flush_cb callbacks are -optional. Unimplemented callbacks are indicated using a NULL.

    +for more information on debugger integration. The callbacks are as follows, +optional callbacks may be NULL:

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    CallbackRequiredDescription
    read_cbYesDebug transport read callback
    write_cbYesDebug transport write callback
    peek_cbNoDebug transport peek callback, strongly recommended but optional
    read_flush_cbNoDebug transport read flush callback
    write_flush_cbNoDebug transport write flush callback
    request_cbNoApplication specific command (AppRequest) callback, NULL indicates no AppRequest support
    detached_cbNoDebugger detached callback
    +

    Important: The callbacks are not allowed to call any Duktape API +functions (doing so may cause memory unsafe behavior) except for the following:

    +
      +
    • The request_cb AppRequest callback may use the value stack + within the guidelines described in + debugger.rst.
    • +
    • Since Duktape 1.4.0 the debugger detached callback is allowed to call + duk_debugger_attach() + to immediately reattach the debugger. In Duktape 1.3.0 and before the + immediate reattach potentially caused + some issues.
    • +
    +
    +The duk_debugger_attach_custom() and duk_debugger_attach() +API calls were merged in Duktape 2.x. +


    .duk_debugger_cooperate() 1.2.0 -debug +debugger §

    Prototype §

    @@ -2498,7 +2713,7 @@

    See also

    .duk_debugger_detach() 1.2.0 -debug +debugger §

    Prototype §

    @@ -2528,6 +2743,91 @@

    See also duk_debugger_cooperate

    +

    +.duk_debugger_notify() +1.5.0 +debugger + §

    +
    +

    Prototype §

    +
    duk_bool_t duk_debugger_notify(duk_context *ctx, duk_idx_t nvalues);
    +
    +
    +
    +

    Stack §

    +
    [ . . . val1 . . . valN ] [ . . . ]
    +
    +
    +

    Summary §

    +

    Send an application specific debugger notify (AppNotify) containing the +nvalues values on the value stack top mapped to debug protocol +dvalues. The return value indicates whether the notify was successfully +sent (non-zero) or not (zero). The nvalues arguments are +always popped off the stack top. The call is a no-op if debugger support +has not been compiled in, or if the debugger is not attached; in both cases +the call will return zero to indicate that the notify was not sent.

    +

    See the debugger documentation for more information and examples on how +to use application specific notifications.

    +
    +
    +

    Example §

    +
    /* Causes the following notify to be sent over the debugger protocol:
    + *
    + *   NFY AppNotify "BatteryStatus" 740 1000 true EOM
    + */
    +int battery_current = 740;
    +int battery_limit = 1000;
    +int battery_charging = 1;
    +
    +duk_push_string(ctx, "BatteryStatus");
    +duk_push_int(ctx, battery_current);
    +duk_push_int(ctx, battery_limit);
    +duk_push_boolean(ctx, battery_charging);
    +if (duk_debugger_notify(ctx, 4 /*nvalues*/)) {
    +    printf("battery status notification sent\n");
    +} else {
    +    printf("battery status notification not sent\n");
    +}
    +
    +
    +

    +.duk_debugger_pause() +1.5.0 +debugger + §

    +
    +

    Prototype §

    +
    void duk_debugger_pause(duk_context *ctx);
    +
    +
    +
    +

    Stack §

    +

    (No effect on value stack.)

    +
    +
    +

    Summary §

    +

    Request a debugger pause as soon as possible and return without blocking. +The pause will be triggered the next time Ecmascript bytecode is executed, +which is usually almost immediate. However, if a native call such as a +Duktape/C function is in progress or no Ecmascript code is currently +executing, it may take longer for the pause to take effect.

    +

    The call is a no-op if (1) debugger support has not been compiled in, (2) +the debugger is not attached, or (3) Duktape is already paused. This mimics +the semantics of the Ecmascript debugger statement.

    +
    +Like all Duktape API calls, this call is not thread safe. It may be tempting +to trigger a pause from a thread different than one running Ecmascript code +for the context, but this is unsafe and not currently supported. +
    +
    +
    +

    Example §

    +
    /* In your event loop: */
    +if (key_pressed == KEY_F12) {
    +    duk_debugger_pause(ctx);
    +}
    +
    +

    .duk_decode_string() 1.0.0 @@ -2535,7 +2835,7 @@

    See also §

    Prototype §

    -
    void duk_decode_string(duk_context *ctx, duk_idx_t index, duk_decode_char_function callback, void *udata);
    +
    void duk_decode_string(duk_context *ctx, duk_idx_t idx, duk_decode_char_function callback, void *udata);
     
    @@ -2544,7 +2844,7 @@

    Stack

    Summary §

    -

    Process string at index, calling callback for each codepoint +

    Process string at idx, calling callback for each codepoint of the string. The callback is given the udata argument and a codepoint. The input string is not modified. If the value is not a string or the index is invalid, throws an error.

    @@ -2573,7 +2873,7 @@

    See also §

    Prototype §

    -
    void duk_def_prop(duk_context *ctx, duk_idx_t obj_index, duk_uint_t flags);
    +
    void duk_def_prop(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t flags);
     
    @@ -2587,11 +2887,15 @@

    Stack

    Summary §

    Create or alter the attributes of property key of object at -obj_index, with semantics like +obj_idx, with semantics like Object.defineProperty(). When the requested change is not allowed (e.g. property is not configurable), a TypeError is thrown. If the target is not an object (or the index is invalid) an error is thrown.

    +

    If the target is a Proxy object which implements the defineProperty +trap, the trap should be invoked. However, Duktape doesn't currently support +the defineProperty trap. When support is added, this API call will +start invoking the trap.

    The flags field provides "have" flags to indicate what property attributes are changed (this models the partial property descriptors allowed by Object.defineProperty()). Values for the writable, configurable, @@ -2608,8 +2912,9 @@

    Summary +may not be modifiable (such as string .length and index properties) +or may have limitations (such as array .length property which cannot +be made configurable or enumerable due to internal limitations).

    Some examples (see further examples below):

    +

    .duk_del_prop() 1.0.0 @@ -2712,7 +3042,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_del_prop(duk_context *ctx, duk_idx_t obj_index);
    +
    duk_bool_t duk_del_prop(duk_context *ctx, duk_idx_t obj_idx);
     
    @@ -2721,7 +3051,7 @@

    Stack

    Summary §

    -

    Delete the property key of a value at obj_index. +

    Delete the property key of a value at obj_idx. key is removed from the stack. Return code and error throwing behavior:

      @@ -2730,15 +3060,13 @@

      Summary object coercible, throws an error. -
    • If obj_index is invalid, throws an error.
    • +
    • If obj_idx is invalid, throws an error.
    -

    The property deletion is equivalent to the Ecmascript expression:

    -
    delete obj[key]
    -
    -

    For semantics, see +

    The property deletion is equivalent to the Ecmascript expression +res = delete obj[key]. For precise semantics, see Property Accessors, The delete operator and [[Delete]] (P, Throw). @@ -2748,10 +3076,13 @@

    Summary This API call returns 1 when the target property does not exist. This is not very intuitive, but follows Ecmascript semantics: @@ -2792,7 +3123,7 @@

    See also §

    Prototype §

    -
    duk_bool_t duk_del_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index);
    +
    duk_bool_t duk_del_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx);
     
    @@ -2803,7 +3134,7 @@

    Stack Summary §

    Like duk_del_prop(), but the property name is given as an unsigned integer -arr_index. This is especially useful for deleting +arr_idx. This is especially useful for deleting array elements (but is not limited to that).

    Conceptually the number is coerced to a string for the property deletion, e.g. 123 would be equivalent to a property @@ -2818,6 +3149,39 @@

    Example printf("delete obj[123] -> rc=%d\n", (int) rc);

    +

    +.duk_del_prop_lstring() +2.0.0 +property + §

    +
    +

    Prototype §

    +
    duk_bool_t duk_del_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len);
    +
    +
    +
    +

    Stack §

    +
    [ . . . obj . . . ] [ . . . obj . . . ]
    +
    +
    +

    Summary §

    +

    Like duk_del_prop(), +but the property name is given as a string with explicit length.

    +
    +
    +

    Example §

    +
    duk_bool_t rc;
    +
    +rc = duk_del_prop_lstring(ctx, -3, "internal" "\x00" "nul");
    +printf("delete obj.internal[00]nul -> rc=%d\n", (int) rc);
    +
    +
    +
    +

    See also §

    + +

    .duk_del_prop_string() 1.0.0 @@ -2825,7 +3189,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_del_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key);
    +
    duk_bool_t duk_del_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key);
     
    +

    .duk_destroy_heap() 1.0.0 @@ -2873,77 +3243,10 @@

    Example duk_destroy_heap(ctx);

    -

    -.duk_dump_context_stderr() -1.0.0 -stack -nonportable -debug - §

    -
    -

    Prototype §

    -
    void duk_dump_context_stderr(duk_context *ctx);
    -
    -
    -
    -

    Stack §

    -
    [ . . . ] [ . . . ]
    -
    -
    -

    Summary §

    -

    Like duk_push_context_dump() but -the context dump is written to stderr and nothing is left on -the value stack.

    -

    If file I/O has been disabled, this call is a NOP.

    -
    -You should not leave dump calls in production code. -
    -
    -
    -

    Example §

    -
    duk_push_int(ctx, 123);
    -duk_push_string(ctx, "foo");
    -duk_dump_context_stderr(ctx);
    -
    -
    -

    -.duk_dump_context_stdout() -1.0.0 -stack -nonportable -debug - §

    -
    -

    Prototype §

    -
    void duk_dump_context_stdout(duk_context *ctx);
    -
    -
    -
    -

    Stack §

    -
    [ . . . ] [ . . . ]
    -
    -
    -

    Summary §

    -

    Like duk_push_context_dump() but -the context dump is written to stdout and nothing is left on -the value stack.

    -

    If file I/O has been disabled, this call is a NOP.

    -
    -You should not leave dump calls in production code. -
    -
    -
    -

    Example §

    -
    duk_push_int(ctx, 123);
    -duk_push_string(ctx, "foo");
    -duk_dump_context_stdout(ctx);
    -
    -

    .duk_dump_function() 1.3.0 stack -experimental bytecode §

    @@ -2965,6 +3268,8 @@

    Summary For more information on Duktape bytecode dump/load, supported features, and known limitations, see bytecode.rst. +Duktape bytecode format is not intended for obfuscation, see notes on +Obfuscation.

    @@ -2987,7 +3292,7 @@

    See also §

    Prototype §

    -
    void duk_dup(duk_context *ctx, duk_idx_t from_index);
    +
    void duk_dup(duk_context *ctx, duk_idx_t from_idx);
     
    @@ -2996,8 +3301,8 @@

    Stack

    Summary §

    -

    Push a duplicate of value at from_index to the stack. -If from_index is invalid, throws an error.

    +

    Push a duplicate of value at from_idx to the stack. +If from_idx is invalid, throws an error.

    Example §

    @@ -3048,7 +3353,7 @@

    Example §

    Prototype §

    -
    void duk_enum(duk_context *ctx, duk_idx_t obj_index, duk_uint_t enum_flags);
    +
    void duk_enum(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t enum_flags);
     
    @@ -3057,49 +3362,77 @@

    Stack

    Summary §

    -

    Create an enumerator for object at obj_index. Enumeration +

    Create an enumerator for object at obj_idx. Enumeration details can be controlled with enum_flags. If the target value is not an object, throws an error.

    Enumeration flags:

    -
      -
    • DUK_ENUM_INCLUDE_NONENUMERABLE: enumerate also non-enumerable - properties (by default only enumerable properties are enumerated)
    • -
    • DUK_ENUM_INCLUDE_INTERNAL: enumerate also internal properties - (by default internal properties are not enumerated)
    • -
    • DUK_ENUM_OWN_PROPERTIES_ONLY: enumerate only an object's "own" - properties (by default also inherited properties are enumerated)
    • -
    • DUK_ENUM_ARRAY_INDICES_ONLY: enumerate only array indices, - i.e. property names of the form "0", "1", "2", etc.
    • -
    • DUK_ENUM_SORT_ARRAY_INDICES: guarantee that array indices are - sorted by their numeric value, only use with DUK_ENUM_ARRAY_INDICES_ONLY; - this is quite slow
    • -
    -

    Without any flags, enumeration follows the Ecmascript default enumeration -semantics, as in the expression:

    -
    for (key in obj) {
    -    print(key, obj[i]);
    -}
    -
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DUK_ENUM_INCLUDE_NONENUMERABLEEnumerate also non-enumerable properties, by default only enumerable + properties are enumerated
    DUK_ENUM_INCLUDE_HIDDENEnumerate also hidden Symbols, by default hidden Symbols are not + enumerated. Use together with DUK_ENUM_INCLUDE_SYMBOLS. + In Duktape 1.x this flag was called DUK_ENUM_INCLUDE_INTERNAL.
    DUK_ENUM_INCLUDE_SYMBOLSInclude Symbols in the enumeration result. Hidden Symbols are not + included unless DUK_ENUM_INCLUDE_HIDDEN is specified.
    DUK_ENUM_EXCLUDE_STRINGSExclude strings from the enumeration result. By default strings are + included.
    DUK_ENUM_OWN_PROPERTIES_ONLYEnumerate only an object's "own" properties, by default also inherited + properties are enumerated
    DUK_ENUM_ARRAY_INDICES_ONLYEnumerate only array indices, i.e. property names of the form "0", "1", + "2", etc
    DUK_ENUM_SORT_ARRAY_INDICESApply the ES2015 [[OwnPropertyKeys]] enumeration order over the whole + enumeration result rather than per inheritance level, this has the + effect of sorting array indices (even when inherited)
    DUK_ENUM_NO_PROXY_BEHAVIOREnumerate a Proxy object itself without invoking Proxy behaviors.
    +

    Without any flags the enumeration behaves like for-in: +own and inherited enumerable properties are included, and enumeration +order follows the +Ecmascript ES2015 [[OwnPropertyKeys]] +enumeration order, applied for each inheritance level.

    Once the enumerator has been created, use duk_next() to extract keys (or key/value pairs) from the enumerator.

    -Array indices are usually enumerated in a sorted order even without the -DUK_ENUM_SORT_ARRAY_INDICES flag. This is not the case -for "sparse arrays" which contain a lot of gaps (unused indices). -Duktape represents such arrays internally using a key-value representation -instead of a plain array, which affects key enumeration order. -The criteria for switching from a dense to a sparse array are internal details -and potentially version dependent. With the DUK_ENUM_SORT_ARRAY_INDICES -flag the array indices will be sorted even for sparse arrays, at the -cost of an explicit key sorting pass. +The ES2015 [[OwnPropertyKeys]] enumeration order is: +(1) array indices in ascending order, (2) non-array-index keys in their +insertion order, and (3) symbols in their insertion order. This rule +is applied separately for each inheritance level, so that if array index +keys are inherited, they will appear out-of-order in the result. For +most practical code this is not an issue because array indices are very +rarely inherited. You can force the whole enumeration sequence to be +sorted using DUK_ENUM_SORT_ARRAY_INDICES.

    Example §

    duk_enum(ctx, -3, DUK_ENUM_INCLUDE_NONENUMERABLE);
     
    -while (duk_next(ctx, -1 /*enum_index*/, 0 /*get_value*/)) {
    +while (duk_next(ctx, -1 /*enum_idx*/, 0 /*get_value*/)) {
         /* [ ... enum key ] */
         printf("-> key %s\n", duk_get_string(ctx, -1));
         duk_pop(ctx);  /* pop_key */
    @@ -3121,7 +3454,7 @@ 

    See also §

    Prototype §

    -
    duk_bool_t duk_equals(duk_context *ctx, duk_idx_t index1, duk_idx_t index2);
    +
    duk_bool_t duk_equals(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2);
     
    @@ -3130,7 +3463,7 @@

    Stack

    Summary §

    -

    Compare values at index1 and index2 for equality. +

    Compare values at idx1 and idx2 for equality. Returns 1 if values are considered equal using Ecmascript Equals operator (==) semantics, otherwise returns 0. Also returns 0 if either @@ -3164,7 +3497,7 @@

    See also §

    Prototype §

    -
    void duk_error(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...);
    +
    duk_ret_t duk_error(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...);
     
    @@ -3183,6 +3516,12 @@

    Summary duk_push_error_object().

    +

    Even though the function never returns, the prototype describes a return +value which allows code such as:

    +
    if (argvalue < 0) {
    +    return duk_error(ctx, DUK_ERR_TYPE_ERROR, "invalid argument value: %d", (int) argvalue);
    +}
    +


    @@ -3205,7 +3551,7 @@

    See also §

    Prototype §

    -
    void duk_error_va(duk_context *ctx, duk_errcode_t err_code, const char *fmt, va_list ap);
    +
    duk_ret_t duk_error_va(duk_context *ctx, duk_errcode_t err_code, const char *fmt, va_list ap);
     

    @@ -3255,10 +3608,9 @@

    Summary .

    This is essentially a shortcut for:

    -
    duk_push_string(ctx, __FILE__);
    +
    duk_push_string(ctx, "eval");
     duk_compile(ctx, DUK_COMPILE_EVAL);  /* [ ... source filename ] -> [ function ] */
     duk_call(ctx, 0);
     
    @@ -3296,77 +3648,75 @@

    See also duk_eval_file_noresult

    -

    -.duk_eval_file() -1.0.0 -nonportable -compile - §

    +

    +.duk_eval_error() +2.0.0 +error + §

    -

    Prototype §

    -
    void duk_eval_file(duk_context *ctx, const char *path);
    +

    Prototype §

    +
    duk_ret_t duk_eval_error(duk_context *ctx, const char *fmt, ...);
     
    -

    Stack §

    -
    [ . . . ] [ . . . result ]
    +

    Stack §

    +
    [ . . . ] [ . . . err ]
    -

    Summary §

    -

    Like -duk_eval(), but the eval input -is given as a filename. The filename associated with the temporary -function created for the eval code is path as is.

    -
    -The path argument is given directly to fopen(). -The path encoding cannot be specified and there is no support for a wide -character string. -
    +

    Summary §

    +

    Convenience API call, equivalent to +duk_error() with an error code +DUK_ERR_EVAL_ERROR.

    -

    Example §

    -
    duk_eval_file(ctx, "test.js");
    -printf("result is: %s\n", duk_safe_to_string(ctx, -1));
    -duk_pop(ctx);
    +

    Example §

    +
    return duk_eval_error(ctx, "my error: %d", (int) argval);
     
    -

    See also §

    +

    See also §

    -

    -.duk_eval_file_noresult() -1.0.0 -nonportable -compile - §

    +

    +.duk_eval_error_va() +2.0.0 +vararg +error + §

    -

    Prototype §

    -
    void duk_eval_file_noresult(duk_context *ctx, const char *path);
    +

    Prototype §

    +
    duk_ret_t duk_eval_error_va(duk_context *ctx, const char *fmt, va_list ap);
     
    -

    Stack §

    -
    [ . . . ] [ . . . ]
    +

    Stack §

    +
    [ . . . ] [ . . . err ]
    -

    Summary §

    -

    Like -duk_eval_file(), but leaves no -result on the value stack.

    -
    -The path argument is given directly to fopen(). -The path encoding cannot be specified and there is no support for a wide -character string. -
    +

    Summary §

    +

    Convenience API call, equivalent to +duk_error_va() with an error code +DUK_ERR_EVAL_ERROR.

    -

    Example §

    -
    duk_eval_file_noresult(ctx, "test.js");
    +

    Example §

    +
    void my_eval_error(duk_context *ctx, const char *fmt, ...) {
    +    va_list ap;
    +
    +    va_start(ap, fmt);
    +    duk_eval_error_va(ctx, fmt, ap);
    +    va_end(ap);
    +}
     
    +
    +

    See also §

    + +

    .duk_eval_lstring() 1.0.0 @@ -3385,9 +3735,8 @@

    Stack Summary §

    Like duk_eval(), but the eval input -is given as a C string with explicit length. The filename associated with the -temporary is automatically provided from the __FILE__ preprocessor -define of the caller.

    +is given as a C string with explicit length. The filename associated with +the temporary eval function is "eval".

    With this variant, the input source code is not interned by Duktape which is useful in low memory environments. @@ -3494,8 +3843,7 @@

    Summary duk_eval(), but the eval input is given as a C string. The filename associated with the temporary -is automatically provided from the __FILE__ preprocessor define -of the caller.

    +eval function is "eval".

    With this variant, the input source code is not interned by Duktape which is useful in low memory environments. @@ -3550,7 +3898,7 @@

    Example §

    Prototype §

    -
    void duk_fatal(duk_context *ctx, duk_errcode_t err_code, const char *err_msg);
    +
    duk_ret_t duk_fatal(duk_context *ctx, const char *err_msg);
     
    @@ -3559,18 +3907,23 @@

    Stack

    Summary §

    -

    Call fatal error handler with a specified error code and an optional -message (err_msg may be NULL). The valid range -for user error codes is [1,16777215].

    +

    Call fatal error handler with an optional message (err_msg +may be NULL). Like all strings in Duktape, the error message +should be an UTF-8 string, although pure ASCII is strongly recommended.

    A fatal error handler never returns and may e.g. exit the current process. Error catching points (like try-catch statements and error catching API calls) are bypassed, and finalizers are not executed. You should only call this function when a truly fatal, unrecoverable error has occurred.

    -
    +

    Even though the function never returns, the prototype describes a return +value which allows code such as:

    +
    if (argvalue < 0) {
    +    return duk_fatal(ctx, "argvalue invalid, cannot continue execution");
    +}
    +

    Example §

    -
    duk_fatal(ctx, DUK_ERR_INTERNAL_ERROR, "assumption failed");
    +
    duk_fatal(ctx, "assumption failed");
     

    @@ -3671,8 +4024,12 @@

    Stack

    Summary §

    Force a mark-and-sweep garbage collection round. If mark-and-sweep is -disabled in the Duktape build, the call is a no-op. The flags field is a -placeholder; no flags are defined at the moment.

    +disabled in the Duktape build, the call is a no-op.

    +

    The following flags are defined:

    + + + +
    DefineDescription
    DUK_GC_COMPACTForce object property table compaction

    You may want to call this function twice to ensure even objects with finalizers are collected. Currently it takes two mark-and-sweep rounds to collect such objects. First round marks the object as finalizable and @@ -3684,6 +4041,75 @@

    Example duk_gc(ctx, 0);

    +


    +.duk_generic_error() +2.0.0 +error + §

    +
    +

    Prototype §

    +
    duk_ret_t duk_generic_error(duk_context *ctx, const char *fmt, ...);
    +
    +
    +
    +

    Stack §

    +
    [ . . . ] [ . . . err ]
    +
    +
    +

    Summary §

    +

    Convenience API call, equivalent to +duk_error() with an error code +DUK_ERR_ERROR.

    +
    +
    +

    Example §

    +
    return duk_generic_error(ctx, "my error: %d", (int) argval);
    +
    +
    +
    +

    See also §

    + +
    +

    +.duk_generic_error_va() +2.0.0 +vararg +error + §

    +
    +

    Prototype §

    +
    duk_ret_t duk_generic_error_va(duk_context *ctx, const char *fmt, va_list ap);
    +
    +
    +
    +

    Stack §

    +
    [ . . . ] [ . . . err ]
    +
    +
    +

    Summary §

    +

    Convenience API call, equivalent to +duk_error_va() with an error code +DUK_ERR_ERROR.

    +
    +
    +

    Example §

    +
    void my_generic_error(duk_context *ctx, const char *fmt, ...) {
    +    va_list ap;
    +
    +    va_start(ap, fmt);
    +    duk_generic_error_va(ctx, fmt, ap);
    +    va_end(ap);
    +}
    +
    +
    +
    +

    See also §

    + +

    .duk_get_boolean() 1.0.0 @@ -3691,7 +4117,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_get_boolean(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_get_boolean(duk_context *ctx, duk_idx_t idx);
     
    @@ -3700,7 +4126,7 @@

    Stack

    Summary §

    -

    Get the boolean value at index without modifying or coercing +

    Get the boolean value at idx without modifying or coercing the value. Returns 1 if the value is true, 0 if the value is false, not a boolean, or the index is invalid.

    Note that the value is not coerced, so even a "truthy" Ecmascript value @@ -3722,7 +4148,7 @@

    Example §

    Prototype §

    -
    void *duk_get_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size);
    +
    void *duk_get_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size);
     
    @@ -3731,7 +4157,7 @@

    Stack

    Summary §

    -

    Get the data pointer for a (plain) buffer value at index without +

    Get the data pointer for a (plain) buffer value at idx without modifying or coercing the value. Returns a non-NULL pointer if the value is a valid buffer with a non-zero size. For a zero-size buffer, may return a NULL or a non-NULL pointer. Returns NULL @@ -3745,9 +4171,11 @@

    Summary There is no reliable way to distinguish a zero-size buffer from a non-buffer -based on the return values. A NULL with zero size is returned for -a non-buffer. The same values may be returned for a zero-size buffer (although -it is also possible that a non-NULL pointer is returned). +based on the return values alone: a NULL with zero size is returned +for a non-buffer. The same values may be returned for a zero-size buffer (although +it is also possible that a non-NULL pointer is returned). Use +duk_is_buffer_data() when type +checking a buffer or a buffer object.

    @@ -3771,13 +4199,12 @@

    See also .duk_get_buffer_data() 1.3.0 stack -experimental bufferobject buffer §

    Prototype §

    -
    void *duk_get_buffer_data(duk_context *ctx, duk_idx_t index, duk_size_t *out_size);
    +
    void *duk_get_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size);
     
    @@ -3786,15 +4213,16 @@

    Stack

    Summary §

    -

    Get the data pointer for a plain buffer or a Buffer object (Duktape.Buffer, -Node.js Buffer, ArrayBuffer, DataView, or TypedArray view) value at -index without modifying or coercing the value. Return a -non-NULL pointer if the value is a valid buffer with a non-zero -size. For a zero-size buffer, may return a NULL or a -non-NULL pointer. Returns NULL if the value is -not a buffer or the index is invalid. If out_size is -non-NULL, the size of the buffer is written to *out_size; -0 is written if the return value is NULL.

    +

    Get the data pointer for a plain buffer or a buffer object (ArrayBuffer, +Node.js Buffer, DataView, or TypedArray view) value at idx without +modifying or coercing the value. Return a non-NULL pointer if the +value is a valid buffer with a non-zero size. For a zero-size buffer, may return +a NULL or a non-NULL pointer. Returns NULL +if the value is not a buffer, the value is a buffer object whose "backing buffer" +doesn't fully cover the buffer object's apparent size, or the index is invalid. +If out_size is non-NULL, the size of the buffer is +written to *out_size; 0 is written if the return value is +NULL.

    The data area indicated by the return pointer and length is the full buffer for a plain buffer value, and the active "slice" for a buffer object. The length returned is expressed in bytes (instead of elements), so that you @@ -3817,11 +4245,18 @@

    Summary new Buffer(8) are backed by an automatic fixed buffer, so their pointers are always stable.

    +

    In special cases it's possible that a buffer object is backed by a plain +buffer which is smaller than the buffer object's apparent size. In these +cases a NULL is returned; this ensures that the pointer and size +returned can always be used safely. (This behavior may change even in minor +versions.)

    @@ -3851,7 +4286,7 @@

    See also §

    Prototype §

    -
    duk_c_function duk_get_c_function(duk_context *ctx, duk_idx_t index);
    +
    duk_c_function duk_get_c_function(duk_context *ctx, duk_idx_t idx);
     
    @@ -3862,7 +4297,7 @@

    Stack Summary §

    Get the Duktape/C function pointer (a duk_c_function) from an Ecmascript function object associated with a Duktape/C function. If the -value is not such a function or index is invalid, returns NULL.

    +value is not such a function or idx is invalid, returns NULL.

    If you prefer an error to be thrown for an invalid value or index, use duk_require_c_function().

    @@ -3881,7 +4316,7 @@

    Example §

    Prototype §

    -
    duk_context *duk_get_context(duk_context *ctx, duk_idx_t index);
    +
    duk_context *duk_get_context(duk_context *ctx, duk_idx_t idx);
     
    @@ -3890,8 +4325,8 @@

    Stack

    Summary §

    -

    Get a context pointer for a Duktape thread at index. If the -value at index is not a Duktape thread or the index is invalid, +

    Get a context pointer for a Duktape thread at idx. If the +value at idx is not a Duktape thread or the index is invalid, returns NULL.

    The returned context pointer is only valid while the Duktape thread is reachable from a garbage collection point of view.

    @@ -3975,7 +4410,7 @@

    See also §

    Prototype §

    -
    duk_errcode_t duk_get_error_code(duk_context *ctx, duk_idx_t index);
    +
    duk_errcode_t duk_get_error_code(duk_context *ctx, duk_idx_t idx);
     
    @@ -3984,12 +4419,15 @@

    Stack

    Summary §

    -

    Map the value at index to the error codes DUK_ERR_xxx +

    Map the value at idx to the error codes DUK_ERR_xxx based on which Error subclass the value inherits from. For example, if the value at the stack top is an user-defined error which inherits from ReferenceError, the return value will be DUK_ERR_REFERENCE_ERROR. -If the value is not an object, does not inherit from Error, or index -is invalid, returns 0 (= DUK_ERR_NONE).

    +If the value inherits from Error but doesn't inherit from any of +the standard subclasses (EvalError, RangeError, ReferenceError, SyntaxError, +TypeError, URIError) DUK_ERR_ERROR is returned. +If the value is not an object, does not inherit from Error, or +idx is invalid, returns 0 (= DUK_ERR_NONE).

    Example §

    @@ -4006,7 +4444,7 @@

    Example §

    Prototype §

    -
    void duk_get_finalizer(duk_context *ctx, duk_idx_t index);
    +
    void duk_get_finalizer(duk_context *ctx, duk_idx_t idx);
     
    @@ -4015,7 +4453,7 @@

    Stack

    Summary §

    -

    Get the finalizer associated with a value at index. If the +

    Get the finalizer associated with a value at idx. If the value is not an object or it is an object without a finalizer, undefined is pushed to the stack instead.

    @@ -4031,6 +4469,39 @@

    See also duk_set_finalizer

    +

    +.duk_get_global_lstring() +2.0.0 +property + §

    +
    +

    Prototype §

    +
    duk_bool_t duk_get_global_lstring(duk_context *ctx, const char *key, duk_size_t key_len);
    +
    +
    +
    +

    Stack §

    +
    [ . . . ] [ . . . val ] (if key exists)
    +
    [ . . . ] [ . . . undefined ] (if key doesn't exist)
    +
    +
    +

    Summary §

    +

    Like duk_get_global_string() +but the key is given as a string with explicit length.

    +
    +
    +

    Example §

    +
    (void) duk_get_global_lstring(ctx, "internal" "\x00" "nul");
    +
    +
    +

    .duk_get_global_string() 1.0.0 @@ -4071,7 +4542,9 @@

    Example

    See also §


    @@ -4082,7 +4555,7 @@

    See also §

    Prototype §

    -
    void *duk_get_heapptr(duk_context *ctx, duk_idx_t index);
    +
    void *duk_get_heapptr(duk_context *ctx, duk_idx_t idx);
     
    @@ -4092,7 +4565,7 @@

    Stack

    Summary §

    Get a borrowed void * reference to a Duktape heap allocated -value (object, buffer, string) at index. Return NULL +value (object, buffer, string) at idx. Return NULL if the index is invalid or the target value is not heap allocated. The returned pointer must not be interpreted or dereferenced, but duk_push_heapptr() can be used @@ -4139,7 +4612,7 @@

    See also §

    Prototype §

    -
    duk_int_t duk_get_int(duk_context *ctx, duk_idx_t index);
    +
    duk_int_t duk_get_int(duk_context *ctx, duk_idx_t idx);
     
    @@ -4148,7 +4621,7 @@

    Stack

    Summary §

    -

    Get the number at index and convert it to a C duk_int_t +

    Get the number at idx and convert it to a C duk_int_t by first clamping the value between [DUK_INT_MIN, DUK_INT_MAX] and then truncating towards zero. The value on the stack is not modified. If the value is a NaN, is not a number, or the index is invalid, @@ -4185,7 +4658,7 @@

    Example §

    Prototype §

    -
    duk_size_t duk_get_length(duk_context *ctx, duk_idx_t index);
    +
    duk_size_t duk_get_length(duk_context *ctx, duk_idx_t idx);
     
    @@ -4194,11 +4667,11 @@

    Stack

    Summary §

    -

    Get a type-specific "length" for value at index:

    +

    Get a type-specific "length" for value at idx:

    • String: character length of string (not byte length)
    • Object: Math.floor(ToNumber(obj.length)) if result within - 32-bit unsigned range; otherwise 0
    • + duk_size_t unsigned range; otherwise 0
    • Buffer: byte length of buffer
    • Other type or invalid stack index: 0
    @@ -4213,6 +4686,12 @@

    Example }

    +

    .duk_get_lstring() 1.0.0 @@ -4220,7 +4699,7 @@

    Example §

    Prototype §

    -
    const char *duk_get_lstring(duk_context *ctx, duk_idx_t index, duk_size_t *out_len);
    +
    const char *duk_get_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len);
     
    @@ -4229,7 +4708,7 @@

    Stack

    Summary §

    -

    Get character data pointer and length for a string at index +

    Get character data pointer and length for a string at idx without modifying or coercing the value. Returns a non-NULL pointer to the read-only, NUL-terminated string data, and writes the string byte length to *out_len (if out_len is @@ -4262,7 +4741,7 @@

    Example §

    Prototype §

    -
    duk_int_t duk_get_magic(duk_context *ctx, duk_idx_t index);
    +
    duk_int_t duk_get_magic(duk_context *ctx, duk_idx_t idx);
     
    @@ -4272,7 +4751,7 @@

    Stack

    Summary §

    Get the 16-bit signed "magic" value associated with the Duktape/C function -at index. If the value is not a Duktape/C function, an error is +at idx. If the value is not a Duktape/C function, an error is thrown.

    Lightweight functions have space for only 8 magic value bits which is @@ -4323,13 +4802,44 @@

    Example duk_get_memory_functions(ctx, &funcs);

    +


    +.duk_get_now() +2.0.0 +time +experimental + §

    +
    +

    Prototype §

    +
    duk_double_t duk_get_now(duk_context *ctx);
    +
    +
    +
    +

    Stack §

    +

    (No effect on value stack.)

    +
    +
    +

    Summary §

    +

    +Get current time in POSIX milliseconds, as seen by the Ecmascript +environment. The return value matches Date.now() with the reservation +that sub-millisecond resolution may be available. +

    +
    +
    +

    Example §

    +
    duk_double_t now;
    +
    +now = duk_get_now(ctx);
    +print("timestamp: %lf\n", (double) now);
    +
    +

    .duk_get_number() 1.0.0 §

    Prototype §

    -
    duk_double_t duk_get_number(duk_context *ctx, duk_idx_t index);
    +
    duk_double_t duk_get_number(duk_context *ctx, duk_idx_t idx);
     
    @@ -4338,7 +4848,7 @@

    Stack

    Summary §

    -

    Get the number value at index without modifying or coercing +

    Get the number value at idx without modifying or coercing the value. Returns NaN if the value is not a number or the index is invalid.

    @@ -4354,7 +4864,7 @@

    Example §

    Prototype §

    -
    void *duk_get_pointer(duk_context *ctx, duk_idx_t index);
    +
    void *duk_get_pointer(duk_context *ctx, duk_idx_t idx);
     
    @@ -4363,7 +4873,7 @@

    Stack

    Summary §

    -

    Get the pointer value at index as void * without +

    Get the pointer value at idx as void * without modifying or coercing the value. Returns NULL if the value is not a pointer or the index is invalid.

    @@ -4382,7 +4892,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_get_prop(duk_context *ctx, duk_idx_t obj_index);
    +
    duk_bool_t duk_get_prop(duk_context *ctx, duk_idx_t obj_idx);
     
    @@ -4392,7 +4902,7 @@

    Stack

    Summary §

    -

    Get the property key of a value at obj_index. +

    Get the property key of a value at obj_idx. Return code and error throwing behavior:

    • If the property exists, 1 is returned and key @@ -4401,15 +4911,14 @@

      Summary object coercible, throws an error.

    • -
    • If obj_index is invalid, throws an error.
    • +
    • If obj_idx is invalid, throws an error.
    -

    The property read is equivalent to the Ecmascript expression:

    -
    obj[key]
    -
    -

    For semantics, see +

    The property read is equivalent to the Ecmascript expression +res = obj[key] with the exception that the presence or absence of the +property is indicated by the call return value. For precise semantics, see Property Accessors, GetValue (V), and [[Get]] (P). @@ -4418,10 +4927,16 @@

    Summary property. -
  • The key argument is internally coerced to a string. There is - an internal fast path for arrays and numeric indices which avoids an - explicit string coercion, so use a numeric key when applicable. -
  • +
  • The key argument is internally coerced using ToPropertyKey() + coercion which results in a string or a Symbol. There is an internal + fast path for arrays and numeric indices which avoids an explicit string + coercion, so use a numeric key when applicable.
  • + +

    If the target is a Proxy object which implements the get trap, +the trap is invoked and the API call always returns 1 (i.e. property present): the +absence/presence of properties is not indicated by the get Proxy +trap. Thus, the API call return value may be of limited use if the target +object is potentially a Proxy.

    If the key is a fixed string you can avoid one API call and use the duk_get_prop_string() variant. Similarly, if the key is an array index, you can use the @@ -4465,6 +4980,56 @@

    See also duk_get_prop_index

    +

    +.duk_get_prop_desc() +2.0.0 +sandbox +property + §

    +
    +

    Prototype §

    +
    void duk_get_prop_desc(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t flags);
    +
    +
    +
    +

    Stack §

    +
    [ . . . obj . . . key ] [ . . . obj . . . desc ] (if property exists)
    +
    [ . . . obj . . . key ] [ . . . obj . . . undefined ] (if property doesn't exist)
    +
    +
    +

    Summary §

    +

    Equivalent of Object.getOwnPropertyDescriptor() in the C API: +pushes a property descriptor object for a named property of the object at +obj_idx. If the target is not an object (or the index is invalid) +an error is thrown.

    +

    No flags are defined yet, use 0 for flags.

    +
    +
    +

    Example §

    +
    duk_idx_t obj_idx = /* ... */;
    +
    +/* Check if property "my_prop" is a getter. */
    +
    +duk_push_string(ctx, "my_prop");
    +duk_get_prop_desc(ctx, obj_idx, 0 /*flags*/);
    +if (duk_is_object(ctx, -1)) {
    +  /* Property found. */
    +  if (duk_has_prop_string(ctx, -1, "get")) {
    +    printf("my_prop is a getter\n");
    +  } else {
    +    printf("my_prop is not a getter\n");
    +  }
    +} else {
    +  printf("my_prop not found\n");
    +}
    +
    +
    +
    +

    See also §

    + +

    .duk_get_prop_index() 1.0.0 @@ -4472,7 +5037,7 @@

    See also §

    Prototype §

    -
    duk_bool_t duk_get_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index);
    +
    duk_bool_t duk_get_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx);
     
    @@ -4484,7 +5049,7 @@

    Stack Summary §

    Like duk_get_prop(), but the property name is given as an unsigned integer -arr_index. This is especially useful for accessing +arr_idx. This is especially useful for accessing array elements (but is not limited to that).

    Conceptually the number is coerced to a string for the property read, e.g. 123 would be equivalent to a property name @@ -4498,6 +5063,39 @@

    Example duk_pop(ctx);

    +

    +.duk_get_prop_lstring() +2.0.0 +property + §

    +
    +

    Prototype §

    +
    duk_bool_t duk_get_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len);
    +
    +
    +
    +

    Stack §

    +
    [ . . . obj . . . ] [ . . . obj . . . val ] (if key exists)
    +
    [ . . . obj . . . ] [ . . . obj . . . undefined ] (if key doesn't exist)
    +
    +
    +

    Summary §

    +

    Like duk_get_prop(), +but the property name is given as a string with explicit length.

    +
    +
    +

    Example §

    +
    duk_get_prop_lstring(ctx, -3, "internal" "\x00" "nul", 12);
    +printf("obj.propertyName = %s\n", duk_to_string(ctx, -1));
    +duk_pop(ctx);
    +
    +
    +
    +

    See also §

    + +

    .duk_get_prop_string() 1.0.0 @@ -4505,7 +5103,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_get_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key);
    +
    duk_bool_t duk_get_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key);
     
    @@ -4526,6 +5124,12 @@

    Example duk_pop(ctx);

    +

    .duk_get_prototype() 1.0.0 @@ -4534,7 +5138,7 @@

    Example §

    Prototype §

    -
    void duk_get_prototype(duk_context *ctx, duk_idx_t index);
    +
    void duk_get_prototype(duk_context *ctx, duk_idx_t idx);
     
    @@ -4543,7 +5147,7 @@

    Stack

    Summary §

    -

    Get the internal prototype of the value at index. If the +

    Get the internal prototype of the value at idx. If the value is not an object, an error is thrown. If the object has no prototype (which is possible for "naked objects") undefined is pushed to the stack instead.

    @@ -4568,7 +5172,7 @@

    See also §

    Prototype §

    -
    const char *duk_get_string(duk_context *ctx, duk_idx_t index);
    +
    const char *duk_get_string(duk_context *ctx, duk_idx_t idx);
     
    @@ -4577,7 +5181,7 @@

    Stack

    Summary §

    -

    Get character data pointer for a string at index without +

    Get character data pointer for a string at idx without modifying or coercing the value. Returns a non-NULL pointer to the read-only, NUL-terminated string data. Returns NULL if the value is not a string or the index is invalid.

    @@ -4588,6 +5192,15 @@

    Summary +Symbol values are visible in the C API as strings so that both +duk_is_symbol() and duk_is_string() are true. +This behavior is similar to Duktape 1.x internal strings. Symbols are +still an experimental feature; for now, you can distinguish Symbols from +ordinary strings using duk_is_symbol(). +For the internal representation, see +symbols.rst. +

    Example §

    @@ -4667,7 +5280,7 @@

    See also §

    Prototype §

    -
    duk_int_t duk_get_type(duk_context *ctx, duk_idx_t index);
    +
    duk_int_t duk_get_type(duk_context *ctx, duk_idx_t idx);
     
    @@ -4676,9 +5289,18 @@

    Stack

    Summary §

    -

    Returns type of value at index. The return value is one of -DUK_TYPE_xxx or DUK_TYPE_NONE if index is -invalid.

    +

    Returns type of value at idx. The return value is one of +DUK_TYPE_xxx or DUK_TYPE_NONE if idx +is invalid.

    +
    +Symbol values are visible in the C API as strings so that both +duk_is_symbol() and duk_is_string() are true. +This behavior is similar to Duktape 1.x internal strings. Symbols are +still an experimental feature; for now, you can distinguish Symbols from +ordinary strings using duk_is_symbol(). +For the internal representation, see +symbols.rst. +

    Example §

    @@ -4702,7 +5324,7 @@

    See also §

    Prototype §

    -
    duk_uint_t duk_get_type_mask(duk_context *ctx, duk_idx_t index);
    +
    duk_uint_t duk_get_type_mask(duk_context *ctx, duk_idx_t idx);
     
    @@ -4711,12 +5333,21 @@

    Stack

    Summary §

    -

    Returns type mask of value at index. The return value is one of -DUK_TYPE_MASK_xxx or DUK_TYPE_MASK_NONE if index +

    Returns type mask of value at idx. The return value is one of +DUK_TYPE_MASK_xxx or DUK_TYPE_MASK_NONE if idx is invalid.

    Type masks allow e.g. for a convenient comparison for multiple types at once (the duk_check_type_mask() call is even more convenient for this purpose).

    +
    +Symbol values are visible in the C API as strings so that both +duk_is_symbol() and duk_is_string() are true. +This behavior is similar to Duktape 1.x internal strings. Symbols are +still an experimental feature; for now, you can distinguish Symbols from +ordinary strings using duk_is_symbol(). +For the internal representation, see +symbols.rst. +

    Example §

    @@ -4740,7 +5371,7 @@

    See also §

    Prototype §

    -
    duk_uint_t duk_get_uint(duk_context *ctx, duk_idx_t index);
    +
    duk_uint_t duk_get_uint(duk_context *ctx, duk_idx_t idx);
     
    @@ -4749,7 +5380,7 @@

    Stack

    Summary §

    -

    Get the number at index and convert it to a C duk_uint_t +

    Get the number at idx and convert it to a C duk_uint_t by first clamping the value between [0, DUK_UINT_MAX] and then truncating towards zero. The value on the stack is not modified. If the value is a NaN, is not a number, or the index is invalid, @@ -4787,7 +5418,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_has_prop(duk_context *ctx, duk_idx_t obj_index);
    +
    duk_bool_t duk_has_prop(duk_context *ctx, duk_idx_t obj_idx);
     
    @@ -4796,19 +5427,17 @@

    Stack

    Summary §

    -

    Check whether value at obj_index has a property key. +

    Check whether value at obj_idx has a property key. key is removed from the stack. Return code and error throwing behavior:

    • If the property exists, 1 is returned.
    • If the property doesn't exist, 0 is returned.
    • -
    • If the value at obj_index is not an object, throws an error.
    • -
    • If obj_index is invalid, throws an error.
    • +
    • If the value at obj_idx is not an object, throws an error.
    • +
    • If obj_idx is invalid, throws an error.
    -

    The property existence check is equivalent to the Ecmascript expression:

    -
    key in obj
    -
    -

    For semantics, see +

    The property existence check is equivalent to the Ecmascript expression +res = key in obj. For semantics, see Property Accessors, The in operator, and [[HasProperty]] (P). @@ -4817,10 +5446,13 @@

    Summary property. -
  • The key argument is internally coerced to a string. There is - an internal fast path for arrays and numeric indices which avoids an - explicit string coercion, so use a numeric key when applicable. -
  • +
  • The key argument is internally coerced using ToPropertyKey() + coercion which results in a string or a Symbol. There is an internal + fast path for arrays and numeric indices which avoids an explicit string + coercion, so use a numeric key when applicable.
  • + +

    If the target is a Proxy object which implements the has trap, +the trap is invoked and the API call return value matches the trap return value.

    Instead of accepting any object coercible @@ -4864,7 +5496,7 @@

    See also §

    Prototype §

    -
    duk_bool_t duk_has_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index);
    +
    duk_bool_t duk_has_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx);
     
    @@ -4875,7 +5507,7 @@

    Stack Summary §

    Like duk_has_prop(), but the property name is given as an unsigned integer -arr_index. This is especially useful for checking +arr_idx. This is especially useful for checking existence of array elements (but is not limited to that).

    Conceptually the number is coerced to a string for property existence check, e.g. 123 would be equivalent to a property @@ -4891,6 +5523,41 @@

    Example }

    +

    +.duk_has_prop_lstring() +2.0.0 +stack +property + §

    +
    +

    Prototype §

    +
    duk_bool_t duk_has_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len);
    +
    +
    +
    +

    Stack §

    +
    [ . . . obj . . . ] [ . . . obj . . . ]
    +
    +
    +

    Summary §

    +

    Like duk_has_prop(), +but the property name is given as a string with explicit length.

    +
    +
    +

    Example §

    +
    if (duk_has_prop_lstring(ctx, -3, "internal" "\x00" "nul", 12)) {
    +    printf("obj has 'internal[00]nul'\n");
    +} else {
    +    printf("obj does not have 'internal[00]nul'\n");
    +}
    +
    +
    +
    +

    See also §

    + +

    .duk_has_prop_string() 1.0.0 @@ -4899,7 +5566,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_has_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key);
    +
    duk_bool_t duk_has_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key);
     
    @@ -4914,13 +5581,19 @@

    Summary

    Example §

    -
    if (duk_has_prop(ctx, -3, "myProperty")) {
    +
    if (duk_has_prop_string(ctx, -3, "myProperty")) {
         printf("obj has 'myProperty'\n");
     } else {
         printf("obj does not have 'myProperty'\n");
     }
     
    +
    +

    See also §

    + +


    .duk_hex_decode() 1.0.0 @@ -4928,7 +5601,7 @@

    Example §

    Prototype §

    -
    void duk_hex_decode(duk_context *ctx, duk_idx_t index);
    +
    void duk_hex_decode(duk_context *ctx, duk_idx_t idx);
     
    @@ -4965,7 +5638,7 @@

    See also §

    Prototype §

    -
    const char *duk_hex_encode(duk_context *ctx, duk_idx_t index);
    +
    const char *duk_hex_encode(duk_context *ctx, duk_idx_t idx);
     
    @@ -5006,18 +5679,18 @@

    See also §

    Prototype §

    -
    void duk_insert(duk_context *ctx, duk_idx_t to_index);
    +
    void duk_insert(duk_context *ctx, duk_idx_t to_idx);
     

    Stack §

    -
    [ . . . old(to_index) . . . val ] [ . . . val(to_index) old . . . ]
    +
    [ . . . old(to_idx) . . . val ] [ . . . val(to_idx) old . . . ]

    Summary §

    -

    Insert a value at to_index with a value popped from the -stack top. The previous value at to_index and any values -above it are moved up the stack by a step. If to_index is +

    Insert a value at to_idx with a value popped from the +stack top. The previous value at to_idx and any values +above it are moved up the stack by a step. If to_idx is an invalid index, throws an error.

    Negative indices are evaluated prior to popping the value at the stack @@ -5039,6 +5712,197 @@

    See also duk_replace

    +

    +.duk_inspect_callstack_entry() +2.0.0 +stack +inspect + §

    +
    +

    Prototype §

    +
    void duk_inspect_callstack_entry(duk_context *ctx, duk_int_t level);
    +
    +
    +
    +

    Stack §

    +
    [ . . . ] [ . . . info ]
    +
    +
    +

    Summary §

    +

    Inspect callstack entry at level and push an object +containing Duktape specific internal information about the entry. +The level argument must be negative and mimics the value stack +index convention: -1 is the most recent (innermost) call, -2 is its +caller, and so on. If the level argument is invalid (e.g. outside of +current callstack) undefined is pushed instead.

    +
    +The result object is not under versioning guarantees so its properties +may change even in minor releases (but not patch releases). This is a +practical compromise: internals change quite frequently, so the choices are +either to make no versioning guarantees or avoid exposing internals at all. +As such, calling code should never rely on having a certain set of fields +available, and it may be necessary to check DUK_VERSION when +interpreting the result fields. +
    +

    The following table summarizes current properties.

    + + + + + + + + + + + + + + + + + + +
    PropertyDescription
    functionFunction being executed. Note that this is a potential sandboxing + concern if exposed to untrusted code.
    pcProgram counter for Ecmascript functions. Zero if executing a native + function.
    lineNumberLine number for Ecmascript functions. Zero if executing a native + function or if pc-to-line translation data is not available.
    +
    +
    +

    Example §

    +
    duk_inspect_callstack_entry(ctx, -3);
    +duk_get_prop_string(ctx, -1, "lineNumber");
    +printf("immediate caller is executing on line %ld\n", (long) duk_to_int(ctx, -1));
    +duk_pop_2(ctx);
    +
    +
    +

    +.duk_inspect_value() +2.0.0 +stack +inspect + §

    +
    +

    Prototype §

    +
    void duk_inspect_value(duk_context *ctx, duk_idx_t idx);
    +
    +
    +
    +

    Stack §

    +
    [ . . . val . . . ] [ . . . val . . . info ]
    +
    +
    +

    Summary §

    +

    Inspect value at idx and push an object containing Duktape +specific internal information about the object. If the value stack index +is invalid, pushes an object describing a "none" value.

    +
    +The result object is not under versioning guarantees so its properties +may change even in minor releases (but not patch releases). This is a +practical compromise: internals change quite frequently, so the choices are +either to make no versioning guarantees or avoid exposing internals at all. +As such, calling code should never rely on having a certain set of fields +available, and it may be necessary to check DUK_VERSION when +interpreting the result fields. +
    +

    The following table summarizes current properties. Memory byte sizes +don't include any heap overhead which may vary between 0-16 bytes (or more) +depending on the allocation functions being used.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDescription
    typeType number matching DUK_TYPE_xxx from duktape.h.
    itagInternal type tag matching internal DUK_TAG_xxx defines. Values + may change between versions, and are dependent on config options and the + memory layout used for tagged values internally.
    hptrHeap pointer for a heap-allocated value. Points to the internal Duktape + header structure related to the value type. Same value would be returned + from duk_get_heapptr().
    refcReference count. Reference counts are not adjusted in any way, and + include references to the value caused by the duk_inspect_value() + call.
    classFor objects, internal class number, matches internal + DUK_HOBJECT_CLASS_xxx defines.
    hbytesByte size of main heap object allocation. For some values this is + the only allocation, other values have additional allocations.
    pbytesByte size of an object's property table. The property table includes + a possible array part, a possible hash part, and a key/value entry part.
    bcbytesByte size of Ecmascript function bytecode (instructions, constants). + Shared between all instances (closures) of a certain function template.
    dbytesByte size of the current allocation of a dynamic or external buffer. + Note that external buffer allocations are not part of the Duktape heap.
    esizeObject entry part size in elements.
    enextObject entry part first free index (= index of next property slot to be + used). In practice matches number of own properties for objects that + don't have uncompacted deleted keys.
    asizeObject array part size in elements, zero if no array part or array part + has been abandoned (sparse array). May be larger or smaller than the + apparent array .length.
    hsizeObject hash part size in elements.
    tstateInternal thread state, matches internal DUK_HTHREAD_STATE_xxx + defines.
    variantIdentifies type variants for certain types. For strings, variant 0 is + an ordinary heap allocated string while variant 1 is an external string. + For buffers, variant 0 is a fixed buffer, 1 is a dynamic buffer, and 2 + is an external buffer.
    +
    +
    +

    Example §

    +
    duk_inspect_value(ctx, -3);
    +duk_get_prop_string(ctx, -1, "refc");
    +printf("refcount of value at -3: %ld\n", (long) duk_to_int(ctx, -1));
    +duk_pop_2(ctx);
    +
    +

    .duk_instanceof() 1.3.0 @@ -5046,7 +5910,7 @@

    See also §

    Prototype §

    -
    duk_bool_t duk_instanceof(duk_context *ctx, duk_idx_t index1, duk_idx_t index2);
    +
    duk_bool_t duk_instanceof(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2);
     
    @@ -5055,7 +5919,7 @@

    Stack

    Summary §

    -

    Compare values at index1 and index2 using the +

    Compare values at idx1 and idx2 using the Ecmascript instanceof operator. Returns 1 if val1 instanceof val2, 0 if not. Throws an error if either index is invalid; instanceof itself also throws errors for @@ -5063,7 +5927,7 @@

    Summary The error throwing behavior for invalid indices differs from the behavior of e.g. duk_equals(), and matches the strictness of instanceof. -For example, if rval (index2) is not a callable object instanceof +For example, if rval (idx2) is not a callable object instanceof throws a TypeError. Throwing an error for an invalid index is consistent with instanceof strictness.

    @@ -5086,7 +5950,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_array(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_array(duk_context *ctx, duk_idx_t idx);
     
    @@ -5095,8 +5959,8 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is an object and is an Ecmascript array -(has the internal class Array), otherwise returns 0. If index +

    Returns 1 if value at idx is an object and is an Ecmascript array +(has the internal class Array), otherwise returns 0. If idx is invalid, also returns 0.

    This function returns 1 when the following Ecmascript expression is true:

    Object.prototype.toString.call(val) === '[object Array]'
    @@ -5116,7 +5980,7 @@ 

    Example §

    Prototype §

    -
    duk_bool_t duk_is_boolean(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_boolean(duk_context *ctx, duk_idx_t idx);
     
    @@ -5125,8 +5989,8 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is a boolean, otherwise -returns 0. If index is invalid, also returns 0.

    +

    Returns 1 if value at idx is a boolean, otherwise +returns 0. If idx is invalid, also returns 0.

    Example §

    @@ -5143,7 +6007,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_bound_function(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_bound_function(duk_context *ctx, duk_idx_t idx);
     
    @@ -5152,9 +6016,9 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is a Function object which has +

    Returns 1 if value at idx is a Function object which has been created with Ecmascript Function.prototype.bind(), -otherwise returns 0. If index is invalid, also returns 0.

    +otherwise returns 0. If idx is invalid, also returns 0.

    Bound functions are an Ecmascript concept: they point to a target function and supply a this binding and zero or more argument bindings. See @@ -5176,7 +6040,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_buffer(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_buffer(duk_context *ctx, duk_idx_t idx);
     
    @@ -5185,8 +6049,8 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is a buffer, otherwise -returns 0. If index is invalid, also returns 0.

    +

    Returns 1 if value at idx is a plain buffer, otherwise +returns 0. If idx is invalid, also returns 0.

    Example §

    @@ -5195,6 +6059,46 @@

    Example }

    + +

    +.duk_is_buffer_data() +2.0.0 +stack +buffer + §

    +
    +

    Prototype §

    +
    duk_bool_t duk_is_buffer_data(duk_context *ctx, duk_idx_t idx);
    +
    +
    +
    +

    Stack §

    +
    [ . . . val . . . ]
    +
    +
    +

    Summary §

    +

    Returns 1 if value at idx is a plain buffer or any +buffer object type, otherwise returns 0. If idx is invalid, +also returns 0.

    +
    +
    +

    Example §

    +
    if (duk_is_buffer_data(ctx, -3)) {
    +    /* ... */
    +}
    +
    +
    +
    +

    See also §

    + +

    .duk_is_c_function() 1.0.0 @@ -5203,7 +6107,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_c_function(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_c_function(duk_context *ctx, duk_idx_t idx);
     
    @@ -5212,9 +6116,9 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is a Function object and is +

    Returns 1 if value at idx is a Function object and is assocated with a C function, otherwise returns 0. -If index is invalid, also returns 0.

    +If idx is invalid, also returns 0.

    An example of an underlying C function observing the Duktape/C API calling convention:

    int my_func(duk_context *ctx) {
    @@ -5236,7 +6140,7 @@ 

    Example §

    Prototype §

    -
    duk_bool_t duk_is_callable(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_callable(duk_context *ctx, duk_idx_t idx);
     
    @@ -5245,8 +6149,8 @@

    Stack

    Summary §

    -

    Return 1 if value at index is callable, otherwise returns 0. -Also returns 0 if index is invalid.

    +

    Return 1 if value at idx is callable, otherwise returns 0. +Also returns 0 if idx is invalid.

    Currently this is the same as duk_is_function().

    @@ -5295,7 +6199,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_dynamic_buffer(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_dynamic_buffer(duk_context *ctx, duk_idx_t idx);
     
    @@ -5304,8 +6208,8 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is a dynamic buffer, -otherwise returns 0. If index is invalid, also +

    Returns 1 if value at idx is a dynamic buffer, +otherwise returns 0. If idx is invalid, also returns 0.

    @@ -5323,7 +6227,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_ecmascript_function(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_ecmascript_function(duk_context *ctx, duk_idx_t idx);
     
    @@ -5332,9 +6236,9 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is a Function object which has +

    Returns 1 if value at idx is a Function object which has been compiled from Ecmascript source code, otherwise returns 0. -If index is invalid, also returns 0.

    +If idx is invalid, also returns 0.

    Internally Ecmascript functions are compiled into bytecode and executed with the Ecmascript bytecode interpreter.

    @@ -5353,7 +6257,7 @@

    Example < §

    Prototype §

    -
    duk_bool_t duk_is_error(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_error(duk_context *ctx, duk_idx_t idx);
     
    @@ -5362,8 +6266,8 @@

    Stack

    Summary §

    -

    Returns 1 if value at index inherits from Error, -otherwise returns 0. If index is invalid, also returns 0.

    +

    Returns 1 if value at idx inherits from Error, +otherwise returns 0. If idx is invalid, also returns 0.

    Example §

    @@ -5375,6 +6279,35 @@

    Example }

    +

    +.duk_is_eval_error() +1.4.0 +stack +error + §

    +
    +

    Prototype §

    +
    duk_bool_t duk_is_eval_error(duk_context *ctx, duk_idx_t idx);
    +
    +
    +
    +

    Stack §

    +
    [ . . . val . . . ]
    +
    +
    +

    Summary §

    +

    Returns 1 if value at idx inherits from EvalError, +otherwise returns 0. If idx is invalid, also returns 0. This is +a convenience call for using +duk_get_error_code() == DUK_ERR_EVAL_ERROR.

    +
    +
    +

    Example §

    +
    if (duk_is_eval_error(ctx, -3)) {
    +    /* ... */
    +}
    +
    +

    .duk_is_fixed_buffer() 1.0.0 @@ -5383,7 +6316,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_fixed_buffer(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_fixed_buffer(duk_context *ctx, duk_idx_t idx);
     
    @@ -5392,8 +6325,8 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is a fixed buffer, -otherwise returns 0. If index is invalid, also +

    Returns 1 if value at idx is a fixed buffer, +otherwise returns 0. If idx is invalid, also returns 0.

    @@ -5411,7 +6344,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_function(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_function(duk_context *ctx, duk_idx_t idx);
     
    @@ -5420,8 +6353,8 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is an object and is a function (has the -internal class Function), otherwise returns 0. If index is +

    Returns 1 if value at idx is an object and is a function (has the +internal class Function), otherwise returns 0. If idx is invalid, also returns 0.

    This function returns 1 when the following Ecmascript expression is true:

    Object.prototype.toString.call(val) === '[object Function]'
    @@ -5446,7 +6379,7 @@ 

    Example §

    Prototype §

    -
    duk_bool_t duk_is_lightfunc(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_lightfunc(duk_context *ctx, duk_idx_t idx);
     
    @@ -5455,8 +6388,8 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is a lightfunc, otherwise -returns 0. If index is invalid, also returns 0.

    +

    Returns 1 if value at idx is a lightfunc, otherwise +returns 0. If idx is invalid, also returns 0.

    Example §

    @@ -5472,7 +6405,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_nan(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_nan(duk_context *ctx, duk_idx_t idx);
     
    @@ -5481,8 +6414,8 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is a NaN (a special -number value), otherwise returns 0. If index is invalid, +

    Returns 1 if value at idx is a NaN (a special +number value), otherwise returns 0. If idx is invalid, also returns 0.

    IEEE has a large number of different NaN values. Duktape normalizes NaN values internally. This function returns 1 @@ -5502,7 +6435,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_null(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_null(duk_context *ctx, duk_idx_t idx);
     
    @@ -5511,8 +6444,8 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is either null, otherwise -returns 0. If index is invalid, also returns 0.

    +

    Returns 1 if value at idx is either null, otherwise +returns 0. If idx is invalid, also returns 0.

    Example §

    @@ -5528,7 +6461,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_null_or_undefined(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_null_or_undefined(duk_context *ctx, duk_idx_t idx);
     
    @@ -5537,8 +6470,8 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is either null or undefined, -otherwise returns 0. If index is invalid, also returns 0.

    +

    Returns 1 if value at idx is either null or undefined, +otherwise returns 0. If idx is invalid, also returns 0.

    This API call is similar to a (x == null) comparison in Ecmascript, which is true for both null and undefined.

    @@ -5556,7 +6489,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_number(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_number(duk_context *ctx, duk_idx_t idx);
     
    @@ -5565,8 +6498,8 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is a number, otherwise -returns 0. If index is invalid, also returns 0.

    +

    Returns 1 if value at idx is a number, otherwise +returns 0. If idx is invalid, also returns 0.

    Example §

    @@ -5583,7 +6516,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_object(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_object(duk_context *ctx, duk_idx_t idx);
     
    @@ -5592,8 +6525,8 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is an object, otherwise -returns 0. If index is invalid, also returns 0.

    +

    Returns 1 if value at idx is an object, otherwise +returns 0. If idx is invalid, also returns 0.

    Note that many values are considered to be an object, e.g.:

    • Ecmascript object
    • @@ -5620,7 +6553,7 @@

      Example §

      Prototype §

      -
      duk_bool_t duk_is_object_coercible(duk_context *ctx, duk_idx_t index);
      +
      duk_bool_t duk_is_object_coercible(duk_context *ctx, duk_idx_t idx);
       
      @@ -5629,9 +6562,9 @@

      Stack

      Summary §

      -

      Returns 1 if value at index is object coercible, as defined in +

      Returns 1 if value at idx is object coercible, as defined in CheckObjectCoercible, -otherwise returns 0. If index is invalid, also returns 0.

      +otherwise returns 0. If idx is invalid, also returns 0.

      All Ecmascript types are object coercible except undefined and null. The custom buffer and pointer types are object coercible.

      @@ -5649,7 +6582,7 @@

      Example §

      Prototype §

      -
      duk_bool_t duk_is_pointer(duk_context *ctx, duk_idx_t index);
      +
      duk_bool_t duk_is_pointer(duk_context *ctx, duk_idx_t idx);
       
      @@ -5658,8 +6591,8 @@

      Stack

      Summary §

      -

      Returns 1 if value at index is a pointer, otherwise -returns 0. If index is invalid, also returns 0.

      +

      Returns 1 if value at idx is a pointer, otherwise +returns 0. If idx is invalid, also returns 0.

      Example §

      @@ -5675,7 +6608,7 @@

      Example §

      Prototype §

      -
      duk_bool_t duk_is_primitive(duk_context *ctx, duk_idx_t index);
      +
      duk_bool_t duk_is_primitive(duk_context *ctx, duk_idx_t idx);
       
      @@ -5684,11 +6617,15 @@

      Stack

      Summary §

      -

      Returns 1 if value at index is a primitive type, as defined in +

      Returns 1 if value at idx is a primitive type, as defined in ToPrimitive, -otherwise returns 0. If index is invalid, also returns 0.

      -

      Anything other than an object is a primitive type at the moment, including -custom buffer and pointer types.

      +otherwise returns 0. If idx is invalid, also returns 0.

      +

      Any standard type other than an object is a primitive type. The custom +plain pointer type is also considered a primitive type. However, the custom +plain buffer type (which behaves like an Uint8Array object in most situations) and +lightfunc type (which behaves like a Function object in most situations) are not +considered a primitive type. This matches the behavior of duk_to_primitive() +which (usually) coerces e.g. a plain buffer to the string [object Uint8Array].

      Example §

      @@ -5697,33 +6634,91 @@

      Example }

    -

    -.duk_is_strict_call() -1.0.0 -function - §

    +

    +.duk_is_range_error() +1.4.0 +stack +error + §

    -

    Prototype §

    -
    duk_bool_t duk_is_strict_call(duk_context *ctx);
    +

    Prototype §

    +
    duk_bool_t duk_is_range_error(duk_context *ctx, duk_idx_t idx);
     
    -

    Stack §

    -

    (No effect on value stack.)

    +

    Stack §

    +
    [ . . . val . . . ]
    -

    Summary §

    -

    Check whether the current (Duktape/C) function call is strict or not. -Returns 1 if the current function call is strict, 0 otherwise. As of -Duktape 0.12.0, this function always returns 1 when called from user code -(even if the call stack is empty).

    +

    Summary §

    +

    Returns 1 if value at idx inherits from RangeError, +otherwise returns 0. If idx is invalid, also returns 0. This is +a convenience call for using +duk_get_error_code() == DUK_ERR_RANGE_ERROR.

    -

    Example §

    -
    if (duk_is_strict_call(ctx)) {
    -    printf("strict call\n");
    -} else {
    -    printf("non-strict call\n");
    +

    Example §

    +
    if (duk_is_range_error(ctx, -3)) {
    +    /* ... */
    +}
    +
    +
    +

    +.duk_is_reference_error() +1.4.0 +stack +error + §

    +
    +

    Prototype §

    +
    duk_bool_t duk_is_reference_error(duk_context *ctx, duk_idx_t idx);
    +
    +
    +
    +

    Stack §

    +
    [ . . . val . . . ]
    +
    +
    +

    Summary §

    +

    Returns 1 if value at idx inherits from ReferenceError, +otherwise returns 0. If idx is invalid, also returns 0. This is +a convenience call for using +duk_get_error_code() == DUK_ERR_REFERENCE_ERROR.

    +
    +
    +

    Example §

    +
    if (duk_is_reference_error(ctx, -3)) {
    +    /* ... */
    +}
    +
    +
    +

    +.duk_is_strict_call() +1.0.0 +function + §

    +
    +

    Prototype §

    +
    duk_bool_t duk_is_strict_call(duk_context *ctx);
    +
    +
    +
    +

    Stack §

    +

    (No effect on value stack.)

    +
    +
    +

    Summary §

    +

    Check whether the current (Duktape/C) function call is strict or not. +Returns 1 if the current function call is strict, 0 otherwise. As of +Duktape 0.12.0, this function always returns 1 when called from user code +(even if the call stack is empty).

    +
    +
    +

    Example §

    +
    if (duk_is_strict_call(ctx)) {
    +    printf("strict call\n");
    +} else {
    +    printf("non-strict call\n");
     }
     
    @@ -5735,7 +6730,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_string(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_string(duk_context *ctx, duk_idx_t idx);
     
    @@ -5744,8 +6739,17 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is a string, otherwise -returns 0. If index is invalid, also returns 0.

    +

    Returns 1 if value at idx is a string, otherwise +returns 0. If idx is invalid, also returns 0.

    +
    +Symbol values are visible in the C API as strings so that both +duk_is_symbol() and duk_is_string() are true. +This behavior is similar to Duktape 1.x internal strings. Symbols are +still an experimental feature; for now, you can distinguish Symbols from +ordinary strings using duk_is_symbol(). +For the internal representation, see +symbols.rst. +

    Example §

    @@ -5754,6 +6758,72 @@

    Example }

    +

    +.duk_is_symbol() +2.0.0 +symbol +string +stack + §

    +
    +

    Prototype §

    +
    duk_bool_t duk_is_symbol(duk_context *ctx, duk_idx_t idx);
    +
    +
    +
    +

    Stack §

    +
    [ . . . val . . . ]
    +
    +
    +

    Summary §

    +

    Returns 1 if value at idx is a symbol, otherwise +returns 0. If idx is invalid, also returns 0.

    +
    +Symbol values are visible in the C API as strings so that both +duk_is_symbol() and duk_is_string() are true. +This behavior is similar to Duktape 1.x internal strings. Symbols are +still an experimental feature; for now, you can distinguish Symbols from +ordinary strings using duk_is_symbol(). +For the internal representation, see +symbols.rst. +
    +
    +
    +

    Example §

    +
    if (duk_is_symbol(ctx, -3)) {
    +    /* ... */
    +}
    +
    +
    +

    +.duk_is_syntax_error() +1.4.0 +stack +error + §

    +
    +

    Prototype §

    +
    duk_bool_t duk_is_syntax_error(duk_context *ctx, duk_idx_t idx);
    +
    +
    +
    +

    Stack §

    +
    [ . . . val . . . ]
    +
    +
    +

    Summary §

    +

    Returns 1 if value at idx inherits from SyntaxError, +otherwise returns 0. If idx is invalid, also returns 0. This is +a convenience call for using +duk_get_error_code() == DUK_ERR_SYNTAX_ERROR.

    +
    +
    +

    Example §

    +
    if (duk_is_syntax_error(ctx, -3)) {
    +    /* ... */
    +}
    +
    +

    .duk_is_thread() 1.0.0 @@ -5762,7 +6832,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_thread(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_thread(duk_context *ctx, duk_idx_t idx);
     
    @@ -5771,8 +6841,8 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is an object and is a Duktape -thread (coroutine), otherwise returns 0. If index is invalid, +

    Returns 1 if value at idx is an object and is a Duktape +thread (coroutine), otherwise returns 0. If idx is invalid, also returns 0.

    @@ -5782,6 +6852,35 @@

    Example }

    +

    +.duk_is_type_error() +1.4.0 +stack +error + §

    +
    +

    Prototype §

    +
    duk_bool_t duk_is_type_error(duk_context *ctx, duk_idx_t idx);
    +
    +
    +
    +

    Stack §

    +
    [ . . . val . . . ]
    +
    +
    +

    Summary §

    +

    Returns 1 if value at idx inherits from TypeError, +otherwise returns 0. If idx is invalid, also returns 0. This is +a convenience call for using +duk_get_error_code() == DUK_ERR_TYPE_ERROR.

    +
    +
    +

    Example §

    +
    if (duk_is_type_error(ctx, -3)) {
    +    /* ... */
    +}
    +
    +

    .duk_is_undefined() 1.0.0 @@ -5789,7 +6888,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_undefined(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_undefined(duk_context *ctx, duk_idx_t idx);
     
    @@ -5798,8 +6897,8 @@

    Stack

    Summary §

    -

    Returns 1 if value at index is either undefined, otherwise -returns 0. If index is invalid, also returns 0.

    +

    Returns 1 if value at idx is either undefined, otherwise +returns 0. If idx is invalid, also returns 0.

    Example §

    @@ -5808,6 +6907,35 @@

    Example }

    +

    +.duk_is_uri_error() +1.4.0 +stack +error + §

    +
    +

    Prototype §

    +
    duk_bool_t duk_is_uri_error(duk_context *ctx, duk_idx_t idx);
    +
    +
    +
    +

    Stack §

    +
    [ . . . val . . . ]
    +
    +
    +

    Summary §

    +

    Returns 1 if value at idx inherits from URIError, +otherwise returns 0. If idx is invalid, also returns 0. This is +a convenience call for using +duk_get_error_code() == DUK_ERR_URI_ERROR.

    +
    +
    +

    Example §

    +
    if (duk_is_uri_error(ctx, -3)) {
    +    /* ... */
    +}
    +
    +

    .duk_is_valid_index() 1.0.0 @@ -5815,7 +6943,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_is_valid_index(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_is_valid_index(duk_context *ctx, duk_idx_t idx);
     
    @@ -5890,7 +7018,7 @@

    See also §

    Prototype §

    -
    void duk_json_decode(duk_context *ctx, duk_idx_t index);
    +
    void duk_json_decode(duk_context *ctx, duk_idx_t idx);
     
    @@ -5929,7 +7057,7 @@

    See also §

    Prototype §

    -
    const char *duk_json_encode(duk_context *ctx, duk_idx_t index);
    +
    const char *duk_json_encode(duk_context *ctx, duk_idx_t idx);
     
    @@ -5964,7 +7092,6 @@

    See also .duk_load_function() 1.3.0 stack -experimental bytecode §

    @@ -5987,6 +7114,8 @@

    Summary For more information on Duktape bytecode dump/load, supported features, and known limitations, see bytecode.rst. +Duktape bytecode format is not intended for obfuscation, see notes on +Obfuscation.

    @@ -6006,75 +7135,6 @@

    See also duk_dump_function

    -

    -.duk_log() -1.0.0 -log - §

    -
    -

    Prototype §

    -
    void duk_log(duk_context *ctx, duk_int_t level, const char *fmt, ...);
    -
    -
    -
    -

    Stack §

    -

    (No effect on value stack.)

    -
    -
    -

    Summary §

    -

    Write a formatted log entry with the specified log level (one of -DUK_LOG_xxx). The log write goes through the Duktape -built-in logging facility, see -Logging for details.

    -
    -
    -

    Example §

    -
    duk_log(ctx, DUK_LOG_INFO, "received message, type: %d", (int) msg_type);
    -
    -
    -
    -

    See also §

    - -
    -

    -.duk_log_va() -1.1.0 -vararg -log - §

    -
    -

    Prototype §

    -
    void duk_log_va(duk_context *ctx, duk_int_t level, const char *fmt, va_list ap);
    -
    -
    -
    -

    Stack §

    -

    (No effect on value stack.)

    -
    -
    -

    Summary §

    -

    Vararg variant of -duk_log().

    -
    -
    -

    Example §

    -
    void my_log_info(duk_context *ctx, const char *fmt, ...) {
    -    va_list ap;
    -
    -    va_start(ap, fmt);
    -    duk_log_va(ctx, DUK_LOG_INFO, fmt, ap);
    -    va_end(ap);
    -}
    -
    -
    -
    -

    See also §

    - -

    .duk_map_string() 1.0.0 @@ -6082,7 +7142,7 @@

    See also §

    Prototype §

    -
    void duk_map_string(duk_context *ctx, duk_idx_t index, duk_map_char_function callback, void *udata);
    +
    void duk_map_string(duk_context *ctx, duk_idx_t idx, duk_map_char_function callback, void *udata);
     
    @@ -6091,7 +7151,7 @@

    Stack

    Summary §

    -

    Process string at index, calling callback for each codepoint +

    Process string at idx, calling callback for each codepoint of the string. The callback is given the udata argument and a codepoint and returns a replacement codepoint. If successful, a new string consisting of the replacement codepoints replaces the original. If the value is not a string or @@ -6181,7 +7241,7 @@

    See also §

    Prototype §

    -
    duk_bool_t duk_next(duk_context *ctx, duk_idx_t enum_index, duk_bool_t get_value);
    +
    duk_bool_t duk_next(duk_context *ctx, duk_idx_t enum_idx, duk_bool_t get_value);
     
    @@ -6222,7 +7282,7 @@

    See also §

    Prototype §

    -
    duk_idx_t duk_normalize_index(duk_context *ctx, duk_idx_t index);
    +
    duk_idx_t duk_normalize_index(duk_context *ctx, duk_idx_t idx);
     
    @@ -6285,6 +7345,11 @@

    Summary duk_idx_t func_idx; duk_int_t rc; +/* Basic example: function call and duk_safe_to_string() error print. */ + duk_dup(ctx, func_idx); duk_push_int(ctx, 2); duk_push_int(ctx, 3); @@ -6309,7 +7376,35 @@

    Example if (rc == DUK_EXEC_SUCCESS) { printf("2+3=%ld\n", (long) duk_get_int(ctx, -1)); } else { - printf("error: %s\n", duk_to_string(ctx, -1)); + /* Coercing with duk_safe_to_string() is a useful default, but you can + * also look up e.g. the .stack property of the error. + */ + printf("error: %s\n", duk_safe_to_string(ctx, -1)); +} +duk_pop(ctx); + +/* Accessing .stack to print a stack trace if the value caught is an + * Error instance. + */ + +duk_dup(ctx, func_idx); +duk_push_int(ctx, 2); +duk_push_int(ctx, 3); +rc = duk_pcall(ctx, 2); /* [ ... func 2 3 ] -> [ 5 ] */ +if (rc == DUK_EXEC_SUCCESS) { + printf("2+3=%ld\n", (long) duk_get_int(ctx, -1)); +} else { + if (duk_is_error(ctx, -1)) { + /* Accessing .stack might cause an error to be thrown, so wrap this + * access in a duk_safe_call() if it matters. + */ + duk_get_prop_string(ctx, -1, "stack"); + printf("error: %s\n", duk_safe_to_string(ctx, -1)); + duk_pop(ctx); + } else { + /* Non-Error value, coerce safely to string. */ + printf("error: %s\n", duk_safe_to_string(ctx, -1)); + } } duk_pop(ctx); @@ -6379,7 +7474,7 @@

    Example §

    Prototype §

    -
    duk_int_t duk_pcall_prop(duk_context *ctx, duk_idx_t obj_index, duk_idx_t nargs);
    +
    duk_int_t duk_pcall_prop(duk_context *ctx, duk_idx_t obj_idx, duk_idx_t nargs);
     
    @@ -6458,46 +7553,6 @@

    See also duk_pcompile_file

    -

    -.duk_pcompile_file() -1.0.0 -protected -nonportable -compile - §

    -
    -

    Prototype §

    -
    duk_int_t duk_pcompile_file(duk_context *ctx, duk_uint_t flags, const char *path);
    -
    -
    -
    -

    Stack §

    -
    [ . . . ] [ . . . function ] (if success, return value == 0)
    -
    [ . . . ] [ . . . err ] (if failure, return value != 0)
    -
    -
    -

    Summary §

    -

    Like -duk_pcompile(), but the compile input -is given as a filename. The filename associated with the result function -is path as is.

    -
    -The path argument is given directly to fopen(). -The path encoding cannot be specified and there is no support for a wide -character string. -
    -
    -
    -

    Example §

    -
    if (duk_pcompile_file(ctx, 0, "test.js") != 0) {
    -    printf("compile failed: %s\n", duk_safe_to_string(ctx, -1));
    -} else {
    -    duk_call(ctx, 0);      /* [ func ] -> [ result ] */
    -    printf("program result: %s\n", duk_safe_to_string(ctx, -1));
    -}
    -duk_pop(ctx);
    -
    -

    .duk_pcompile_lstring() 1.0.0 @@ -6519,8 +7574,7 @@

    Summary Like duk_pcompile(), but the compile input is given as a C string with explicit length. The filename associated with the -function is automatically provided from the __FILE__ preprocessor -define of the caller.

    +function is "input".

    With this variant, the input source code is not interned by Duktape which is useful in low memory environments. @@ -6602,8 +7656,7 @@

    Summary Like duk_pcompile(), but the compile input is given as a C string. The filename associated with the function is -automatically provided from the __FILE__ preprocessor define -of the caller.

    +"input".

    With this variant, the input source code is not interned by Duktape which is useful in low memory environments. @@ -6705,87 +7758,6 @@

    See also duk_peval_file_noresult

    -


    -.duk_peval_file() -1.0.0 -protected -nonportable -compile - §

    -
    -

    Prototype §

    -
    duk_int_t duk_peval_file(duk_context *ctx, const char *path);
    -
    -
    -
    -

    Stack §

    -
    [ . . . ] [ . . . result ] (if success, return value == 0)
    -
    [ . . . ] [ . . . err ] (if failure, return value != 0)
    -
    -
    -

    Summary §

    -

    Like -duk_peval(), but the eval input -is given as a filename. The filename associated with the temporary -function created for the eval code is path as is.

    -
    -The path argument is given directly to fopen(). -The path encoding cannot be specified and there is no support for a wide -character string. -
    -
    -
    -

    Example §

    -
    if (duk_peval_file(ctx, "test.js") != 0) {
    -    printf("eval failed: %s\n", duk_safe_to_string(ctx, -1));
    -} else {
    -    printf("result is: %s\n", duk_safe_to_string(ctx, -1));
    -}
    -duk_pop(ctx);
    -
    -
    -
    -

    See also §

    - -
    -

    -.duk_peval_file_noresult() -1.0.0 -protected -nonportable -compile - §

    -
    -

    Prototype §

    -
    duk_int_t duk_peval_file_noresult(duk_context *ctx, const char *path);
    -
    -
    -
    -

    Stack §

    -
    [ . . . ] [ . . . ]
    -
    -
    -

    Summary §

    -

    Like -duk_peval_file(), but leaves no -result on the value stack.

    -
    -The path argument is given directly to fopen(). -The path encoding cannot be specified and there is no support for a wide -character string. -
    -
    -
    -

    Example §

    -
    if (duk_peval_file_noresult(ctx, "test.js") != 0) {
    -    printf("eval failed\n");
    -} else {
    -    printf("eval successful\n");
    -}
    -
    -

    .duk_peval_lstring() 1.0.0 @@ -6807,8 +7779,7 @@

    Summary duk_peval(), but the eval input is given as a C string with explicit length. The filename associated with the -temporary is automatically provided from the __FILE__ preprocessor -define of the caller.

    +temporary eval function is "eval".

    With this variant, the input source code is not interned by Duktape which is useful in low memory environments. @@ -6852,7 +7823,7 @@

    Stack Summary §

    Like duk_peval_lstring(), but leaves -no result on the value stack.

    +no result on the value stack (regardless of success/error result).

    With this variant, the input source code is not interned by Duktape which is useful in low memory environments. @@ -6888,7 +7859,7 @@

    Stack

    Summary §

    Like duk_peval() but leaves no result -on the value stack.

    +on the value stack (regardless of success/error result).

    Example §

    @@ -6929,8 +7900,7 @@

    Summary duk_peval(), but the eval input is given as a C string. The filename associated with the temporary -is automatically provided from the __FILE__ preprocessor define -of the caller.

    +eval function is "eval".

    With this variant, the input source code is not interned by Duktape which is useful in low memory environments. @@ -6971,7 +7941,7 @@

    Stack Summary §

    Like duk_peval_string(), but leaves -no result on the value stack.

    +no result on the value stack (regardless of success/error result).

    With this variant, the input source code is not interned by Duktape which is useful in low memory environments. @@ -7178,24 +8148,60 @@

    Example duk_pop(ctx); /* pop array */

    -

    -.duk_push_boolean() -1.0.0 +


    +.duk_push_bare_object() +2.0.0 stack - §

    -

    Prototype §

    -
    void duk_push_boolean(duk_context *ctx, duk_bool_t val);
    +

    Prototype §

    +
    duk_idx_t duk_push_bare_object(duk_context *ctx);
     
    -

    Stack §

    -
    [ . . . ] [ . . . true ] (if val != 0)
    -
    [ . . . ] [ . . . false ] (if val == 0)
    +

    Stack §

    +
    [ . . . ] [ . . . obj ]
    -

    Summary §

    -

    Push true (if val != 0) or false (if val == 0) to the stack.

    +

    Summary §

    +

    Similar to duk_push_object() +but the pushed object doesn't inherit from any other object, i.e. its internal +prototype is null. This call is equivalent to +Object.create(null). Returns non-negative index (relative to +stack bottom) of the pushed object.

    +
    +
    +

    Example §

    +
    duk_idx_t obj_idx;
    +
    +obj_idx = duk_push_bare_object(ctx);
    +
    +
    +
    +

    See also §

    + +
    +

    +.duk_push_boolean() +1.0.0 +stack + §

    +
    +

    Prototype §

    +
    void duk_push_boolean(duk_context *ctx, duk_bool_t val);
    +
    +
    +
    +

    Stack §

    +
    [ . . . ] [ . . . true ] (if val != 0)
    +
    [ . . . ] [ . . . false ] (if val == 0)
    +
    +
    +

    Summary §

    +

    Push true (if val != 0) or false (if val == 0) to the stack.

    Example §

    @@ -7268,7 +8274,6 @@

    See also .duk_push_buffer_object() 1.3.0 stack -experimental bufferobject §


    .duk_push_current_function() 1.0.0 @@ -7549,6 +8549,9 @@

    Summary Push the currently running function to the stack. The value pushed is an Ecmascript Function object. If there is no current function, undefined is pushed instead.

    +

    If the current function was called via one or more bound functions or a +Proxy object, the function returned from this call is the final, resolved +function (not the bound function or the Proxy).

    This function allows a C function to gain access to its function object. Since multiple function objects can internally point to the same C function, a function object is a convenient place for function parameterization and @@ -7689,7 +8692,7 @@

    Example duk_idx_t err_idx; va_start(ap, fmt); - err_idx = duk_push_error_object_va(ctx, fmt, ap); + err_idx = duk_push_error_object_va(ctx, DUK_ERR_TYPE_ERROR, fmt, ap); va_end(ap); return err_idx; @@ -7706,7 +8709,6 @@

    See also .duk_push_external_buffer() 1.3.0 stack -experimental buffer §

    @@ -7942,7 +8944,7 @@

    Summary duk_get_heapptr() (or its variants) +duk_get_heapptr() (or its variants) and must have been reachable for Duktape garbage collection up to this call. If ptr is NULL, undefined is pushed.

    @@ -8139,6 +9141,12 @@

    Example duk_pop(ctx); /* pop object */

    +


    .duk_push_pointer() 1.0.0 @@ -8190,9 +9198,16 @@

    Summary +There may be platform specific behavior for some format specifiers. For +example, the behavior of %s with a NULL argument +has officially undefined behavior, so actual behavior may vary across +platforms and may even be memory unsafe. +

    Example §

    @@ -8224,7 +9239,14 @@

    Summary duk_push_lstring on purpose.

    -

    C code should normally only push valid CESU-8 strings to the stack.

    +
    +C code should normally only push valid CESU-8 strings to the stack. +Some invalid CESU-8/UTF-8 byte sequences are reserved for special +uses such as representing Symbol values. When you push such an invalid +byte sequence, the value on the value stack will behave like a string for +C code but will appear as a Symbol for Ecmascript code. +See Symbols for more discussion. +

    If input string might contain internal NUL characters, use duk_push_lstring() instead.

    @@ -8236,40 +9258,6 @@

    Example duk_push_string(ctx, NULL); /* push 'null' */

    -

    -.duk_push_string_file() -1.0.0 -string -stack -nonportable - §

    -
    -

    Prototype §

    -
    const char *duk_push_string_file(duk_context *ctx, const char *path);
    -
    -
    -
    -

    Stack §

    -
    [ . . . ] [ . . . data ]
    -
    -
    -

    Summary §

    -

    Push the contents of a file path into the stack as string data. -The file should be CESU-8 formatted if Ecmascript string compatibility is -necessary. A pointer to the interned string data is returned. If the -operation fails, throws an error.

    -

    If path is NULL, throws an error.

    -
    -The path argument is given directly to fopen(). -The path encoding cannot be specified and there is no support for a wide -character string. -
    -
    -
    -

    Example §

    -
    duk_push_string_file(ctx, "test.js");
    -
    -

    .duk_push_this() 1.0.0 @@ -8549,7 +9537,7 @@

    Example §

    Prototype §

    -
    void duk_put_function_list(duk_context *ctx, duk_idx_t obj_index, const duk_function_list_entry *funcs);
    +
    void duk_put_function_list(duk_context *ctx, duk_idx_t obj_idx, const duk_function_list_entry *funcs);
     
    @@ -8558,7 +9546,7 @@

    Stack

    Summary §

    -

    Set multiple function properties into a target object at obj_index. +

    Set multiple function properties into a target object at obj_idx. The functions are specified as a list of triples (name, function, nargs), ending with a triple where name is NULL (preferably also function is NULL for sanity).

    @@ -8570,7 +9558,7 @@

    Example const duk_function_list_entry my_module_funcs[] = { { "tweak", do_tweak, 0 /* no args */ }, { "adjust", do_adjust, 3 /* 3 args */ }, - { "frobnicate", do_frobnicate, DUK_VARAGS /* variable args */ }, + { "frobnicate", do_frobnicate, DUK_VARARGS /* variable args */ }, { NULL, NULL, 0 } }; @@ -8591,6 +9579,39 @@

    See also duk_put_number_list

    +

    +.duk_put_global_lstring() +2.0.0 +property + §

    +
    +

    Prototype §

    +
    duk_bool_t duk_put_global_lstring(duk_context *ctx, const char *key, duk_size_t key_len);
    +
    +
    +
    +

    Stack §

    +
    [ . . . val ] [ . . . ]
    +
    +
    +

    Summary §

    +

    Like duk_put_global_string() +but the key is given as a string with explicit length.

    +
    +
    +

    Example §

    +
    duk_push_string(ctx, "1.2.3");
    +(void) duk_put_global_lstring(ctx, "internal" "\x00" "nul");
    +
    +
    +

    .duk_put_global_string() 1.0.0 @@ -8629,7 +9650,9 @@

    Example

    See also §


    @@ -8640,7 +9663,7 @@

    See also §

    Prototype §

    -
    void duk_put_number_list(duk_context *ctx, duk_idx_t obj_index, const duk_number_list_entry *numbers);
    +
    void duk_put_number_list(duk_context *ctx, duk_idx_t obj_idx, const duk_number_list_entry *numbers);
     
    @@ -8650,7 +9673,7 @@

    Stack

    Summary §

    Set multiple number (double) properties into a target object -at obj_index. The number list is given as a list of pairs +at obj_idx. The number list is given as a list of pairs (name, number), ending with a pair where the name is NULL.

    This is useful e.g. when defining numeric constants for modules or classes implemented in C.

    @@ -8681,7 +9704,7 @@

    See also §

    Prototype §

    -
    duk_bool_t duk_put_prop(duk_context *ctx, duk_idx_t obj_index);
    +
    duk_bool_t duk_put_prop(duk_context *ctx, duk_idx_t obj_idx);
     
    @@ -8691,23 +9714,21 @@

    Stack

    Summary §

    Write val to the property key of a value at -obj_index. key and val are removed +obj_idx. key and val are removed from the stack. Return code and error throwing behavior:

    • If the property write succeeds, returns 1.
    • If the property write fails, throws an error (strict mode semantics). An error may also be thrown by the "setter" function of an accessor property.
    • -
    • If the value at obj_index is not +
    • If the value at obj_idx is not object coercible, throws an error.
    • -
    • If obj_index is invalid, throws an error.
    • +
    • If obj_idx is invalid, throws an error.
    -

    The property write is equivalent to the Ecmascript expression:

    -
    obj[key] = val
    -
    -

    The exact rules of when a property write succeeds or fails are the same -as for Ecmascript code making the above assignment.

    -

    For semantics, see +

    The property write is equivalent to the Ecmascript expression +obj[key] = val. The exact rules of when a property write +succeeds or fails are the same as for Ecmascript code making the +equivalent assignment. For precise semantics, see Property Accessors, PutValue (V, W), and [[Put]] (P, V, Throw). @@ -8719,10 +9740,13 @@

    Summary PutValue (V, W), step 7 of the special [[Put]] variant). -
  • The key argument is internally coerced to a string. There is - an internal fast path for arrays and numeric indices which avoids an - explicit string coercion, so use a numeric key when applicable. -
  • +
  • The key argument is internally coerced using ToPropertyKey() + coercion which results in a string or a Symbol. There is an internal + fast path for arrays and numeric indices which avoids an explicit string + coercion, so use a numeric key when applicable.
  • + +

    If the target is a Proxy object which implements the set trap, +the trap is invoked and the API call return value matches the trap return value.

    In Ecmascript an assignment expression has the value of the right-hand-side expression, regardless of whether or not the assignment succeeds. The return @@ -8767,7 +9791,7 @@

    See also §

    Prototype §

    -
    duk_bool_t duk_put_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index);
    +
    duk_bool_t duk_put_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx);
     
    @@ -8778,7 +9802,7 @@

    Stack Summary §

    Like duk_put_prop(), but the property name is given as an unsigned integer -arr_index. This is especially useful for writing to +arr_idx. This is especially useful for writing to array elements (but is not limited to that).

    Conceptually the number is coerced to a string for the property write, e.g. 123 would be equivalent to a property @@ -8792,6 +9816,40 @@

    Example printf("rc=%d\n", (int) rc);

    +

    +.duk_put_prop_lstring() +2.0.0 +property + §

    +
    +

    Prototype §

    +
    duk_bool_t duk_put_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len);
    +
    +
    +
    +

    Stack §

    +
    [ . . . obj . . . val ] [ . . . obj . . . ]
    +
    +
    +

    Summary §

    +

    Like duk_put_prop(), +but the property name is given as a string with explicit length.

    +
    +
    +

    Example §

    +
    duk_bool_t rc;
    +
    +duk_push_string(ctx, "value");
    +rc = duk_put_prop_lstring(ctx, -3, "internal" "\x00" "nul", 12);
    +printf("rc=%d\n", (int) rc);
    +
    +
    +
    +

    See also §

    + +

    .duk_put_prop_string() 1.0.0 @@ -8799,7 +9857,7 @@

    Example §

    Prototype §

    -
    duk_bool_t duk_put_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key);
    +
    duk_bool_t duk_put_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key);
     
    @@ -8821,6 +9879,81 @@

    Example printf("rc=%d\n", (int) rc);

    + +

    +.duk_range_error() +2.0.0 +error + §

    +
    +

    Prototype §

    +
    duk_ret_t duk_range_error(duk_context *ctx, const char *fmt, ...);
    +
    +
    +
    +

    Stack §

    +
    [ . . . ] [ . . . err ]
    +
    +
    +

    Summary §

    +

    Convenience API call, equivalent to +duk_error() with an error code +DUK_ERR_RANGE_ERROR.

    +
    +
    +

    Example §

    +
    return duk_range_error(ctx, "my error: %d", (int) argval);
    +
    +
    +
    +

    See also §

    + +
    +

    +.duk_range_error_va() +2.0.0 +vararg +error + §

    +
    +

    Prototype §

    +
    duk_ret_t duk_range_error_va(duk_context *ctx, const char *fmt, va_list ap);
    +
    +
    +
    +

    Stack §

    +
    [ . . . ] [ . . . err ]
    +
    +
    +

    Summary §

    +

    Convenience API call, equivalent to +duk_error_va() with an error code +DUK_ERR_RANGE_ERROR.

    +
    +
    +

    Example §

    +
    void my_range_error(duk_context *ctx, const char *fmt, ...) {
    +    va_list ap;
    +
    +    va_start(ap, fmt);
    +    duk_range_error_va(ctx, fmt, ap);
    +    va_end(ap);
    +}
    +
    +
    +
    +

    See also §

    + +

    .duk_realloc() 1.0.0 @@ -8910,7 +10043,7 @@

    Summary duk_alloc_raw() with a zero size argument; the call may return NULL or some other value which is safe to give to - duk_free_raw(). + duk_free_raw().

    Memory reallocated with duk_realloc_raw() can be freed with either duk_free() or @@ -8935,6 +10068,75 @@

    See also duk_realloc

    +


    +.duk_reference_error() +2.0.0 +error + §

    +
    +

    Prototype §

    +
    duk_ret_t duk_reference_error(duk_context *ctx, const char *fmt, ...);
    +
    +
    +
    +

    Stack §

    +
    [ . . . ] [ . . . err ]
    +
    +
    +

    Summary §

    +

    Convenience API call, equivalent to +duk_error() with an error code +DUK_ERR_REFERENCE_ERROR.

    +
    +
    +

    Example §

    +
    return duk_reference_error(ctx, "my error: %d", (int) argval);
    +
    +
    +
    +

    See also §

    + +
    +

    +.duk_reference_error_va() +2.0.0 +vararg +error + §

    +
    +

    Prototype §

    +
    duk_ret_t duk_reference_error_va(duk_context *ctx, const char *fmt, va_list ap);
    +
    +
    +
    +

    Stack §

    +
    [ . . . ] [ . . . err ]
    +
    +
    +

    Summary §

    +

    Convenience API call, equivalent to +duk_error_va() with an error code +DUK_ERR_REFERENCE_ERROR.

    +
    +
    +

    Example §

    +
    void my_reference_error(duk_context *ctx, const char *fmt, ...) {
    +    va_list ap;
    +
    +    va_start(ap, fmt);
    +    duk_reference_error_va(ctx, fmt, ap);
    +    va_end(ap);
    +}
    +
    +
    +
    +

    See also §

    + +

    .duk_remove() 1.0.0 @@ -8942,18 +10144,18 @@

    See also §

    Prototype §

    -
    void duk_remove(duk_context *ctx, duk_idx_t index);
    +
    void duk_remove(duk_context *ctx, duk_idx_t idx);
     

    Stack §

    -
    [ . . . val(index) . . . ] [ . . . . . . ]
    +
    [ . . . val(idx) . . . ] [ . . . . . . ]

    Summary §

    -

    Remove value at index. Elements above index -are shifted down the stack by a step. If to_index is -an invalid index, throws an error.

    +

    Remove value at idx. Elements above idx +are shifted down the stack by a step. If idx is an invalid +index, throws an error.

    Example §

    @@ -8970,17 +10172,17 @@

    Example §

    Prototype §

    -
    void duk_replace(duk_context *ctx, duk_idx_t to_index);
    +
    void duk_replace(duk_context *ctx, duk_idx_t to_idx);
     

    Stack §

    -
    [ . . . old(to_index) . . . val ] [ . . . val(to_index) . . . ]
    +
    [ . . . old(to_idx) . . . val ] [ . . . val(to_idx) . . . ]

    Summary §

    -

    Replace value at to_index with a value popped from the -stack top. If to_index is an invalid index, throws an error.

    +

    Replace value at to_idx with a value popped from the +stack top. If to_idx is an invalid index, throws an error.

    Negative indices are evaluated prior to popping the value at the stack top. This is also illustrated by the example. @@ -9008,7 +10210,7 @@

    See also §

    Prototype §

    -
    duk_bool_t duk_require_boolean(duk_context *ctx, duk_idx_t index);
    +
    duk_bool_t duk_require_boolean(duk_context *ctx, duk_idx_t idx);
     
    @@ -9018,7 +10220,7 @@

    Stack

    Summary §

    Like duk_get_boolean(), -but throws an error if the value at index is not a boolean +but throws an error if the value at idx is not a boolean or if the index is invalid.

    @@ -9036,7 +10238,7 @@

    Example §

    Prototype §

    -
    void *duk_require_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size);
    +
    void *duk_require_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size);
     
    @@ -9046,7 +10248,7 @@

    Stack

    Summary §

    Like duk_get_buffer(), -but throws an error if the value at index is not a (plain) +but throws an error if the value at idx is not a (plain) buffer or if the index is invalid.

    @@ -9070,13 +10272,12 @@

    See also .duk_require_buffer_data() 1.3.0 stack -experimental bufferobject buffer §

    Prototype §

    -
    void *duk_require_buffer_data(duk_context *ctx, duk_idx_t index, duk_size_t *out_size);
    +
    void *duk_require_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size);
     
    @@ -9086,7 +10287,7 @@

    Stack

    Summary §

    Like duk_get_buffer_data(), -but throws an error if the value at index is not a plain buffer +but throws an error if the value at idx is not a plain buffer or a buffer object or if the index is invalid.

    @@ -9114,7 +10315,7 @@

    See also §

    Prototype §

    -
    duk_c_function duk_require_c_function(duk_context *ctx, duk_idx_t index);
    +
    duk_c_function duk_require_c_function(duk_context *ctx, duk_idx_t idx);
     
    @@ -9124,7 +10325,7 @@

    Stack

    Summary §

    Like duk_get_c_function(), but -throws an error if the value at index is not an Ecmascript function +throws an error if the value at idx is not an Ecmascript function associated with a Duktape/C function or if the index is invalid.

    @@ -9134,6 +10335,35 @@

    Example funcptr = duk_require_c_function(ctx, -3);

    +

    +.duk_require_callable() +1.4.0 +stack + §

    +
    +

    Prototype §

    +
    void duk_require_callable(duk_context *ctx, duk_idx_t idx);
    +
    +
    +
    +

    Stack §

    +
    [ . . . val . . . ]
    +
    +
    +

    Summary §

    +

    Throw an error if the value at idx is not callable +or if the index is invalid.

    +
    +There is no "get" primitive (duk_get_callable()) because there's +no useful C return value for an arbitrary callable value. At the moment this +call is equivalent to calling duk_require_function(). +
    +
    +
    +

    Example §

    +
    duk_require_callable(ctx, -3);
    +
    +

    .duk_require_context() 1.0.0 @@ -9142,7 +10372,7 @@

    Example §

    Prototype §

    -
    duk_context *duk_require_context(duk_context *ctx, duk_idx_t index);
    +
    duk_context *duk_require_context(duk_context *ctx, duk_idx_t idx);
     
    @@ -9152,7 +10382,7 @@

    Stack

    Summary §

    Like duk_get_context(), -but throws an error if the value at index is not a Duktape +but throws an error if the value at idx is not a Duktape thread or if the index is invalid.

    @@ -9163,6 +10393,34 @@

    Example new_ctx = duk_require_context(ctx, -1);

    +

    +.duk_require_function() +1.4.0 +stack + §

    +
    +

    Prototype §

    +
    void duk_require_function(duk_context *ctx, duk_idx_t idx);
    +
    +
    +
    +

    Stack §

    +
    [ . . . val . . . ]
    +
    +
    +

    Summary §

    +

    Throw an error if the value at idx is not a function +or if the index is invalid.

    +
    +There is no "get" primitive (duk_get_function()) because there's +no useful C return value for an arbitrary function. +
    +
    +
    +

    Example §

    +
    duk_require_function(ctx, -3);
    +
    +

    .duk_require_heapptr() 1.1.0 @@ -9171,7 +10429,7 @@

    Example §

    Prototype §

    -
    void *duk_require_heapptr(duk_context *ctx, duk_idx_t index);
    +
    void *duk_require_heapptr(duk_context *ctx, duk_idx_t idx);
     
    @@ -9181,7 +10439,7 @@

    Stack

    Summary §

    Like duk_get_heapptr(), -but throws an error if the value at index is not a Duktape +but throws an error if the value at idx is not a Duktape heap allocated value (object, buffer, string) or if the index is invalid.

    @@ -9205,7 +10463,7 @@

    See also §

    Prototype §

    -
    duk_int_t duk_require_int(duk_context *ctx, duk_idx_t index);
    +
    duk_int_t duk_require_int(duk_context *ctx, duk_idx_t idx);
     
    @@ -9215,7 +10473,7 @@

    Stack

    Summary §

    Like duk_get_int(), -but throws an error if the value at index is not a number +but throws an error if the value at idx is not a number or if the index is invalid.

    %!I", - (long) (curr_pc - DUK_HCOMPILEDFUNCTION_GET_CODE_BASE(thr->heap, DUK__FUN())), + (long) (curr_pc - DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, DUK__FUN())), (unsigned long) *curr_pc, (long) DUK_DEC_OP(*curr_pc), (long) (thr->valstack_top - thr->valstack), @@ -67518,417 +71186,995 @@ DUK_LOCAL DUK_NOINLINE void duk__js_execute_bytecode_inner(duk_hthread *entry_th ins = *curr_pc++; /* Typing: use duk_small_(u)int_fast_t when decoding small - * opcode fields (op, A, B, C) and duk_(u)int_fast_t when - * decoding larger fields (e.g. BC which is 18 bits). Use - * unsigned variant by default, signed when the value is used - * in signed arithmetic. Using variable names such as 'a', 'b', - * 'c', 'bc', etc makes it easier to spot typing mismatches. + * opcode fields (op, A, B, C, BC) which fit into 16 bits + * and duk_(u)int_fast_t when decoding larger fields (e.g. + * ABC). Use unsigned variant by default, signed when the + * value is used in signed arithmetic. Using variable names + * such as 'a', 'b', 'c', 'bc', etc makes it easier to spot + * typing mismatches. */ - /* XXX: the best typing needs to be validated by perf measurement: - * e.g. using a small type which is the cast to a larger duk_idx_t - * may be slower than declaring the variable as a duk_idx_t in the - * first place. + /* Switch based on opcode. Cast to 8-bit unsigned value and + * use a fully populated case clauses so that the compiler + * will (at least usually) omit a bounds check. */ + op = (duk_uint8_t) DUK_DEC_OP(ins); + switch (op) { - /* XXX: use macros for the repetitive tval/refcount handling. */ + /* Some useful macros. These access inner executor variables + * directly so they only apply within the executor. + */ +#if defined(DUK_USE_EXEC_PREFER_SIZE) +#define DUK__REPLACE_TOP_A_BREAK() { goto replace_top_a; } +#define DUK__REPLACE_TOP_BC_BREAK() { goto replace_top_bc; } +#define DUK__REPLACE_BOOL_A_BREAK(bval) { \ + duk_bool_t duk__bval; \ + duk__bval = (bval); \ + DUK_ASSERT(duk__bval == 0 || duk__bval == 1); \ + duk_push_boolean((duk_context *) thr, duk__bval); \ + DUK__REPLACE_TOP_A_BREAK(); \ + } +#else +#define DUK__REPLACE_TOP_A_BREAK() { DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_A(ins)); break; } +#define DUK__REPLACE_TOP_BC_BREAK() { DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_BC(ins)); break; } +#define DUK__REPLACE_BOOL_A_BREAK(bval) { \ + duk_bool_t duk__bval; \ + duk_tval *duk__tvdst; \ + duk__bval = (bval); \ + DUK_ASSERT(duk__bval == 0 || duk__bval == 1); \ + duk__tvdst = DUK__REGP_A(ins); \ + DUK_TVAL_SET_BOOLEAN_UPDREF(thr, duk__tvdst, duk__bval); \ + break; \ + } +#endif - switch ((int) DUK_DEC_OP(ins)) { - /* XXX: switch cast? */ + /* XXX: 12 + 12 bit variant might make sense too, for both reg and + * const loads. + */ + /* For LDREG, STREG, LDCONST footprint optimized variants would just + * duk_dup() + duk_replace(), but because they're used quite a lot + * they're currently intentionally not size optimized. + */ case DUK_OP_LDREG: { - duk_small_uint_fast_t a; - duk_uint_fast_t bc; duk_tval *tv1, *tv2; - a = DUK_DEC_A(ins); tv1 = DUK__REGP(a); - bc = DUK_DEC_BC(ins); tv2 = DUK__REGP(bc); + tv1 = DUK__REGP_A(ins); + tv2 = DUK__REGP_BC(ins); DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2); /* side effects */ break; } case DUK_OP_STREG: { - duk_small_uint_fast_t a; - duk_uint_fast_t bc; duk_tval *tv1, *tv2; - a = DUK_DEC_A(ins); tv1 = DUK__REGP(a); - bc = DUK_DEC_BC(ins); tv2 = DUK__REGP(bc); + tv1 = DUK__REGP_A(ins); + tv2 = DUK__REGP_BC(ins); DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv2, tv1); /* side effects */ break; } case DUK_OP_LDCONST: { - duk_small_uint_fast_t a; - duk_uint_fast_t bc; duk_tval *tv1, *tv2; - a = DUK_DEC_A(ins); tv1 = DUK__REGP(a); - bc = DUK_DEC_BC(ins); tv2 = DUK__CONSTP(bc); + tv1 = DUK__REGP_A(ins); + tv2 = DUK__CONSTP_BC(ins); DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2); /* side effects */ break; } + /* LDINT and LDINTX are intended to load an arbitrary signed + * 32-bit value. Only an LDINT+LDINTX sequence is supported. + * This also guarantees all values remain fastints. + */ +#if defined(DUK_USE_EXEC_PREFER_SIZE) + case DUK_OP_LDINT: { + duk_int32_t val; + + val = (duk_int32_t) DUK_DEC_BC(ins) - (duk_int32_t) DUK_BC_LDINT_BIAS; + duk_push_int((duk_context *) thr, val); + DUK__REPLACE_TOP_A_BREAK(); + } + case DUK_OP_LDINTX: { + duk_int32_t val; + + val = (duk_int32_t) duk_get_int((duk_context *) thr, DUK_DEC_A(ins)); + val = (val << DUK_BC_LDINTX_SHIFT) + (duk_int32_t) DUK_DEC_BC(ins); /* no bias */ + duk_push_int((duk_context *) thr, val); + DUK__REPLACE_TOP_A_BREAK(); + } +#else /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_LDINT: { - duk_small_uint_fast_t a; - duk_int_fast_t bc; duk_tval *tv1; -#if defined(DUK_USE_FASTINT) duk_int32_t val; -#else - duk_double_t val; -#endif -#if defined(DUK_USE_FASTINT) - a = DUK_DEC_A(ins); tv1 = DUK__REGP(a); - bc = DUK_DEC_BC(ins); val = (duk_int32_t) (bc - DUK_BC_LDINT_BIAS); - DUK_TVAL_SET_FASTINT_I32_UPDREF(thr, tv1, val); /* side effects */ -#else - a = DUK_DEC_A(ins); tv1 = DUK__REGP(a); - bc = DUK_DEC_BC(ins); val = (duk_double_t) (bc - DUK_BC_LDINT_BIAS); - DUK_TVAL_SET_NUMBER_UPDREF(thr, tv1, val); /* side effects */ -#endif + val = (duk_int32_t) DUK_DEC_BC(ins) - (duk_int32_t) DUK_BC_LDINT_BIAS; + tv1 = DUK__REGP_A(ins); + DUK_TVAL_SET_I32_UPDREF(thr, tv1, val); /* side effects */ break; } - case DUK_OP_LDINTX: { - duk_small_uint_fast_t a; duk_tval *tv1; - duk_double_t val; - - /* LDINTX is not necessarily in FASTINT range, so - * no fast path for now. - * - * XXX: perhaps restrict LDINTX to fastint range, wider - * range very rarely needed. - */ + duk_int32_t val; - a = DUK_DEC_A(ins); tv1 = DUK__REGP(a); + tv1 = DUK__REGP_A(ins); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); - val = DUK_TVAL_GET_NUMBER(tv1) * ((duk_double_t) (1L << DUK_BC_LDINTX_SHIFT)) + - (duk_double_t) DUK_DEC_BC(ins); #if defined(DUK_USE_FASTINT) - DUK_TVAL_SET_NUMBER_CHKFAST(tv1, val); + DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1)); + val = DUK_TVAL_GET_FASTINT_I32(tv1); #else - DUK_TVAL_SET_NUMBER(tv1, val); + /* XXX: fast double-to-int conversion, we know number is integer in [-0x80000000,0xffffffff]. */ + val = (duk_int32_t) DUK_TVAL_GET_NUMBER(tv1); #endif + val = (val << DUK_BC_LDINTX_SHIFT) + (duk_int32_t) DUK_DEC_BC(ins); /* no bias */ + DUK_TVAL_SET_I32_UPDREF(thr, tv1, val); /* side effects */ break; } +#endif /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_MPUTOBJ: - case DUK_OP_MPUTOBJI: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a; - duk_tval *tv1; - duk_hobject *obj; - duk_uint_fast_t idx; - duk_small_uint_fast_t count; - - /* A -> register of target object - * B -> first register of key/value pair list - * C -> number of key/value pairs - */ - - a = DUK_DEC_A(ins); tv1 = DUK__REGP(a); - DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv1)); - obj = DUK_TVAL_GET_OBJECT(tv1); - - idx = (duk_uint_fast_t) DUK_DEC_B(ins); - if (DUK_DEC_OP(ins) == DUK_OP_MPUTOBJI) { - duk_tval *tv_ind = DUK__REGP(idx); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); - idx = (duk_uint_fast_t) DUK_TVAL_GET_NUMBER(tv_ind); - } - - count = (duk_small_uint_fast_t) DUK_DEC_C(ins); - -#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK) - if (DUK_UNLIKELY(idx + count * 2 > (duk_uint_fast_t) duk_get_top(ctx))) { - /* XXX: use duk_is_valid_index() instead? */ - /* XXX: improve check; check against nregs, not against top */ - DUK__INTERNAL_ERROR("MPUTOBJ out of bounds"); - } -#endif - - duk_push_hobject(ctx, obj); - - while (count > 0) { - /* XXX: faster initialization (direct access or better primitives) */ - - duk_push_tval(ctx, DUK__REGP(idx)); - DUK_ASSERT(duk_is_string(ctx, -1)); - duk_push_tval(ctx, DUK__REGP(idx + 1)); /* -> [... obj key value] */ - duk_xdef_prop_wec(ctx, -3); /* -> [... obj] */ - - count--; - idx += 2; - } - - duk_pop(ctx); /* [... obj] -> [...] */ +#if defined(DUK_USE_EXEC_PREFER_SIZE) + case DUK_OP_LDTHIS: { + duk_push_this((duk_context *) thr); + DUK__REPLACE_TOP_BC_BREAK(); + } + case DUK_OP_LDUNDEF: { + duk_to_undefined((duk_context *) thr, (duk_idx_t) DUK_DEC_BC(ins)); break; } + case DUK_OP_LDNULL: { + duk_to_null((duk_context *) thr, (duk_idx_t) DUK_DEC_BC(ins)); + break; + } + case DUK_OP_LDTRUE: { + duk_push_true((duk_context *) thr); + DUK__REPLACE_TOP_BC_BREAK(); + } + case DUK_OP_LDFALSE: { + duk_push_false((duk_context *) thr); + DUK__REPLACE_TOP_BC_BREAK(); + } +#else /* DUK_USE_EXEC_PREFER_SIZE */ + case DUK_OP_LDTHIS: { + /* Note: 'this' may be bound to any value, not just an object */ + duk_tval *tv1, *tv2; - case DUK_OP_MPUTARR: - case DUK_OP_MPUTARRI: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a; + tv1 = DUK__REGP_BC(ins); + tv2 = thr->valstack_bottom - 1; /* 'this binding' is just under bottom */ + DUK_ASSERT(tv2 >= thr->valstack); + DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2); /* side effects */ + break; + } + case DUK_OP_LDUNDEF: { duk_tval *tv1; - duk_hobject *obj; - duk_uint_fast_t idx; - duk_small_uint_fast_t count; - duk_uint32_t arr_idx; - - /* A -> register of target object - * B -> first register of value data (start_index, value1, value2, ..., valueN) - * C -> number of key/value pairs (N) - */ - - a = DUK_DEC_A(ins); tv1 = DUK__REGP(a); - DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv1)); - obj = DUK_TVAL_GET_OBJECT(tv1); - DUK_ASSERT(obj != NULL); - idx = (duk_uint_fast_t) DUK_DEC_B(ins); - if (DUK_DEC_OP(ins) == DUK_OP_MPUTARRI) { - duk_tval *tv_ind = DUK__REGP(idx); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); - idx = (duk_uint_fast_t) DUK_TVAL_GET_NUMBER(tv_ind); - } - - count = (duk_small_uint_fast_t) DUK_DEC_C(ins); - -#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK) - if (idx + count + 1 > (duk_uint_fast_t) duk_get_top(ctx)) { - /* XXX: use duk_is_valid_index() instead? */ - /* XXX: improve check; check against nregs, not against top */ - DUK__INTERNAL_ERROR("MPUTARR out of bounds"); - } -#endif + tv1 = DUK__REGP_BC(ins); + DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1); /* side effects */ + break; + } + case DUK_OP_LDNULL: { + duk_tval *tv1; - tv1 = DUK__REGP(idx); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); - arr_idx = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv1); - idx++; + tv1 = DUK__REGP_BC(ins); + DUK_TVAL_SET_NULL_UPDREF(thr, tv1); /* side effects */ + break; + } + case DUK_OP_LDTRUE: { + duk_tval *tv1; - duk_push_hobject(ctx, obj); + tv1 = DUK__REGP_BC(ins); + DUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv1, 1); /* side effects */ + break; + } + case DUK_OP_LDFALSE: { + duk_tval *tv1; - while (count > 0) { - /* duk_xdef_prop() will define an own property without any array - * special behaviors. We'll need to set the array length explicitly - * in the end. For arrays with elisions, the compiler will emit an - * explicit SETALEN which will update the length. - */ + tv1 = DUK__REGP_BC(ins); + DUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv1, 0); /* side effects */ + break; + } +#endif /* DUK_USE_EXEC_PREFER_SIZE */ - /* XXX: because we're dealing with 'own' properties of a fresh array, - * the array initializer should just ensure that the array has a large - * enough array part and write the values directly into array part, - * and finally set 'length' manually in the end (as already happens now). - */ + case DUK_OP_BNOT: { + duk__vm_bitwise_not(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins)); + break; + } - duk_push_tval(ctx, DUK__REGP(idx)); /* -> [... obj value] */ - duk_xdef_prop_index_wec(ctx, -2, arr_idx); /* -> [... obj] */ + case DUK_OP_LNOT: { + duk__vm_logical_not(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins)); + break; + } - /* XXX: could use at least one fewer loop counters */ - count--; - idx++; - arr_idx++; - } +#if defined(DUK_USE_EXEC_PREFER_SIZE) + case DUK_OP_UNM: + case DUK_OP_UNP: { + duk__vm_arith_unary_op(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins), op); + break; + } +#else /* DUK_USE_EXEC_PREFER_SIZE */ + case DUK_OP_UNM: { + duk__vm_arith_unary_op(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins), DUK_OP_UNM); + break; + } + case DUK_OP_UNP: { + duk__vm_arith_unary_op(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins), DUK_OP_UNP); + break; + } +#endif /* DUK_USE_EXEC_PREFER_SIZE */ - /* XXX: E5.1 Section 11.1.4 coerces the final length through - * ToUint32() which is odd but happens now as a side effect of - * 'arr_idx' type. - */ - duk_hobject_set_length(thr, obj, (duk_uint32_t) arr_idx); +#if defined(DUK_USE_EXEC_PREFER_SIZE) + case DUK_OP_TYPEOF: { + duk_small_uint_t stridx; - duk_pop(ctx); /* [... obj] -> [...] */ + stridx = duk_js_typeof_stridx(DUK__REGP_BC(ins)); + DUK_ASSERT(stridx >= 0 && stridx < DUK_HEAP_NUM_STRINGS); + duk_push_hstring_stridx((duk_context *) thr, stridx); + DUK__REPLACE_TOP_A_BREAK(); + } +#else /* DUK_USE_EXEC_PREFER_SIZE */ + case DUK_OP_TYPEOF: { + duk_tval *tv; + duk_small_uint_t stridx; + duk_hstring *h_str; + + tv = DUK__REGP_BC(ins); + stridx = duk_js_typeof_stridx(tv); + DUK_ASSERT_STRIDX_VALID(stridx); + h_str = DUK_HTHREAD_GET_STRING(thr, stridx); + tv = DUK__REGP_A(ins); + DUK_TVAL_SET_STRING_UPDREF(thr, tv, h_str); break; } +#endif /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_NEW: - case DUK_OP_NEWI: { + case DUK_OP_TYPEOFID: { duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_uint_fast_t idx; - duk_small_uint_fast_t i; - - /* A -> unused (reserved for flags, for consistency with DUK_OP_CALL) - * B -> target register and start reg: constructor, arg1, ..., argN - * (for DUK_OP_NEWI, 'b' is indirect) - * C -> num args (N) - */ - - /* duk_new() will call the constuctor using duk_handle_call(). - * A constructor call prevents a yield from inside the constructor, - * even if the constructor is an Ecmascript function. - */ - - /* Don't need to sync curr_pc here; duk_new() will do that - * when it augments the created error. - */ + duk_small_uint_t stridx; +#if !defined(DUK_USE_EXEC_PREFER_SIZE) + duk_hstring *h_str; +#endif + duk_activation *act; + duk_hstring *name; + duk_tval *tv; - /* XXX: unnecessary copying of values? Just set 'top' to - * b + c, and let the return handling fix up the stack frame? + /* A -> target register + * BC -> constant index of identifier name */ - idx = (duk_uint_fast_t) DUK_DEC_B(ins); - if (DUK_DEC_OP(ins) == DUK_OP_NEWI) { - duk_tval *tv_ind = DUK__REGP(idx); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); - idx = (duk_uint_fast_t) DUK_TVAL_GET_NUMBER(tv_ind); - } - -#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK) - if (idx + c + 1 > (duk_uint_fast_t) duk_get_top(ctx)) { - /* XXX: use duk_is_valid_index() instead? */ - /* XXX: improve check; check against nregs, not against top */ - DUK__INTERNAL_ERROR("NEW out of bounds"); + tv = DUK__CONSTP_BC(ins); + DUK_ASSERT(DUK_TVAL_IS_STRING(tv)); + name = DUK_TVAL_GET_STRING(tv); + tv = NULL; /* lookup has side effects */ + act = thr->callstack + thr->callstack_top - 1; + if (duk_js_getvar_activation(thr, act, name, 0 /*throw*/)) { + /* -> [... val this] */ + tv = DUK_GET_TVAL_NEGIDX(ctx, -2); + stridx = duk_js_typeof_stridx(tv); + tv = NULL; /* no longer needed */ + duk_pop_2(ctx); + } else { + /* unresolvable, no stack changes */ + stridx = DUK_STRIDX_LC_UNDEFINED; + } + DUK_ASSERT_STRIDX_VALID(stridx); +#if defined(DUK_USE_EXEC_PREFER_SIZE) + duk_push_hstring_stridx(ctx, stridx); + DUK__REPLACE_TOP_A_BREAK(); +#else /* DUK_USE_EXEC_PREFER_SIZE */ + h_str = DUK_HTHREAD_GET_STRING(thr, stridx); + tv = DUK__REGP_A(ins); + DUK_TVAL_SET_STRING_UPDREF(thr, tv, h_str); + break; +#endif /* DUK_USE_EXEC_PREFER_SIZE */ + } + + /* Equality: E5 Sections 11.9.1, 11.9.3 */ + +#define DUK__EQ_BODY(barg,carg) { \ + duk_bool_t tmp; \ + tmp = duk_js_equals(thr, (barg), (carg)); \ + DUK_ASSERT(tmp == 0 || tmp == 1); \ + DUK__REPLACE_BOOL_A_BREAK(tmp); \ + } +#define DUK__NEQ_BODY(barg,carg) { \ + duk_bool_t tmp; \ + tmp = duk_js_equals(thr, (barg), (carg)); \ + DUK_ASSERT(tmp == 0 || tmp == 1); \ + tmp ^= 1; \ + DUK__REPLACE_BOOL_A_BREAK(tmp); \ + } +#define DUK__SEQ_BODY(barg,carg) { \ + duk_bool_t tmp; \ + tmp = duk_js_strict_equals((barg), (carg)); \ + DUK_ASSERT(tmp == 0 || tmp == 1); \ + DUK__REPLACE_BOOL_A_BREAK(tmp); \ + } +#define DUK__SNEQ_BODY(barg,carg) { \ + duk_bool_t tmp; \ + tmp = duk_js_strict_equals((barg), (carg)); \ + DUK_ASSERT(tmp == 0 || tmp == 1); \ + tmp ^= 1; \ + DUK__REPLACE_BOOL_A_BREAK(tmp); \ + } +#if defined(DUK_USE_EXEC_PREFER_SIZE) + case DUK_OP_EQ_RR: + case DUK_OP_EQ_CR: + case DUK_OP_EQ_RC: + case DUK_OP_EQ_CC: + DUK__EQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); + case DUK_OP_NEQ_RR: + case DUK_OP_NEQ_CR: + case DUK_OP_NEQ_RC: + case DUK_OP_NEQ_CC: + DUK__NEQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); + case DUK_OP_SEQ_RR: + case DUK_OP_SEQ_CR: + case DUK_OP_SEQ_RC: + case DUK_OP_SEQ_CC: + DUK__SEQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); + case DUK_OP_SNEQ_RR: + case DUK_OP_SNEQ_CR: + case DUK_OP_SNEQ_RC: + case DUK_OP_SNEQ_CC: + DUK__SNEQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); +#else /* DUK_USE_EXEC_PREFER_SIZE */ + case DUK_OP_EQ_RR: + DUK__EQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_EQ_CR: + DUK__EQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_EQ_RC: + DUK__EQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_EQ_CC: + DUK__EQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_NEQ_RR: + DUK__NEQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_NEQ_CR: + DUK__NEQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_NEQ_RC: + DUK__NEQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_NEQ_CC: + DUK__NEQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_SEQ_RR: + DUK__SEQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_SEQ_CR: + DUK__SEQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_SEQ_RC: + DUK__SEQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_SEQ_CC: + DUK__SEQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_SNEQ_RR: + DUK__SNEQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_SNEQ_CR: + DUK__SNEQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_SNEQ_RC: + DUK__SNEQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_SNEQ_CC: + DUK__SNEQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); +#endif /* DUK_USE_EXEC_PREFER_SIZE */ + +#define DUK__COMPARE_BODY(arg1,arg2,flags) { \ + duk_bool_t tmp; \ + tmp = duk_js_compare_helper(thr, (arg1), (arg2), (flags)); \ + DUK_ASSERT(tmp == 0 || tmp == 1); \ + DUK__REPLACE_BOOL_A_BREAK(tmp); \ + } +#define DUK__GT_BODY(barg,carg) DUK__COMPARE_BODY((carg), (barg), 0) +#define DUK__GE_BODY(barg,carg) DUK__COMPARE_BODY((barg), (carg), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST | DUK_COMPARE_FLAG_NEGATE) +#define DUK__LT_BODY(barg,carg) DUK__COMPARE_BODY((barg), (carg), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) +#define DUK__LE_BODY(barg,carg) DUK__COMPARE_BODY((carg), (barg), DUK_COMPARE_FLAG_NEGATE) +#if defined(DUK_USE_EXEC_PREFER_SIZE) + case DUK_OP_GT_RR: + case DUK_OP_GT_CR: + case DUK_OP_GT_RC: + case DUK_OP_GT_CC: + DUK__GT_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); + case DUK_OP_GE_RR: + case DUK_OP_GE_CR: + case DUK_OP_GE_RC: + case DUK_OP_GE_CC: + DUK__GE_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); + case DUK_OP_LT_RR: + case DUK_OP_LT_CR: + case DUK_OP_LT_RC: + case DUK_OP_LT_CC: + DUK__LT_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); + case DUK_OP_LE_RR: + case DUK_OP_LE_CR: + case DUK_OP_LE_RC: + case DUK_OP_LE_CC: + DUK__LE_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); +#else /* DUK_USE_EXEC_PREFER_SIZE */ + case DUK_OP_GT_RR: + DUK__GT_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_GT_CR: + DUK__GT_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_GT_RC: + DUK__GT_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_GT_CC: + DUK__GT_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_GE_RR: + DUK__GE_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_GE_CR: + DUK__GE_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_GE_RC: + DUK__GE_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_GE_CC: + DUK__GE_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_LT_RR: + DUK__LT_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_LT_CR: + DUK__LT_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_LT_RC: + DUK__LT_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_LT_CC: + DUK__LT_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_LE_RR: + DUK__LE_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_LE_CR: + DUK__LE_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_LE_RC: + DUK__LE_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_LE_CC: + DUK__LE_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); +#endif /* DUK_USE_EXEC_PREFER_SIZE */ + + /* No size optimized variant at present for IF. */ + case DUK_OP_IFTRUE_R: { + if (duk_js_toboolean(DUK__REGP_BC(ins)) != 0) { + curr_pc++; } -#endif - - duk_require_stack(ctx, (duk_idx_t) c); - duk_push_tval(ctx, DUK__REGP(idx)); - for (i = 0; i < c; i++) { - duk_push_tval(ctx, DUK__REGP(idx + i + 1)); + break; + } + case DUK_OP_IFTRUE_C: { + if (duk_js_toboolean(DUK__CONSTP_BC(ins)) != 0) { + curr_pc++; } - duk_new(ctx, (duk_idx_t) c); /* [... constructor arg1 ... argN] -> [retval] */ - DUK_DDD(DUK_DDDPRINT("NEW -> %!iT", (duk_tval *) duk_get_tval(ctx, -1))); - duk_replace(ctx, (duk_idx_t) idx); - - /* When debugger is enabled, we need to recheck the activation - * status after returning. This is now handled by call handling - * and heap->dbg_force_restart. - */ break; } - - case DUK_OP_REGEXP: { -#ifdef DUK_USE_REGEXP_SUPPORT - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - - /* A -> target register - * B -> bytecode (also contains flags) - * C -> escaped source - */ - - duk_push_tval(ctx, DUK__REGCONSTP(c)); - duk_push_tval(ctx, DUK__REGCONSTP(b)); /* -> [ ... escaped_source bytecode ] */ - duk_regexp_create_instance(thr); /* -> [ ... regexp_instance ] */ - DUK_DDD(DUK_DDDPRINT("regexp instance: %!iT", (duk_tval *) duk_get_tval(ctx, -1))); - duk_replace(ctx, (duk_idx_t) a); -#else - /* The compiler should never emit DUK_OP_REGEXP if there is no - * regexp support. - */ - DUK__INTERNAL_ERROR("no regexp support"); -#endif - + case DUK_OP_IFFALSE_R: { + if (duk_js_toboolean(DUK__REGP_BC(ins)) == 0) { + curr_pc++; + } break; } - - case DUK_OP_CSREG: - case DUK_OP_CSREGI: { - /* - * Assuming a register binds to a variable declared within this - * function (a declarative binding), the 'this' for the call - * setup is always 'undefined'. E5 Section 10.2.1.1.6. - */ - - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t b = DUK_DEC_B(ins); /* restricted to regs */ - duk_uint_fast_t idx; - - /* A -> target register (A, A+1) for call setup - * (for DUK_OP_CSREGI, 'a' is indirect) - * B -> register containing target function (not type checked here) - */ - - /* XXX: direct manipulation, or duk_replace_tval() */ - - /* Note: target registers a and a+1 may overlap with DUK__REGP(b). - * Careful here. - */ - - idx = (duk_uint_fast_t) DUK_DEC_A(ins); - if (DUK_DEC_OP(ins) == DUK_OP_CSREGI) { - duk_tval *tv_ind = DUK__REGP(idx); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); - idx = (duk_uint_fast_t) DUK_TVAL_GET_NUMBER(tv_ind); + case DUK_OP_IFFALSE_C: { + if (duk_js_toboolean(DUK__CONSTP_BC(ins)) == 0) { + curr_pc++; } + break; + } -#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK) - if (idx + 2 > (duk_uint_fast_t) duk_get_top(ctx)) { - /* XXX: use duk_is_valid_index() instead? */ - /* XXX: improve check; check against nregs, not against top */ - DUK__INTERNAL_ERROR("CSREG out of bounds"); - } -#endif +#if defined(DUK_USE_EXEC_PREFER_SIZE) + case DUK_OP_ADD_RR: + case DUK_OP_ADD_CR: + case DUK_OP_ADD_RC: + case DUK_OP_ADD_CC: { + /* XXX: could leave value on stack top and goto replace_top_a; */ + duk__vm_arith_add(thr, DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins), DUK_DEC_A(ins)); + break; + } +#else /* DUK_USE_EXEC_PREFER_SIZE */ + case DUK_OP_ADD_RR: { + duk__vm_arith_add(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins)); + break; + } + case DUK_OP_ADD_CR: { + duk__vm_arith_add(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins)); + break; + } + case DUK_OP_ADD_RC: { + duk__vm_arith_add(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins)); + break; + } + case DUK_OP_ADD_CC: { + duk__vm_arith_add(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins)); + break; + } +#endif /* DUK_USE_EXEC_PREFER_SIZE */ + +#if defined(DUK_USE_EXEC_PREFER_SIZE) + case DUK_OP_SUB_RR: + case DUK_OP_SUB_CR: + case DUK_OP_SUB_RC: + case DUK_OP_SUB_CC: + case DUK_OP_MUL_RR: + case DUK_OP_MUL_CR: + case DUK_OP_MUL_RC: + case DUK_OP_MUL_CC: + case DUK_OP_DIV_RR: + case DUK_OP_DIV_CR: + case DUK_OP_DIV_RC: + case DUK_OP_DIV_CC: + case DUK_OP_MOD_RR: + case DUK_OP_MOD_CR: + case DUK_OP_MOD_RC: + case DUK_OP_MOD_CC: +#if defined(DUK_USE_ES7_EXP_OPERATOR) + case DUK_OP_EXP_RR: + case DUK_OP_EXP_CR: + case DUK_OP_EXP_RC: + case DUK_OP_EXP_CC: +#endif /* DUK_USE_ES7_EXP_OPERATOR */ + { + /* XXX: could leave value on stack top and goto replace_top_a; */ + duk__vm_arith_binary_op(thr, DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins), DUK_DEC_A(ins), op); + break; + } +#else /* DUK_USE_EXEC_PREFER_SIZE */ + case DUK_OP_SUB_RR: { + duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB); + break; + } + case DUK_OP_SUB_CR: { + duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB); + break; + } + case DUK_OP_SUB_RC: { + duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB); + break; + } + case DUK_OP_SUB_CC: { + duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB); + break; + } + case DUK_OP_MUL_RR: { + duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL); + break; + } + case DUK_OP_MUL_CR: { + duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL); + break; + } + case DUK_OP_MUL_RC: { + duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL); + break; + } + case DUK_OP_MUL_CC: { + duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL); + break; + } + case DUK_OP_DIV_RR: { + duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV); + break; + } + case DUK_OP_DIV_CR: { + duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV); + break; + } + case DUK_OP_DIV_RC: { + duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV); + break; + } + case DUK_OP_DIV_CC: { + duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV); + break; + } + case DUK_OP_MOD_RR: { + duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD); + break; + } + case DUK_OP_MOD_CR: { + duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD); + break; + } + case DUK_OP_MOD_RC: { + duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD); + break; + } + case DUK_OP_MOD_CC: { + duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD); + break; + } +#if defined(DUK_USE_ES7_EXP_OPERATOR) + case DUK_OP_EXP_RR: { + duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP); + break; + } + case DUK_OP_EXP_CR: { + duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP); + break; + } + case DUK_OP_EXP_RC: { + duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP); + break; + } + case DUK_OP_EXP_CC: { + duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP); + break; + } +#endif /* DUK_USE_ES7_EXP_OPERATOR */ +#endif /* DUK_USE_EXEC_PREFER_SIZE */ + +#if defined(DUK_USE_EXEC_PREFER_SIZE) + case DUK_OP_BAND_RR: + case DUK_OP_BAND_CR: + case DUK_OP_BAND_RC: + case DUK_OP_BAND_CC: + case DUK_OP_BOR_RR: + case DUK_OP_BOR_CR: + case DUK_OP_BOR_RC: + case DUK_OP_BOR_CC: + case DUK_OP_BXOR_RR: + case DUK_OP_BXOR_CR: + case DUK_OP_BXOR_RC: + case DUK_OP_BXOR_CC: + case DUK_OP_BASL_RR: + case DUK_OP_BASL_CR: + case DUK_OP_BASL_RC: + case DUK_OP_BASL_CC: + case DUK_OP_BLSR_RR: + case DUK_OP_BLSR_CR: + case DUK_OP_BLSR_RC: + case DUK_OP_BLSR_CC: + case DUK_OP_BASR_RR: + case DUK_OP_BASR_CR: + case DUK_OP_BASR_RC: + case DUK_OP_BASR_CC: { + /* XXX: could leave value on stack top and goto replace_top_a; */ + duk__vm_bitwise_binary_op(thr, DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins), DUK_DEC_A(ins), op); + break; + } +#else /* DUK_USE_EXEC_PREFER_SIZE */ + case DUK_OP_BAND_RR: { + duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND); + break; + } + case DUK_OP_BAND_CR: { + duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND); + break; + } + case DUK_OP_BAND_RC: { + duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND); + break; + } + case DUK_OP_BAND_CC: { + duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND); + break; + } + case DUK_OP_BOR_RR: { + duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR); + break; + } + case DUK_OP_BOR_CR: { + duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR); + break; + } + case DUK_OP_BOR_RC: { + duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR); + break; + } + case DUK_OP_BOR_CC: { + duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR); + break; + } + case DUK_OP_BXOR_RR: { + duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR); + break; + } + case DUK_OP_BXOR_CR: { + duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR); + break; + } + case DUK_OP_BXOR_RC: { + duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR); + break; + } + case DUK_OP_BXOR_CC: { + duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR); + break; + } + case DUK_OP_BASL_RR: { + duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL); + break; + } + case DUK_OP_BASL_CR: { + duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL); + break; + } + case DUK_OP_BASL_RC: { + duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL); + break; + } + case DUK_OP_BASL_CC: { + duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL); + break; + } + case DUK_OP_BLSR_RR: { + duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR); + break; + } + case DUK_OP_BLSR_CR: { + duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR); + break; + } + case DUK_OP_BLSR_RC: { + duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR); + break; + } + case DUK_OP_BLSR_CC: { + duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR); + break; + } + case DUK_OP_BASR_RR: { + duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR); + break; + } + case DUK_OP_BASR_CR: { + duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR); + break; + } + case DUK_OP_BASR_RC: { + duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR); + break; + } + case DUK_OP_BASR_CC: { + duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR); + break; + } +#endif /* DUK_USE_EXEC_PREFER_SIZE */ + + /* For INSTOF and IN, B is always a register. */ +#define DUK__INSTOF_BODY(barg,carg) { \ + duk_bool_t tmp; \ + tmp = duk_js_instanceof(thr, (barg), (carg)); \ + DUK_ASSERT(tmp == 0 || tmp == 1); \ + DUK__REPLACE_BOOL_A_BREAK(tmp); \ + } +#define DUK__IN_BODY(barg,carg) { \ + duk_bool_t tmp; \ + tmp = duk_js_in(thr, (barg), (carg)); \ + DUK_ASSERT(tmp == 0 || tmp == 1); \ + DUK__REPLACE_BOOL_A_BREAK(tmp); \ + } +#if defined(DUK_USE_EXEC_PREFER_SIZE) + case DUK_OP_INSTOF_RR: + case DUK_OP_INSTOF_CR: + case DUK_OP_INSTOF_RC: + case DUK_OP_INSTOF_CC: + DUK__INSTOF_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); + case DUK_OP_IN_RR: + case DUK_OP_IN_CR: + case DUK_OP_IN_RC: + case DUK_OP_IN_CC: + DUK__IN_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); +#else /* DUK_USE_EXEC_PREFER_SIZE */ + case DUK_OP_INSTOF_RR: + DUK__INSTOF_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_INSTOF_CR: + DUK__INSTOF_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_INSTOF_RC: + DUK__INSTOF_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_INSTOF_CC: + DUK__INSTOF_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_IN_RR: + DUK__IN_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_IN_CR: + DUK__IN_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_IN_RC: + DUK__IN_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_IN_CC: + DUK__IN_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); +#endif /* DUK_USE_EXEC_PREFER_SIZE */ - duk_push_tval(ctx, DUK__REGP(b)); - duk_replace(ctx, (duk_idx_t) idx); - duk_push_undefined(ctx); - duk_replace(ctx, (duk_idx_t) (idx + 1)); + /* Pre/post inc/dec for register variables, important for loops. */ +#if defined(DUK_USE_EXEC_PREFER_SIZE) + case DUK_OP_PREINCR: + case DUK_OP_PREDECR: + case DUK_OP_POSTINCR: + case DUK_OP_POSTDECR: { + duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), op); + break; + } + case DUK_OP_PREINCV: + case DUK_OP_PREDECV: + case DUK_OP_POSTINCV: + case DUK_OP_POSTDECV: { + duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), op, DUK__STRICT()); + break; + } +#else /* DUK_USE_EXEC_PREFER_SIZE */ + case DUK_OP_PREINCR: { + duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_PREINCR); + break; + } + case DUK_OP_PREDECR: { + duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_PREDECR); + break; + } + case DUK_OP_POSTINCR: { + duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_POSTINCR); + break; + } + case DUK_OP_POSTDECR: { + duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_POSTDECR); + break; + } + case DUK_OP_PREINCV: { + duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_PREINCV, DUK__STRICT()); + break; + } + case DUK_OP_PREDECV: { + duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_PREDECV, DUK__STRICT()); + break; + } + case DUK_OP_POSTINCV: { + duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_POSTINCV, DUK__STRICT()); + break; + } + case DUK_OP_POSTDECV: { + duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_POSTDECV, DUK__STRICT()); break; } +#endif /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_GETVAR: { + /* XXX: Move to separate helper, optimize for perf/size separately. */ + /* Preinc/predec for object properties. */ + case DUK_OP_PREINCP_RR: + case DUK_OP_PREINCP_CR: + case DUK_OP_PREINCP_RC: + case DUK_OP_PREINCP_CC: + case DUK_OP_PREDECP_RR: + case DUK_OP_PREDECP_CR: + case DUK_OP_PREDECP_RC: + case DUK_OP_PREDECP_CC: + case DUK_OP_POSTINCP_RR: + case DUK_OP_POSTINCP_CR: + case DUK_OP_POSTINCP_RC: + case DUK_OP_POSTINCP_CC: + case DUK_OP_POSTDECP_RR: + case DUK_OP_POSTDECP_CR: + case DUK_OP_POSTDECP_RC: + case DUK_OP_POSTDECP_CC: { duk_context *ctx = (duk_context *) thr; - duk_activation *act; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_uint_fast_t bc = DUK_DEC_BC(ins); - duk_tval *tv1; - duk_hstring *name; - - tv1 = DUK__CONSTP(bc); - DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); - name = DUK_TVAL_GET_STRING(tv1); - DUK_ASSERT(name != NULL); - DUK_DDD(DUK_DDDPRINT("GETVAR: '%!O'", (duk_heaphdr *) name)); - act = thr->callstack + thr->callstack_top - 1; - (void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/); /* -> [... val this] */ + duk_tval *tv_obj; + duk_tval *tv_key; + duk_tval *tv_val; + duk_bool_t rc; + duk_double_t x, y, z; +#if !defined(DUK_USE_EXEC_PREFER_SIZE) + duk_tval *tv_dst; +#endif /* DUK_USE_EXEC_PREFER_SIZE */ - duk_pop(ctx); /* 'this' binding is not needed here */ - duk_replace(ctx, (duk_idx_t) a); - break; - } + /* A -> target reg + * B -> object reg/const (may be const e.g. in "'foo'[1]") + * C -> key reg/const + */ - case DUK_OP_PUTVAR: { - duk_activation *act; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_uint_fast_t bc = DUK_DEC_BC(ins); - duk_tval *tv1; - duk_hstring *name; + /* Opcode bits 0-1 are used to distinguish reg/const variants. + * Opcode bits 2-3 are used to distinguish inc/dec variants: + * Bit 2 = inc(0)/dec(1), bit 3 = pre(0)/post(1). + */ + DUK_ASSERT((DUK_OP_PREINCP_RR & 0x0c) == 0x00); + DUK_ASSERT((DUK_OP_PREDECP_RR & 0x0c) == 0x04); + DUK_ASSERT((DUK_OP_POSTINCP_RR & 0x0c) == 0x08); + DUK_ASSERT((DUK_OP_POSTDECP_RR & 0x0c) == 0x0c); - tv1 = DUK__CONSTP(bc); - DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); - name = DUK_TVAL_GET_STRING(tv1); - DUK_ASSERT(name != NULL); + tv_obj = DUK__REGCONSTP_B(ins); + tv_key = DUK__REGCONSTP_C(ins); + rc = duk_hobject_getprop(thr, tv_obj, tv_key); /* -> [val] */ + DUK_UNREF(rc); /* ignore */ + tv_obj = NULL; /* invalidated */ + tv_key = NULL; /* invalidated */ - /* XXX: putvar takes a duk_tval pointer, which is awkward and - * should be reworked. + /* XXX: Fastint fast path would be useful here. Also fastints + * now lose their fastint status in current handling which is + * not intuitive. */ - tv1 = DUK__REGP(a); /* val */ - act = thr->callstack + thr->callstack_top - 1; - duk_js_putvar_activation(thr, act, name, tv1, DUK__STRICT()); + x = duk_to_number_m1(ctx); + duk_pop(ctx); + if (ins & DUK_BC_INCDECP_FLAG_DEC) { + y = x - 1.0; + } else { + y = x + 1.0; + } + + duk_push_number(ctx, y); + tv_val = DUK_GET_TVAL_NEGIDX(ctx, -1); + DUK_ASSERT(tv_val != NULL); + tv_obj = DUK__REGCONSTP_B(ins); + tv_key = DUK__REGCONSTP_C(ins); + rc = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, DUK__STRICT()); + DUK_UNREF(rc); /* ignore */ + tv_obj = NULL; /* invalidated */ + tv_key = NULL; /* invalidated */ + duk_pop(ctx); + + z = (ins & DUK_BC_INCDECP_FLAG_POST) ? x : y; +#if defined(DUK_USE_EXEC_PREFER_SIZE) + duk_push_number(ctx, z); + DUK__REPLACE_TOP_A_BREAK(); +#else + tv_dst = DUK__REGP_A(ins); + DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_dst, z); break; +#endif } - case DUK_OP_DECLVAR: { + /* XXX: GETPROP where object is 'this', GETPROPT? + * Occurs relatively often in object oriented code. + */ + +#define DUK__GETPROP_BODY(barg,carg) { \ + /* A -> target reg \ + * B -> object reg/const (may be const e.g. in "'foo'[1]") \ + * C -> key reg/const \ + */ \ + (void) duk_hobject_getprop(thr, (barg), (carg)); \ + DUK__REPLACE_TOP_A_BREAK(); \ + } +#define DUK__PUTPROP_BODY(aarg,barg,carg) { \ + /* A -> object reg \ + * B -> key reg/const \ + * C -> value reg/const \ + * \ + * Note: intentional difference to register arrangement \ + * of e.g. GETPROP; 'A' must contain a register-only value. \ + */ \ + (void) duk_hobject_putprop(thr, (aarg), (barg), (carg), DUK__STRICT()); \ + break; \ + } +#define DUK__DELPROP_BODY(barg,carg) { \ + /* A -> result reg \ + * B -> object reg \ + * C -> key reg/const \ + */ \ + duk_bool_t rc; \ + rc = duk_hobject_delprop(thr, (barg), (carg), DUK__STRICT()); \ + DUK_ASSERT(rc == 0 || rc == 1); \ + DUK__REPLACE_BOOL_A_BREAK(rc); \ + } +#if defined(DUK_USE_EXEC_PREFER_SIZE) + case DUK_OP_GETPROP_RR: + case DUK_OP_GETPROP_CR: + case DUK_OP_GETPROP_RC: + case DUK_OP_GETPROP_CC: + DUK__GETPROP_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); + case DUK_OP_PUTPROP_RR: + case DUK_OP_PUTPROP_CR: + case DUK_OP_PUTPROP_RC: + case DUK_OP_PUTPROP_CC: + DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); + case DUK_OP_DELPROP_RR: + case DUK_OP_DELPROP_RC: /* B is always reg */ + DUK__DELPROP_BODY(DUK__REGP_B(ins), DUK__REGCONSTP_C(ins)); +#else /* DUK_USE_EXEC_PREFER_SIZE */ + case DUK_OP_GETPROP_RR: + DUK__GETPROP_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_GETPROP_CR: + DUK__GETPROP_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_GETPROP_RC: + DUK__GETPROP_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_GETPROP_CC: + DUK__GETPROP_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_PUTPROP_RR: + DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__REGP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_PUTPROP_CR: + DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__CONSTP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_PUTPROP_RC: + DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__REGP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_PUTPROP_CC: + DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); + case DUK_OP_DELPROP_RR: /* B is always reg */ + DUK__DELPROP_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); + case DUK_OP_DELPROP_RC: + DUK__DELPROP_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); +#endif /* DUK_USE_EXEC_PREFER_SIZE */ + + /* No fast path for DECLVAR now, it's quite a rare instruction. */ + case DUK_OP_DECLVAR_RR: + case DUK_OP_DECLVAR_CR: + case DUK_OP_DECLVAR_RC: + case DUK_OP_DECLVAR_CC: { duk_activation *act; duk_context *ctx = (duk_context *) thr; duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); duk_tval *tv1; duk_hstring *name; duk_small_uint_t prop_flags; duk_bool_t is_func_decl; duk_bool_t is_undef_value; - tv1 = DUK__REGCONSTP(b); + tv1 = DUK__REGCONSTP_B(ins); DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); name = DUK_TVAL_GET_STRING(tv1); DUK_ASSERT(name != NULL); @@ -67946,9 +72192,10 @@ DUK_LOCAL DUK_NOINLINE void duk__js_execute_bytecode_inner(duk_hthread *entry_th prop_flags = a & DUK_PROPDESC_FLAGS_MASK; if (is_undef_value) { - duk_push_undefined(ctx); + DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); /* valstack policy */ + thr->valstack_top++; } else { - duk_push_tval(ctx, DUK__REGCONSTP(c)); + duk_push_tval(ctx, DUK__REGCONSTP_C(ins)); } tv1 = DUK_GET_TVAL_NEGIDX(ctx, -1); @@ -67963,83 +72210,68 @@ DUK_LOCAL DUK_NOINLINE void duk__js_execute_bytecode_inner(duk_hthread *entry_th break; } - case DUK_OP_DELVAR: { - duk_activation *act; - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_tval *tv1; - duk_hstring *name; - duk_bool_t rc; - - tv1 = DUK__REGCONSTP(b); - DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); - name = DUK_TVAL_GET_STRING(tv1); - DUK_ASSERT(name != NULL); - DUK_DDD(DUK_DDDPRINT("DELVAR '%!O'", (duk_heaphdr *) name)); - act = thr->callstack + thr->callstack_top - 1; - rc = duk_js_delvar_activation(thr, act, name); +#if defined(DUK_USE_REGEXP_SUPPORT) + /* The compiler should never emit DUK_OP_REGEXP if there is no + * regexp support. + */ + case DUK_OP_REGEXP_RR: + case DUK_OP_REGEXP_CR: + case DUK_OP_REGEXP_RC: + case DUK_OP_REGEXP_CC: { + /* A -> target register + * B -> bytecode (also contains flags) + * C -> escaped source + */ - duk_push_boolean(ctx, rc); - duk_replace(ctx, (duk_idx_t) a); - break; + duk_push_tval((duk_context *) thr, DUK__REGCONSTP_C(ins)); + duk_push_tval((duk_context *) thr, DUK__REGCONSTP_B(ins)); /* -> [ ... escaped_source bytecode ] */ + duk_regexp_create_instance(thr); /* -> [ ... regexp_instance ] */ + DUK__REPLACE_TOP_A_BREAK(); } +#endif /* DUK_USE_REGEXP_SUPPORT */ - case DUK_OP_CSVAR: - case DUK_OP_CSVARI: { - /* 'this' value: - * E5 Section 6.b.i + /* XXX: 'c' is unused, use whole BC, etc. */ + case DUK_OP_CSVAR_RR: + case DUK_OP_CSVAR_CR: + case DUK_OP_CSVAR_RC: + case DUK_OP_CSVAR_CC: { + /* The speciality of calling through a variable binding is that the + * 'this' value may be provided by the variable lookup: E5 Section 6.b.i. * * The only (standard) case where the 'this' binding is non-null is when * (1) the variable is found in an object environment record, and * (2) that object environment record is a 'with' block. - * */ duk_context *ctx = (duk_context *) thr; duk_activation *act; - duk_small_uint_fast_t b = DUK_DEC_B(ins); duk_uint_fast_t idx; duk_tval *tv1; duk_hstring *name; - tv1 = DUK__REGCONSTP(b); + /* A -> target registers (A, A + 1) for call setup + * B -> identifier name, usually constant but can be a register due to shuffling + */ + + tv1 = DUK__REGCONSTP_B(ins); DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); name = DUK_TVAL_GET_STRING(tv1); DUK_ASSERT(name != NULL); act = thr->callstack + thr->callstack_top - 1; (void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/); /* -> [... val this] */ - /* Note: target registers a and a+1 may overlap with DUK__REGCONSTP(b) - * and DUK__REGCONSTP(c). Careful here. - */ - idx = (duk_uint_fast_t) DUK_DEC_A(ins); - if (DUK_DEC_OP(ins) == DUK_OP_CSVARI) { - duk_tval *tv_ind = DUK__REGP(idx); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); - idx = (duk_uint_fast_t) DUK_TVAL_GET_NUMBER(tv_ind); - } - -#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK) - if (idx + 2 > (duk_uint_fast_t) duk_get_top(ctx)) { - /* XXX: use duk_is_valid_index() instead? */ - /* XXX: improve check; check against nregs, not against top */ - DUK__INTERNAL_ERROR("CSVAR out of bounds"); - } -#endif + /* Could add direct value stack handling. */ duk_replace(ctx, (duk_idx_t) (idx + 1)); /* 'this' binding */ duk_replace(ctx, (duk_idx_t) idx); /* variable value (function, we hope, not checked here) */ break; } case DUK_OP_CLOSURE: { - duk_context *ctx = (duk_context *) thr; duk_activation *act; - duk_hcompiledfunction *fun; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_uint_fast_t bc = DUK_DEC_BC(ins); + duk_hcompfunc *fun_act; + duk_small_uint_fast_t bc = DUK_DEC_BC(ins); duk_hobject *fun_temp; /* A -> target reg @@ -68047,16 +72279,16 @@ DUK_LOCAL DUK_NOINLINE void duk__js_execute_bytecode_inner(duk_hthread *entry_th */ DUK_DDD(DUK_DDDPRINT("CLOSURE to target register %ld, fnum %ld (count %ld)", - (long) a, (long) bc, (long) DUK_HCOMPILEDFUNCTION_GET_FUNCS_COUNT(thr->heap, DUK__FUN()))); + (long) DUK_DEC_A(ins), (long) DUK_DEC_BC(ins), (long) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, DUK__FUN()))); DUK_ASSERT_DISABLE(bc >= 0); /* unsigned */ - DUK_ASSERT((duk_uint_t) bc < (duk_uint_t) DUK_HCOMPILEDFUNCTION_GET_FUNCS_COUNT(thr->heap, DUK__FUN())); + DUK_ASSERT((duk_uint_t) bc < (duk_uint_t) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, DUK__FUN())); act = thr->callstack + thr->callstack_top - 1; - fun = (duk_hcompiledfunction *) DUK_ACT_GET_FUNC(act); - fun_temp = DUK_HCOMPILEDFUNCTION_GET_FUNCS_BASE(thr->heap, fun)[bc]; + fun_act = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act); + fun_temp = DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, fun_act)[bc]; DUK_ASSERT(fun_temp != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_COMPILEDFUNCTION(fun_temp)); + DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(fun_temp)); DUK_DDD(DUK_DDDPRINT("CLOSURE: function template is: %p -> %!O", (void *) fun_temp, (duk_heaphdr *) fun_temp)); @@ -68073,558 +72305,218 @@ DUK_LOCAL DUK_NOINLINE void duk__js_execute_bytecode_inner(duk_hthread *entry_th * matters here. */ duk_js_push_closure(thr, - (duk_hcompiledfunction *) fun_temp, + (duk_hcompfunc *) fun_temp, act->var_env, act->lex_env, 1 /*add_auto_proto*/); - duk_replace(ctx, (duk_idx_t) a); - - break; + DUK__REPLACE_TOP_A_BREAK(); } - case DUK_OP_GETPROP: { + case DUK_OP_GETVAR: { duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_tval *tv_obj; - duk_tval *tv_key; - duk_bool_t rc; - - /* A -> target reg - * B -> object reg/const (may be const e.g. in "'foo'[1]") - * C -> key reg/const - */ - - tv_obj = DUK__REGCONSTP(b); - tv_key = DUK__REGCONSTP(c); - DUK_DDD(DUK_DDDPRINT("GETPROP: a=%ld obj=%!T, key=%!T", - (long) a, - (duk_tval *) DUK__REGCONSTP(b), - (duk_tval *) DUK__REGCONSTP(c))); - rc = duk_hobject_getprop(thr, tv_obj, tv_key); /* -> [val] */ - DUK_UNREF(rc); /* ignore */ - DUK_DDD(DUK_DDDPRINT("GETPROP --> %!T", - (duk_tval *) duk_get_tval(ctx, -1))); - tv_obj = NULL; /* invalidated */ - tv_key = NULL; /* invalidated */ + duk_activation *act; + duk_tval *tv1; + duk_hstring *name; - duk_replace(ctx, (duk_idx_t) a); /* val */ - break; + tv1 = DUK__CONSTP_BC(ins); + DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); + name = DUK_TVAL_GET_STRING(tv1); + DUK_ASSERT(name != NULL); + act = thr->callstack + thr->callstack_top - 1; + (void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/); /* -> [... val this] */ + duk_pop(ctx); /* 'this' binding is not needed here */ + DUK__REPLACE_TOP_A_BREAK(); } - case DUK_OP_PUTPROP: { - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_tval *tv_obj; - duk_tval *tv_key; - duk_tval *tv_val; - duk_bool_t rc; - - /* A -> object reg - * B -> key reg/const - * C -> value reg/const - * - * Note: intentional difference to register arrangement - * of e.g. GETPROP; 'A' must contain a register-only value. - */ - - tv_obj = DUK__REGP(a); - tv_key = DUK__REGCONSTP(b); - tv_val = DUK__REGCONSTP(c); - DUK_DDD(DUK_DDDPRINT("PUTPROP: obj=%!T, key=%!T, val=%!T", - (duk_tval *) DUK__REGP(a), - (duk_tval *) DUK__REGCONSTP(b), - (duk_tval *) DUK__REGCONSTP(c))); - rc = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, DUK__STRICT()); - DUK_UNREF(rc); /* ignore */ - DUK_DDD(DUK_DDDPRINT("PUTPROP --> obj=%!T, key=%!T, val=%!T", - (duk_tval *) DUK__REGP(a), - (duk_tval *) DUK__REGCONSTP(b), - (duk_tval *) DUK__REGCONSTP(c))); - tv_obj = NULL; /* invalidated */ - tv_key = NULL; /* invalidated */ - tv_val = NULL; /* invalidated */ - - break; - } + case DUK_OP_PUTVAR: { + duk_activation *act; + duk_tval *tv1; + duk_hstring *name; - case DUK_OP_DELPROP: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_tval *tv_obj; - duk_tval *tv_key; - duk_bool_t rc; + tv1 = DUK__CONSTP_BC(ins); + DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); + name = DUK_TVAL_GET_STRING(tv1); + DUK_ASSERT(name != NULL); - /* A -> result reg - * B -> object reg - * C -> key reg/const + /* XXX: putvar takes a duk_tval pointer, which is awkward and + * should be reworked. */ - tv_obj = DUK__REGP(b); - tv_key = DUK__REGCONSTP(c); - rc = duk_hobject_delprop(thr, tv_obj, tv_key, DUK__STRICT()); - tv_obj = NULL; /* invalidated */ - tv_key = NULL; /* invalidated */ - - duk_push_boolean(ctx, rc); - duk_replace(ctx, (duk_idx_t) a); /* result */ + tv1 = DUK__REGP_A(ins); /* val */ + act = thr->callstack + thr->callstack_top - 1; + duk_js_putvar_activation(thr, act, name, tv1, DUK__STRICT()); break; } - case DUK_OP_CSPROP: - case DUK_OP_CSPROPI: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_uint_fast_t idx; - duk_tval *tv_obj; - duk_tval *tv_key; + case DUK_OP_DELVAR: { + duk_activation *act; + duk_tval *tv1; + duk_hstring *name; duk_bool_t rc; - /* E5 Section 11.2.3, step 6.a.i */ - /* E5 Section 10.4.3 */ - - /* XXX: allow object to be a const, e.g. in 'foo'.toString()? - * On the other hand, DUK_REGCONSTP() is slower and generates - * more code. - */ - - tv_obj = DUK__REGP(b); - tv_key = DUK__REGCONSTP(c); - rc = duk_hobject_getprop(thr, tv_obj, tv_key); /* -> [val] */ - DUK_UNREF(rc); /* unused */ - tv_obj = NULL; /* invalidated */ - tv_key = NULL; /* invalidated */ + tv1 = DUK__CONSTP_BC(ins); + DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); + name = DUK_TVAL_GET_STRING(tv1); + DUK_ASSERT(name != NULL); + act = thr->callstack + thr->callstack_top - 1; + rc = duk_js_delvar_activation(thr, act, name); + DUK__REPLACE_BOOL_A_BREAK(rc); + } - /* Note: target registers a and a+1 may overlap with DUK__REGP(b) - * and DUK__REGCONSTP(c). Careful here. + case DUK_OP_JUMP: { + /* Note: without explicit cast to signed, MSVC will + * apparently generate a large positive jump when the + * bias-corrected value would normally be negative. */ - - idx = (duk_uint_fast_t) DUK_DEC_A(ins); - if (DUK_DEC_OP(ins) == DUK_OP_CSPROPI) { - duk_tval *tv_ind = DUK__REGP(idx); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); - idx = (duk_uint_fast_t) DUK_TVAL_GET_NUMBER(tv_ind); - } - -#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK) - if (idx + 2 > (duk_uint_fast_t) duk_get_top(ctx)) { - /* XXX: use duk_is_valid_index() instead? */ - /* XXX: improve check; check against nregs, not against top */ - DUK__INTERNAL_ERROR("CSPROP out of bounds"); - } -#endif - - duk_push_tval(ctx, DUK__REGP(b)); /* [ ... val obj ] */ - duk_replace(ctx, (duk_idx_t) (idx + 1)); /* 'this' binding */ - duk_replace(ctx, (duk_idx_t) idx); /* val */ + curr_pc += (duk_int_fast_t) DUK_DEC_ABC(ins) - (duk_int_fast_t) DUK_BC_JUMP_BIAS; break; } - case DUK_OP_ADD: - case DUK_OP_SUB: - case DUK_OP_MUL: - case DUK_OP_DIV: - case DUK_OP_MOD: { - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_small_uint_fast_t op = DUK_DEC_OP(ins); +#define DUK__RETURN_SHARED() do { \ + duk_small_uint_t ret_result; \ + /* duk__handle_return() is guaranteed never to throw, except \ + * for potential out-of-memory situations which will then \ + * propagate out of the executor longjmp handler. \ + */ \ + ret_result = duk__handle_return(thr, \ + entry_thread, \ + entry_callstack_top); \ + if (ret_result == DUK__RETHAND_RESTART) { \ + goto restart_execution; \ + } \ + DUK_ASSERT(ret_result == DUK__RETHAND_FINISHED); \ + return; \ + } while (0) +#if defined(DUK_USE_EXEC_PREFER_SIZE) + case DUK_OP_RETREG: + case DUK_OP_RETCONST: + case DUK_OP_RETCONSTN: + case DUK_OP_RETUNDEF: { + /* BC -> return value reg/const */ - if (op == DUK_OP_ADD) { - /* - * Handling DUK_OP_ADD this way is more compact (experimentally) - * than a separate case with separate argument decoding. - */ - duk__vm_arith_add(thr, DUK__REGCONSTP(b), DUK__REGCONSTP(c), a); + DUK__SYNC_AND_NULL_CURR_PC(); + + if (op == DUK_OP_RETREG) { + duk_push_tval((duk_context *) thr, DUK__REGP_BC(ins)); + } else if (op == DUK_OP_RETUNDEF) { + DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); /* valstack policy */ + thr->valstack_top++; } else { - duk__vm_arith_binary_op(thr, DUK__REGCONSTP(b), DUK__REGCONSTP(c), a, op); + DUK_ASSERT(op == DUK_OP_RETCONST || op == DUK_OP_RETCONSTN); + duk_push_tval((duk_context *) thr, DUK__CONSTP_BC(ins)); } - break; - } - - case DUK_OP_BAND: - case DUK_OP_BOR: - case DUK_OP_BXOR: - case DUK_OP_BASL: - case DUK_OP_BLSR: - case DUK_OP_BASR: { - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_small_uint_fast_t op = DUK_DEC_OP(ins); - duk__vm_bitwise_binary_op(thr, DUK__REGCONSTP(b), DUK__REGCONSTP(c), a, op); - break; + DUK__RETURN_SHARED(); } +#else /* DUK_USE_EXEC_PREFER_SIZE */ + case DUK_OP_RETREG: { + duk_tval *tv; - case DUK_OP_EQ: - case DUK_OP_NEQ: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_bool_t tmp; - - /* E5 Sections 11.9.1, 11.9.3 */ - tmp = duk_js_equals(thr, DUK__REGCONSTP(b), DUK__REGCONSTP(c)); - if (DUK_DEC_OP(ins) == DUK_OP_NEQ) { - tmp = !tmp; - } - duk_push_boolean(ctx, tmp); - duk_replace(ctx, (duk_idx_t) a); - break; + DUK__SYNC_AND_NULL_CURR_PC(); + tv = DUK__REGP_BC(ins); + DUK_TVAL_SET_TVAL(thr->valstack_top, tv); + DUK_TVAL_INCREF(thr, tv); + thr->valstack_top++; + DUK__RETURN_SHARED(); } + case DUK_OP_RETCONST: { + duk_tval *tv; - case DUK_OP_SEQ: - case DUK_OP_SNEQ: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_bool_t tmp; - - /* E5 Sections 11.9.1, 11.9.3 */ - tmp = duk_js_strict_equals(DUK__REGCONSTP(b), DUK__REGCONSTP(c)); - if (DUK_DEC_OP(ins) == DUK_OP_SNEQ) { - tmp = !tmp; - } - duk_push_boolean(ctx, tmp); - duk_replace(ctx, (duk_idx_t) a); - break; + DUK__SYNC_AND_NULL_CURR_PC(); + tv = DUK__CONSTP_BC(ins); + DUK_TVAL_SET_TVAL(thr->valstack_top, tv); + DUK_TVAL_INCREF(thr, tv); + thr->valstack_top++; + DUK__RETURN_SHARED(); } + case DUK_OP_RETCONSTN: { + duk_tval *tv; - /* Note: combining comparison ops must be done carefully because - * of uncomparable values (NaN): it's not necessarily true that - * (x >= y) === !(x < y). Also, evaluation order matters, and - * although it would only seem to affect the compiler this is - * actually not the case, because there are also run-time coercions - * of the arguments (with potential side effects). - * - * XXX: can be combined; check code size. - */ - - case DUK_OP_GT: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_bool_t tmp; - - /* x > y --> y < x */ - tmp = duk_js_compare_helper(thr, - DUK__REGCONSTP(c), /* y */ - DUK__REGCONSTP(b), /* x */ - 0); /* flags */ - - duk_push_boolean(ctx, tmp); - duk_replace(ctx, (duk_idx_t) a); - break; + DUK__SYNC_AND_NULL_CURR_PC(); + tv = DUK__CONSTP_BC(ins); + DUK_TVAL_SET_TVAL(thr->valstack_top, tv); + DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv)); /* no INCREF for this constant */ + thr->valstack_top++; + DUK__RETURN_SHARED(); } - - case DUK_OP_GE: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_bool_t tmp; - - /* x >= y --> not (x < y) */ - tmp = duk_js_compare_helper(thr, - DUK__REGCONSTP(b), /* x */ - DUK__REGCONSTP(c), /* y */ - DUK_COMPARE_FLAG_EVAL_LEFT_FIRST | - DUK_COMPARE_FLAG_NEGATE); /* flags */ - - duk_push_boolean(ctx, tmp); - duk_replace(ctx, (duk_idx_t) a); - break; + case DUK_OP_RETUNDEF: { + DUK__SYNC_AND_NULL_CURR_PC(); + thr->valstack_top++; /* value at valstack top is already undefined by valstack policy */ + DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); + DUK__RETURN_SHARED(); } +#endif /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_LT: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_bool_t tmp; + case DUK_OP_LABEL: { + duk_catcher *cat; + duk_small_uint_fast_t bc = DUK_DEC_BC(ins); - /* x < y */ - tmp = duk_js_compare_helper(thr, - DUK__REGCONSTP(b), /* x */ - DUK__REGCONSTP(c), /* y */ - DUK_COMPARE_FLAG_EVAL_LEFT_FIRST); /* flags */ + /* allocate catcher and populate it (should be atomic) */ - duk_push_boolean(ctx, tmp); - duk_replace(ctx, (duk_idx_t) a); - break; - } + duk_hthread_catchstack_grow(thr); + cat = thr->catchstack + thr->catchstack_top; + thr->catchstack_top++; - case DUK_OP_LE: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_bool_t tmp; + cat->flags = DUK_CAT_TYPE_LABEL | (bc << DUK_CAT_LABEL_SHIFT); + cat->callstack_index = thr->callstack_top - 1; + cat->pc_base = (duk_instr_t *) curr_pc; /* pre-incremented, points to first jump slot */ + cat->idx_base = 0; /* unused for label */ + cat->h_varname = NULL; - /* x <= y --> not (x > y) --> not (y < x) */ - tmp = duk_js_compare_helper(thr, - DUK__REGCONSTP(c), /* y */ - DUK__REGCONSTP(b), /* x */ - DUK_COMPARE_FLAG_NEGATE); /* flags */ + DUK_DDD(DUK_DDDPRINT("LABEL catcher: flags=0x%08lx, callstack_index=%ld, pc_base=%ld, " + "idx_base=%ld, h_varname=%!O, label_id=%ld", + (long) cat->flags, (long) cat->callstack_index, (long) cat->pc_base, + (long) cat->idx_base, (duk_heaphdr *) cat->h_varname, (long) DUK_CAT_GET_LABEL(cat))); - duk_push_boolean(ctx, tmp); - duk_replace(ctx, (duk_idx_t) a); + curr_pc += 2; /* skip jump slots */ break; } - case DUK_OP_IF: { - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_bool_t tmp; + case DUK_OP_ENDLABEL: { + duk_catcher *cat; +#if (defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)) || defined(DUK_USE_ASSERTIONS) + duk_small_uint_fast_t bc = DUK_DEC_BC(ins); +#endif +#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) + DUK_DDD(DUK_DDDPRINT("ENDLABEL %ld", (long) bc)); +#endif - tmp = duk_js_toboolean(DUK__REGCONSTP(b)); - if (tmp == (duk_bool_t) a) { - /* if boolean matches A, skip next inst */ - curr_pc++; - } else { - ; - } - break; - } + DUK_ASSERT(thr->catchstack_top >= 1); - case DUK_OP_JUMP: { - duk_int_fast_t abc = DUK_DEC_ABC(ins); + cat = thr->catchstack + thr->catchstack_top - 1; + DUK_UNREF(cat); + DUK_ASSERT(DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_LABEL); + DUK_ASSERT((duk_uint_fast_t) DUK_CAT_GET_LABEL(cat) == bc); - curr_pc += abc - DUK_BC_JUMP_BIAS; + duk_hthread_catchstack_unwind(thr, thr->catchstack_top - 1); + /* no need to unwind callstack */ break; } - case DUK_OP_RETURN: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - /* duk_small_uint_fast_t c = DUK_DEC_C(ins); */ - duk_small_uint_t ret_result; - - /* A -> flags - * B -> return value reg/const - * C -> currently unused - */ + case DUK_OP_BREAK: { + duk_small_uint_fast_t bc = DUK_DEC_BC(ins); DUK__SYNC_AND_NULL_CURR_PC(); - - /* duk__handle_return() is guaranteed never to throw, except - * for potential out-of-memory situations which will then - * propagate out of the executor longjmp handler. - */ - - if (a & DUK_BC_RETURN_FLAG_HAVE_RETVAL) { - duk_push_tval(ctx, DUK__REGCONSTP(b)); - } else { - duk_push_undefined(ctx); - } - ret_result = duk__handle_return(thr, - entry_thread, - entry_callstack_top); - if (ret_result == DUK__RETHAND_RESTART) { - goto restart_execution; - } - DUK_ASSERT(ret_result == DUK__RETHAND_FINISHED); - - DUK_DDD(DUK_DDDPRINT("exiting executor after RETURN handling")); - return; + duk__handle_break_or_continue(thr, (duk_uint_t) bc, DUK_LJ_TYPE_BREAK); + goto restart_execution; } - case DUK_OP_CALL: - case DUK_OP_CALLI: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_uint_fast_t idx; - duk_small_uint_t call_flags; - duk_small_uint_t flag_tailcall; - duk_small_uint_t flag_evalcall; - duk_tval *tv_func; - duk_hobject *obj_func; - duk_bool_t setup_rc; - duk_idx_t num_stack_args; -#if !defined(DUK_USE_EXEC_FUN_LOCAL) - duk_hcompiledfunction *fun; -#endif - - /* A -> flags - * B -> base register for call (base -> func, base+1 -> this, base+2 -> arg1 ... base+2+N-1 -> argN) - * (for DUK_OP_CALLI, 'b' is indirect) - * C -> nargs - */ - - /* these are not necessarily 0 or 1 (may be other non-zero), that's ok */ - flag_tailcall = (a & DUK_BC_CALL_FLAG_TAILCALL); - flag_evalcall = (a & DUK_BC_CALL_FLAG_EVALCALL); - - idx = (duk_uint_fast_t) DUK_DEC_B(ins); - if (DUK_DEC_OP(ins) == DUK_OP_CALLI) { - duk_tval *tv_ind = DUK__REGP(idx); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); - idx = (duk_uint_fast_t) DUK_TVAL_GET_NUMBER(tv_ind); - } - -#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK) - if (!duk_is_valid_index(ctx, (duk_idx_t) idx)) { - /* XXX: improve check; check against nregs, not against top */ - DUK__INTERNAL_ERROR("CALL out of bounds"); - } -#endif - - /* - * To determine whether to use an optimized Ecmascript-to-Ecmascript - * call, we need to know whether the final, non-bound function is an - * Ecmascript function. - * - * This is now implemented so that we start to do an ecma-to-ecma call - * setup which will resolve the bound chain as the first thing. If the - * final function is not eligible, the return value indicates that the - * ecma-to-ecma call is not possible. The setup will overwrite the call - * target at DUK__REGP(idx) with the final, non-bound function (which - * may be a lightfunc), and fudge arguments if necessary. - * - * XXX: If an ecma-to-ecma call is not possible, this initial call - * setup will do bound function chain resolution but won't do the - * "effective this binding" resolution which is quite confusing. - * Perhaps add a helper for doing bound function and effective this - * binding resolution - and call that explicitly? Ecma-to-ecma call - * setup and normal function handling can then assume this prestep has - * been done by the caller. - */ - - duk_set_top(ctx, (duk_idx_t) (idx + c + 2)); /* [ ... func this arg1 ... argN ] */ - - call_flags = 0; - if (flag_tailcall) { - /* We request a tail call, but in some corner cases - * call handling can decide that a tail call is - * actually not possible. - * See: test-bug-tailcall-preventyield-assert.c. - */ - call_flags |= DUK_CALL_FLAG_IS_TAILCALL; - } - - /* Compared to duk_handle_call(): - * - protected call: never - * - ignore recursion limit: never - */ - num_stack_args = c; - setup_rc = duk_handle_ecma_call_setup(thr, - num_stack_args, - call_flags); - - if (setup_rc) { - /* Ecma-to-ecma call possible, may or may not be a tail call. - * Avoid C recursion by being clever. - */ - DUK_DDD(DUK_DDDPRINT("ecma-to-ecma call setup possible, restart execution")); - /* curr_pc synced by duk_handle_ecma_call_setup() */ - goto restart_execution; - } - DUK_ASSERT(thr->ptr_curr_pc != NULL); /* restored if ecma-to-ecma setup fails */ - - DUK_DDD(DUK_DDDPRINT("ecma-to-ecma call not possible, target is native (may be lightfunc)")); - - /* Recompute argument count: bound function handling may have shifted. */ - num_stack_args = duk_get_top(ctx) - (idx + 2); - DUK_DDD(DUK_DDDPRINT("recomputed arg count: %ld\n", (long) num_stack_args)); - - tv_func = DUK__REGP(idx); /* Relookup if relocated */ - if (DUK_TVAL_IS_LIGHTFUNC(tv_func)) { - - call_flags = 0; /* not protected, respect reclimit, not constructor */ - - /* There is no eval() special handling here: eval() is never - * automatically converted to a lightfunc. - */ - DUK_ASSERT(DUK_TVAL_GET_LIGHTFUNC_FUNCPTR(tv_func) != duk_bi_global_object_eval); - - duk_handle_call_unprotected(thr, - num_stack_args, - call_flags); - - /* duk_js_call.c is required to restore the stack reserve - * so we only need to reset the top. - */ -#if !defined(DUK_USE_EXEC_FUN_LOCAL) - fun = DUK__FUN(); -#endif - duk_set_top(ctx, (duk_idx_t) fun->nregs); - - /* No need to reinit setjmp() catchpoint, as call handling - * will store and restore our state. - */ - } else { - /* Call setup checks callability. */ - DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv_func)); - obj_func = DUK_TVAL_GET_OBJECT(tv_func); - DUK_ASSERT(obj_func != NULL); - DUK_ASSERT(!DUK_HOBJECT_HAS_BOUND(obj_func)); + case DUK_OP_CONTINUE: { + duk_small_uint_fast_t bc = DUK_DEC_BC(ins); - /* - * Other cases, use C recursion. - * - * If a tail call was requested we ignore it and execute a normal call. - * Since Duktape 0.11.0 the compiler emits a RETURN opcode even after - * a tail call to avoid test-bug-tailcall-thread-yield-resume.js. - * - * Direct eval call: (1) call target (before following bound function - * chain) is the built-in eval() function, and (2) call was made with - * the identifier 'eval'. - */ - - call_flags = 0; /* not protected, respect reclimit, not constructor */ - - if (DUK_HOBJECT_IS_NATIVEFUNCTION(obj_func) && - ((duk_hnativefunction *) obj_func)->func == duk_bi_global_object_eval) { - if (flag_evalcall) { - DUK_DDD(DUK_DDDPRINT("call target is eval, call identifier was 'eval' -> direct eval")); - call_flags |= DUK_CALL_FLAG_DIRECT_EVAL; - } else { - DUK_DDD(DUK_DDDPRINT("call target is eval, call identifier was not 'eval' -> indirect eval")); - } - } - - duk_handle_call_unprotected(thr, - num_stack_args, - call_flags); - - /* duk_js_call.c is required to restore the stack reserve - * so we only need to reset the top. - */ -#if !defined(DUK_USE_EXEC_FUN_LOCAL) - fun = DUK__FUN(); -#endif - duk_set_top(ctx, (duk_idx_t) fun->nregs); - - /* No need to reinit setjmp() catchpoint, as call handling - * will store and restore our state. - */ - } - - /* When debugger is enabled, we need to recheck the activation - * status after returning. This is now handled by call handling - * and heap->dbg_force_restart. - */ - break; + DUK__SYNC_AND_NULL_CURR_PC(); + duk__handle_break_or_continue(thr, (duk_uint_t) bc, DUK_LJ_TYPE_CONTINUE); + goto restart_execution; } + /* XXX: move to helper, too large to be inline here */ case DUK_OP_TRYCATCH: { duk_context *ctx = (duk_context *) thr; duk_activation *act; duk_catcher *cat; duk_tval *tv1; duk_small_uint_fast_t a; - duk_uint_fast_t bc; + duk_small_uint_fast_t bc; /* A -> flags * BC -> reg_catch; base register for two registers used both during @@ -68695,13 +72587,13 @@ DUK_LOCAL DUK_NOINLINE void duk__js_execute_bytecode_inner(duk_hthread *entry_th duk_push_tval(ctx, DUK__REGP(bc)); duk_to_object(ctx, -1); - duk_dup(ctx, -1); + duk_dup_top(ctx); /* [ ... env target ] */ /* [ ... env target target ] */ - duk_xdef_prop_stridx(thr, -3, DUK_STRIDX_INT_TARGET, DUK_PROPDESC_FLAGS_NONE); - duk_xdef_prop_stridx(thr, -2, DUK_STRIDX_INT_THIS, DUK_PROPDESC_FLAGS_NONE); /* always provideThis=true */ + duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_INT_TARGET, DUK_PROPDESC_FLAGS_NONE); + duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_THIS, DUK_PROPDESC_FLAGS_NONE); /* always provideThis=true */ /* [ ... env ] */ @@ -68789,899 +72681,982 @@ DUK_LOCAL DUK_NOINLINE void duk__js_execute_bytecode_inner(duk_hthread *entry_th break; } - /* Pre/post inc/dec for register variables, important for loops. */ - case DUK_OP_PREINCR: - case DUK_OP_PREDECR: - case DUK_OP_POSTINCR: - case DUK_OP_POSTDECR: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_uint_fast_t bc = DUK_DEC_BC(ins); - duk_tval *tv1, *tv2; - duk_double_t x, y, z; - - /* Two lowest bits of opcode are used to distinguish - * variants. Bit 0 = inc(0)/dec(1), bit 1 = pre(0)/post(1). - */ - DUK_ASSERT((DUK_OP_PREINCR & 0x03) == 0x00); - DUK_ASSERT((DUK_OP_PREDECR & 0x03) == 0x01); - DUK_ASSERT((DUK_OP_POSTINCR & 0x03) == 0x02); - DUK_ASSERT((DUK_OP_POSTDECR & 0x03) == 0x03); + case DUK_OP_ENDTRY: { + duk_catcher *cat; + duk_tval *tv1; - tv1 = DUK__REGP(bc); -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv1)) { - duk_int64_t x_fi, y_fi, z_fi; - x_fi = DUK_TVAL_GET_FASTINT(tv1); - if (ins & DUK_ENC_OP(0x01)) { - if (x_fi == DUK_FASTINT_MIN) { - goto skip_fastint; - } - y_fi = x_fi - 1; - } else { - if (x_fi == DUK_FASTINT_MAX) { - goto skip_fastint; - } - y_fi = x_fi + 1; - } + DUK_ASSERT(thr->catchstack_top >= 1); + DUK_ASSERT(thr->callstack_top >= 1); + DUK_ASSERT(thr->catchstack[thr->catchstack_top - 1].callstack_index == thr->callstack_top - 1); - DUK_TVAL_SET_FASTINT(tv1, y_fi); /* no need for refcount update */ + cat = thr->catchstack + thr->catchstack_top - 1; - tv2 = DUK__REGP(a); - z_fi = (ins & DUK_ENC_OP(0x02)) ? x_fi : y_fi; - DUK_TVAL_SET_FASTINT_UPDREF(thr, tv2, z_fi); /* side effects */ - break; - } - skip_fastint: -#endif - if (DUK_TVAL_IS_NUMBER(tv1)) { - /* Fast path for the case where the register - * is a number (e.g. loop counter). - */ + DUK_DDD(DUK_DDDPRINT("ENDTRY: clearing catch active flag (regardless of whether it was set or not)")); + DUK_CAT_CLEAR_CATCH_ENABLED(cat); - x = DUK_TVAL_GET_NUMBER(tv1); - if (ins & DUK_ENC_OP(0x01)) { - y = x - 1.0; - } else { - y = x + 1.0; - } + if (DUK_CAT_HAS_FINALLY_ENABLED(cat)) { + DUK_DDD(DUK_DDDPRINT("ENDTRY: finally part is active, jump through 2nd jump slot with 'normal continuation'")); - DUK_TVAL_SET_NUMBER(tv1, y); /* no need for refcount update */ - } else { - x = duk_to_number(ctx, bc); + tv1 = thr->valstack + cat->idx_base; + DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); + DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1); /* side effects */ + tv1 = NULL; - if (ins & DUK_ENC_OP(0x01)) { - y = x - 1.0; - } else { - y = x + 1.0; - } + tv1 = thr->valstack + cat->idx_base + 1; + DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); + DUK_TVAL_SET_U32_UPDREF(thr, tv1, (duk_uint32_t) DUK_LJ_TYPE_NORMAL); /* side effects */ + tv1 = NULL; - duk_push_number(ctx, y); - duk_replace(ctx, bc); + DUK_CAT_CLEAR_FINALLY_ENABLED(cat); + } else { + DUK_DDD(DUK_DDDPRINT("ENDTRY: no finally part, dismantle catcher, jump through 2nd jump slot (to end of statement)")); + duk_hthread_catchstack_unwind(thr, thr->catchstack_top - 1); + /* no need to unwind callstack */ } - tv2 = DUK__REGP(a); - z = (ins & DUK_ENC_OP(0x02)) ? x : y; - DUK_TVAL_SET_NUMBER_UPDREF(thr, tv2, z); /* side effects */ + curr_pc = cat->pc_base + 1; break; } - /* Preinc/predec for var-by-name, slow path. */ - case DUK_OP_PREINCV: - case DUK_OP_PREDECV: - case DUK_OP_POSTINCV: - case DUK_OP_POSTDECV: { - duk_context *ctx = (duk_context *) thr; + case DUK_OP_ENDCATCH: { duk_activation *act; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_uint_fast_t bc = DUK_DEC_BC(ins); - duk_double_t x, y; + duk_catcher *cat; duk_tval *tv1; - duk_hstring *name; - /* Two lowest bits of opcode are used to distinguish - * variants. Bit 0 = inc(0)/dec(1), bit 1 = pre(0)/post(1). - */ - DUK_ASSERT((DUK_OP_PREINCV & 0x03) == 0x00); - DUK_ASSERT((DUK_OP_PREDECV & 0x03) == 0x01); - DUK_ASSERT((DUK_OP_POSTINCV & 0x03) == 0x02); - DUK_ASSERT((DUK_OP_POSTDECV & 0x03) == 0x03); + DUK_ASSERT(thr->catchstack_top >= 1); + DUK_ASSERT(thr->callstack_top >= 1); + DUK_ASSERT(thr->catchstack[thr->catchstack_top - 1].callstack_index == thr->callstack_top - 1); - tv1 = DUK__CONSTP(bc); - DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); - name = DUK_TVAL_GET_STRING(tv1); - DUK_ASSERT(name != NULL); - act = thr->callstack + thr->callstack_top - 1; - (void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/); /* -> [... val this] */ + cat = thr->catchstack + thr->catchstack_top - 1; + DUK_ASSERT(!DUK_CAT_HAS_CATCH_ENABLED(cat)); /* cleared before entering catch part */ - /* XXX: fastint fast path would be very useful here */ + act = thr->callstack + thr->callstack_top - 1; - x = duk_to_number(ctx, -2); - duk_pop_2(ctx); - if (ins & DUK_ENC_OP(0x01)) { - y = x - 1.0; - } else { - y = x + 1.0; - } + if (DUK_CAT_HAS_LEXENV_ACTIVE(cat)) { + duk_hobject *prev_env; - duk_push_number(ctx, y); - tv1 = DUK_GET_TVAL_NEGIDX(ctx, -1); - DUK_ASSERT(tv1 != NULL); - duk_js_putvar_activation(thr, act, name, tv1, DUK__STRICT()); - duk_pop(ctx); + /* 'with' binding has no catch clause, so can't be here unless a normal try-catch */ + DUK_ASSERT(DUK_CAT_HAS_CATCH_BINDING_ENABLED(cat)); + DUK_ASSERT(act->lex_env != NULL); - duk_push_number(ctx, (ins & DUK_ENC_OP(0x02)) ? x : y); - duk_replace(ctx, (duk_idx_t) a); - break; - } + DUK_DDD(DUK_DDDPRINT("ENDCATCH: popping catcher part lexical environment")); - /* Preinc/predec for object properties. */ - case DUK_OP_PREINCP: - case DUK_OP_PREDECP: - case DUK_OP_POSTINCP: - case DUK_OP_POSTDECP: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_tval *tv_obj; - duk_tval *tv_key; - duk_tval *tv_val; - duk_bool_t rc; - duk_double_t x, y; + prev_env = act->lex_env; + DUK_ASSERT(prev_env != NULL); + act->lex_env = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, prev_env); + DUK_CAT_CLEAR_LEXENV_ACTIVE(cat); + DUK_HOBJECT_DECREF(thr, prev_env); /* side effects */ + } - /* A -> target reg - * B -> object reg/const (may be const e.g. in "'foo'[1]") - * C -> key reg/const - */ + if (DUK_CAT_HAS_FINALLY_ENABLED(cat)) { + DUK_DDD(DUK_DDDPRINT("ENDCATCH: finally part is active, jump through 2nd jump slot with 'normal continuation'")); - /* Two lowest bits of opcode are used to distinguish - * variants. Bit 0 = inc(0)/dec(1), bit 1 = pre(0)/post(1). - */ - DUK_ASSERT((DUK_OP_PREINCP & 0x03) == 0x00); - DUK_ASSERT((DUK_OP_PREDECP & 0x03) == 0x01); - DUK_ASSERT((DUK_OP_POSTINCP & 0x03) == 0x02); - DUK_ASSERT((DUK_OP_POSTDECP & 0x03) == 0x03); + tv1 = thr->valstack + cat->idx_base; + DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); + DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1); /* side effects */ + tv1 = NULL; - tv_obj = DUK__REGCONSTP(b); - tv_key = DUK__REGCONSTP(c); - rc = duk_hobject_getprop(thr, tv_obj, tv_key); /* -> [val] */ - DUK_UNREF(rc); /* ignore */ - tv_obj = NULL; /* invalidated */ - tv_key = NULL; /* invalidated */ + tv1 = thr->valstack + cat->idx_base + 1; + DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); + DUK_TVAL_SET_U32_UPDREF(thr, tv1, (duk_uint32_t) DUK_LJ_TYPE_NORMAL); /* side effects */ + tv1 = NULL; - x = duk_to_number(ctx, -1); - duk_pop(ctx); - if (ins & DUK_ENC_OP(0x01)) { - y = x - 1.0; + DUK_CAT_CLEAR_FINALLY_ENABLED(cat); } else { - y = x + 1.0; + DUK_DDD(DUK_DDDPRINT("ENDCATCH: no finally part, dismantle catcher, jump through 2nd jump slot (to end of statement)")); + duk_hthread_catchstack_unwind(thr, thr->catchstack_top - 1); + /* no need to unwind callstack */ } - duk_push_number(ctx, y); - tv_val = DUK_GET_TVAL_NEGIDX(ctx, -1); - DUK_ASSERT(tv_val != NULL); - tv_obj = DUK__REGCONSTP(b); - tv_key = DUK__REGCONSTP(c); - rc = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, DUK__STRICT()); - DUK_UNREF(rc); /* ignore */ - tv_obj = NULL; /* invalidated */ - tv_key = NULL; /* invalidated */ - duk_pop(ctx); - - duk_push_number(ctx, (ins & DUK_ENC_OP(0x02)) ? x : y); - duk_replace(ctx, (duk_idx_t) a); + curr_pc = cat->pc_base + 1; break; } - case DUK_OP_EXTRA: { - /* XXX: shared decoding of 'b' and 'c'? */ - - duk_small_uint_fast_t extraop = DUK_DEC_A(ins); - switch ((int) extraop) { - /* XXX: switch cast? */ - - case DUK_EXTRAOP_NOP: { - /* nop */ - break; - } - - case DUK_EXTRAOP_INVALID: { - DUK_ERROR_FMT1(thr, DUK_ERR_INTERNAL_ERROR, "INVALID opcode (%ld)", (long) DUK_DEC_BC(ins)); - break; - } - - case DUK_EXTRAOP_LDTHIS: { - /* Note: 'this' may be bound to any value, not just an object */ - duk_uint_fast_t bc = DUK_DEC_BC(ins); - duk_tval *tv1, *tv2; - - tv1 = DUK__REGP(bc); - tv2 = thr->valstack_bottom - 1; /* 'this binding' is just under bottom */ - DUK_ASSERT(tv2 >= thr->valstack); - - DUK_DDD(DUK_DDDPRINT("LDTHIS: %!T to r%ld", (duk_tval *) tv2, (long) bc)); - - DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2); /* side effects */ - break; - } - - case DUK_EXTRAOP_LDUNDEF: { - duk_uint_fast_t bc = DUK_DEC_BC(ins); - duk_tval *tv1; - - tv1 = DUK__REGP(bc); - DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1); /* side effects */ - break; - } - - case DUK_EXTRAOP_LDNULL: { - duk_uint_fast_t bc = DUK_DEC_BC(ins); - duk_tval *tv1; - - tv1 = DUK__REGP(bc); - DUK_TVAL_SET_NULL_UPDREF(thr, tv1); /* side effects */ - break; - } - - case DUK_EXTRAOP_LDTRUE: - case DUK_EXTRAOP_LDFALSE: { - duk_uint_fast_t bc = DUK_DEC_BC(ins); - duk_tval *tv1; - duk_small_uint_fast_t bval = (extraop == DUK_EXTRAOP_LDTRUE ? 1 : 0); - - tv1 = DUK__REGP(bc); - DUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv1, bval); /* side effects */ - break; - } - - case DUK_EXTRAOP_NEWOBJ: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t b = DUK_DEC_B(ins); - - duk_push_object(ctx); - duk_replace(ctx, (duk_idx_t) b); - break; - } - - case DUK_EXTRAOP_NEWARR: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t b = DUK_DEC_B(ins); + case DUK_OP_ENDFIN: { + duk_context *ctx = (duk_context *) thr; + duk_catcher *cat; + duk_tval *tv1; + duk_small_uint_t cont_type; + duk_small_uint_t ret_result; - duk_push_array(ctx); - duk_replace(ctx, (duk_idx_t) b); - break; - } + /* Sync and NULL early. */ + DUK__SYNC_AND_NULL_CURR_PC(); - case DUK_EXTRAOP_SETALEN: { - duk_small_uint_fast_t b; - duk_small_uint_fast_t c; - duk_tval *tv1; - duk_hobject *h; - duk_uint32_t len; + DUK_ASSERT(thr->catchstack_top >= 1); + DUK_ASSERT(thr->callstack_top >= 1); + DUK_ASSERT(thr->catchstack[thr->catchstack_top - 1].callstack_index == thr->callstack_top - 1); - b = DUK_DEC_B(ins); tv1 = DUK__REGP(b); - DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv1)); - h = DUK_TVAL_GET_OBJECT(tv1); + cat = thr->catchstack + thr->catchstack_top - 1; - c = DUK_DEC_C(ins); tv1 = DUK__REGP(c); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); - len = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv1); + /* CATCH flag may be enabled or disabled here; it may be enabled if + * the statement has a catch block but the try block does not throw + * an error. + */ + DUK_ASSERT(!DUK_CAT_HAS_FINALLY_ENABLED(cat)); /* cleared before entering finally */ + /* XXX: assert idx_base */ - duk_hobject_set_length(thr, h, len); + DUK_DDD(DUK_DDDPRINT("ENDFIN: completion value=%!T, type=%!T", + (duk_tval *) (thr->valstack + cat->idx_base + 0), + (duk_tval *) (thr->valstack + cat->idx_base + 1))); - break; - } + tv1 = thr->valstack + cat->idx_base + 1; /* type */ + DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); + cont_type = (duk_small_uint_t) DUK_TVAL_GET_NUMBER(tv1); - case DUK_EXTRAOP_TYPEOF: { - duk_context *ctx = (duk_context *) thr; - duk_uint_fast_t bc = DUK_DEC_BC(ins); - duk_push_hstring(ctx, duk_js_typeof(thr, DUK__REGP(bc))); - duk_replace(ctx, (duk_idx_t) bc); - break; + switch (cont_type) { + case DUK_LJ_TYPE_NORMAL: { + DUK_DDD(DUK_DDDPRINT("ENDFIN: finally part finishing with 'normal' (non-abrupt) completion -> " + "dismantle catcher, resume execution after ENDFIN")); + duk_hthread_catchstack_unwind(thr, thr->catchstack_top - 1); + /* no need to unwind callstack */ + goto restart_execution; } + case DUK_LJ_TYPE_RETURN: { + DUK_DDD(DUK_DDDPRINT("ENDFIN: finally part finishing with 'return' complation -> dismantle " + "catcher, handle return, lj.value1=%!T", thr->valstack + cat->idx_base)); - case DUK_EXTRAOP_TYPEOFID: { - duk_context *ctx = (duk_context *) thr; - duk_activation *act; - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_hstring *name; - duk_tval *tv; - - /* B -> target register - * C -> constant index of identifier name + /* Not necessary to unwind catchstack: return handling will + * do it. The finally flag of 'cat' is no longer set. The + * catch flag may be set, but it's not checked by return handling. */ + DUK_ASSERT(!DUK_CAT_HAS_FINALLY_ENABLED(cat)); /* cleared before entering finally */ +#if 0 + duk_hthread_catchstack_unwind(thr, thr->catchstack_top - 1); +#endif - tv = DUK__REGCONSTP(c); /* XXX: this could be a DUK__CONSTP instead */ - DUK_ASSERT(DUK_TVAL_IS_STRING(tv)); - name = DUK_TVAL_GET_STRING(tv); - act = thr->callstack + thr->callstack_top - 1; - if (duk_js_getvar_activation(thr, act, name, 0 /*throw*/)) { - /* -> [... val this] */ - tv = DUK_GET_TVAL_NEGIDX(ctx, -2); - duk_push_hstring(ctx, duk_js_typeof(thr, tv)); - duk_replace(ctx, (duk_idx_t) b); - duk_pop_2(ctx); - } else { - /* unresolvable, no stack changes */ - duk_push_hstring_stridx(ctx, DUK_STRIDX_LC_UNDEFINED); - duk_replace(ctx, (duk_idx_t) b); + duk_push_tval(ctx, thr->valstack + cat->idx_base); + ret_result = duk__handle_return(thr, + entry_thread, + entry_callstack_top); + if (ret_result == DUK__RETHAND_RESTART) { + goto restart_execution; } + DUK_ASSERT(ret_result == DUK__RETHAND_FINISHED); - break; + DUK_DDD(DUK_DDDPRINT("exiting executor after ENDFIN and RETURN (pseudo) longjmp type")); + return; } + case DUK_LJ_TYPE_BREAK: + case DUK_LJ_TYPE_CONTINUE: { + duk_uint_t label_id; + duk_small_uint_t lj_type; - case DUK_EXTRAOP_INITENUM: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - - /* - * Enumeration semantics come from for-in statement, E5 Section 12.6.4. - * If called with 'null' or 'undefined', this opcode returns 'null' as - * the enumerator, which is special cased in NEXTENUM. This simplifies - * the compiler part - */ - - /* B -> register for writing enumerator object - * C -> value to be enumerated (register) + /* Not necessary to unwind catchstack: break/continue + * handling will do it. The finally flag of 'cat' is + * no longer set. The catch flag may be set, but it's + * not checked by break/continue handling. */ +#if 0 + duk_hthread_catchstack_unwind(thr, thr->catchstack_top - 1); +#endif - if (duk_is_null_or_undefined(ctx, (duk_idx_t) c)) { - duk_push_null(ctx); - duk_replace(ctx, (duk_idx_t) b); - } else { - duk_dup(ctx, (duk_idx_t) c); - duk_to_object(ctx, -1); - duk_hobject_enumerator_create(ctx, 0 /*enum_flags*/); /* [ ... val ] --> [ ... enum ] */ - duk_replace(ctx, (duk_idx_t) b); - } - break; + tv1 = thr->valstack + cat->idx_base; + DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); +#if defined(DUK_USE_FASTINT) + DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1)); + label_id = (duk_small_uint_t) DUK_TVAL_GET_FASTINT_U32(tv1); +#else + label_id = (duk_small_uint_t) DUK_TVAL_GET_NUMBER(tv1); +#endif + lj_type = cont_type; + duk__handle_break_or_continue(thr, label_id, lj_type); + goto restart_execution; } + default: { + DUK_DDD(DUK_DDDPRINT("ENDFIN: finally part finishing with abrupt completion, lj_type=%ld -> " + "dismantle catcher, re-throw error", + (long) cont_type)); - case DUK_EXTRAOP_NEXTENUM: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - - /* - * NEXTENUM checks whether the enumerator still has unenumerated - * keys. If so, the next key is loaded to the target register - * and the next instruction is skipped. Otherwise the next instruction - * will be executed, jumping out of the enumeration loop. - */ + duk_push_tval(ctx, thr->valstack + cat->idx_base); - /* B -> target register for next key - * C -> enum register - */ + duk_err_setup_heap_ljstate(thr, (duk_small_int_t) cont_type); - DUK_DDD(DUK_DDDPRINT("NEXTENUM: b->%!T, c->%!T", - (duk_tval *) duk_get_tval(ctx, (duk_idx_t) b), - (duk_tval *) duk_get_tval(ctx, (duk_idx_t) c))); - - if (duk_is_object(ctx, (duk_idx_t) c)) { - /* XXX: assert 'c' is an enumerator */ - duk_dup(ctx, (duk_idx_t) c); - if (duk_hobject_enumerator_next(ctx, 0 /*get_value*/)) { - /* [ ... enum ] -> [ ... next_key ] */ - DUK_DDD(DUK_DDDPRINT("enum active, next key is %!T, skip jump slot ", - (duk_tval *) duk_get_tval(ctx, -1))); - curr_pc++; - } else { - /* [ ... enum ] -> [ ... ] */ - DUK_DDD(DUK_DDDPRINT("enum finished, execute jump slot")); - duk_push_undefined(ctx); - } - duk_replace(ctx, (duk_idx_t) b); - } else { - /* 'null' enumerator case -> behave as with an empty enumerator */ - DUK_ASSERT(duk_is_null(ctx, (duk_idx_t) c)); - DUK_DDD(DUK_DDDPRINT("enum is null, execute jump slot")); - } - break; + DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* always in executor */ + duk_err_longjmp(thr); + DUK_UNREACHABLE(); + } } - case DUK_EXTRAOP_INITSET: - case DUK_EXTRAOP_INITSETI: - case DUK_EXTRAOP_INITGET: - case DUK_EXTRAOP_INITGETI: { - duk_context *ctx = (duk_context *) thr; - duk_bool_t is_set = (extraop == DUK_EXTRAOP_INITSET || extraop == DUK_EXTRAOP_INITSETI); - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_uint_fast_t idx; + /* Must restart in all cases because we NULLed thr->ptr_curr_pc. */ + DUK_UNREACHABLE(); + break; + } - /* B -> object register - * C -> C+0 contains key, C+1 closure (value) - */ + case DUK_OP_THROW: { + duk_context *ctx = (duk_context *) thr; + duk_small_uint_fast_t bc = DUK_DEC_BC(ins); - /* - * INITSET/INITGET are only used to initialize object literal keys. - * The compiler ensures that there cannot be a previous data property - * of the same name. It also ensures that setter and getter can only - * be initialized once (or not at all). - */ + /* Note: errors are augmented when they are created, not + * when they are thrown. So, don't augment here, it would + * break re-throwing for instance. + */ - idx = (duk_uint_fast_t) DUK_DEC_C(ins); - if (extraop == DUK_EXTRAOP_INITSETI || extraop == DUK_EXTRAOP_INITGETI) { - duk_tval *tv_ind = DUK__REGP(idx); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); - idx = (duk_uint_fast_t) DUK_TVAL_GET_NUMBER(tv_ind); - } + /* Sync so that augmentation sees up-to-date activations, NULL + * thr->ptr_curr_pc so that it's not used if side effects occur + * in augmentation or longjmp handling. + */ + DUK__SYNC_AND_NULL_CURR_PC(); -#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK) - if (idx + 2 > (duk_uint_fast_t) duk_get_top(ctx)) { - /* XXX: use duk_is_valid_index() instead? */ - /* XXX: improve check; check against nregs, not against top */ - DUK__INTERNAL_ERROR("INITSET/INITGET out of bounds"); - } + duk_dup(ctx, (duk_idx_t) bc); + DUK_DDD(DUK_DDDPRINT("THROW ERROR (BYTECODE): %!dT (before throw augment)", + (duk_tval *) duk_get_tval(ctx, -1))); +#if defined(DUK_USE_AUGMENT_ERROR_THROW) + duk_err_augment_error_throw(thr); + DUK_DDD(DUK_DDDPRINT("THROW ERROR (BYTECODE): %!dT (after throw augment)", + (duk_tval *) duk_get_tval(ctx, -1))); #endif - /* XXX: this is now a very unoptimal implementation -- this can be - * made very simple by direct manipulation of the object internals, - * given the guarantees above. - */ - - duk_push_hobject_bidx(ctx, DUK_BIDX_OBJECT_CONSTRUCTOR); - duk_get_prop_stridx(ctx, -1, DUK_STRIDX_DEFINE_PROPERTY); - duk_push_undefined(ctx); - duk_dup(ctx, (duk_idx_t) b); - duk_dup(ctx, (duk_idx_t) (idx + 0)); - duk_push_object(ctx); /* -> [ Object defineProperty undefined obj key desc ] */ - - duk_push_true(ctx); - duk_put_prop_stridx(ctx, -2, DUK_STRIDX_ENUMERABLE); - duk_push_true(ctx); - duk_put_prop_stridx(ctx, -2, DUK_STRIDX_CONFIGURABLE); - duk_dup(ctx, (duk_idx_t) (idx + 1)); - duk_put_prop_stridx(ctx, -2, (is_set ? DUK_STRIDX_SET : DUK_STRIDX_GET)); - - DUK_DDD(DUK_DDDPRINT("INITGET/INITSET: obj=%!T, key=%!T, desc=%!T", - (duk_tval *) duk_get_tval(ctx, -3), - (duk_tval *) duk_get_tval(ctx, -2), - (duk_tval *) duk_get_tval(ctx, -1))); + duk_err_setup_heap_ljstate(thr, DUK_LJ_TYPE_THROW); - duk_call_method(ctx, 3); /* -> [ Object res ] */ - duk_pop_2(ctx); + DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* always in executor */ + duk_err_longjmp(thr); + DUK_UNREACHABLE(); + break; + } - DUK_DDD(DUK_DDDPRINT("INITGET/INITSET AFTER: obj=%!T", - (duk_tval *) duk_get_tval(ctx, (duk_idx_t) b))); - break; - } + case DUK_OP_CSREG: { + /* + * Assuming a register binds to a variable declared within this + * function (a declarative binding), the 'this' for the call + * setup is always 'undefined'. E5 Section 10.2.1.1.6. + */ - case DUK_EXTRAOP_ENDTRY: { - duk_catcher *cat; - duk_tval *tv1; + duk_small_uint_fast_t a = DUK_DEC_A(ins); + duk_small_uint_fast_t bc = DUK_DEC_BC(ins); - DUK_ASSERT(thr->catchstack_top >= 1); - DUK_ASSERT(thr->callstack_top >= 1); - DUK_ASSERT(thr->catchstack[thr->catchstack_top - 1].callstack_index == thr->callstack_top - 1); + /* A -> register containing target function (not type checked here) + * BC -> target registers (BC, BC + 1) for call setup + */ - cat = thr->catchstack + thr->catchstack_top - 1; +#if defined(DUK_USE_PREFER_SIZE) + duk_dup((duk_context *) thr, a); + duk_replace((duk_context *) thr, bc); + duk_to_undefined((duk_context *) thr, bc + 1); +#else + duk_tval *tv1; + duk_tval *tv2; + duk_tval *tv3; + duk_tval tv_tmp1; + duk_tval tv_tmp2; - DUK_DDD(DUK_DDDPRINT("ENDTRY: clearing catch active flag (regardless of whether it was set or not)")); - DUK_CAT_CLEAR_CATCH_ENABLED(cat); + tv1 = DUK__REGP(bc); + tv2 = tv1 + 1; + DUK_TVAL_SET_TVAL(&tv_tmp1, tv1); + DUK_TVAL_SET_TVAL(&tv_tmp2, tv2); + tv3 = DUK__REGP(a); + DUK_TVAL_SET_TVAL(tv1, tv3); + DUK_TVAL_INCREF(thr, tv1); /* no side effects */ + DUK_TVAL_SET_UNDEFINED(tv2); /* no need for incref */ + DUK_TVAL_DECREF(thr, &tv_tmp1); + DUK_TVAL_DECREF(thr, &tv_tmp2); +#endif + break; + } - if (DUK_CAT_HAS_FINALLY_ENABLED(cat)) { - DUK_DDD(DUK_DDDPRINT("ENDTRY: finally part is active, jump through 2nd jump slot with 'normal continuation'")); + case DUK_OP_EVALCALL: { + /* Eval call or a normal call made using the identifier 'eval'. + * Eval calls are never handled as tail calls for simplicity. + */ + duk_context *ctx = (duk_context *) thr; + duk_small_uint_fast_t nargs; + duk_uint_fast_t idx; + duk_idx_t num_stack_args; + duk_small_uint_t call_flags; + duk_tval *tv_func; + duk_hobject *obj_func; +#if !defined(DUK_USE_EXEC_FUN_LOCAL) + duk_hcompfunc *fun; +#endif - tv1 = thr->valstack + cat->idx_base; - DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); - DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1); /* side effects */ - tv1 = NULL; + /* Technically we should also check for the possibility of + * a pure Ecmascript-to-Ecmascript call: while built-in eval() + * is native, it's possible for the 'eval' identifier to be + * shadowed. In practice that would be rare and optimizing the + * C call stack for that case is a bit pointless. + */ - tv1 = thr->valstack + cat->idx_base + 1; - DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); - DUK_TVAL_SET_FASTINT_U32_UPDREF(thr, tv1, (duk_uint32_t) DUK_LJ_TYPE_NORMAL); /* side effects */ - tv1 = NULL; + nargs = (duk_small_uint_fast_t) DUK_DEC_A(ins); + idx = (duk_uint_fast_t) DUK_DEC_BC(ins); + duk_set_top(ctx, (duk_idx_t) (idx + nargs + 2)); /* [ ... func this arg1 ... argN ] */ - DUK_CAT_CLEAR_FINALLY_ENABLED(cat); - } else { - DUK_DDD(DUK_DDDPRINT("ENDTRY: no finally part, dismantle catcher, jump through 2nd jump slot (to end of statement)")); - duk_hthread_catchstack_unwind(thr, thr->catchstack_top - 1); - /* no need to unwind callstack */ + call_flags = 0; + tv_func = DUK_GET_TVAL_POSIDX(ctx, idx); + if (DUK_TVAL_IS_OBJECT(tv_func)) { + obj_func = DUK_TVAL_GET_OBJECT(tv_func); + DUK_ASSERT(obj_func != NULL); + if (DUK_HOBJECT_IS_NATFUNC(obj_func) && + ((duk_hnatfunc *) obj_func)->func == duk_bi_global_object_eval) { + DUK_DDD(DUK_DDDPRINT("call target is eval, call identifier was 'eval' -> direct eval")); + call_flags |= DUK_CALL_FLAG_DIRECT_EVAL; } - - curr_pc = cat->pc_base + 1; - break; } + num_stack_args = nargs; + duk_handle_call_unprotected(thr, num_stack_args, call_flags); - case DUK_EXTRAOP_ENDCATCH: { - duk_activation *act; - duk_catcher *cat; - duk_tval *tv1; +#if !defined(DUK_USE_EXEC_FUN_LOCAL) + fun = DUK__FUN(); +#endif + duk_set_top(ctx, (duk_idx_t) fun->nregs); + break; + } + + case DUK_OP_CALL: + case DUK_OP_TAILCALL: { + /* DUK_OP_CALL: plain call, not tailcall compatible. + * + * DUK_OP_TAILCALL: plain call which is tailcall + * compatible. Tail call may not be possible due + * to e.g. target not being an Ecmascript function. + * + * Not a direct eval call. Indirect eval calls don't + * need special handling here. + */ - DUK_ASSERT(thr->catchstack_top >= 1); - DUK_ASSERT(thr->callstack_top >= 1); - DUK_ASSERT(thr->catchstack[thr->catchstack_top - 1].callstack_index == thr->callstack_top - 1); + /* To determine whether to use an optimized Ecmascript-to-Ecmascript + * call, we need to know whether the final, non-bound function is an + * Ecmascript function. Current implementation is to first try an + * Ecma-to-Ecma call setup which also resolves the bound function + * chain. The setup attempt overwrites call target at DUK__REGP(idx) + * and may also fudge the argument list. However, it won't resolve + * the effective 'this' binding if the setup fails. This is somewhat + * awkward, and the two call setup code paths should be merged. + * + * If an Ecma-to-Ecma call is not possible, the actual call handling + * will do another (unnecessary) attempt to resolve the bound function. + */ - cat = thr->catchstack + thr->catchstack_top - 1; - DUK_ASSERT(!DUK_CAT_HAS_CATCH_ENABLED(cat)); /* cleared before entering catch part */ + duk_context *ctx = (duk_context *) thr; + duk_small_uint_fast_t nargs; + duk_uint_fast_t idx; + duk_idx_t num_stack_args; + duk_small_uint_t call_flags; +#if !defined(DUK_USE_EXEC_FUN_LOCAL) + duk_hcompfunc *fun; +#endif - act = thr->callstack + thr->callstack_top - 1; + /* A -> nargs + * BC -> base register for call (base -> func, base+1 -> this, base+2 -> arg1 ... base+2+N-1 -> argN) + */ - if (DUK_CAT_HAS_LEXENV_ACTIVE(cat)) { - duk_hobject *prev_env; + /* XXX: in some cases it's faster NOT to reuse the value + * stack but rather copy the arguments on top of the stack + * (mainly when the calling value stack is large and the value + * stack resize would be large). See DUK_OP_NEW. + */ - /* 'with' binding has no catch clause, so can't be here unless a normal try-catch */ - DUK_ASSERT(DUK_CAT_HAS_CATCH_BINDING_ENABLED(cat)); - DUK_ASSERT(act->lex_env != NULL); + nargs = (duk_small_uint_fast_t) DUK_DEC_A(ins); + idx = (duk_uint_fast_t) DUK_DEC_BC(ins); + duk_set_top(ctx, (duk_idx_t) (idx + nargs + 2)); /* [ ... func this arg1 ... argN ] */ - DUK_DDD(DUK_DDDPRINT("ENDCATCH: popping catcher part lexical environment")); + /* DUK_OP_CALL and DUK_OP_TAILCALL are consecutive + * which allows a simple bit test. + */ + DUK_ASSERT((DUK_OP_CALL & 0x01) == 0); + DUK_ASSERT((DUK_OP_TAILCALL & 0x01) == 1); + call_flags = (ins & (1UL << DUK_BC_SHIFT_OP)) ? DUK_CALL_FLAG_IS_TAILCALL : 0; - prev_env = act->lex_env; - DUK_ASSERT(prev_env != NULL); - act->lex_env = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, prev_env); - DUK_CAT_CLEAR_LEXENV_ACTIVE(cat); - DUK_HOBJECT_DECREF(thr, prev_env); /* side effects */ - } + num_stack_args = nargs; + if (duk_handle_ecma_call_setup(thr, num_stack_args, call_flags)) { + /* Ecma-to-ecma call possible, may or may not be a tail call. + * Avoid C recursion by being clever. + */ + DUK_DDD(DUK_DDDPRINT("ecma-to-ecma call setup possible, restart execution")); + /* curr_pc synced by duk_handle_ecma_call_setup() */ + goto restart_execution; + } - if (DUK_CAT_HAS_FINALLY_ENABLED(cat)) { - DUK_DDD(DUK_DDDPRINT("ENDCATCH: finally part is active, jump through 2nd jump slot with 'normal continuation'")); + /* Recompute argument count: bound function handling may have shifted. */ + num_stack_args = duk_get_top(ctx) - (idx + 2); + DUK_DDD(DUK_DDDPRINT("recomputed arg count: %ld\n", (long) num_stack_args)); - tv1 = thr->valstack + cat->idx_base; - DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); - DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1); /* side effects */ - tv1 = NULL; + /* Target is either a lightfunc or a function object. + * We don't need to check for eval handling here: the + * call may be an indirect eval ('myEval("something")') + * but that requires no special handling. + */ - tv1 = thr->valstack + cat->idx_base + 1; - DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); - DUK_TVAL_SET_FASTINT_U32_UPDREF(thr, tv1, (duk_uint32_t) DUK_LJ_TYPE_NORMAL); /* side effects */ - tv1 = NULL; + duk_handle_call_unprotected(thr, num_stack_args, 0 /*call_flags*/); - DUK_CAT_CLEAR_FINALLY_ENABLED(cat); - } else { - DUK_DDD(DUK_DDDPRINT("ENDCATCH: no finally part, dismantle catcher, jump through 2nd jump slot (to end of statement)")); - duk_hthread_catchstack_unwind(thr, thr->catchstack_top - 1); - /* no need to unwind callstack */ - } + /* duk_js_call.c is required to restore the stack reserve + * so we only need to reset the top. + */ +#if !defined(DUK_USE_EXEC_FUN_LOCAL) + fun = DUK__FUN(); +#endif + duk_set_top(ctx, (duk_idx_t) fun->nregs); - curr_pc = cat->pc_base + 1; - break; - } + /* No need to reinit setjmp() catchpoint, as call handling + * will store and restore our state. + */ - case DUK_EXTRAOP_ENDFIN: { - duk_context *ctx = (duk_context *) thr; - duk_catcher *cat; - duk_tval *tv1; - duk_small_uint_t cont_type; - duk_small_uint_t ret_result; + /* When debugger is enabled, we need to recheck the activation + * status after returning. This is now handled by call handling + * and heap->dbg_force_restart. + */ + break; + } - /* Sync and NULL early. */ - DUK__SYNC_AND_NULL_CURR_PC(); + case DUK_OP_NEW: { + duk_context *ctx = (duk_context *) thr; + duk_small_uint_fast_t a = DUK_DEC_A(ins); + duk_small_uint_fast_t bc = DUK_DEC_BC(ins); +#if defined(DUK_USE_EXEC_PREFER_SIZE) +#if !defined(DUK_USE_EXEC_FUN_LOCAL) + duk_hcompfunc *fun; +#endif +#else + duk_small_uint_fast_t count; + duk_tval *tv_src; +#endif - DUK_ASSERT(thr->catchstack_top >= 1); - DUK_ASSERT(thr->callstack_top >= 1); - DUK_ASSERT(thr->catchstack[thr->catchstack_top - 1].callstack_index == thr->callstack_top - 1); + /* A -> num args (N) + * BC -> target register and start reg: constructor, arg1, ..., argN + */ - cat = thr->catchstack + thr->catchstack_top - 1; + /* duk_new() will call the constuctor using duk_handle_call(). + * A constructor call prevents a yield from inside the constructor, + * even if the constructor is an Ecmascript function. + */ - /* CATCH flag may be enabled or disabled here; it may be enabled if - * the statement has a catch block but the try block does not throw - * an error. - */ - DUK_ASSERT(!DUK_CAT_HAS_FINALLY_ENABLED(cat)); /* cleared before entering finally */ - /* XXX: assert idx_base */ + /* Don't need to sync curr_pc here; duk_new() will do that + * when it augments the created error. + */ - DUK_DDD(DUK_DDDPRINT("ENDFIN: completion value=%!T, type=%!T", - (duk_tval *) (thr->valstack + cat->idx_base + 0), - (duk_tval *) (thr->valstack + cat->idx_base + 1))); +#if defined(DUK_USE_EXEC_PREFER_SIZE) + /* This alternative relies on our being allowed to trash anything + * above 'bc' so we can just reuse the argument registers which + * means smaller value stack use. Footprint is a bit smaller. + */ + duk_set_top(ctx, (duk_idx_t) (bc + a + 1)); + duk_new(ctx, (duk_idx_t) a); /* [... constructor arg1 ... argN] -> [retval] */ - tv1 = thr->valstack + cat->idx_base + 1; /* type */ - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); - cont_type = (duk_small_uint_t) DUK_TVAL_GET_NUMBER(tv1); - - switch (cont_type) { - case DUK_LJ_TYPE_NORMAL: { - DUK_DDD(DUK_DDDPRINT("ENDFIN: finally part finishing with 'normal' (non-abrupt) completion -> " - "dismantle catcher, resume execution after ENDFIN")); - duk_hthread_catchstack_unwind(thr, thr->catchstack_top - 1); - /* no need to unwind callstack */ - goto restart_execution; - } - case DUK_LJ_TYPE_RETURN: { - DUK_DDD(DUK_DDDPRINT("ENDFIN: finally part finishing with 'return' complation -> dismantle " - "catcher, handle return, lj.value1=%!T", thr->valstack + cat->idx_base)); + /* The return value is already in its correct place at the stack, + * i.e. it has replaced the 'constructor' at index bc. Just reset + * top and we're done. + */ - /* Not necessary to unwind catchstack: return handling will - * do it. The finally flag of 'cat' is no longer set. The - * catch flag may be set, but it's not checked by return handling. - */ - DUK_ASSERT(!DUK_CAT_HAS_FINALLY_ENABLED(cat)); /* cleared before entering finally */ -#if 0 - duk_hthread_catchstack_unwind(thr, thr->catchstack_top - 1); +#if !defined(DUK_USE_EXEC_FUN_LOCAL) + fun = DUK__FUN(); #endif + duk_set_top(ctx, (duk_idx_t) fun->nregs); +#else /* DUK_USE_EXEC_PREFER_SIZE */ + /* Faster alternative is to duplicate the values to avoid a resize. + * This depends on the relative size between the value stack and + * the argument count, though. + */ + count = a + 1; + duk_require_stack(ctx, count); + tv_src = DUK_GET_TVAL_POSIDX(ctx, bc); + duk__push_tvals_incref_only(thr, tv_src, count); + duk_new(ctx, (duk_idx_t) a); /* [... constructor arg1 ... argN] -> [retval] */ + duk_replace(ctx, bc); +#endif /* DUK_USE_EXEC_PREFER_SIZE */ - duk_push_tval(ctx, thr->valstack + cat->idx_base); - ret_result = duk__handle_return(thr, - entry_thread, - entry_callstack_top); - if (ret_result == DUK__RETHAND_RESTART) { - goto restart_execution; - } - DUK_ASSERT(ret_result == DUK__RETHAND_FINISHED); + /* When debugger is enabled, we need to recheck the activation + * status after returning. This is now handled by call handling + * and heap->dbg_force_restart. + */ + break; + } - DUK_DDD(DUK_DDDPRINT("exiting executor after ENDFIN and RETURN (pseudo) longjmp type")); - return; - } - case DUK_LJ_TYPE_BREAK: - case DUK_LJ_TYPE_CONTINUE: { - duk_uint_t label_id; - duk_small_uint_t lj_type; - - /* Not necessary to unwind catchstack: break/continue - * handling will do it. The finally flag of 'cat' is - * no longer set. The catch flag may be set, but it's - * not checked by break/continue handling. - */ -#if 0 - duk_hthread_catchstack_unwind(thr, thr->catchstack_top - 1); -#endif + case DUK_OP_NEWOBJ: { + duk_context *ctx = (duk_context *) thr; + duk_push_object(ctx); + DUK__REPLACE_TOP_BC_BREAK(); + } - tv1 = thr->valstack + cat->idx_base; - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); -#if defined(DUK_USE_FASTINT) - DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1)); - label_id = (duk_small_uint_t) DUK_TVAL_GET_FASTINT_U32(tv1); -#else - label_id = (duk_small_uint_t) DUK_TVAL_GET_NUMBER(tv1); -#endif - lj_type = cont_type; - duk__handle_break_or_continue(thr, label_id, lj_type); - goto restart_execution; - } - default: { - DUK_DDD(DUK_DDDPRINT("ENDFIN: finally part finishing with abrupt completion, lj_type=%ld -> " - "dismantle catcher, re-throw error", - (long) cont_type)); + case DUK_OP_NEWARR: { + duk_context *ctx = (duk_context *) thr; + duk_push_array(ctx); + DUK__REPLACE_TOP_BC_BREAK(); + } - duk_push_tval(ctx, thr->valstack + cat->idx_base); + case DUK_OP_MPUTOBJ: + case DUK_OP_MPUTOBJI: { + duk_context *ctx = (duk_context *) thr; + duk_idx_t obj_idx; + duk_uint_fast_t idx, idx_end; + duk_small_uint_fast_t count; - duk_err_setup_heap_ljstate(thr, (duk_small_int_t) cont_type); + /* A -> register of target object + * B -> first register of key/value pair list + * or register containing first register number if indirect + * C -> number of key/value pairs * 2 + * (= number of value stack indices used starting from 'B') + */ - DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* always in executor */ - duk_err_longjmp(thr); - DUK_UNREACHABLE(); - } - } + obj_idx = DUK_DEC_A(ins); + DUK_ASSERT(duk_is_object(ctx, obj_idx)); - /* Must restart in all cases because we NULLed thr->ptr_curr_pc. */ - DUK_UNREACHABLE(); - break; + idx = (duk_uint_fast_t) DUK_DEC_B(ins); + if (DUK_DEC_OP(ins) == DUK_OP_MPUTOBJI) { + DUK__LOOKUP_INDIRECT_INDEX(idx); } - case DUK_EXTRAOP_THROW: { - duk_context *ctx = (duk_context *) thr; - duk_uint_fast_t bc = DUK_DEC_BC(ins); + count = (duk_small_uint_fast_t) DUK_DEC_C(ins); + DUK_ASSERT(count > 0); /* compiler guarantees */ + idx_end = idx + count; - /* Note: errors are augmented when they are created, not - * when they are thrown. So, don't augment here, it would - * break re-throwing for instance. - */ +#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK) + if (DUK_UNLIKELY(idx_end > (duk_uint_fast_t) duk_get_top(ctx))) { + /* XXX: use duk_is_valid_index() instead? */ + /* XXX: improve check; check against nregs, not against top */ + DUK__INTERNAL_ERROR("MPUTOBJ out of bounds"); + } +#endif - /* Sync so that augmentation sees up-to-date activations, NULL - * thr->ptr_curr_pc so that it's not used if side effects occur - * in augmentation or longjmp handling. - */ - DUK__SYNC_AND_NULL_CURR_PC(); + /* Use 'force' flag to duk_def_prop() to ensure that any + * inherited properties don't prevent the operation. + * With ES2015 duplicate properties are allowed, so that we + * must overwrite any previous data or accessor property. + * + * With ES2015 computed property names the literal keys + * may be arbitrary values and need to be ToPropertyKey() + * coerced at runtime. + */ + do { + /* XXX: faster initialization (direct access or better primitives) */ + duk_dup(ctx, idx); + duk_dup(ctx, idx + 1); + duk_def_prop(ctx, obj_idx, DUK_DEFPROP_HAVE_VALUE | + DUK_DEFPROP_FORCE | + DUK_DEFPROP_SET_WRITABLE | + DUK_DEFPROP_SET_ENUMERABLE | + DUK_DEFPROP_SET_CONFIGURABLE); + idx += 2; + } while (idx < idx_end); + break; + } - duk_dup(ctx, (duk_idx_t) bc); - DUK_DDD(DUK_DDDPRINT("THROW ERROR (BYTECODE): %!dT (before throw augment)", - (duk_tval *) duk_get_tval(ctx, -1))); -#if defined(DUK_USE_AUGMENT_ERROR_THROW) - duk_err_augment_error_throw(thr); - DUK_DDD(DUK_DDDPRINT("THROW ERROR (BYTECODE): %!dT (after throw augment)", - (duk_tval *) duk_get_tval(ctx, -1))); -#endif + case DUK_OP_INITSET: + case DUK_OP_INITGET: { + duk_context *ctx = (duk_context *) thr; + duk_bool_t is_set = (op == DUK_OP_INITSET); + duk_uint_fast_t idx; + duk_uint_t defprop_flags; - duk_err_setup_heap_ljstate(thr, DUK_LJ_TYPE_THROW); + /* A -> object register (acts as a source) + * BC -> BC+0 contains key, BC+1 closure (value) + */ - DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* always in executor */ - duk_err_longjmp(thr); - DUK_UNREACHABLE(); - break; + /* INITSET/INITGET are only used to initialize object literal keys. + * There may be a previous propery in ES2015 because duplicate property + * names are allowed. + */ + + /* This could be made more optimal by accessing internals directly. */ + + idx = (duk_uint_fast_t) DUK_DEC_BC(ins); + duk_dup(ctx, (duk_idx_t) (idx + 0)); /* key */ + duk_dup(ctx, (duk_idx_t) (idx + 1)); /* getter/setter */ + if (is_set) { + defprop_flags = DUK_DEFPROP_HAVE_SETTER | + DUK_DEFPROP_FORCE | + DUK_DEFPROP_SET_ENUMERABLE | + DUK_DEFPROP_SET_CONFIGURABLE; + } else { + defprop_flags = DUK_DEFPROP_HAVE_GETTER | + DUK_DEFPROP_FORCE | + DUK_DEFPROP_SET_ENUMERABLE | + DUK_DEFPROP_SET_CONFIGURABLE; } + duk_def_prop(ctx, (duk_idx_t) DUK_DEC_A(ins), defprop_flags); + break; + } - case DUK_EXTRAOP_INVLHS: { - DUK_ERROR(thr, DUK_ERR_REFERENCE_ERROR, "invalid lvalue"); + case DUK_OP_MPUTARR: + case DUK_OP_MPUTARRI: { + duk_context *ctx = (duk_context *) thr; + duk_idx_t obj_idx; + duk_uint_fast_t idx, idx_end; + duk_small_uint_fast_t count; + duk_tval *tv1; + duk_uint32_t arr_idx; - DUK_UNREACHABLE(); - break; + /* A -> register of target object + * B -> first register of value data (start_index, value1, value2, ..., valueN) + * or register containing first register number if indirect + * C -> number of key/value pairs (N) + */ + + obj_idx = DUK_DEC_A(ins); + DUK_ASSERT(duk_is_object(ctx, obj_idx)); + + idx = (duk_uint_fast_t) DUK_DEC_B(ins); + if (DUK_DEC_OP(ins) == DUK_OP_MPUTARRI) { + DUK__LOOKUP_INDIRECT_INDEX(idx); } - case DUK_EXTRAOP_UNM: - case DUK_EXTRAOP_UNP: { - duk_uint_fast_t bc = DUK_DEC_BC(ins); - duk__vm_arith_unary_op(thr, DUK__REGP(bc), bc, extraop); - break; + count = (duk_small_uint_fast_t) DUK_DEC_C(ins); + DUK_ASSERT(count > 0 + 1); /* compiler guarantees */ + idx_end = idx + count; + +#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK) + if (idx_end > (duk_uint_fast_t) duk_get_top(ctx)) { + /* XXX: use duk_is_valid_index() instead? */ + /* XXX: improve check; check against nregs, not against top */ + DUK__INTERNAL_ERROR("MPUTARR out of bounds"); } +#endif - case DUK_EXTRAOP_DEBUGGER: { - /* Opcode only emitted by compiler when debugger - * support is enabled. Ignore it silently without - * debugger support, in case it has been loaded - * from precompiled bytecode. - */ -#if defined(DUK_USE_DEBUGGER_SUPPORT) - if (DUK_HEAP_IS_DEBUGGER_ATTACHED(thr->heap)) { - DUK_D(DUK_DPRINT("DEBUGGER statement encountered, halt execution")); - DUK__SYNC_AND_NULL_CURR_PC(); - duk_debug_halt_execution(thr, 1 /*use_prev_pc*/); - DUK_D(DUK_DPRINT("DEBUGGER statement finished, resume execution")); - goto restart_execution; - } else { - DUK_D(DUK_DPRINT("DEBUGGER statement ignored, debugger not attached")); - } + tv1 = DUK__REGP(idx); + DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); +#if defined(DUK_USE_FASTINT) + DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1)); + arr_idx = (duk_uint32_t) DUK_TVAL_GET_FASTINT_U32(tv1); #else - DUK_D(DUK_DPRINT("DEBUGGER statement ignored, no debugger support")); + arr_idx = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv1); #endif - break; - } + idx++; - case DUK_EXTRAOP_BREAK: { - duk_uint_fast_t bc = DUK_DEC_BC(ins); + do { + /* duk_xdef_prop() will define an own property without any array + * special behaviors. We'll need to set the array length explicitly + * in the end. For arrays with elisions, the compiler will emit an + * explicit SETALEN which will update the length. + */ - DUK_DDD(DUK_DDDPRINT("BREAK: %ld", (long) bc)); + /* XXX: because we're dealing with 'own' properties of a fresh array, + * the array initializer should just ensure that the array has a large + * enough array part and write the values directly into array part, + * and finally set 'length' manually in the end (as already happens now). + */ - DUK__SYNC_AND_NULL_CURR_PC(); - duk__handle_break_or_continue(thr, (duk_uint_t) bc, DUK_LJ_TYPE_BREAK); - goto restart_execution; - } + duk_dup(ctx, idx); + duk_xdef_prop_index_wec(ctx, obj_idx, arr_idx); - case DUK_EXTRAOP_CONTINUE: { - duk_uint_fast_t bc = DUK_DEC_BC(ins); + idx++; + arr_idx++; + } while (idx < idx_end); - DUK_DDD(DUK_DDDPRINT("CONTINUE: %ld", (long) bc)); + /* XXX: E5.1 Section 11.1.4 coerces the final length through + * ToUint32() which is odd but happens now as a side effect of + * 'arr_idx' type. + */ + duk_set_length(thr, obj_idx, (duk_size_t) (duk_uarridx_t) arr_idx); + break; + } - DUK__SYNC_AND_NULL_CURR_PC(); - duk__handle_break_or_continue(thr, (duk_uint_t) bc, DUK_LJ_TYPE_CONTINUE); - goto restart_execution; - } + case DUK_OP_SETALEN: { + duk_tval *tv1; + duk_hobject *h; + duk_uint32_t len; - case DUK_EXTRAOP_BNOT: { - duk_uint_fast_t bc = DUK_DEC_BC(ins); + tv1 = DUK__REGP_A(ins); + DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv1)); + h = DUK_TVAL_GET_OBJECT(tv1); + DUK_ASSERT(DUK_HOBJECT_IS_ARRAY(h)); - duk__vm_bitwise_not(thr, DUK__REGP(bc), bc); - break; - } + tv1 = DUK__REGP_BC(ins); + DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); +#if defined(DUK_USE_FASTINT) + DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1)); + len = (duk_uint32_t) DUK_TVAL_GET_FASTINT_U32(tv1); +#else + len = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv1); +#endif + ((duk_harray *) h)->length = len; + break; + } - case DUK_EXTRAOP_LNOT: { - duk_uint_fast_t bc = DUK_DEC_BC(ins); - duk_tval *tv1; + case DUK_OP_INITENUM: { + duk_context *ctx = (duk_context *) thr; + duk_small_uint_fast_t b = DUK_DEC_B(ins); + duk_small_uint_fast_t c = DUK_DEC_C(ins); - tv1 = DUK__REGP(bc); - duk__vm_logical_not(thr, tv1, tv1); - break; - } + /* + * Enumeration semantics come from for-in statement, E5 Section 12.6.4. + * If called with 'null' or 'undefined', this opcode returns 'null' as + * the enumerator, which is special cased in NEXTENUM. This simplifies + * the compiler part + */ - case DUK_EXTRAOP_INSTOF: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_bool_t tmp; + /* B -> register for writing enumerator object + * C -> value to be enumerated (register) + */ - tmp = duk_js_instanceof(thr, DUK__REGP(b), DUK__REGCONSTP(c)); - duk_push_boolean(ctx, tmp); + if (duk_is_null_or_undefined(ctx, (duk_idx_t) c)) { + duk_push_null(ctx); duk_replace(ctx, (duk_idx_t) b); - break; - } - - case DUK_EXTRAOP_IN: { - duk_context *ctx = (duk_context *) thr; - duk_small_uint_fast_t b = DUK_DEC_B(ins); - duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_bool_t tmp; - - tmp = duk_js_in(thr, DUK__REGP(b), DUK__REGCONSTP(c)); - duk_push_boolean(ctx, tmp); + } else { + duk_dup(ctx, (duk_idx_t) c); + duk_to_object(ctx, -1); + duk_hobject_enumerator_create(ctx, 0 /*enum_flags*/); /* [ ... val ] --> [ ... enum ] */ duk_replace(ctx, (duk_idx_t) b); - break; } + break; + } - case DUK_EXTRAOP_LABEL: { - duk_catcher *cat; - duk_uint_fast_t bc = DUK_DEC_BC(ins); - - /* allocate catcher and populate it (should be atomic) */ + case DUK_OP_NEXTENUM: { + duk_context *ctx = (duk_context *) thr; + duk_small_uint_fast_t b = DUK_DEC_B(ins); + duk_small_uint_fast_t c = DUK_DEC_C(ins); - duk_hthread_catchstack_grow(thr); - cat = thr->catchstack + thr->catchstack_top; - thr->catchstack_top++; + /* + * NEXTENUM checks whether the enumerator still has unenumerated + * keys. If so, the next key is loaded to the target register + * and the next instruction is skipped. Otherwise the next instruction + * will be executed, jumping out of the enumeration loop. + */ - cat->flags = DUK_CAT_TYPE_LABEL | (bc << DUK_CAT_LABEL_SHIFT); - cat->callstack_index = thr->callstack_top - 1; - cat->pc_base = (duk_instr_t *) curr_pc; /* pre-incremented, points to first jump slot */ - cat->idx_base = 0; /* unused for label */ - cat->h_varname = NULL; + /* B -> target register for next key + * C -> enum register + */ - DUK_DDD(DUK_DDDPRINT("LABEL catcher: flags=0x%08lx, callstack_index=%ld, pc_base=%ld, " - "idx_base=%ld, h_varname=%!O, label_id=%ld", - (long) cat->flags, (long) cat->callstack_index, (long) cat->pc_base, - (long) cat->idx_base, (duk_heaphdr *) cat->h_varname, (long) DUK_CAT_GET_LABEL(cat))); + DUK_DDD(DUK_DDDPRINT("NEXTENUM: b->%!T, c->%!T", + (duk_tval *) duk_get_tval(ctx, (duk_idx_t) b), + (duk_tval *) duk_get_tval(ctx, (duk_idx_t) c))); - curr_pc += 2; /* skip jump slots */ - break; + if (duk_is_object(ctx, (duk_idx_t) c)) { + /* XXX: assert 'c' is an enumerator */ + duk_dup(ctx, (duk_idx_t) c); + if (duk_hobject_enumerator_next(ctx, 0 /*get_value*/)) { + /* [ ... enum ] -> [ ... next_key ] */ + DUK_DDD(DUK_DDDPRINT("enum active, next key is %!T, skip jump slot ", + (duk_tval *) duk_get_tval(ctx, -1))); + curr_pc++; + } else { + /* [ ... enum ] -> [ ... ] */ + DUK_DDD(DUK_DDDPRINT("enum finished, execute jump slot")); + DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); /* valstack policy */ + thr->valstack_top++; + } + duk_replace(ctx, (duk_idx_t) b); + } else { + /* 'null' enumerator case -> behave as with an empty enumerator */ + DUK_ASSERT(duk_is_null(ctx, (duk_idx_t) c)); + DUK_DDD(DUK_DDDPRINT("enum is null, execute jump slot")); } + break; + } - case DUK_EXTRAOP_ENDLABEL: { - duk_catcher *cat; -#if defined(DUK_USE_DDDPRINT) || defined(DUK_USE_ASSERTIONS) - duk_uint_fast_t bc = DUK_DEC_BC(ins); -#endif -#if defined(DUK_USE_DDDPRINT) - DUK_DDD(DUK_DDDPRINT("ENDLABEL %ld", (long) bc)); -#endif - - DUK_ASSERT(thr->catchstack_top >= 1); - - cat = thr->catchstack + thr->catchstack_top - 1; - DUK_UNREF(cat); - DUK_ASSERT(DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_LABEL); - DUK_ASSERT((duk_uint_fast_t) DUK_CAT_GET_LABEL(cat) == bc); - - duk_hthread_catchstack_unwind(thr, thr->catchstack_top - 1); - /* no need to unwind callstack */ - break; - } + case DUK_OP_INVLHS: { + DUK_ERROR_REFERENCE(thr, DUK_STR_INVALID_LVALUE); + DUK_UNREACHABLE(); + break; + } - default: { - DUK__INTERNAL_ERROR("invalid extra opcode"); + case DUK_OP_DEBUGGER: { + /* Opcode only emitted by compiler when debugger + * support is enabled. Ignore it silently without + * debugger support, in case it has been loaded + * from precompiled bytecode. + */ +#if defined(DUK_USE_DEBUGGER_SUPPORT) + if (DUK_HEAP_IS_DEBUGGER_ATTACHED(thr->heap)) { + DUK_D(DUK_DPRINT("DEBUGGER statement encountered, halt execution")); + DUK__SYNC_AND_NULL_CURR_PC(); + duk_debug_halt_execution(thr, 1 /*use_prev_pc*/); + DUK_D(DUK_DPRINT("DEBUGGER statement finished, resume execution")); + goto restart_execution; + } else { + DUK_D(DUK_DPRINT("DEBUGGER statement ignored, debugger not attached")); } +#else + DUK_D(DUK_DPRINT("DEBUGGER statement ignored, no debugger support")); +#endif + break; + } - } /* end switch */ + case DUK_OP_NOP: { + /* nop */ + break; + } + case DUK_OP_INVALID: { + DUK_ERROR_FMT1(thr, DUK_ERR_ERROR, "INVALID opcode (%ld)", (long) DUK_DEC_ABC(ins)); break; } - default: { - /* this should never be possible, because the switch-case is - * comprehensive +#if !defined(DUK_USE_EXEC_PREFER_SIZE) +#if !defined(DUK_USE_ES7_EXP_OPERATOR) + case DUK_OP_EXP_RR: + case DUK_OP_EXP_CR: + case DUK_OP_EXP_RC: + case DUK_OP_EXP_CC: +#endif + case DUK_OP_UNUSED194: + case DUK_OP_UNUSED195: + case DUK_OP_UNUSED196: + case DUK_OP_UNUSED197: + case DUK_OP_UNUSED198: + case DUK_OP_UNUSED199: + case DUK_OP_UNUSED200: + case DUK_OP_UNUSED201: + case DUK_OP_UNUSED202: + case DUK_OP_UNUSED203: + case DUK_OP_UNUSED204: + case DUK_OP_UNUSED205: + case DUK_OP_UNUSED206: + case DUK_OP_UNUSED207: + case DUK_OP_UNUSED208: + case DUK_OP_UNUSED209: + case DUK_OP_UNUSED210: + case DUK_OP_UNUSED211: + case DUK_OP_UNUSED212: + case DUK_OP_UNUSED213: + case DUK_OP_UNUSED214: + case DUK_OP_UNUSED215: + case DUK_OP_UNUSED216: + case DUK_OP_UNUSED217: + case DUK_OP_UNUSED218: + case DUK_OP_UNUSED219: + case DUK_OP_UNUSED220: + case DUK_OP_UNUSED221: + case DUK_OP_UNUSED222: + case DUK_OP_UNUSED223: + case DUK_OP_UNUSED224: + case DUK_OP_UNUSED225: + case DUK_OP_UNUSED226: + case DUK_OP_UNUSED227: + case DUK_OP_UNUSED228: + case DUK_OP_UNUSED229: + case DUK_OP_UNUSED230: + case DUK_OP_UNUSED231: + case DUK_OP_UNUSED232: + case DUK_OP_UNUSED233: + case DUK_OP_UNUSED234: + case DUK_OP_UNUSED235: + case DUK_OP_UNUSED236: + case DUK_OP_UNUSED237: + case DUK_OP_UNUSED238: + case DUK_OP_UNUSED239: + case DUK_OP_UNUSED240: + case DUK_OP_UNUSED241: + case DUK_OP_UNUSED242: + case DUK_OP_UNUSED243: + case DUK_OP_UNUSED244: + case DUK_OP_UNUSED245: + case DUK_OP_UNUSED246: + case DUK_OP_UNUSED247: + case DUK_OP_UNUSED248: + case DUK_OP_UNUSED249: + case DUK_OP_UNUSED250: + case DUK_OP_UNUSED251: + case DUK_OP_UNUSED252: + case DUK_OP_UNUSED253: + case DUK_OP_UNUSED254: + case DUK_OP_UNUSED255: { + /* Force all case clauses to map to an actual handler + * so that the compiler can emit a jump without a bounds + * check: the switch argument is a duk_uint8_t so that + * the compiler may be able to figure it out. This is + * a small detail and obviously compiler dependent. */ + volatile duk_small_int_t dummy_volatile; + dummy_volatile = 0; + DUK_UNREF(dummy_volatile); + DUK_D(DUK_DPRINT("invalid opcode: %ld - %!I", (long) op, ins)); + DUK__INTERNAL_ERROR("invalid opcode"); + break; + } +#endif /* DUK_USE_EXEC_PREFER_SIZE */ + default: { + /* Default case catches invalid/unsupported opcodes. */ + DUK_D(DUK_DPRINT("invalid opcode: %ld - %!I", (long) op, ins)); DUK__INTERNAL_ERROR("invalid opcode"); break; } } /* end switch */ + + continue; + + /* Some shared exit paths for opcode handling below. These + * are mostly useful to reduce code footprint when multiple + * opcodes have a similar epilogue (like replacing stack top + * with index 'a'). + */ + +#if defined(DUK_USE_EXEC_PREFER_SIZE) + replace_top_a: + DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_A(ins)); + continue; + replace_top_bc: + DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_BC(ins)); + continue; +#endif } DUK_UNREACHABLE(); -#ifndef DUK_USE_VERBOSE_EXECUTOR_ERRORS +#if !defined(DUK_USE_VERBOSE_EXECUTOR_ERRORS) internal_error: - DUK_ERROR_INTERNAL(thr, "internal error in bytecode executor"); + DUK_ERROR_INTERNAL(thr); #endif } +/* automatic undefs */ +#undef DUK__BYTEOFF_A +#undef DUK__BYTEOFF_B +#undef DUK__BYTEOFF_BC +#undef DUK__BYTEOFF_C +#undef DUK__COMPARE_BODY +#undef DUK__CONST +#undef DUK__CONSTP +#undef DUK__CONSTP_A +#undef DUK__CONSTP_B +#undef DUK__CONSTP_BC +#undef DUK__CONSTP_C +#undef DUK__DELPROP_BODY +#undef DUK__EQ_BODY +#undef DUK__FUN +#undef DUK__GETPROP_BODY +#undef DUK__GE_BODY +#undef DUK__GT_BODY +#undef DUK__INLINE_PERF +#undef DUK__INSTOF_BODY +#undef DUK__INTERNAL_ERROR +#undef DUK__INT_NOACTION +#undef DUK__INT_RESTART +#undef DUK__IN_BODY +#undef DUK__LE_BODY #undef DUK__LONGJMP_RESTART -#undef DUK__LONGJMP_FINISHED #undef DUK__LONGJMP_RETHROW - -#undef DUK__RETHAND_RESTART -#undef DUK__RETHAND_FINISHED - -#undef DUK__FUN -#undef DUK__STRICT +#undef DUK__LOOKUP_INDIRECT_INDEX +#undef DUK__LT_BODY +#undef DUK__MASK_A +#undef DUK__MASK_B +#undef DUK__MASK_BC +#undef DUK__MASK_C +#undef DUK__NEQ_BODY +#undef DUK__PUTPROP_BODY +#undef DUK__RCBIT_B +#undef DUK__RCBIT_C #undef DUK__REG +#undef DUK__REGCONSTP_B +#undef DUK__REGCONSTP_C #undef DUK__REGP -#undef DUK__CONST -#undef DUK__CONSTP -#undef DUK__RCISREG -#undef DUK__REGCONST -#undef DUK__REGCONSTP - -#undef DUK__INTERNAL_ERROR -#undef DUK__SYNC_CURR_PC +#undef DUK__REGP_A +#undef DUK__REGP_B +#undef DUK__REGP_BC +#undef DUK__REGP_C +#undef DUK__REPLACE_BOOL_A_BREAK +#undef DUK__REPLACE_TOP_A_BREAK +#undef DUK__REPLACE_TOP_BC_BREAK +#undef DUK__REPLACE_TO_TVPTR +#undef DUK__RETHAND_FINISHED +#undef DUK__RETHAND_RESTART +#undef DUK__RETURN_SHARED +#undef DUK__SEQ_BODY +#undef DUK__SHIFT_A +#undef DUK__SHIFT_B +#undef DUK__SHIFT_BC +#undef DUK__SHIFT_C +#undef DUK__SNEQ_BODY +#undef DUK__STRICT #undef DUK__SYNC_AND_NULL_CURR_PC +#undef DUK__SYNC_CURR_PC +#undef DUK__TVAL_SHIFT #line 1 "duk_js_ops.c" /* * Ecmascript specification algorithm and conversion helpers. * - * These helpers encapsulate the primitive Ecmascript operation - * semantics, and are used by the bytecode executor and the API - * (among other places). Note that some primitives are only - * implemented as part of the API and have no "internal" helper. - * (This is the case when an internal helper would not really be - * useful; e.g. the operation is rare, uses value stack heavily, - * etc.) + * These helpers encapsulate the primitive Ecmascript operation semantics, + * and are used by the bytecode executor and the API (among other places). + * Some primitives are only implemented as part of the API and have no + * "internal" helper. This is the case when an internal helper would not + * really be useful; e.g. the operation is rare, uses value stack heavily, + * etc. * * The operation arguments depend on what is required to implement * the operation: @@ -69718,13 +73693,7 @@ DUK_LOCAL DUK_NOINLINE void duk__js_execute_bytecode_inner(duk_hthread *entry_th * in-place coercion is OK for the bytecode executor and the API. */ -/* include removed: duk_internal.h */ - -/* - * [[DefaultValue]] (E5 Section 8.12.8) - * - * ==> implemented in the API. - */ +/* #include duk_internal.h -> already included */ /* * ToPrimitive() (E5 Section 9.1) @@ -69742,8 +73711,13 @@ DUK_INTERNAL duk_bool_t duk_js_toboolean(duk_tval *tv) { case DUK_TAG_NULL: return 0; case DUK_TAG_BOOLEAN: + DUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv) == 0 || DUK_TVAL_GET_BOOLEAN(tv) == 1); return DUK_TVAL_GET_BOOLEAN(tv); case DUK_TAG_STRING: { + /* Symbols ToBoolean() coerce to true, regardless of their + * description. This happens with no explicit check because + * of the symbol representation byte prefix. + */ duk_hstring *h = DUK_TVAL_GET_STRING(tv); DUK_ASSERT(h != NULL); return (DUK_HSTRING_GET_BYTELEN(h) > 0 ? 1 : 0); @@ -69752,10 +73726,10 @@ DUK_INTERNAL duk_bool_t duk_js_toboolean(duk_tval *tv) { return 1; } case DUK_TAG_BUFFER: { - /* mimic semantics for strings */ - duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); - DUK_ASSERT(h != NULL); - return (DUK_HBUFFER_GET_SIZE(h) > 0 ? 1 : 0); + /* Mimic Uint8Array semantics: objects coerce true, regardless + * of buffer length (zero or not) or context. + */ + return 1; } case DUK_TAG_POINTER: { void *p = DUK_TVAL_GET_POINTER(tv); @@ -69775,16 +73749,23 @@ DUK_INTERNAL duk_bool_t duk_js_toboolean(duk_tval *tv) { default: { /* number */ duk_double_t d; +#if defined(DUK_USE_PREFER_SIZE) int c; +#endif DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); DUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv)); d = DUK_TVAL_GET_DOUBLE(tv); +#if defined(DUK_USE_PREFER_SIZE) c = DUK_FPCLASSIFY((double) d); if (c == DUK_FP_ZERO || c == DUK_FP_NAN) { return 0; } else { return 1; } +#else + DUK_ASSERT(duk_double_is_nan_or_zero(d) == 0 || duk_double_is_nan_or_zero(d) == 1); + return duk_double_is_nan_or_zero(d) ^ 1; +#endif } } DUK_UNREACHABLE(); @@ -69824,6 +73805,8 @@ DUK_LOCAL duk_double_t duk__tonumber_string_raw(duk_hthread *thr) { duk_small_uint_t s2n_flags; duk_double_t d; + DUK_ASSERT(duk_is_string(ctx, -1)); + /* Quite lenient, e.g. allow empty as zero, but don't allow trailing * garbage. */ @@ -69837,11 +73820,23 @@ DUK_LOCAL duk_double_t duk__tonumber_string_raw(duk_hthread *thr) { DUK_S2N_FLAG_ALLOW_EMPTY_FRAC | DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO | DUK_S2N_FLAG_ALLOW_LEADING_ZERO | - DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT; + DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT | + DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT | + DUK_S2N_FLAG_ALLOW_AUTO_BIN_INT; duk_numconv_parse(ctx, 10 /*radix*/, s2n_flags); + +#if defined(DUK_USE_PREFER_SIZE) d = duk_get_number(ctx, -1); duk_pop(ctx); +#else + thr->valstack_top--; + DUK_ASSERT(DUK_TVAL_IS_NUMBER(thr->valstack_top)); + DUK_ASSERT(DUK_TVAL_IS_DOUBLE(thr->valstack_top)); /* no fastint conversion in numconv now */ + DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(thr->valstack_top)); + d = DUK_TVAL_GET_DOUBLE(thr->valstack_top); /* assumes not a fastint */ + DUK_TVAL_SET_UNDEFINED(thr->valstack_top); +#endif return d; } @@ -69871,35 +73866,29 @@ DUK_INTERNAL duk_double_t duk_js_tonumber(duk_hthread *thr, duk_tval *tv) { return 0.0; } case DUK_TAG_STRING: { + /* For Symbols ToNumber() is always a TypeError. */ duk_hstring *h = DUK_TVAL_GET_STRING(tv); + if (DUK_HSTRING_HAS_SYMBOL(h)) { + DUK_ERROR_TYPE(thr, DUK_STR_CANNOT_NUMBER_COERCE_SYMBOL); + } duk_push_hstring(ctx, h); return duk__tonumber_string_raw(thr); } + case DUK_TAG_BUFFER: /* plain buffer treated like object */ case DUK_TAG_OBJECT: { - /* Note: ToPrimitive(object,hint) == [[DefaultValue]](object,hint), - * so use [[DefaultValue]] directly. - */ duk_double_t d; duk_push_tval(ctx, tv); - duk_to_defaultvalue(ctx, -1, DUK_HINT_NUMBER); /* 'tv' becomes invalid */ + duk_to_primitive(ctx, -1, DUK_HINT_NUMBER); /* 'tv' becomes invalid */ /* recursive call for a primitive value (guaranteed not to cause second * recursion). */ - d = duk_js_tonumber(thr, duk_require_tval(ctx, -1)); + DUK_ASSERT(duk_get_tval(ctx, -1) != NULL); + d = duk_js_tonumber(thr, duk_get_tval(ctx, -1)); duk_pop(ctx); return d; } - case DUK_TAG_BUFFER: { - /* Coerce like a string. This makes sense because addition also treats - * buffers like strings. - */ - duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); - duk_push_hbuffer(ctx, h); - duk_to_string(ctx, -1); /* XXX: expensive, but numconv now expects to see a string */ - return duk__tonumber_string_raw(thr); - } case DUK_TAG_POINTER: { /* Coerce like boolean */ void *p = DUK_TVAL_GET_POINTER(tv); @@ -69930,23 +73919,33 @@ DUK_INTERNAL duk_double_t duk_js_tonumber(duk_hthread *thr, duk_tval *tv) { /* exposed, used by e.g. duk_bi_date.c */ DUK_INTERNAL duk_double_t duk_js_tointeger_number(duk_double_t x) { +#if defined(DUK_USE_PREFER_SIZE) duk_small_int_t c = (duk_small_int_t) DUK_FPCLASSIFY(x); - if (c == DUK_FP_NAN) { + if (DUK_UNLIKELY(c == DUK_FP_NAN)) { return 0.0; - } else if (c == DUK_FP_ZERO || c == DUK_FP_INFINITE) { - /* XXX: FP_ZERO check can be removed, the else clause handles it - * correctly (preserving sign). - */ + } else if (DUK_UNLIKELY(c == DUK_FP_INFINITE)) { return x; } else { - duk_small_int_t s = (duk_small_int_t) DUK_SIGNBIT(x); - x = DUK_FLOOR(DUK_FABS(x)); /* truncate towards zero */ - if (s) { - x = -x; + /* Finite, including neg/pos zero. Neg zero sign must be + * preserved. + */ + return duk_double_trunc_towards_zero(x); + } +#else /* DUK_USE_PREFER_SIZE */ + /* NaN and Infinity have the same exponent so it's a cheap + * initial check for the rare path. + */ + if (DUK_UNLIKELY(duk_double_is_nan_or_inf(x))) { + if (duk_double_is_nan(x)) { + return 0.0; + } else { + return x; } - return x; + } else { + return duk_double_trunc_towards_zero(x); } +#endif /* DUK_USE_PREFER_SIZE */ } DUK_INTERNAL duk_double_t duk_js_tointeger(duk_hthread *thr, duk_tval *tv) { @@ -69961,20 +73960,23 @@ DUK_INTERNAL duk_double_t duk_js_tointeger(duk_hthread *thr, duk_tval *tv) { /* combined algorithm matching E5 Sections 9.5 and 9.6 */ DUK_LOCAL duk_double_t duk__toint32_touint32_helper(duk_double_t x, duk_bool_t is_toint32) { - duk_small_int_t c = (duk_small_int_t) DUK_FPCLASSIFY(x); - duk_small_int_t s; +#if defined (DUK_USE_PREFER_SIZE) + duk_small_int_t c; +#endif +#if defined (DUK_USE_PREFER_SIZE) + c = (duk_small_int_t) DUK_FPCLASSIFY(x); if (c == DUK_FP_NAN || c == DUK_FP_ZERO || c == DUK_FP_INFINITE) { return 0.0; } - +#else + if (duk_double_is_nan_zero_inf(x)) { + return 0.0; + } +#endif /* x = sign(x) * floor(abs(x)), i.e. truncate towards zero, keep sign */ - s = (duk_small_int_t) DUK_SIGNBIT(x); - x = DUK_FLOOR(DUK_FABS(x)); - if (s) { - x = -x; - } + x = duk_double_trunc_towards_zero(x); /* NOTE: fmod(x) result sign is same as sign of x, which * differs from what Javascript wants (see Section 9.6). @@ -69985,7 +73987,7 @@ DUK_LOCAL duk_double_t duk__toint32_touint32_helper(duk_double_t x, duk_bool_t i if (x < 0.0) { x += DUK_DOUBLE_2TO32; } - /* -> x in [0, 2**32[ */ + DUK_ASSERT(x >= 0 && x < DUK_DOUBLE_2TO32); /* -> x in [0, 2**32[ */ if (is_toint32) { if (x >= DUK_DOUBLE_2TO31) { @@ -70041,58 +74043,13 @@ DUK_INTERNAL duk_uint16_t duk_js_touint16(duk_hthread *thr, duk_tval *tv) { /* * ToString() (E5 Section 9.8) - * - * ==> implemented in the API. - */ - -/* * ToObject() (E5 Section 9.9) - * - * ==> implemented in the API. - */ - -/* * CheckObjectCoercible() (E5 Section 9.10) - * - * Note: no API equivalent now. - */ - -#if 0 /* unused */ -DUK_INTERNAL void duk_js_checkobjectcoercible(duk_hthread *thr, duk_tval *tv_x) { - duk_small_uint_t tag = DUK_TVAL_GET_TAG(tv_x); - - /* Note: this must match ToObject() behavior */ - - if (tag == DUK_TAG_UNDEFINED || - tag == DUK_TAG_NULL || - tag == DUK_TAG_POINTER || - tag == DUK_TAG_BUFFER) { - DUK_ERROR_TYPE(thr, "not object coercible"); - } -} -#endif - -/* * IsCallable() (E5 Section 9.11) * - * XXX: API equivalent is a separate implementation now, and this has - * currently no callers. + * ==> implemented in the API. */ -#if 0 /* unused */ -DUK_INTERNAL duk_bool_t duk_js_iscallable(duk_tval *tv_x) { - duk_hobject *obj; - - if (!DUK_TVAL_IS_OBJECT(tv_x)) { - return 0; - } - obj = DUK_TVAL_GET_OBJECT(tv_x); - DUK_ASSERT(obj != NULL); - - return DUK_HOBJECT_IS_CALLABLE(obj); -} -#endif - /* * Loose equality, strict equality, and SameValue (E5 Sections 11.9.1, 11.9.4, * 9.12). These have much in common so they can share some helpers. @@ -70164,8 +74121,8 @@ DUK_LOCAL duk_bool_t duk__js_samevalue_number(duk_double_t x, duk_double_t y) { * * signbit(x) == signbit(y) */ - duk_small_int_t sx = (DUK_SIGNBIT(x) ? 1 : 0); - duk_small_int_t sy = (DUK_SIGNBIT(y) ? 1 : 0); + duk_small_int_t sx = DUK_SIGNBIT(x) ? 1 : 0; + duk_small_int_t sy = DUK_SIGNBIT(y) ? 1 : 0; return (sx == sy); } @@ -70192,14 +74149,12 @@ DUK_LOCAL duk_bool_t duk__js_samevalue_number(duk_double_t x, duk_double_t y) { * * signbit(x) == signbit(y) */ - duk_small_int_t sx = (DUK_SIGNBIT(x) ? 1 : 0); - duk_small_int_t sy = (DUK_SIGNBIT(y) ? 1 : 0); - return (sx == sy); + return duk_double_same_sign(x, y); } return 1; } else { /* IEEE requires that zeros compare the same regardless - * of their signed, so if both x and y are zeroes, they + * of their sign, so if both x and y are zeroes, they * are caught above. */ DUK_ASSERT(!(DUK_FPCLASSIFY(x) == DUK_FP_ZERO && DUK_FPCLASSIFY(y) == DUK_FP_ZERO)); @@ -70218,7 +74173,8 @@ DUK_LOCAL duk_bool_t duk__js_samevalue_number(duk_double_t x, duk_double_t y) { DUK_INTERNAL duk_bool_t duk_js_equals_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_int_t flags) { duk_context *ctx = (duk_context *) thr; - duk_tval *tv_tmp; + duk_uint_t type_mask_x; + duk_uint_t type_mask_y; /* If flags != 0 (strict or SameValue), thr can be NULL. For loose * equals comparison it must be != NULL. @@ -70243,15 +74199,19 @@ DUK_INTERNAL duk_bool_t duk_js_equals_helper(duk_hthread *thr, duk_tval *tv_x, d else #endif if (DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y)) { - /* Catches both doubles and cases where only one argument is a fastint */ + duk_double_t d1, d2; + + /* Catches both doubles and cases where only one argument is + * a fastint so can't assume a double. + */ + d1 = DUK_TVAL_GET_NUMBER(tv_x); + d2 = DUK_TVAL_GET_NUMBER(tv_y); if (DUK_UNLIKELY((flags & DUK_EQUALS_FLAG_SAMEVALUE) != 0)) { /* SameValue */ - return duk__js_samevalue_number(DUK_TVAL_GET_NUMBER(tv_x), - DUK_TVAL_GET_NUMBER(tv_y)); + return duk__js_samevalue_number(d1, d2); } else { /* equals and strict equals */ - return duk__js_equals_number(DUK_TVAL_GET_NUMBER(tv_x), - DUK_TVAL_GET_NUMBER(tv_y)); + return duk__js_equals_number(d1, d2); } } else if (DUK_TVAL_GET_TAG(tv_x) == DUK_TVAL_GET_TAG(tv_y)) { switch (DUK_TVAL_GET_TAG(tv_x)) { @@ -70267,34 +74227,19 @@ DUK_INTERNAL duk_bool_t duk_js_equals_helper(duk_hthread *thr, duk_tval *tv_x, d } case DUK_TAG_STRING: case DUK_TAG_OBJECT: { - /* heap pointer comparison suffices */ + /* Heap pointer comparison suffices for strings and objects. + * Symbols compare equal if they have the same internal + * representation; again heap pointer comparison suffices. + */ return DUK_TVAL_GET_HEAPHDR(tv_x) == DUK_TVAL_GET_HEAPHDR(tv_y); } case DUK_TAG_BUFFER: { - if ((flags & (DUK_EQUALS_FLAG_STRICT | DUK_EQUALS_FLAG_SAMEVALUE)) != 0) { - /* heap pointer comparison suffices */ - return DUK_TVAL_GET_HEAPHDR(tv_x) == DUK_TVAL_GET_HEAPHDR(tv_y); - } else { - /* non-strict equality for buffers compares contents */ - duk_hbuffer *h_x = DUK_TVAL_GET_BUFFER(tv_x); - duk_hbuffer *h_y = DUK_TVAL_GET_BUFFER(tv_y); - duk_size_t len_x = DUK_HBUFFER_GET_SIZE(h_x); - duk_size_t len_y = DUK_HBUFFER_GET_SIZE(h_y); - void *buf_x; - void *buf_y; - if (len_x != len_y) { - return 0; - } - buf_x = (void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_x); - buf_y = (void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_y); - /* if len_x == len_y == 0, buf_x and/or buf_y may - * be NULL, but that's OK. - */ - DUK_ASSERT(len_x == len_y); - DUK_ASSERT(len_x == 0 || buf_x != NULL); - DUK_ASSERT(len_y == 0 || buf_y != NULL); - return (DUK_MEMCMP((const void *) buf_x, (const void *) buf_y, (size_t) len_x) == 0) ? 1 : 0; - } + /* In Duktape 2.x plain buffers mimic Uint8Array objects + * so always compare by heap pointer. In Duktape 1.x + * strict comparison would compare heap pointers and + * non-strict would compare contents. + */ + return DUK_TVAL_GET_HEAPHDR(tv_x) == DUK_TVAL_GET_HEAPHDR(tv_y); } case DUK_TAG_LIGHTFUNC: { /* At least 'magic' has a significant impact on function @@ -70336,95 +74281,78 @@ DUK_INTERNAL duk_bool_t duk_js_equals_helper(duk_hthread *thr, duk_tval *tv_x, d * code size. */ + type_mask_x = duk_get_type_mask_tval(tv_x); + type_mask_y = duk_get_type_mask_tval(tv_y); + /* Undefined/null are considered equal (e.g. "null == undefined" -> true). */ - if ((DUK_TVAL_IS_UNDEFINED(tv_x) && DUK_TVAL_IS_NULL(tv_y)) || - (DUK_TVAL_IS_NULL(tv_x) && DUK_TVAL_IS_UNDEFINED(tv_y))) { + if ((type_mask_x & (DUK_TYPE_MASK_UNDEFINED | DUK_TYPE_MASK_NULL)) && + (type_mask_y & (DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_UNDEFINED))) { return 1; } - /* Number/string-or-buffer -> coerce string to number (e.g. "'1.5' == 1.5" -> true). */ - if (DUK_TVAL_IS_NUMBER(tv_x) && (DUK_TVAL_IS_STRING(tv_y) || DUK_TVAL_IS_BUFFER(tv_y))) { - /* the next 'if' is guaranteed to match after swap */ - tv_tmp = tv_x; - tv_x = tv_y; - tv_y = tv_tmp; + /* Number/string -> coerce string to number (e.g. "'1.5' == 1.5" -> true). */ + if ((type_mask_x & DUK_TYPE_MASK_NUMBER) && (type_mask_y & DUK_TYPE_MASK_STRING)) { + if (!DUK_TVAL_STRING_IS_SYMBOL(tv_y)) { + duk_double_t d1, d2; + d1 = DUK_TVAL_GET_NUMBER(tv_x); + d2 = duk_to_number_tval(ctx, tv_y); + return duk__js_equals_number(d1, d2); + } } - if ((DUK_TVAL_IS_STRING(tv_x) || DUK_TVAL_IS_BUFFER(tv_x)) && DUK_TVAL_IS_NUMBER(tv_y)) { - /* XXX: this is possible without resorting to the value stack */ - duk_double_t d1, d2; - d2 = DUK_TVAL_GET_NUMBER(tv_y); - duk_push_tval(ctx, tv_x); - duk_to_string(ctx, -1); /* buffer values are coerced first to string here */ - duk_to_number(ctx, -1); - d1 = duk_require_number(ctx, -1); - duk_pop(ctx); - return duk__js_equals_number(d1, d2); - } - - /* Buffer/string -> compare contents. */ - if (DUK_TVAL_IS_BUFFER(tv_x) && DUK_TVAL_IS_STRING(tv_y)) { - tv_tmp = tv_x; - tv_x = tv_y; - tv_y = tv_tmp; - } - if (DUK_TVAL_IS_STRING(tv_x) && DUK_TVAL_IS_BUFFER(tv_y)) { - duk_hstring *h_x = DUK_TVAL_GET_STRING(tv_x); - duk_hbuffer *h_y = DUK_TVAL_GET_BUFFER(tv_y); - duk_size_t len_x = DUK_HSTRING_GET_BYTELEN(h_x); - duk_size_t len_y = DUK_HBUFFER_GET_SIZE(h_y); - const void *buf_x; - const void *buf_y; - if (len_x != len_y) { - return 0; + if ((type_mask_x & DUK_TYPE_MASK_STRING) && (type_mask_y & DUK_TYPE_MASK_NUMBER)) { + if (!DUK_TVAL_STRING_IS_SYMBOL(tv_x)) { + duk_double_t d1, d2; + d1 = DUK_TVAL_GET_NUMBER(tv_y); + d2 = duk_to_number_tval(ctx, tv_x); + return duk__js_equals_number(d1, d2); } - buf_x = (const void *) DUK_HSTRING_GET_DATA(h_x); - buf_y = (const void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_y); - /* if len_x == len_y == 0, buf_x and/or buf_y may - * be NULL, but that's OK. - */ - DUK_ASSERT(len_x == len_y); - DUK_ASSERT(len_x == 0 || buf_x != NULL); - DUK_ASSERT(len_y == 0 || buf_y != NULL); - return (DUK_MEMCMP((const void *) buf_x, (const void *) buf_y, (size_t) len_x) == 0) ? 1 : 0; } /* Boolean/any -> coerce boolean to number and try again. If boolean is * compared to a pointer, the final comparison after coercion now always * yields false (as pointer vs. number compares to false), but this is * not special cased. + * + * ToNumber(bool) is +1.0 or 0.0. Tagged boolean value is always 0 or 1. */ - if (DUK_TVAL_IS_BOOLEAN(tv_x)) { - tv_tmp = tv_x; - tv_x = tv_y; - tv_y = tv_tmp; + if (type_mask_x & DUK_TYPE_MASK_BOOLEAN) { + DUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv_x) == 0 || DUK_TVAL_GET_BOOLEAN(tv_x) == 1); + duk_push_int(ctx, DUK_TVAL_GET_BOOLEAN(tv_x)); + duk_push_tval(ctx, tv_y); + goto recursive_call; } - if (DUK_TVAL_IS_BOOLEAN(tv_y)) { - /* ToNumber(bool) is +1.0 or 0.0. Tagged boolean value is always 0 or 1. */ - duk_bool_t rc; + if (type_mask_y & DUK_TYPE_MASK_BOOLEAN) { DUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv_y) == 0 || DUK_TVAL_GET_BOOLEAN(tv_y) == 1); duk_push_tval(ctx, tv_x); duk_push_int(ctx, DUK_TVAL_GET_BOOLEAN(tv_y)); - rc = duk_js_equals_helper(thr, - DUK_GET_TVAL_NEGIDX(ctx, -2), - DUK_GET_TVAL_NEGIDX(ctx, -1), - 0 /*flags:nonstrict*/); - duk_pop_2(ctx); - return rc; + goto recursive_call; } - /* String-number-buffer/object -> coerce object to primitive (apparently without hint), then try again. */ - if ((DUK_TVAL_IS_STRING(tv_x) || DUK_TVAL_IS_NUMBER(tv_x) || DUK_TVAL_IS_BUFFER(tv_x)) && - DUK_TVAL_IS_OBJECT(tv_y)) { - tv_tmp = tv_x; - tv_x = tv_y; - tv_y = tv_tmp; + /* String-number-symbol/object -> coerce object to primitive (apparently without hint), then try again. */ + if ((type_mask_x & (DUK_TYPE_MASK_STRING | DUK_TYPE_MASK_NUMBER)) && + (type_mask_y & DUK_TYPE_MASK_OBJECT)) { + /* No symbol check needed because symbols and strings are accepted. */ + duk_push_tval(ctx, tv_x); + duk_push_tval(ctx, tv_y); + duk_to_primitive(ctx, -1, DUK_HINT_NONE); /* apparently no hint? */ + goto recursive_call; } - if (DUK_TVAL_IS_OBJECT(tv_x) && - (DUK_TVAL_IS_STRING(tv_y) || DUK_TVAL_IS_NUMBER(tv_y) || DUK_TVAL_IS_BUFFER(tv_y))) { - duk_bool_t rc; + if ((type_mask_x & DUK_TYPE_MASK_OBJECT) && + (type_mask_y & (DUK_TYPE_MASK_STRING | DUK_TYPE_MASK_NUMBER))) { + /* No symbol check needed because symbols and strings are accepted. */ duk_push_tval(ctx, tv_x); duk_push_tval(ctx, tv_y); duk_to_primitive(ctx, -2, DUK_HINT_NONE); /* apparently no hint? */ + goto recursive_call; + } + + /* Nothing worked -> not equal. */ + return 0; + + recursive_call: + /* Shared code path to call the helper again with arguments on stack top. */ + { + duk_bool_t rc; rc = duk_js_equals_helper(thr, DUK_GET_TVAL_NEGIDX(ctx, -2), DUK_GET_TVAL_NEGIDX(ctx, -1), @@ -70432,9 +74360,6 @@ DUK_INTERNAL duk_bool_t duk_js_equals_helper(duk_hthread *thr, duk_tval *tv_x, d duk_pop_2(ctx); return rc; } - - /* Nothing worked -> not equal. */ - return 0; } /* @@ -70516,56 +74441,139 @@ DUK_INTERNAL duk_small_int_t duk_js_buffer_compare(duk_heap *heap, duk_hbuffer * } #endif +#if defined(DUK_USE_FASTINT) +DUK_LOCAL duk_bool_t duk__compare_fastint(duk_bool_t retval, duk_int64_t v1, duk_int64_t v2) { + DUK_ASSERT(retval == 0 || retval == 1); + if (v1 < v2) { + return retval ^ 1; + } else { + return retval; + } +} +#endif + +#if defined(DUK_USE_PARANOID_MATH) +DUK_LOCAL duk_bool_t duk__compare_number(duk_bool_t retval, duk_double_t d1, duk_double_t d2) { + duk_small_int_t c1, s1, c2, s2; + + DUK_ASSERT(retval == 0 || retval == 1); + c1 = (duk_small_int_t) DUK_FPCLASSIFY(d1); + s1 = (duk_small_int_t) DUK_SIGNBIT(d1); + c2 = (duk_small_int_t) DUK_FPCLASSIFY(d2); + s2 = (duk_small_int_t) DUK_SIGNBIT(d2); + + if (c1 == DUK_FP_NAN || c2 == DUK_FP_NAN) { + return 0; /* Always false, regardless of negation. */ + } + + if (c1 == DUK_FP_ZERO && c2 == DUK_FP_ZERO) { + /* For all combinations: +0 < +0, +0 < -0, -0 < +0, -0 < -0, + * steps e, f, and g. + */ + return retval; /* false */ + } + + if (d1 == d2) { + return retval; /* false */ + } + + if (c1 == DUK_FP_INFINITE && s1 == 0) { + /* x == +Infinity */ + return retval; /* false */ + } + + if (c2 == DUK_FP_INFINITE && s2 == 0) { + /* y == +Infinity */ + return retval ^ 1; /* true */ + } + + if (c2 == DUK_FP_INFINITE && s2 != 0) { + /* y == -Infinity */ + return retval; /* false */ + } + + if (c1 == DUK_FP_INFINITE && s1 != 0) { + /* x == -Infinity */ + return retval ^ 1; /* true */ + } + + if (d1 < d2) { + return retval ^ 1; /* true */ + } + + return retval; /* false */ +} +#else /* DUK_USE_PARANOID_MATH */ +DUK_LOCAL duk_bool_t duk__compare_number(duk_bool_t retval, duk_double_t d1, duk_double_t d2) { + /* This comparison tree relies doesn't match the exact steps in + * E5 Section 11.8.5 but should produce the same results. The + * steps rely on exact IEEE semantics for NaNs, etc. + */ + + DUK_ASSERT(retval == 0 || retval == 1); + if (d1 < d2) { + /* In no case should both (d1 < d2) and (d2 < d1) be true. + * It's possible that neither is true though, and that's + * handled below. + */ + DUK_ASSERT(!(d2 < d1)); + + /* - d1 < d2, both d1/d2 are normals (not Infinity, not NaN) + * - d2 is +Infinity, d1 != +Infinity and NaN + * - d1 is -Infinity, d2 != -Infinity and NaN + */ + return retval ^ 1; + } else { + if (d2 < d1) { + /* - !(d1 < d2), both d1/d2 are normals (not Infinity, not NaN) + * - d1 is +Infinity, d2 != +Infinity and NaN + * - d2 is -Infinity, d1 != -Infinity and NaN + */ + return retval; + } else { + /* - d1 and/or d2 is NaN + * - d1 and d2 are both +/- 0 + * - d1 == d2 (including infinities) + */ + if (duk_double_is_nan(d1) || duk_double_is_nan(d2)) { + /* Note: undefined from Section 11.8.5 always + * results in false return (see e.g. Section + * 11.8.3) - hence special treatment here. + */ + return 0; /* zero regardless of negation */ + } else { + return retval; + } + } + } +} +#endif /* DUK_USE_PARANOID_MATH */ + DUK_INTERNAL duk_bool_t duk_js_compare_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_int_t flags) { duk_context *ctx = (duk_context *) thr; duk_double_t d1, d2; - duk_small_int_t c1, c2; - duk_small_int_t s1, s2; duk_small_int_t rc; duk_bool_t retval; + DUK_ASSERT(DUK_COMPARE_FLAG_NEGATE == 1); /* Rely on this flag being lowest. */ + retval = flags & DUK_COMPARE_FLAG_NEGATE; + DUK_ASSERT(retval == 0 || retval == 1); + /* Fast path for fastints */ #if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) { - duk_int64_t v1 = DUK_TVAL_GET_FASTINT(tv_x); - duk_int64_t v2 = DUK_TVAL_GET_FASTINT(tv_y); - if (v1 < v2) { - /* 'lt is true' */ - retval = 1; - } else { - retval = 0; - } - if (flags & DUK_COMPARE_FLAG_NEGATE) { - retval ^= 1; - } - return retval; + if (DUK_LIKELY(DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y))) { + return duk__compare_fastint(retval, + DUK_TVAL_GET_FASTINT(tv_x), + DUK_TVAL_GET_FASTINT(tv_y)); } #endif /* DUK_USE_FASTINT */ /* Fast path for numbers (one of which may be a fastint) */ -#if 1 /* XXX: make fast paths optional for size minimization? */ - if (DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y)) { - d1 = DUK_TVAL_GET_NUMBER(tv_x); - d2 = DUK_TVAL_GET_NUMBER(tv_y); - c1 = DUK_FPCLASSIFY(d1); - c2 = DUK_FPCLASSIFY(d2); - - if (c1 == DUK_FP_NORMAL && c2 == DUK_FP_NORMAL) { - /* XXX: this is a very narrow check, and doesn't cover - * zeroes, subnormals, infinities, which compare normally. - */ - - if (d1 < d2) { - /* 'lt is true' */ - retval = 1; - } else { - retval = 0; - } - if (flags & DUK_COMPARE_FLAG_NEGATE) { - retval ^= 1; - } - return retval; - } +#if !defined(DUK_USE_PREFER_SIZE) + if (DUK_LIKELY(DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y))) { + return duk__compare_number(retval, + DUK_TVAL_GET_NUMBER(tv_x), + DUK_TVAL_GET_NUMBER(tv_y)); } #endif @@ -70592,102 +74600,51 @@ DUK_INTERNAL duk_bool_t duk_js_compare_helper(duk_hthread *thr, duk_tval *tv_x, DUK_ASSERT(h1 != NULL); DUK_ASSERT(h2 != NULL); - rc = duk_js_string_compare(h1, h2); - if (rc < 0) { - goto lt_true; - } else { - goto lt_false; - } - } else { - /* Ordering should not matter (E5 Section 11.8.5, step 3.a) but - * preserve it just in case. - */ - - if (flags & DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) { - d1 = duk_to_number(ctx, -2); - d2 = duk_to_number(ctx, -1); - } else { - d2 = duk_to_number(ctx, -1); - d1 = duk_to_number(ctx, -2); - } - - c1 = (duk_small_int_t) DUK_FPCLASSIFY(d1); - s1 = (duk_small_int_t) DUK_SIGNBIT(d1); - c2 = (duk_small_int_t) DUK_FPCLASSIFY(d2); - s2 = (duk_small_int_t) DUK_SIGNBIT(d2); - - if (c1 == DUK_FP_NAN || c2 == DUK_FP_NAN) { - goto lt_undefined; - } - - if (c1 == DUK_FP_ZERO && c2 == DUK_FP_ZERO) { - /* For all combinations: +0 < +0, +0 < -0, -0 < +0, -0 < -0, - * steps e, f, and g. - */ - goto lt_false; - } - - if (d1 == d2) { - goto lt_false; - } - - if (c1 == DUK_FP_INFINITE && s1 == 0) { - /* x == +Infinity */ - goto lt_false; - } - - if (c2 == DUK_FP_INFINITE && s2 == 0) { - /* y == +Infinity */ - goto lt_true; - } - - if (c2 == DUK_FP_INFINITE && s2 != 0) { - /* y == -Infinity */ - goto lt_false; - } - - if (c1 == DUK_FP_INFINITE && s1 != 0) { - /* x == -Infinity */ - goto lt_true; - } - - if (d1 < d2) { - goto lt_true; + if (!DUK_HSTRING_HAS_SYMBOL(h1) && !DUK_HSTRING_HAS_SYMBOL(h2)) { + rc = duk_js_string_compare(h1, h2); + duk_pop_2(ctx); + if (rc < 0) { + return retval ^ 1; + } else { + return retval; + } } - goto lt_false; - } - - lt_undefined: - /* Note: undefined from Section 11.8.5 always results in false - * return (see e.g. Section 11.8.3) - hence special treatment here. - */ - retval = 0; - goto cleanup; - - lt_true: - if (flags & DUK_COMPARE_FLAG_NEGATE) { - retval = 0; - goto cleanup; - } else { - retval = 1; - goto cleanup; + /* One or both are Symbols: fall through to handle in the + * generic path. Concretely, ToNumber() will fail. + */ } - /* never here */ - lt_false: - if (flags & DUK_COMPARE_FLAG_NEGATE) { - retval = 1; - goto cleanup; + /* Ordering should not matter (E5 Section 11.8.5, step 3.a). */ +#if 0 + if (flags & DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) { + d1 = duk_to_number_m2(ctx); + d2 = duk_to_number_m1(ctx); } else { - retval = 0; - goto cleanup; + d2 = duk_to_number_m1(ctx); + d1 = duk_to_number_m2(ctx); } - /* never here */ +#endif + d1 = duk_to_number_m2(ctx); + d2 = duk_to_number_m1(ctx); - cleanup: + /* We want to duk_pop_2(ctx); because the values are numbers + * no decref check is needed. + */ +#if defined(DUK_USE_PREFER_SIZE) duk_pop_2(ctx); - return retval; +#else + DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk_get_tval(ctx, -2))); + DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk_get_tval(ctx, -1))); + DUK_ASSERT(duk_get_top(ctx) >= 2); + ((duk_hthread *) ctx)->valstack_top -= 2; + tv_x = ((duk_hthread *) ctx)->valstack_top; + tv_y = tv_x + 1; + DUK_TVAL_SET_UNDEFINED(tv_x); /* Value stack policy */ + DUK_TVAL_SET_UNDEFINED(tv_y); +#endif + + return duk__compare_number(retval, d1, d2); } /* @@ -70715,7 +74672,9 @@ DUK_INTERNAL duk_bool_t duk_js_instanceof(duk_hthread *thr, duk_tval *tv_x, duk_ duk_hobject *func; duk_hobject *val; duk_hobject *proto; + duk_tval *tv; duk_uint_t sanity; + duk_bool_t skip_first; /* * Get the values onto the stack first. It would be possible to cover @@ -70758,13 +74717,13 @@ DUK_INTERNAL duk_bool_t duk_js_instanceof(duk_hthread *thr, duk_tval *tv_x, duk_ DUK_ERROR_TYPE(thr, "invalid instanceof rval"); } - if (!DUK_HOBJECT_HAS_BOUND(func)) { + if (!DUK_HOBJECT_HAS_BOUNDFUNC(func)) { break; } /* [ ... lval rval ] */ - duk_get_prop_stridx(ctx, -1, DUK_STRIDX_INT_TARGET); /* -> [ ... lval rval new_rval ] */ + duk_get_prop_stridx_short(ctx, -1, DUK_STRIDX_INT_TARGET); /* -> [ ... lval rval new_rval ] */ duk_replace(ctx, -1); /* -> [ ... lval new_rval ] */ func = duk_require_hobject(ctx, -1); @@ -70781,29 +74740,43 @@ DUK_INTERNAL duk_bool_t duk_js_instanceof(duk_hthread *thr, duk_tval *tv_x, duk_ * to execute E5 Section 15.3.5.3. */ - DUK_ASSERT(!DUK_HOBJECT_HAS_BOUND(func)); + DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func)); DUK_ASSERT(DUK_HOBJECT_IS_CALLABLE(func)); /* [ ... lval rval(func) ] */ - /* Handle lightfuncs through object coercion for now. */ - /* XXX: direct implementation */ - val = duk_get_hobject_or_lfunc_coerce(ctx, -2); - if (!val) { + /* For lightfuncs, buffers, and pointers start the comparison directly + * from the virtual prototype object. + */ + skip_first = 0; + tv = DUK_GET_TVAL_NEGIDX(ctx, -2); + switch (DUK_TVAL_GET_TAG(tv)) { + case DUK_TAG_LIGHTFUNC: + val = thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]; + DUK_ASSERT(val != NULL); + break; + case DUK_TAG_BUFFER: + val = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE]; + DUK_ASSERT(val != NULL); + break; + case DUK_TAG_POINTER: + val = thr->builtins[DUK_BIDX_POINTER_PROTOTYPE]; + DUK_ASSERT(val != NULL); + break; + case DUK_TAG_OBJECT: + skip_first = 1; /* Ignore object itself on first round. */ + val = DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(val != NULL); + break; + default: goto pop_and_false; } + DUK_ASSERT(val != NULL); /* Loop doesn't actually rely on this. */ - duk_get_prop_stridx(ctx, -1, DUK_STRIDX_PROTOTYPE); /* -> [ ... lval rval rval.prototype ] */ + duk_get_prop_stridx_short(ctx, -1, DUK_STRIDX_PROTOTYPE); /* -> [ ... lval rval rval.prototype ] */ proto = duk_require_hobject(ctx, -1); duk_pop(ctx); /* -> [ ... lval rval ] */ - DUK_ASSERT(val != NULL); - -#if defined(DUK_USE_ES6_PROXY) - val = duk_hobject_resolve_proxy_target(thr, val); - DUK_ASSERT(val != NULL); -#endif - sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; do { /* @@ -70824,9 +74797,6 @@ DUK_INTERNAL duk_bool_t duk_js_instanceof(duk_hthread *thr, duk_tval *tv_x, duk_ * also the built-in Function prototype, the result is true. */ - DUK_ASSERT(val != NULL); - val = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, val); - if (!val) { goto pop_and_false; } @@ -70836,11 +74806,14 @@ DUK_INTERNAL duk_bool_t duk_js_instanceof(duk_hthread *thr, duk_tval *tv_x, duk_ val = duk_hobject_resolve_proxy_target(thr, val); #endif - if (val == proto) { + if (skip_first) { + skip_first = 0; + } else if (val == proto) { goto pop_and_true; } - /* follow prototype chain */ + DUK_ASSERT(val != NULL); + val = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, val); } while (--sanity > 0); if (sanity == 0) { @@ -70880,18 +74853,19 @@ DUK_INTERNAL duk_bool_t duk_js_in(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv /* XXX: The ES5/5.1/6 specifications require that the key in 'key in obj' * must be string coerced before the internal HasProperty() algorithm is * invoked. A fast path skipping coercion could be safely implemented for - * numbers (as number-to-string coercion has no side effects). For ES6 + * numbers (as number-to-string coercion has no side effects). For ES2015 * proxy behavior, the trap 'key' argument must be in a string coerced * form (which is a shame). */ - /* TypeError if rval is not an object (or lightfunc which should behave - * like a Function instance). + /* TypeError if rval is not an object or object like (e.g. lightfunc + * or plain buffer). */ duk_push_tval(ctx, tv_x); duk_push_tval(ctx, tv_y); - duk_require_type_mask(ctx, -1, DUK_TYPE_MASK_OBJECT | DUK_TYPE_MASK_LIGHTFUNC); - duk_to_string(ctx, -2); /* coerce lval with ToString() */ + duk_require_type_mask(ctx, -1, DUK_TYPE_MASK_OBJECT | DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); + + (void) duk_to_property_key_hstring(ctx, -2); retval = duk_hobject_hasprop(thr, DUK_GET_TVAL_NEGIDX(ctx, -1), @@ -70915,10 +74889,8 @@ DUK_INTERNAL duk_bool_t duk_js_in(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv * lowercase variants now. */ -DUK_INTERNAL duk_hstring *duk_js_typeof(duk_hthread *thr, duk_tval *tv_x) { - duk_small_int_t stridx = 0; - - DUK_UNREF(thr); +DUK_INTERNAL duk_small_uint_t duk_js_typeof_stridx(duk_tval *tv_x) { + duk_small_uint_t stridx = 0; switch (DUK_TVAL_GET_TAG(tv_x)) { case DUK_TAG_UNDEFINED: { @@ -70926,7 +74898,7 @@ DUK_INTERNAL duk_hstring *duk_js_typeof(duk_hthread *thr, duk_tval *tv_x) { break; } case DUK_TAG_NULL: { - /* Note: not a typo, "object" is returned for a null value */ + /* Note: not a typo, "object" is returned for a null value. */ stridx = DUK_STRIDX_LC_OBJECT; break; } @@ -70935,12 +74907,21 @@ DUK_INTERNAL duk_hstring *duk_js_typeof(duk_hthread *thr, duk_tval *tv_x) { break; } case DUK_TAG_POINTER: { - /* implementation specific */ + /* Implementation specific. */ stridx = DUK_STRIDX_LC_POINTER; break; } case DUK_TAG_STRING: { - stridx = DUK_STRIDX_LC_STRING; + duk_hstring *str; + + /* All internal keys are identified as Symbols. */ + str = DUK_TVAL_GET_STRING(tv_x); + DUK_ASSERT(str != NULL); + if (DUK_HSTRING_HAS_SYMBOL(str)) { + stridx = DUK_STRIDX_LC_SYMBOL; + } else { + stridx = DUK_STRIDX_LC_STRING; + } break; } case DUK_TAG_OBJECT: { @@ -70954,8 +74935,11 @@ DUK_INTERNAL duk_hstring *duk_js_typeof(duk_hthread *thr, duk_tval *tv_x) { break; } case DUK_TAG_BUFFER: { - /* implementation specific */ - stridx = DUK_STRIDX_LC_BUFFER; + /* Implementation specific. In Duktape 1.x this would be + * 'buffer', in Duktape 2.x changed to 'object' because plain + * buffers now mimic Uint8Array objects. + */ + stridx = DUK_STRIDX_LC_OBJECT; break; } case DUK_TAG_LIGHTFUNC: { @@ -70974,8 +74958,8 @@ DUK_INTERNAL duk_hstring *duk_js_typeof(duk_hthread *thr, duk_tval *tv_x) { } } - DUK_ASSERT(stridx >= 0 && stridx < DUK_HEAP_NUM_STRINGS); - return DUK_HTHREAD_GET_STRING(thr, stridx); + DUK_ASSERT_STRIDX_VALID(stridx); + return stridx; } /* @@ -70984,8 +74968,10 @@ DUK_INTERNAL duk_hstring *duk_js_typeof(duk_hthread *thr, duk_tval *tv_x) { * Array index: E5 Section 15.4 * Array length: E5 Section 15.4.5.1 steps 3.c - 3.d (array length write) * - * The DUK_HSTRING_GET_ARRIDX_SLOW() and DUK_HSTRING_GET_ARRIDX_FAST() macros - * call duk_js_to_arrayindex_string_helper(). + * duk_js_to_arrayindex_string_helper() computes the array index from + * string contents alone. Depending on options it's only called during + * string intern (and value stored to duk_hstring) or it's called also + * at runtime. */ DUK_INTERNAL duk_small_int_t duk_js_to_arrayindex_raw_string(const duk_uint8_t *str, duk_uint32_t blen, duk_uarridx_t *out_idx) { @@ -71075,7 +75061,7 @@ DUK_INTERNAL duk_uarridx_t duk_js_to_arrayindex_string_helper(duk_hstring *h) { * if "raw" own property helpers are added. */ -/* include removed: duk_internal.h */ +/* #include duk_internal.h -> already included */ /* * Local result type for duk__get_identifier_reference() lookup. @@ -71115,22 +75101,28 @@ typedef struct { * even if the closure object remains reachable. */ -DUK_LOCAL void duk__inc_data_inner_refcounts(duk_hthread *thr, duk_hcompiledfunction *f) { +DUK_LOCAL void duk__inc_data_inner_refcounts(duk_hthread *thr, duk_hcompfunc *f) { duk_tval *tv, *tv_end; duk_hobject **funcs, **funcs_end; - DUK_ASSERT(DUK_HCOMPILEDFUNCTION_GET_DATA(thr->heap, f) != NULL); /* compiled functions must be created 'atomically' */ DUK_UNREF(thr); - tv = DUK_HCOMPILEDFUNCTION_GET_CONSTS_BASE(thr->heap, f); - tv_end = DUK_HCOMPILEDFUNCTION_GET_CONSTS_END(thr->heap, f); + /* If function creation fails due to out-of-memory, the data buffer + * pointer may be NULL in some cases. That's actually possible for + * GC code, but shouldn't be possible here because the incomplete + * function will be unwound from the value stack and never instantiated. + */ + DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, f) != NULL); + + tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, f); + tv_end = DUK_HCOMPFUNC_GET_CONSTS_END(thr->heap, f); while (tv < tv_end) { DUK_TVAL_INCREF(thr, tv); tv++; } - funcs = DUK_HCOMPILEDFUNCTION_GET_FUNCS_BASE(thr->heap, f); - funcs_end = DUK_HCOMPILEDFUNCTION_GET_FUNCS_END(thr->heap, f); + funcs = DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, f); + funcs_end = DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, f); while (funcs < funcs_end) { DUK_HEAPHDR_INCREF(thr, (duk_heaphdr *) *funcs); funcs++; @@ -71148,51 +75140,57 @@ DUK_LOCAL const duk_uint16_t duk__closure_copy_proplist[] = { /* order: most frequent to least frequent */ DUK_STRIDX_INT_VARMAP, DUK_STRIDX_INT_FORMALS, - DUK_STRIDX_NAME, +#if defined(DUK_USE_PC2LINE) DUK_STRIDX_INT_PC2LINE, +#endif +#if defined(DUK_USE_FUNC_FILENAME_PROPERTY) DUK_STRIDX_FILE_NAME, +#endif +#if defined(DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY) DUK_STRIDX_INT_SOURCE +#endif }; DUK_INTERNAL void duk_js_push_closure(duk_hthread *thr, - duk_hcompiledfunction *fun_temp, + duk_hcompfunc *fun_temp, duk_hobject *outer_var_env, duk_hobject *outer_lex_env, duk_bool_t add_auto_proto) { duk_context *ctx = (duk_context *) thr; - duk_hcompiledfunction *fun_clos; + duk_hcompfunc *fun_clos; duk_small_uint_t i; duk_uint_t len_value; DUK_ASSERT(fun_temp != NULL); - DUK_ASSERT(DUK_HCOMPILEDFUNCTION_GET_DATA(thr->heap, fun_temp) != NULL); - DUK_ASSERT(DUK_HCOMPILEDFUNCTION_GET_FUNCS(thr->heap, fun_temp) != NULL); - DUK_ASSERT(DUK_HCOMPILEDFUNCTION_GET_BYTECODE(thr->heap, fun_temp) != NULL); + DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_temp) != NULL); + DUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_temp) != NULL); + DUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_temp) != NULL); DUK_ASSERT(outer_var_env != NULL); DUK_ASSERT(outer_lex_env != NULL); DUK_UNREF(len_value); - duk_push_compiledfunction(ctx); + fun_clos = duk_push_hcompfunc(ctx); + DUK_ASSERT(fun_clos != NULL); + DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) fun_clos) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); + duk_push_hobject(ctx, &fun_temp->obj); /* -> [ ... closure template ] */ - fun_clos = (duk_hcompiledfunction *) duk_get_hcompiledfunction(ctx, -2); - DUK_ASSERT(fun_clos != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_COMPILEDFUNCTION((duk_hobject *) fun_clos)); - DUK_ASSERT(DUK_HCOMPILEDFUNCTION_GET_DATA(thr->heap, fun_clos) == NULL); - DUK_ASSERT(DUK_HCOMPILEDFUNCTION_GET_FUNCS(thr->heap, fun_clos) == NULL); - DUK_ASSERT(DUK_HCOMPILEDFUNCTION_GET_BYTECODE(thr->heap, fun_clos) == NULL); + DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun_clos)); + DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_clos) == NULL); + DUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_clos) == NULL); + DUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_clos) == NULL); - DUK_HCOMPILEDFUNCTION_SET_DATA(thr->heap, fun_clos, DUK_HCOMPILEDFUNCTION_GET_DATA(thr->heap, fun_temp)); - DUK_HCOMPILEDFUNCTION_SET_FUNCS(thr->heap, fun_clos, DUK_HCOMPILEDFUNCTION_GET_FUNCS(thr->heap, fun_temp)); - DUK_HCOMPILEDFUNCTION_SET_BYTECODE(thr->heap, fun_clos, DUK_HCOMPILEDFUNCTION_GET_BYTECODE(thr->heap, fun_temp)); + DUK_HCOMPFUNC_SET_DATA(thr->heap, fun_clos, DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_temp)); + DUK_HCOMPFUNC_SET_FUNCS(thr->heap, fun_clos, DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_temp)); + DUK_HCOMPFUNC_SET_BYTECODE(thr->heap, fun_clos, DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_temp)); /* Note: all references inside 'data' need to get their refcounts * upped too. This is the case because refcounts are decreased * through every function referencing 'data' independently. */ - DUK_HBUFFER_INCREF(thr, DUK_HCOMPILEDFUNCTION_GET_DATA(thr->heap, fun_clos)); + DUK_HBUFFER_INCREF(thr, DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_clos)); duk__inc_data_inner_refcounts(thr, fun_temp); fun_clos->nregs = fun_temp->nregs; @@ -71202,51 +75200,46 @@ void duk_js_push_closure(duk_hthread *thr, fun_clos->end_line = fun_temp->end_line; #endif - DUK_ASSERT(DUK_HCOMPILEDFUNCTION_GET_DATA(thr->heap, fun_clos) != NULL); - DUK_ASSERT(DUK_HCOMPILEDFUNCTION_GET_FUNCS(thr->heap, fun_clos) != NULL); - DUK_ASSERT(DUK_HCOMPILEDFUNCTION_GET_BYTECODE(thr->heap, fun_clos) != NULL); + DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_clos) != NULL); + DUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_clos) != NULL); + DUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_clos) != NULL); /* XXX: could also copy from template, but there's no way to have any * other value here now (used code has no access to the template). */ DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, &fun_clos->obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); - /* - * Init/assert flags, copying them where appropriate. Some flags - * (like NEWENV) are processed separately below. + /* Copy duk_hobject flags as is from the template using a mask. + * Leave out duk_heaphdr owned flags just in case (e.g. if there's + * some GC flag or similar). Some flags can then be adjusted + * separately if necessary. */ - /* XXX: copy flags using a mask */ + /* DUK_HEAPHDR_SET_FLAGS() masks changes to non-duk_heaphdr flags only. */ + DUK_HEAPHDR_SET_FLAGS((duk_heaphdr *) fun_clos, DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) fun_temp)); + DUK_DD(DUK_DDPRINT("fun_temp heaphdr flags: 0x%08lx, fun_clos heaphdr flags: 0x%08lx", + (unsigned long) DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) fun_temp), + (unsigned long) DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) fun_clos))); DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(&fun_clos->obj)); - DUK_HOBJECT_SET_CONSTRUCTABLE(&fun_clos->obj); /* Note: not set in template (has no "prototype") */ - DUK_ASSERT(DUK_HOBJECT_HAS_CONSTRUCTABLE(&fun_clos->obj)); - DUK_ASSERT(!DUK_HOBJECT_HAS_BOUND(&fun_clos->obj)); - DUK_ASSERT(DUK_HOBJECT_HAS_COMPILEDFUNCTION(&fun_clos->obj)); - DUK_ASSERT(!DUK_HOBJECT_HAS_NATIVEFUNCTION(&fun_clos->obj)); + DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(&fun_clos->obj)); + DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(&fun_clos->obj)); + DUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(&fun_clos->obj)); DUK_ASSERT(!DUK_HOBJECT_HAS_THREAD(&fun_clos->obj)); /* DUK_HOBJECT_FLAG_ARRAY_PART: don't care */ - if (DUK_HOBJECT_HAS_STRICT(&fun_temp->obj)) { - DUK_HOBJECT_SET_STRICT(&fun_clos->obj); - } - if (DUK_HOBJECT_HAS_NOTAIL(&fun_temp->obj)) { - DUK_HOBJECT_SET_NOTAIL(&fun_clos->obj); - } /* DUK_HOBJECT_FLAG_NEWENV: handled below */ - if (DUK_HOBJECT_HAS_NAMEBINDING(&fun_temp->obj)) { - /* Although NAMEBINDING is not directly needed for using - * function instances, it's needed by bytecode dump/load - * so copy it too. - */ - DUK_HOBJECT_SET_NAMEBINDING(&fun_clos->obj); - } - if (DUK_HOBJECT_HAS_CREATEARGS(&fun_temp->obj)) { - DUK_HOBJECT_SET_CREATEARGS(&fun_clos->obj); - } DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(&fun_clos->obj)); DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(&fun_clos->obj)); DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(&fun_clos->obj)); + if (!DUK_HOBJECT_HAS_CONSTRUCTABLE(&fun_clos->obj)) { + /* If the template is not constructable don't add an automatic + * .prototype property. This is the case for e.g. ES2015 object + * literal getters/setters and method definitions. + */ + add_auto_proto = 0; + } + /* * Setup environment record properties based on the template and * its flags. @@ -71263,11 +75256,11 @@ void duk_js_push_closure(duk_hthread *thr, * This is relatively complex, see doc/identifier-handling.rst. */ - if (DUK_HOBJECT_HAS_NEWENV(&fun_temp->obj)) { - DUK_HOBJECT_SET_NEWENV(&fun_clos->obj); - - if (DUK_HOBJECT_HAS_NAMEBINDING(&fun_temp->obj)) { + if (DUK_HOBJECT_HAS_NEWENV(&fun_clos->obj)) { +#if defined(DUK_USE_FUNC_NAME_PROPERTY) + if (DUK_HOBJECT_HAS_NAMEBINDING(&fun_clos->obj)) { duk_hobject *proto; + duk_hobject *new_env; /* * Named function expression, name needs to be bound @@ -71278,8 +75271,6 @@ void duk_js_push_closure(duk_hthread *thr, * b) { funcname: , __prototype: } (if outer_lex_env missing) */ - DUK_ASSERT(duk_has_prop_stridx(ctx, -1, DUK_STRIDX_NAME)); /* required if NAMEBINDING set */ - if (outer_lex_env) { proto = outer_lex_env; } else { @@ -71287,40 +75278,50 @@ void duk_js_push_closure(duk_hthread *thr, } /* -> [ ... closure template env ] */ - (void) duk_push_object_helper_proto(ctx, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV), - proto); + new_env = duk_push_object_helper_proto(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV), + proto); + DUK_ASSERT(new_env != NULL); /* It's important that duk_xdef_prop() is a 'raw define' so that any * properties in an ancestor are never an issue (they should never be * e.g. non-writable, but just in case). + * + * Because template objects are not visible to user code, the case + * where .name is missing shouldn't happen in practice. It it does, + * the name 'undefined' gets bound and maps to the closure (which is + * a bit odd, but safe). */ - duk_get_prop_stridx(ctx, -2, DUK_STRIDX_NAME); /* -> [ ... closure template env funcname ] */ - duk_dup(ctx, -4); /* -> [ ... closure template env funcname closure ] */ - duk_xdef_prop(ctx, -3, DUK_PROPDESC_FLAGS_NONE); /* -> [ ... closure template env ] */ + (void) duk_get_prop_stridx_short(ctx, -2, DUK_STRIDX_NAME); + /* -> [ ... closure template env funcname ] */ + duk_dup_m4(ctx); /* -> [ ... closure template env funcname closure ] */ + duk_xdef_prop(ctx, -3, DUK_PROPDESC_FLAGS_NONE); /* -> [ ... closure template env ] */ /* env[funcname] = closure */ /* [ ... closure template env ] */ - duk_xdef_prop_stridx(ctx, -3, DUK_STRIDX_INT_LEXENV, DUK_PROPDESC_FLAGS_WC); - /* since closure has NEWENV, never define DUK_STRIDX_INT_VARENV, as it - * will be ignored anyway - */ + DUK_HCOMPFUNC_SET_LEXENV(thr->heap, fun_clos, new_env); + DUK_HCOMPFUNC_SET_VARENV(thr->heap, fun_clos, new_env); + DUK_HOBJECT_INCREF(thr, new_env); + DUK_HOBJECT_INCREF(thr, new_env); + duk_pop(ctx); /* [ ... closure template ] */ - } else { + } + else +#endif /* DUK_USE_FUNC_NAME_PROPERTY */ + { /* * Other cases (function declaration, anonymous function expression, * strict direct eval code). The "outer" environment will be whatever * the caller gave us. */ - duk_push_hobject(ctx, outer_lex_env); /* -> [ ... closure template env ] */ - duk_xdef_prop_stridx(ctx, -3, DUK_STRIDX_INT_LEXENV, DUK_PROPDESC_FLAGS_WC); - /* since closure has NEWENV, never define DUK_STRIDX_INT_VARENV, as it - * will be ignored anyway - */ + DUK_HCOMPFUNC_SET_LEXENV(thr->heap, fun_clos, outer_lex_env); + DUK_HCOMPFUNC_SET_VARENV(thr->heap, fun_clos, outer_lex_env); + DUK_HOBJECT_INCREF(thr, outer_lex_env); + DUK_HOBJECT_INCREF(thr, outer_lex_env); /* [ ... closure template ] */ } @@ -71335,27 +75336,24 @@ void duk_js_push_closure(duk_hthread *thr, DUK_ASSERT(!DUK_HOBJECT_HAS_NAMEBINDING(&fun_temp->obj)); - duk_push_hobject(ctx, outer_lex_env); /* -> [ ... closure template env ] */ - duk_xdef_prop_stridx(ctx, -3, DUK_STRIDX_INT_LEXENV, DUK_PROPDESC_FLAGS_WC); - - if (outer_var_env != outer_lex_env) { - duk_push_hobject(ctx, outer_var_env); /* -> [ ... closure template env ] */ - duk_xdef_prop_stridx(ctx, -3, DUK_STRIDX_INT_VARENV, DUK_PROPDESC_FLAGS_WC); - } + DUK_HCOMPFUNC_SET_LEXENV(thr->heap, fun_clos, outer_lex_env); + DUK_HCOMPFUNC_SET_VARENV(thr->heap, fun_clos, outer_var_env); + DUK_HOBJECT_INCREF(thr, outer_lex_env); /* NULLs not allowed; asserted on entry */ + DUK_HOBJECT_INCREF(thr, outer_var_env); } -#ifdef DUK_USE_DDDPRINT - duk_get_prop_stridx(ctx, -2, DUK_STRIDX_INT_VARENV); - duk_get_prop_stridx(ctx, -3, DUK_STRIDX_INT_LEXENV); - DUK_DDD(DUK_DDDPRINT("closure varenv -> %!ipT, lexenv -> %!ipT", - (duk_tval *) duk_get_tval(ctx, -2), - (duk_tval *) duk_get_tval(ctx, -1))); - duk_pop_2(ctx); -#endif + DUK_DDD(DUK_DDDPRINT("closure varenv -> %!ipO, lexenv -> %!ipO", + (duk_heaphdr *) fun_clos->var_env, + (duk_heaphdr *) fun_clos->lex_env)); + + /* Call handling assumes this for all callable closures. */ + DUK_ASSERT(DUK_HCOMPFUNC_GET_LEXENV(thr->heap, fun_clos) != NULL); + DUK_ASSERT(DUK_HCOMPFUNC_GET_VARENV(thr->heap, fun_clos) != NULL); /* * Copy some internal properties directly * - * The properties will be writable and configurable, but not enumerable. + * The properties will be non-writable and non-enumerable, but + * configurable. */ /* [ ... closure template ] */ @@ -71366,10 +75364,10 @@ void duk_js_push_closure(duk_hthread *thr, for (i = 0; i < (duk_small_uint_t) (sizeof(duk__closure_copy_proplist) / sizeof(duk_uint16_t)); i++) { duk_small_int_t stridx = (duk_small_int_t) duk__closure_copy_proplist[i]; - if (duk_get_prop_stridx(ctx, -1, stridx)) { + if (duk_get_prop_stridx_short(ctx, -1, stridx)) { /* [ ... closure template val ] */ DUK_DDD(DUK_DDDPRINT("copying property, stridx=%ld -> found", (long) stridx)); - duk_xdef_prop_stridx(ctx, -3, stridx, DUK_PROPDESC_FLAGS_WC); + duk_xdef_prop_stridx_short(ctx, -3, stridx, DUK_PROPDESC_FLAGS_C); } else { DUK_DDD(DUK_DDDPRINT("copying property, stridx=%ld -> not found", (long) stridx)); duk_pop(ctx); @@ -71379,29 +75377,27 @@ void duk_js_push_closure(duk_hthread *thr, /* * "length" maps to number of formals (E5 Section 13.2) for function * declarations/expressions (non-bound functions). Note that 'nargs' - * is NOT necessarily equal to the number of arguments. + * is NOT necessarily equal to the number of arguments. Use length + * of _Formals; if missing, assume nargs matches .length. */ /* [ ... closure template ] */ - len_value = 0; - - /* XXX: use helper for size optimization */ - if (duk_get_prop_stridx(ctx, -2, DUK_STRIDX_INT_FORMALS)) { + /* XXX: these lookups should be just own property lookups instead of + * looking up the inheritance chain. + */ + if (duk_get_prop_stridx_short(ctx, -1, DUK_STRIDX_INT_FORMALS)) { /* [ ... closure template formals ] */ - DUK_ASSERT(duk_has_prop_stridx(ctx, -1, DUK_STRIDX_LENGTH)); - DUK_ASSERT(duk_get_length(ctx, -1) <= DUK_UINT_MAX); /* formal arg limits */ - len_value = (duk_uint_t) duk_get_length(ctx, -1); + len_value = (duk_uint_t) duk_get_length(ctx, -1); /* could access duk_harray directly, not important */ + DUK_DD(DUK_DDPRINT("closure length from _Formals -> %ld", (long) len_value)); } else { - /* XXX: what to do if _Formals is not empty but compiler has - * optimized it away -- read length from an explicit property - * then? - */ + len_value = fun_temp->nargs; + DUK_DD(DUK_DDPRINT("closure length defaulted from nargs -> %ld", (long) len_value)); } duk_pop(ctx); duk_push_uint(ctx, len_value); /* [ ... closure template len_value ] */ - duk_xdef_prop_stridx(ctx, -3, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_NONE); + duk_xdef_prop_stridx_short(ctx, -3, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C); /* * "prototype" is, by default, a fresh object with the "constructor" @@ -71421,10 +75417,10 @@ void duk_js_push_closure(duk_hthread *thr, if (add_auto_proto) { duk_push_object(ctx); /* -> [ ... closure template newobj ] */ - duk_dup(ctx, -3); /* -> [ ... closure template newobj closure ] */ - duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_CONSTRUCTOR, DUK_PROPDESC_FLAGS_WC); /* -> [ ... closure template newobj ] */ + duk_dup_m3(ctx); /* -> [ ... closure template newobj closure ] */ + duk_xdef_prop_stridx_short(ctx, -2, DUK_STRIDX_CONSTRUCTOR, DUK_PROPDESC_FLAGS_WC); /* -> [ ... closure template newobj ] */ duk_compact(ctx, -1); /* compact the prototype */ - duk_xdef_prop_stridx(ctx, -3, DUK_STRIDX_PROTOTYPE, DUK_PROPDESC_FLAGS_W); /* -> [ ... closure template ] */ + duk_xdef_prop_stridx_short(ctx, -3, DUK_STRIDX_PROTOTYPE, DUK_PROPDESC_FLAGS_W); /* -> [ ... closure template ] */ } /* @@ -71438,40 +75434,43 @@ void duk_js_push_closure(duk_hthread *thr, /* [ ... closure template ] */ if (DUK_HOBJECT_HAS_STRICT(&fun_clos->obj)) { - duk_xdef_prop_stridx_thrower(ctx, -2, DUK_STRIDX_CALLER, DUK_PROPDESC_FLAGS_NONE); - duk_xdef_prop_stridx_thrower(ctx, -2, DUK_STRIDX_LC_ARGUMENTS, DUK_PROPDESC_FLAGS_NONE); + duk_xdef_prop_stridx_thrower(ctx, -2, DUK_STRIDX_CALLER); + duk_xdef_prop_stridx_thrower(ctx, -2, DUK_STRIDX_LC_ARGUMENTS); } else { -#ifdef DUK_USE_NONSTD_FUNC_CALLER_PROPERTY +#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) DUK_DDD(DUK_DDDPRINT("function is non-strict and non-standard 'caller' property in use, add initial 'null' value")); duk_push_null(ctx); - duk_xdef_prop_stridx(ctx, -3, DUK_STRIDX_CALLER, DUK_PROPDESC_FLAGS_NONE); + duk_xdef_prop_stridx_short(ctx, -3, DUK_STRIDX_CALLER, DUK_PROPDESC_FLAGS_NONE); #else DUK_DDD(DUK_DDDPRINT("function is non-strict and non-standard 'caller' property not used")); #endif } /* - * "name" is a non-standard property found in at least V8, Rhino, smjs. - * For Rhino and smjs it is non-writable, non-enumerable, and non-configurable; - * for V8 it is writable, non-enumerable, non-configurable. It is also defined - * for an anonymous function expression in which case the value is an empty string. - * We could also leave name 'undefined' for anonymous functions but that would - * differ from behavior of other engines, so use an empty string. - * - * XXX: make optional? costs something per function. + * "name" used to be non-standard but is now defined by ES2015. + * In ES2015/ES2016 the .name property is configurable. */ /* [ ... closure template ] */ - if (duk_get_prop_stridx(ctx, -1, DUK_STRIDX_NAME)) { +#if defined(DUK_USE_FUNC_NAME_PROPERTY) + /* XXX: Look for own property only; doesn't matter much because + * templates are bare objects. + */ + if (duk_get_prop_stridx_short(ctx, -1, DUK_STRIDX_NAME)) { /* [ ... closure template name ] */ DUK_ASSERT(duk_is_string(ctx, -1)); + DUK_DD(DUK_DDPRINT("setting function instance name to %!T", duk_get_tval(ctx, -1))); + duk_xdef_prop_stridx_short(ctx, -3, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C); /* -> [ ... closure template ] */ } else { - /* [ ... closure template undefined ] */ + /* Anonymous functions don't have a .name in ES2015, so don't set + * it on the instance either. The instance will then inherit + * it from Function.prototype.name. + */ + DUK_DD(DUK_DDPRINT("not setting function instance .name")); duk_pop(ctx); - duk_push_hstring_stridx(ctx, DUK_STRIDX_EMPTY_STRING); } - duk_xdef_prop_stridx(ctx, -3, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_NONE); /* -> [ ... closure template ] */ +#endif /* * Compact the closure, in most cases no properties will be added later. @@ -71493,7 +75492,7 @@ void duk_js_push_closure(duk_hthread *thr, DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(&fun_clos->obj)); DUK_ASSERT(duk_has_prop_stridx(ctx, -2, DUK_STRIDX_LENGTH) != 0); DUK_ASSERT(add_auto_proto == 0 || duk_has_prop_stridx(ctx, -2, DUK_STRIDX_PROTOTYPE) != 0); - DUK_ASSERT(duk_has_prop_stridx(ctx, -2, DUK_STRIDX_NAME) != 0); /* non-standard */ + /* May be missing .name */ DUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(&fun_clos->obj) || duk_has_prop_stridx(ctx, -2, DUK_STRIDX_CALLER) != 0); DUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(&fun_clos->obj) || @@ -71529,17 +75528,14 @@ duk_hobject *duk_create_activation_environment_record(duk_hthread *thr, duk_context *ctx = (duk_context *) thr; duk_hobject *env; duk_hobject *parent; - duk_tval *tv; + duk_hcompfunc *f; DUK_ASSERT(thr != NULL); DUK_ASSERT(func != NULL); - tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_INT_LEXENV(thr)); - if (tv) { - DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv)); - DUK_ASSERT(DUK_HOBJECT_IS_ENV(DUK_TVAL_GET_OBJECT(tv))); - parent = DUK_TVAL_GET_OBJECT(tv); - } else { + f = (duk_hcompfunc *) func; + parent = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, f); + if (!parent) { parent = thr->builtins[DUK_BIDX_GLOBAL_ENV]; } @@ -71547,19 +75543,18 @@ duk_hobject *duk_create_activation_environment_record(duk_hthread *thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV), -1); /* no prototype, updated below */ - env = duk_require_hobject(ctx, -1); - DUK_ASSERT(env != NULL); + env = duk_known_hobject(ctx, -1); DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, env, parent); /* parent env is the prototype */ /* open scope information, for compiled functions only */ - if (DUK_HOBJECT_IS_COMPILEDFUNCTION(func)) { + if (DUK_HOBJECT_IS_COMPFUNC(func)) { duk_push_hthread(ctx, thr); - duk_xdef_prop_stridx_wec(ctx, -2, DUK_STRIDX_INT_THREAD); + duk_xdef_prop_stridx_short_wec(ctx, -2, DUK_STRIDX_INT_THREAD); duk_push_hobject(ctx, func); - duk_xdef_prop_stridx_wec(ctx, -2, DUK_STRIDX_INT_CALLEE); + duk_xdef_prop_stridx_short_wec(ctx, -2, DUK_STRIDX_INT_CALLEE); duk_push_size_t(ctx, idx_bottom); - duk_xdef_prop_stridx_wec(ctx, -2, DUK_STRIDX_INT_REGBASE); + duk_xdef_prop_stridx_short_wec(ctx, -2, DUK_STRIDX_INT_REGBASE); } return env; @@ -71574,7 +75569,7 @@ void duk_js_init_activation_environment_records_delayed(duk_hthread *thr, func = DUK_ACT_GET_FUNC(act); DUK_ASSERT(func != NULL); - DUK_ASSERT(!DUK_HOBJECT_HAS_BOUND(func)); /* bound functions are never in act 'func' */ + DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func)); /* bound functions are never in act 'func' */ /* * Delayed initialization only occurs for 'NEWENV' functions. @@ -71588,7 +75583,7 @@ void duk_js_init_activation_environment_records_delayed(duk_hthread *thr, DUK_ASSERT(env != NULL); DUK_DDD(DUK_DDDPRINT("created delayed fresh env: %!ipO", (duk_heaphdr *) env)); -#ifdef DUK_USE_DDDPRINT +#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) { duk_hobject *p = env; while (p) { @@ -71642,23 +75637,23 @@ DUK_INTERNAL void duk_js_close_environment_record(duk_hthread *thr, duk_hobject duk_push_hobject(ctx, env); /* assertions: env must be closed in the same thread as where it runs */ -#ifdef DUK_USE_ASSERTIONS +#if defined(DUK_USE_ASSERTIONS) { /* [... env] */ - if (duk_get_prop_stridx(ctx, -1, DUK_STRIDX_INT_CALLEE)) { + if (duk_get_prop_stridx_short(ctx, -1, DUK_STRIDX_INT_CALLEE)) { DUK_ASSERT(duk_is_object(ctx, -1)); DUK_ASSERT(duk_get_hobject(ctx, -1) == (duk_hobject *) func); } duk_pop(ctx); - if (duk_get_prop_stridx(ctx, -1, DUK_STRIDX_INT_THREAD)) { + if (duk_get_prop_stridx_short(ctx, -1, DUK_STRIDX_INT_THREAD)) { DUK_ASSERT(duk_is_object(ctx, -1)); DUK_ASSERT(duk_get_hobject(ctx, -1) == (duk_hobject *) thr); } duk_pop(ctx); - if (duk_get_prop_stridx(ctx, -1, DUK_STRIDX_INT_REGBASE)) { + if (duk_get_prop_stridx_short(ctx, -1, DUK_STRIDX_INT_REGBASE)) { DUK_ASSERT(duk_is_number(ctx, -1)); DUK_ASSERT(duk_get_number(ctx, -1) == (double) regbase); } @@ -71668,7 +75663,7 @@ DUK_INTERNAL void duk_js_close_environment_record(duk_hthread *thr, duk_hobject } #endif - if (func != NULL && DUK_HOBJECT_IS_COMPILEDFUNCTION(func)) { + if (func != NULL && DUK_HOBJECT_IS_COMPFUNC(func)) { duk_hobject *varmap; duk_hstring *key; duk_tval *tv; @@ -71691,7 +75686,7 @@ DUK_INTERNAL void duk_js_close_environment_record(duk_hthread *thr, duk_hobject /* [... env] */ - if (!duk_get_prop_stridx(ctx, -1, DUK_STRIDX_INT_CALLEE)) { + if (!duk_get_prop_stridx_short(ctx, -1, DUK_STRIDX_INT_CALLEE)) { DUK_DDD(DUK_DDDPRINT("env has no callee property, nothing to close; re-delete the control properties just in case")); duk_pop(ctx); goto skip_varmap; @@ -71699,7 +75694,7 @@ DUK_INTERNAL void duk_js_close_environment_record(duk_hthread *thr, duk_hobject /* [... env callee] */ - if (!duk_get_prop_stridx(ctx, -1, DUK_STRIDX_INT_VARMAP)) { + if (!duk_get_prop_stridx_short(ctx, -1, DUK_STRIDX_INT_VARMAP)) { DUK_DDD(DUK_DDDPRINT("callee has no varmap property, nothing to close; delete the control properties")); duk_pop_2(ctx); goto skip_varmap; @@ -71723,7 +75718,7 @@ DUK_INTERNAL void duk_js_close_environment_record(duk_hthread *thr, duk_hobject DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); /* assume value is a number */ regnum = (duk_uint_t) DUK_TVAL_GET_NUMBER(tv); DUK_ASSERT_DISABLE(regnum >= 0); /* unsigned */ - DUK_ASSERT(regnum < ((duk_hcompiledfunction *) func)->nregs); /* regnum is sane */ + DUK_ASSERT(regnum < ((duk_hcompfunc *) func)->nregs); /* regnum is sane */ DUK_ASSERT(thr->valstack + regbase + regnum >= thr->valstack); DUK_ASSERT(thr->valstack + regbase + regnum < thr->valstack_top); @@ -71750,9 +75745,9 @@ DUK_INTERNAL void duk_js_close_environment_record(duk_hthread *thr, duk_hobject /* [... env] */ - duk_del_prop_stridx(ctx, -1, DUK_STRIDX_INT_CALLEE); - duk_del_prop_stridx(ctx, -1, DUK_STRIDX_INT_THREAD); - duk_del_prop_stridx(ctx, -1, DUK_STRIDX_INT_REGBASE); + duk_del_prop_stridx_short(ctx, -1, DUK_STRIDX_INT_CALLEE); + duk_del_prop_stridx_short(ctx, -1, DUK_STRIDX_INT_THREAD); + duk_del_prop_stridx_short(ctx, -1, DUK_STRIDX_INT_REGBASE); duk_pop(ctx); @@ -71817,7 +75812,7 @@ duk_bool_t duk__getid_open_decl_env_regs(duk_hthread *thr, DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv)); DUK_ASSERT(DUK_TVAL_GET_OBJECT(tv) != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_COMPILEDFUNCTION(DUK_TVAL_GET_OBJECT(tv))); + DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_TVAL_GET_OBJECT(tv))); env_func = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(env_func != NULL); @@ -71836,7 +75831,7 @@ duk_bool_t duk__getid_open_decl_env_regs(duk_hthread *thr, DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); reg_rel = (duk_size_t) DUK_TVAL_GET_NUMBER(tv); DUK_ASSERT_DISABLE(reg_rel >= 0); /* unsigned */ - DUK_ASSERT(reg_rel < ((duk_hcompiledfunction *) env_func)->nregs); + DUK_ASSERT(reg_rel < ((duk_hcompfunc *) env_func)->nregs); tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, env, DUK_HTHREAD_STRING_INT_THREAD(thr)); DUK_ASSERT(tv != NULL); @@ -71891,7 +75886,7 @@ duk_bool_t duk__getid_activation_regs(duk_hthread *thr, DUK_ASSERT(func != NULL); DUK_ASSERT(DUK_HOBJECT_HAS_NEWENV(func)); - if (!DUK_HOBJECT_IS_COMPILEDFUNCTION(func)) { + if (!DUK_HOBJECT_IS_COMPFUNC(func)) { return 0; } @@ -71910,7 +75905,7 @@ duk_bool_t duk__getid_activation_regs(duk_hthread *thr, DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); reg_rel = (duk_size_t) DUK_TVAL_GET_NUMBER(tv); DUK_ASSERT_DISABLE(reg_rel >= 0); - DUK_ASSERT(reg_rel < ((duk_hcompiledfunction *) func)->nregs); + DUK_ASSERT(reg_rel < ((duk_hcompfunc *) func)->nregs); idx = act->idx_bottom + reg_rel; DUK_ASSERT(idx >= act->idx_bottom); @@ -71965,6 +75960,7 @@ duk_bool_t duk__get_identifier_reference(duk_hthread *thr, if (env == NULL && act != NULL) { duk_hobject *func; + duk_hcompfunc *f; DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference: env is NULL, activation is non-NULL -> " "delayed env case, look up activation regs first")); @@ -72009,13 +76005,10 @@ duk_bool_t duk__get_identifier_reference(duk_hthread *thr, func = DUK_ACT_GET_FUNC(act); DUK_ASSERT(func != NULL); DUK_ASSERT(DUK_HOBJECT_HAS_NEWENV(func)); + f = (duk_hcompfunc *) func; - tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_INT_LEXENV(thr)); - if (tv) { - DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv)); - env = DUK_TVAL_GET_OBJECT(tv); - } else { - DUK_ASSERT(duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_INT_VARENV(thr)) == NULL); + env = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, f); + if (!env) { env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; } @@ -72426,7 +76419,9 @@ void duk__putvar_helper(duk_hthread *thr, if (strict) { DUK_DDD(DUK_DDDPRINT("identifier binding not found, strict => reference error")); - DUK_ERROR(thr, DUK_ERR_REFERENCE_ERROR, "identifier not defined"); + DUK_ERROR_FMT1(thr, DUK_ERR_REFERENCE_ERROR, + "identifier '%s' undefined", + (const char *) DUK_HSTRING_GET_DATA(name)); } DUK_DDD(DUK_DDDPRINT("identifier binding not found, not strict => set to global")); @@ -72932,7 +76927,7 @@ duk_bool_t duk_js_declvar_activation(duk_hthread *thr, * least potentially) slow. */ -/* include removed: duk_internal.h */ +/* #include duk_internal.h -> already included */ /* * Various defines and file specific helper macros @@ -72949,11 +76944,12 @@ duk_bool_t duk_js_declvar_activation(duk_hthread *thr, #define DUK__ISDIGIT47(x) ((x) >= DUK_ASC_4 && (x) <= DUK_ASC_7) /* lexer character window helpers */ -#define DUK__LOOKUP(lex_ctx,index) ((lex_ctx)->window[(index)].codepoint) -#define DUK__ADVANCECHARS(lex_ctx,count) duk__advance_bytes((lex_ctx), (count) * sizeof(duk_lexer_codepoint)) -#define DUK__ADVANCEBYTES(lex_ctx,count) duk__advance_bytes((lex_ctx), (count)) -#define DUK__INITBUFFER(lex_ctx) duk__initbuffer((lex_ctx)) -#define DUK__APPENDBUFFER(lex_ctx,x) duk__appendbuffer((lex_ctx), (duk_codepoint_t) (x)) +#define DUK__LOOKUP(lex_ctx,idx) ((lex_ctx)->window[(idx)].codepoint) +#define DUK__ADVANCECHARS(lex_ctx,count) duk__advance_chars((lex_ctx), (count)) +#define DUK__ADVANCEBYTES(lex_ctx,count) duk__advance_bytes((lex_ctx), (count)) +#define DUK__INITBUFFER(lex_ctx) duk__initbuffer((lex_ctx)) +#define DUK__APPENDBUFFER(lex_ctx,x) duk__appendbuffer((lex_ctx), (duk_codepoint_t) (x)) +#define DUK__APPENDBUFFER_ASCII(lex_ctx,x) duk__appendbuffer_ascii((lex_ctx), (duk_codepoint_t) (x)) /* lookup shorthands (note: assume context variable is named 'lex_ctx') */ #define DUK__L0() DUK__LOOKUP(lex_ctx, 0) @@ -73173,7 +77169,7 @@ DUK_LOCAL void duk__fill_lexer_buffer(duk_lexer_ctx *lex_ctx, duk_small_uint_t s lex_ctx->input_offset = (duk_size_t) (p - lex_ctx->input); lex_ctx->input_line = input_line; - DUK_ERROR_SYNTAX(lex_ctx->thr, "utf-8 decode failed"); + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_DECODE_FAILED); } DUK_LOCAL void duk__advance_bytes(duk_lexer_ctx *lex_ctx, duk_small_uint_t count_bytes) { @@ -73333,7 +77329,7 @@ DUK_LOCAL duk_codepoint_t duk__read_char(duk_lexer_ctx *lex_ctx) { error_clipped: /* clipped codepoint */ error_encoding: /* invalid codepoint encoding or codepoint */ - DUK_ERROR_SYNTAX(lex_ctx->thr, "utf-8 decode failed"); + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_DECODE_FAILED); return 0; } @@ -73366,6 +77362,10 @@ DUK_LOCAL void duk__init_lexer_window(duk_lexer_ctx *lex_ctx) { } #endif /* DUK_USE_LEXER_SLIDING_WINDOW */ +DUK_LOCAL void duk__advance_chars(duk_lexer_ctx *lex_ctx, duk_small_uint_t count_chars) { + duk__advance_bytes(lex_ctx, count_chars * sizeof(duk_lexer_codepoint)); +} + /* * (Re)initialize the temporary byte buffer. May be called extra times * with little impact. @@ -73398,24 +77398,33 @@ DUK_LOCAL void duk__appendbuffer(duk_lexer_ctx *lex_ctx, duk_codepoint_t x) { * escapes ("\udead\ubeef") so all 16-but unsigned values can be * present, even when the source file itself is strict UTF-8. */ - - DUK_ASSERT(x >= 0 && x <= 0x10ffff); + DUK_ASSERT(x >= 0 && x <= 0x10ffffL); DUK_BW_WRITE_ENSURE_CESU8(lex_ctx->thr, &lex_ctx->bw, (duk_ucodepoint_t) x); } +DUK_LOCAL void duk__appendbuffer_ascii(duk_lexer_ctx *lex_ctx, duk_codepoint_t x) { + /* ASCII characters can be emitted as a single byte without encoding + * which matters for some fast paths. + */ + DUK_ASSERT(x >= 0 && x <= 0x7f); + + DUK_BW_WRITE_ENSURE_U8(lex_ctx->thr, &lex_ctx->bw, (duk_uint8_t) x); +} + /* * Intern the temporary byte buffer into a valstack slot * (in practice, slot1 or slot2). */ -DUK_LOCAL void duk__internbuffer(duk_lexer_ctx *lex_ctx, duk_idx_t valstack_idx) { +DUK_LOCAL duk_hstring *duk__internbuffer(duk_lexer_ctx *lex_ctx, duk_idx_t valstack_idx) { duk_context *ctx = (duk_context *) lex_ctx->thr; DUK_ASSERT(valstack_idx == lex_ctx->slot1_idx || valstack_idx == lex_ctx->slot2_idx); DUK_BW_PUSH_AS_STRING(lex_ctx->thr, &lex_ctx->bw); duk_replace(ctx, valstack_idx); + return duk_known_hstring(ctx, valstack_idx); } /* @@ -73440,7 +77449,10 @@ DUK_INTERNAL void duk_lexer_initctx(duk_lexer_ctx *lex_ctx) { * Set lexer input position and reinitialize lookup window. */ -/* NB: duk_lexer_getpoint() is a macro only */ +DUK_INTERNAL void duk_lexer_getpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt) { + pt->offset = lex_ctx->window[0].offset; + pt->line = lex_ctx->window[0].line; +} DUK_INTERNAL void duk_lexer_setpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt) { DUK_ASSERT_DISABLE(pt->offset >= 0); /* unsigned */ @@ -73454,8 +77466,10 @@ DUK_INTERNAL void duk_lexer_setpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt * Lexing helpers */ -/* numeric value of a hex digit (also covers octal and decimal digits) */ -DUK_LOCAL duk_codepoint_t duk__hexval(duk_lexer_ctx *lex_ctx, duk_codepoint_t x) { +/* Numeric value of a hex digit (also covers octal and decimal digits) or + * -1 if not a valid hex digit. + */ +DUK_LOCAL duk_codepoint_t duk__hexval_validate(duk_codepoint_t x) { duk_small_int_t t; /* Here 'x' is a Unicode codepoint */ @@ -73466,11 +77480,21 @@ DUK_LOCAL duk_codepoint_t duk__hexval(duk_lexer_ctx *lex_ctx, duk_codepoint_t x) } } - /* Throwing an error this deep makes the error rather vague, but - * saves hundreds of bytes of code. - */ - DUK_ERROR_SYNTAX(lex_ctx->thr, "decode error"); - return 0; + return -1; +} + +/* Just a wrapper for call sites where 'x' is known to be valid so + * we assert for it before decoding. + */ +DUK_LOCAL duk_codepoint_t duk__hexval(duk_codepoint_t x) { + duk_codepoint_t ret; + + DUK_ASSERT((x >= DUK_ASC_0 && x <= DUK_ASC_9) || + (x >= DUK_ASC_LC_A && x <= DUK_ASC_LC_F) || + (x >= DUK_ASC_UC_A && x <= DUK_ASC_UC_F)); + ret = duk__hexval_validate(x); + DUK_ASSERT(ret >= 0 && ret <= 15); + return ret; } /* having this as a separate function provided a size benefit */ @@ -73481,18 +77505,275 @@ DUK_LOCAL duk_bool_t duk__is_hex_digit(duk_codepoint_t x) { return 0; } -DUK_LOCAL duk_codepoint_t duk__decode_hexesc_from_window(duk_lexer_ctx *lex_ctx, duk_small_int_t lookup_offset) { - /* validation performed by duk__hexval */ - return (duk__hexval(lex_ctx, lex_ctx->window[lookup_offset].codepoint) << 4) | - (duk__hexval(lex_ctx, lex_ctx->window[lookup_offset + 1].codepoint)); +/* Parse a Unicode escape of the form \xHH, \uHHHH, or \u{H+}. Shared by + * source and RegExp parsing. + */ +DUK_LOCAL duk_codepoint_t duk__lexer_parse_escape(duk_lexer_ctx *lex_ctx, duk_bool_t allow_es6) { + duk_small_int_t digits; /* Initial value 2 or 4 for fixed length escapes, 0 for ES2015 \u{H+}. */ + duk_codepoint_t escval; + duk_codepoint_t x; + duk_small_int_t adv; + + DUK_ASSERT(DUK__L0() == DUK_ASC_BACKSLASH); /* caller responsibilities */ + DUK_ASSERT(DUK__L1() == DUK_ASC_LC_X || DUK__L1() == DUK_ASC_LC_U); + DUK_UNREF(allow_es6); + + adv = 2; + digits = 2; + if (DUK__L1() == DUK_ASC_LC_U) { + digits = 4; +#if defined(DUK_USE_ES6_UNICODE_ESCAPE) + if (DUK__L2() == DUK_ASC_LCURLY && allow_es6) { + digits = 0; + adv = 3; + } +#endif + } + DUK__ADVANCECHARS(lex_ctx, adv); + + escval = 0; + for (;;) { + /* One of the escape forms: \xHH, \uHHHH, \u{H+}. + * The 'digits' variable tracks parsing state and is + * initialized to: + * + * \xHH 2 + * \uHH 4 + * \u{H+} 0 first time, updated to -1 to indicate + * at least one digit has been parsed + * + * Octal parsing is handled separately because it can be + * done with fixed lookahead and also has validation + * rules which depend on the escape length (which is + * variable). + * + * We don't need a specific check for x < 0 (end of + * input) or duk_unicode_is_line_terminator(x) + * because the 'dig' decode will fail and lead to a + * SyntaxError. + */ + duk_codepoint_t dig; + + x = DUK__L0(); + DUK__ADVANCECHARS(lex_ctx, 1); + + dig = duk__hexval_validate(x); + if (digits > 0) { + digits--; + if (dig < 0) { + goto fail_escape; + } + DUK_ASSERT(dig >= 0x00 && dig <= 0x0f); + escval = (escval << 4) + dig; + if (digits == 0) { + DUK_ASSERT(escval >= 0 && escval <= 0xffffL); + break; + } + } else { +#if defined(DUK_USE_ES6_UNICODE_ESCAPE) + DUK_ASSERT(digits == 0 /* first time */ || digits == -1 /* others */); + if (dig >= 0) { + DUK_ASSERT(dig >= 0x00 && dig <= 0x0f); + escval = (escval << 4) + dig; + if (escval > 0x10ffffL) { + goto fail_escape; + } + } else if (x == DUK_ASC_RCURLY) { + if (digits == 0) { + /* Empty escape, \u{}. */ + goto fail_escape; + } + DUK_ASSERT(escval >= 0 && escval <= 0x10ffffL); + break; + } else { + goto fail_escape; + } + digits = -1; /* Indicate we have at least one digit. */ +#else /* DUK_USE_ES6_UNICODE_ESCAPE */ + DUK_ASSERT(0); /* Never happens if \u{H+} support disabled. */ +#endif /* DUK_USE_ES6_UNICODE_ESCAPE */ + } + } + + return escval; + + fail_escape: + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_ESCAPE); } -DUK_LOCAL duk_codepoint_t duk__decode_uniesc_from_window(duk_lexer_ctx *lex_ctx, duk_small_int_t lookup_offset) { - /* validation performed by duk__hexval */ - return (duk__hexval(lex_ctx, lex_ctx->window[lookup_offset].codepoint) << 12) | - (duk__hexval(lex_ctx, lex_ctx->window[lookup_offset + 1].codepoint) << 8) | - (duk__hexval(lex_ctx, lex_ctx->window[lookup_offset + 2].codepoint) << 4) | - (duk__hexval(lex_ctx, lex_ctx->window[lookup_offset + 3].codepoint)); +/* XXX: move strict mode to lex_ctx? */ +DUK_LOCAL void duk__lexer_parse_string_literal(duk_lexer_ctx *lex_ctx, duk_token *out_token, duk_small_int_t quote, duk_bool_t strict_mode) { + duk_small_int_t adv; + + for (adv = 1 /* initial quote */ ;;) { + duk_codepoint_t x; + + DUK__ADVANCECHARS(lex_ctx, adv); /* eat opening quote on first loop */ + x = DUK__L0(); + + adv = 1; + if (x == quote) { + DUK__ADVANCECHARS(lex_ctx, 1); /* eat closing quote */ + break; + } else if (x == '\\') { + /* DUK__L0 -> '\' char + * DUK__L1 ... DUK__L5 -> more lookup + */ + duk_small_int_t emitcp = -1; + + x = DUK__L1(); + + /* How much to advance before next loop. */ + adv = 2; /* note: long live range */ + + switch (x) { + case '\'': + emitcp = 0x0027; + break; + case '"': + emitcp = 0x0022; + break; + case '\\': + emitcp = 0x005c; + break; + case 'b': + emitcp = 0x0008; + break; + case 'f': + emitcp = 0x000c; + break; + case 'n': + emitcp = 0x000a; + break; + case 'r': + emitcp = 0x000d; + break; + case 't': + emitcp = 0x0009; + break; + case 'v': + emitcp = 0x000b; + break; + case 'x': + case 'u': { + duk_codepoint_t esc_cp; + esc_cp = duk__lexer_parse_escape(lex_ctx, 1 /*allow_es6*/); + DUK__APPENDBUFFER(lex_ctx, esc_cp); + adv = 0; + break; + } + default: { + if (duk_unicode_is_line_terminator(x)) { + /* line continuation */ + if (x == 0x000d && DUK__L2() == 0x000a) { + /* CR LF again a special case */ + adv = 3; /* line terminator, CR, LF */ + } + } else if (DUK__ISDIGIT(x)) { + /* + * Octal escape or zero escape: + * \0 (lookahead not OctalDigit) + * \1 ... \7 (lookahead not OctalDigit) + * \ZeroToThree OctalDigit (lookahead not OctalDigit) + * \FourToSeven OctalDigit (no lookahead restrictions) + * \ZeroToThree OctalDigit OctalDigit (no lookahead restrictions) + * + * Zero escape is part of the standard syntax. Octal escapes are + * defined in E5 Section B.1.2, and are only allowed in non-strict mode. + * Any other productions starting with a decimal digit are invalid + * but are in practice treated like identity escapes. + * + * Parse octal (up to 3 digits) from the lookup window. + */ + + duk_codepoint_t tmp; + duk_small_uint_t lookup_idx; + + emitcp = 0; + for (lookup_idx = 1; lookup_idx <= 3; lookup_idx++) { + DUK_DDD(DUK_DDDPRINT("lookup_idx=%ld, emitcp=%ld", (long) lookup_idx, (long) emitcp)); + tmp = DUK__LOOKUP(lex_ctx, lookup_idx); + if (tmp < DUK_ASC_0 || tmp > DUK_ASC_7) { + /* No more valid digits. */ + break; + } + tmp = (emitcp << 3) + (tmp - DUK_ASC_0); + if (tmp > 0xff) { + /* Three digit octal escapes above \377 (= 0xff) + * are not allowed. + */ + break; + } + emitcp = tmp; + } + DUK_DDD(DUK_DDDPRINT("final lookup_idx=%ld, emitcp=%ld", (long) lookup_idx, (long) emitcp)); + + adv = lookup_idx; + if (lookup_idx == 1) { + /* \8 or \9 -> treat as literal, accept also + * in strict mode. + */ + DUK_DDD(DUK_DDDPRINT("\\8 or \\9 -> treat as literal, accept in strict mode too")); + emitcp = x; + adv++; /* correction to above, eat offending character */ + } else if (lookup_idx == 2 && emitcp == 0) { + /* Zero escape, also allowed in non-strict mode. */ + DUK_DDD(DUK_DDDPRINT("\\0 -> accept in strict mode too")); + } else { + /* Valid octal, only accept in non-strict mode. */ + DUK_DDD(DUK_DDDPRINT("octal literal %ld -> accept only in non-strict-mode", (long) emitcp)); + DUK_ASSERT(emitcp >= 0 && emitcp <= 0xff); + if (strict_mode) { + goto fail_escape; + } + } + } else if (x < 0) { + goto fail_unterminated; + } else { + /* escaped NonEscapeCharacter */ + DUK__APPENDBUFFER(lex_ctx, x); + } + } /* end default clause */ + } /* end switch */ + + /* Shared handling for single codepoint escapes. */ + if (emitcp >= 0) { + DUK__APPENDBUFFER(lex_ctx, emitcp); + } + + /* Track number of escapes; count not really needed but directive + * prologues need to detect whether there were any escapes or line + * continuations or not. + */ + out_token->num_escapes++; + } else if (x >= 0x20 && x <= 0x7f) { + /* Fast path for ASCII case, avoids line terminator + * check and CESU-8 encoding. + */ + DUK_ASSERT(x >= 0); + DUK_ASSERT(!duk_unicode_is_line_terminator(x)); + DUK_ASSERT(x != quote); + DUK_ASSERT(x != DUK_ASC_BACKSLASH); + DUK__APPENDBUFFER_ASCII(lex_ctx, x); + } else if (x < 0 || duk_unicode_is_line_terminator(x)) { + goto fail_unterminated; + } else { + /* Character which is part of the string but wasn't handled + * by the fast path. + */ + DUK__APPENDBUFFER(lex_ctx, x); + } + } /* string parse loop */ + + return; + + fail_escape: + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_ESCAPE); + return; + + fail_unterminated: + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_STRING); + return; } /* @@ -73571,8 +77852,7 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, duk_bool_t got_lineterm = 0; /* got lineterm preceding non-whitespace, non-lineterm token */ if (++lex_ctx->token_count >= lex_ctx->token_limit) { - DUK_ERROR_RANGE(lex_ctx->thr, "token limit"); - return; /* unreachable */ + goto fail_token_limit; } out_token->t = DUK_TOK_EOF; @@ -73635,7 +77915,7 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, got_lineterm = 1; goto restart_lineupdate; case DUK_ASC_SLASH: /* '/' */ - if (DUK__L1() == '/') { + if (DUK__L1() == DUK_ASC_SLASH) { /* * E5 Section 7.4, allow SourceCharacter (which is any 16-bit * code point). @@ -73650,7 +77930,7 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, DUK__ADVANCECHARS(lex_ctx, 1); } goto restart; /* line terminator will be handled on next round */ - } else if (DUK__L1() == '*') { + } else if (DUK__L1() == DUK_ASC_STAR) { /* * E5 Section 7.4. If the multi-line comment contains a newline, * it is treated like a single line terminator for automatic @@ -73662,16 +77942,16 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, for (;;) { x = DUK__L0(); if (x < 0) { - DUK_ERROR_SYNTAX(lex_ctx->thr, "eof in multiline comment"); + goto fail_unterm_comment; } DUK__ADVANCECHARS(lex_ctx, 1); - if (last_asterisk && x == '/') { + if (last_asterisk && x == DUK_ASC_SLASH) { break; } if (duk_unicode_is_line_terminator(x)) { got_lineterm = 1; } - last_asterisk = (x == '*'); + last_asterisk = (x == DUK_ASC_STAR); } goto restart_lineupdate; } else if (regexp_mode) { @@ -73740,24 +78020,24 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, DUK__ADVANCECHARS(lex_ctx, 1); /* skip opening slash on first loop */ x = DUK__L0(); if (x < 0 || duk_unicode_is_line_terminator(x)) { - DUK_ERROR_SYNTAX(lex_ctx->thr, "eof or line terminator in regexp"); + goto fail_unterm_regexp; } x = DUK__L0(); /* re-read to avoid spill / fetch */ if (state == 0) { - if (x == '/') { + if (x == DUK_ASC_SLASH) { DUK__ADVANCECHARS(lex_ctx, 1); /* eat closing slash */ break; - } else if (x == '\\') { + } else if (x == DUK_ASC_BACKSLASH) { state = 1; - } else if (x == '[') { + } else if (x == DUK_ASC_LBRACKET) { state = 2; } } else if (state == 1) { state = 0; } else if (state == 2) { - if (x == ']') { + if (x == DUK_ASC_RBRACKET) { state = 0; - } else if (x == '\\') { + } else if (x == DUK_ASC_BACKSLASH) { state = 3; } } else { /* state == 3 */ @@ -73765,8 +78045,7 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, } DUK__APPENDBUFFER(lex_ctx, x); } - duk__internbuffer(lex_ctx, lex_ctx->slot1_idx); - out_token->str1 = duk_get_hstring((duk_context *) lex_ctx->thr, lex_ctx->slot1_idx); + out_token->str1 = duk__internbuffer(lex_ctx, lex_ctx->slot1_idx); /* second, parse flags */ @@ -73780,18 +78059,17 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, DUK__APPENDBUFFER(lex_ctx, x); DUK__ADVANCECHARS(lex_ctx, 1); } - duk__internbuffer(lex_ctx, lex_ctx->slot2_idx); - out_token->str2 = duk_get_hstring((duk_context *) lex_ctx->thr, lex_ctx->slot2_idx); + out_token->str2 = duk__internbuffer(lex_ctx, lex_ctx->slot2_idx); DUK__INITBUFFER(lex_ctx); /* free some memory */ /* validation of the regexp is caller's responsibility */ advtok = DUK__ADVTOK(0, DUK_TOK_REGEXP); -#else - DUK_ERROR_SYNTAX(lex_ctx->thr, "regexp support disabled"); -#endif - } else if (DUK__L1() == '=') { +#else /* DUK_USE_REGEXP_SUPPORT */ + goto fail_regexp_support; +#endif /* DUK_USE_REGEXP_SUPPORT */ + } else if (DUK__L1() == DUK_ASC_EQUALS) { /* "/=" and not in regexp mode */ advtok = DUK__ADVTOK(2, DUK_TOK_DIV_EQ); } else { @@ -73835,101 +78113,108 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, advtok = DUK__ADVTOK(1, DUK_TOK_COMMA); break; case DUK_ASC_LANGLE: /* '<' */ - if (DUK__L1() == '<' && DUK__L2() == '=') { + if (DUK__L1() == DUK_ASC_LANGLE && DUK__L2() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(3, DUK_TOK_ALSHIFT_EQ); - } else if (DUK__L1() == '=') { + } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_LE); - } else if (DUK__L1() == '<') { + } else if (DUK__L1() == DUK_ASC_LANGLE) { advtok = DUK__ADVTOK(2, DUK_TOK_ALSHIFT); } else { advtok = DUK__ADVTOK(1, DUK_TOK_LT); } break; case DUK_ASC_RANGLE: /* '>' */ - if (DUK__L1() == '>' && DUK__L2() == '>' && DUK__L3() == '=') { + if (DUK__L1() == DUK_ASC_RANGLE && DUK__L2() == DUK_ASC_RANGLE && DUK__L3() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(4, DUK_TOK_RSHIFT_EQ); - } else if (DUK__L1() == '>' && DUK__L2() == '>') { + } else if (DUK__L1() == DUK_ASC_RANGLE && DUK__L2() == DUK_ASC_RANGLE) { advtok = DUK__ADVTOK(3, DUK_TOK_RSHIFT); - } else if (DUK__L1() == '>' && DUK__L2() == '=') { + } else if (DUK__L1() == DUK_ASC_RANGLE && DUK__L2() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(3, DUK_TOK_ARSHIFT_EQ); - } else if (DUK__L1() == '=') { + } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_GE); - } else if (DUK__L1() == '>') { + } else if (DUK__L1() == DUK_ASC_RANGLE) { advtok = DUK__ADVTOK(2, DUK_TOK_ARSHIFT); } else { advtok = DUK__ADVTOK(1, DUK_TOK_GT); } break; case DUK_ASC_EQUALS: /* '=' */ - if (DUK__L1() == '=' && DUK__L2() == '=') { + if (DUK__L1() == DUK_ASC_EQUALS && DUK__L2() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(3, DUK_TOK_SEQ); - } else if (DUK__L1() == '=') { + } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_EQUALSIGN); } break; case DUK_ASC_EXCLAMATION: /* '!' */ - if (DUK__L1() == '=' && DUK__L2() == '=') { + if (DUK__L1() == DUK_ASC_EQUALS && DUK__L2() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(3, DUK_TOK_SNEQ); - } else if (DUK__L1() == '=') { + } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_NEQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_LNOT); } break; case DUK_ASC_PLUS: /* '+' */ - if (DUK__L1() == '+') { + if (DUK__L1() == DUK_ASC_PLUS) { advtok = DUK__ADVTOK(2, DUK_TOK_INCREMENT); - } else if (DUK__L1() == '=') { + } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_ADD_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_ADD); } break; case DUK_ASC_MINUS: /* '-' */ - if (DUK__L1() == '-') { + if (DUK__L1() == DUK_ASC_MINUS) { advtok = DUK__ADVTOK(2, DUK_TOK_DECREMENT); - } else if (DUK__L1() == '=') { + } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_SUB_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_SUB); } break; case DUK_ASC_STAR: /* '*' */ - if (DUK__L1() == '=') { +#if defined(DUK_USE_ES7_EXP_OPERATOR) + if (DUK__L1() == DUK_ASC_STAR && DUK__L2() == DUK_ASC_EQUALS) { + advtok = DUK__ADVTOK(3, DUK_TOK_EXP_EQ); + } else if (DUK__L1() == DUK_ASC_STAR) { + advtok = DUK__ADVTOK(2, DUK_TOK_EXP); + } else +#endif + if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_MUL_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_MUL); } break; case DUK_ASC_PERCENT: /* '%' */ - if (DUK__L1() == '=') { + if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_MOD_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_MOD); } break; case DUK_ASC_AMP: /* '&' */ - if (DUK__L1() == '&') { + if (DUK__L1() == DUK_ASC_AMP) { advtok = DUK__ADVTOK(2, DUK_TOK_LAND); - } else if (DUK__L1() == '=') { + } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_BAND_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_BAND); } break; case DUK_ASC_PIPE: /* '|' */ - if (DUK__L1() == '|') { + if (DUK__L1() == DUK_ASC_PIPE) { advtok = DUK__ADVTOK(2, DUK_TOK_LOR); - } else if (DUK__L1() == '=') { + } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_BOR_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_BOR); } break; case DUK_ASC_CARET: /* '^' */ - if (DUK__L1() == '=') { + if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_BXOR_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_BXOR); @@ -73946,140 +78231,10 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, break; case DUK_ASC_DOUBLEQUOTE: /* '"' */ case DUK_ASC_SINGLEQUOTE: { /* '\'' */ - duk_small_int_t quote = x; /* Note: duk_uint8_t type yields larger code */ - duk_small_int_t adv; - DUK__INITBUFFER(lex_ctx); - for (;;) { - DUK__ADVANCECHARS(lex_ctx, 1); /* eat opening quote on first loop */ - x = DUK__L0(); - if (x < 0 || duk_unicode_is_line_terminator(x)) { - DUK_ERROR_SYNTAX(lex_ctx->thr, "eof or line terminator in string literal"); - } - if (x == quote) { - DUK__ADVANCECHARS(lex_ctx, 1); /* eat closing quote */ - break; - } - if (x == '\\') { - /* DUK__L0 -> '\' char - * DUK__L1 ... DUK__L5 -> more lookup - */ - - x = DUK__L1(); - - /* How much to advance before next loop; note that next loop - * will advance by 1 anyway, so -1 from the total escape - * length (e.g. len('\uXXXX') - 1 = 6 - 1). As a default, - * 1 is good. - */ - adv = 2 - 1; /* note: long live range */ - - if (x < 0) { - DUK_ERROR_SYNTAX(lex_ctx->thr, "eof or line terminator in string literal"); - } - if (duk_unicode_is_line_terminator(x)) { - /* line continuation */ - if (x == 0x000d && DUK__L2() == 0x000a) { - /* CR LF again a special case */ - adv = 3 - 1; - } - } else if (x == '\'') { - DUK__APPENDBUFFER(lex_ctx, 0x0027); - } else if (x == '"') { - DUK__APPENDBUFFER(lex_ctx, 0x0022); - } else if (x == '\\') { - DUK__APPENDBUFFER(lex_ctx, 0x005c); - } else if (x == 'b') { - DUK__APPENDBUFFER(lex_ctx, 0x0008); - } else if (x == 'f') { - DUK__APPENDBUFFER(lex_ctx, 0x000c); - } else if (x == 'n') { - DUK__APPENDBUFFER(lex_ctx, 0x000a); - } else if (x == 'r') { - DUK__APPENDBUFFER(lex_ctx, 0x000d); - } else if (x == 't') { - DUK__APPENDBUFFER(lex_ctx, 0x0009); - } else if (x == 'v') { - DUK__APPENDBUFFER(lex_ctx, 0x000b); - } else if (x == 'x') { - adv = 4 - 1; - DUK__APPENDBUFFER(lex_ctx, duk__decode_hexesc_from_window(lex_ctx, 2)); - } else if (x == 'u') { - adv = 6 - 1; - DUK__APPENDBUFFER(lex_ctx, duk__decode_uniesc_from_window(lex_ctx, 2)); - } else if (DUK__ISDIGIT(x)) { - duk_codepoint_t ch = 0; /* initialized to avoid warnings of unused var */ - - /* - * Octal escape or zero escape: - * \0 (lookahead not DecimalDigit) - * \1 ... \7 (lookahead not DecimalDigit) - * \ZeroToThree OctalDigit (lookahead not DecimalDigit) - * \FourToSeven OctalDigit (no lookahead restrictions) - * \ZeroToThree OctalDigit OctalDigit (no lookahead restrictions) - * - * Zero escape is part of the standard syntax. Octal escapes are - * defined in E5 Section B.1.2, and are only allowed in non-strict mode. - * Any other productions starting with a decimal digit are invalid. - */ - - if (x == '0' && !DUK__ISDIGIT(DUK__L2())) { - /* Zero escape (also allowed in non-strict mode) */ - ch = 0; - /* adv = 2 - 1 default OK */ -#if defined(DUK_USE_OCTAL_SUPPORT) - } else if (strict_mode) { - /* No other escape beginning with a digit in strict mode */ - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid escape in string literal"); - } else if (DUK__ISDIGIT03(x) && DUK__ISOCTDIGIT(DUK__L2()) && DUK__ISOCTDIGIT(DUK__L3())) { - /* Three digit octal escape, digits validated. */ - adv = 4 - 1; - ch = (duk__hexval(lex_ctx, x) << 6) + - (duk__hexval(lex_ctx, DUK__L2()) << 3) + - duk__hexval(lex_ctx, DUK__L3()); - } else if (((DUK__ISDIGIT03(x) && !DUK__ISDIGIT(DUK__L3())) || DUK__ISDIGIT47(x)) && - DUK__ISOCTDIGIT(DUK__L2())) { - /* Two digit octal escape, digits validated. - * - * The if-condition is a bit tricky. We could catch e.g. - * '\039' in the three-digit escape and fail it there (by - * validating the digits), but we want to avoid extra - * additional validation code. - */ - adv = 3 - 1; - ch = (duk__hexval(lex_ctx, x) << 3) + - duk__hexval(lex_ctx, DUK__L2()); - } else if (DUK__ISDIGIT(x) && !DUK__ISDIGIT(DUK__L2())) { - /* One digit octal escape, digit validated. */ - /* adv = 2 default OK */ - ch = duk__hexval(lex_ctx, x); -#else - /* fall through to error */ -#endif - } else { - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid escape in string literal"); - } - - DUK__APPENDBUFFER(lex_ctx, ch); - } else { - /* escaped NonEscapeCharacter */ - DUK__APPENDBUFFER(lex_ctx, x); - } - DUK__ADVANCECHARS(lex_ctx, adv); - - /* Track number of escapes; count not really needed but directive - * prologues need to detect whether there were any escapes or line - * continuations or not. - */ - out_token->num_escapes++; - } else { - /* part of string */ - DUK__APPENDBUFFER(lex_ctx, x); - } - } - + duk__lexer_parse_string_literal(lex_ctx, out_token, x /*quote*/, strict_mode); duk__internbuffer(lex_ctx, lex_ctx->slot1_idx); - out_token->str1 = duk_get_hstring((duk_context *) lex_ctx->thr, lex_ctx->slot1_idx); + out_token->str1 = duk_known_hstring((duk_context *) lex_ctx->thr, lex_ctx->slot1_idx); DUK__INITBUFFER(lex_ctx); /* free some memory */ @@ -74106,7 +78261,7 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, } got_lineterm = 1; goto restart_lineupdate; - } else if (duk_unicode_is_identifier_start(x) || x == '\\') { + } else if (duk_unicode_is_identifier_start(x) || x == DUK_ASC_BACKSLASH) { /* * Parse an identifier and then check whether it is: * - reserved word (keyword or other reserved word) @@ -74145,22 +78300,20 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, DUK__INITBUFFER(lex_ctx); for (;;) { /* re-lookup first char on first loop */ - if (DUK__L0() == '\\') { - duk_codepoint_t ch; - if (DUK__L1() != 'u') { - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid unicode escape in identifier"); + if (DUK__L0() == DUK_ASC_BACKSLASH) { + duk_codepoint_t esc_cp; + if (DUK__L1() != DUK_ASC_LC_U) { + goto fail_escape; } - - ch = duk__decode_uniesc_from_window(lex_ctx, 2); + esc_cp = duk__lexer_parse_escape(lex_ctx, 1 /*allow_es6*/); + DUK__APPENDBUFFER(lex_ctx, esc_cp); /* IdentifierStart is stricter than IdentifierPart, so if the first * character is escaped, must have a stricter check here. */ - if (!(first ? duk_unicode_is_identifier_start(ch) : duk_unicode_is_identifier_part(ch))) { - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid unicode escape in identifier"); + if (!(first ? duk_unicode_is_identifier_start(esc_cp) : duk_unicode_is_identifier_part(esc_cp))) { + goto fail_escape; } - DUK__APPENDBUFFER(lex_ctx, ch); - DUK__ADVANCECHARS(lex_ctx, 6); /* Track number of escapes: necessary for proper keyword * detection. @@ -74181,10 +78334,8 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, first = 0; } - duk__internbuffer(lex_ctx, lex_ctx->slot1_idx); - out_token->str1 = duk_get_hstring((duk_context *) lex_ctx->thr, lex_ctx->slot1_idx); + out_token->str1 = duk__internbuffer(lex_ctx, lex_ctx->slot1_idx); str = out_token->str1; - DUK_ASSERT(str != NULL); out_token->t_nores = DUK_TOK_IDENTIFIER; DUK__INITBUFFER(lex_ctx); /* free some memory */ @@ -74221,23 +78372,23 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, } } } - } else if (DUK__ISDIGIT(x) || (x == '.')) { + } else if (DUK__ISDIGIT(x) || (x == DUK_ASC_PERIOD)) { /* Note: decimal number may start with a period, but must be followed by a digit */ /* - * DecimalLiteral, HexIntegerLiteral, OctalIntegerLiteral - * "pre-parsing", followed by an actual, accurate parser step. + * Pre-parsing for decimal, hex, octal (both legacy and ES2015), + * and binary literals, followed by an actual parser step + * provided by numconv. * * Note: the leading sign character ('+' or '-') is -not- part of * the production in E5 grammar, and that the a DecimalLiteral - * starting with a '0' must be followed by a non-digit. Leading - * zeroes are syntax errors and must be checked for. + * starting with a '0' must be followed by a non-digit. * * XXX: the two step parsing process is quite awkward, it would * be more straightforward to allow numconv to parse the longest * valid prefix (it already does that, it only needs to indicate * where the input ended). However, the lexer decodes characters - * using a lookup window, so this is not a trivial change. + * using a limited lookup window, so this is not a trivial change. */ /* XXX: because of the final check below (that the literal is not @@ -74247,39 +78398,58 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, */ duk_double_t val; - duk_bool_t int_only = 0; - duk_bool_t allow_hex = 0; + duk_bool_t legacy_oct = 0; duk_small_int_t state; /* 0=before period/exp, * 1=after period, before exp * 2=after exp, allow '+' or '-' * 3=after exp and exp sign */ duk_small_uint_t s2n_flags; - duk_codepoint_t y; + duk_codepoint_t y, z; + duk_small_uint_t s2n_radix = 10; + duk_small_uint_t pre_adv = 0; DUK__INITBUFFER(lex_ctx); y = DUK__L1(); - if (x == '0' && (y == 'x' || y == 'X')) { - DUK__APPENDBUFFER(lex_ctx, x); - DUK__APPENDBUFFER(lex_ctx, y); - DUK__ADVANCECHARS(lex_ctx, 2); - int_only = 1; - allow_hex = 1; -#if defined(DUK_USE_OCTAL_SUPPORT) - } else if (!strict_mode && x == '0' && DUK__ISDIGIT(y)) { - /* Note: if DecimalLiteral starts with a '0', it can only be - * followed by a period or an exponent indicator which starts - * with 'e' or 'E'. Hence the if-check above ensures that - * OctalIntegerLiteral is the only valid NumericLiteral - * alternative at this point (even if y is, say, '9'). - */ - DUK__APPENDBUFFER(lex_ctx, x); - DUK__ADVANCECHARS(lex_ctx, 1); - int_only = 1; -#endif + if (x == DUK_ASC_0) { + z = DUK_LOWERCASE_CHAR_ASCII(y); + + pre_adv = 2; /* default for 0xNNN, 0oNNN, 0bNNN. */ + if (z == DUK_ASC_LC_X) { + s2n_radix = 16; + } else if (z == DUK_ASC_LC_O) { + s2n_radix = 8; + } else if (z == DUK_ASC_LC_B) { + s2n_radix = 2; + } else { + pre_adv = 0; + if (DUK__ISDIGIT(y)) { + if (strict_mode) { + /* Reject octal like \07 but also octal-lookalike + * decimal like \08 in strict mode. + */ + goto fail_number_literal; + } else { + /* Legacy OctalIntegerLiteral or octal-lookalice + * decimal. Deciding between the two happens below + * in digit scanning. + */ + DUK__APPENDBUFFER(lex_ctx, x); + pre_adv = 1; + legacy_oct = 1; + s2n_radix = 8; /* tentative unless conflicting digits found */ + } + } + } } + DUK__ADVANCECHARS(lex_ctx, pre_adv); + + /* XXX: we could parse integers here directly, and fall back + * to numconv only when encountering a fractional expression + * or when an octal literal turned out to be decimal (0778 etc). + */ state = 0; for (;;) { x = DUK__L0(); /* re-lookup curr char on first round */ @@ -74287,25 +78457,35 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, /* Note: intentionally allow leading zeroes here, as the * actual parser will check for them. */ + if (state == 0 && legacy_oct && (x == DUK_ASC_8 || x == DUK_ASC_9)) { + /* Started out as an octal-lookalike + * but interpreted as decimal, e.g. + * '0779' -> 779. This also means + * that fractions are allowed, e.g. + * '0779.123' is allowed but '0777.123' + * is not! + */ + s2n_radix = 10; + } if (state == 2) { state = 3; } - } else if (allow_hex && DUK__ISHEXDIGIT(x)) { + } else if (s2n_radix == 16 && DUK__ISHEXDIGIT(x)) { /* Note: 'e' and 'E' are also accepted here. */ ; - } else if (x == '.') { - if (state >= 1 || int_only) { + } else if (x == DUK_ASC_PERIOD) { + if (state >= 1 || s2n_radix != 10) { break; } else { state = 1; } - } else if (x == 'e' || x == 'E') { - if (state >= 2 || int_only) { + } else if (x == DUK_ASC_LC_E || x == DUK_ASC_UC_E) { + if (state >= 2 || s2n_radix != 10) { break; } else { state = 2; } - } else if (x == '-' || x == '+') { + } else if (x == DUK_ASC_MINUS || x == DUK_ASC_PLUS) { if (state != 2) { break; } else { @@ -74319,22 +78499,24 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, } /* XXX: better coercion */ - duk__internbuffer(lex_ctx, lex_ctx->slot1_idx); + (void) duk__internbuffer(lex_ctx, lex_ctx->slot1_idx); - s2n_flags = DUK_S2N_FLAG_ALLOW_EXP | - DUK_S2N_FLAG_ALLOW_FRAC | - DUK_S2N_FLAG_ALLOW_NAKED_FRAC | - DUK_S2N_FLAG_ALLOW_EMPTY_FRAC | -#if defined(DUK_USE_OCTAL_SUPPORT) - (strict_mode ? 0 : DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT) | -#endif - DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT; + if (s2n_radix != 10) { + /* For bases other than 10, integer only. */ + s2n_flags = DUK_S2N_FLAG_ALLOW_LEADING_ZERO; + } else { + s2n_flags = DUK_S2N_FLAG_ALLOW_EXP | + DUK_S2N_FLAG_ALLOW_FRAC | + DUK_S2N_FLAG_ALLOW_NAKED_FRAC | + DUK_S2N_FLAG_ALLOW_EMPTY_FRAC | + DUK_S2N_FLAG_ALLOW_LEADING_ZERO; + } duk_dup((duk_context *) lex_ctx->thr, lex_ctx->slot1_idx); - duk_numconv_parse((duk_context *) lex_ctx->thr, 10 /*radix*/, s2n_flags); - val = duk_to_number((duk_context *) lex_ctx->thr, -1); + duk_numconv_parse((duk_context *) lex_ctx->thr, s2n_radix, s2n_flags); + val = duk_to_number_m1((duk_context *) lex_ctx->thr); if (DUK_ISNAN(val)) { - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid numeric literal"); + goto fail_number_literal; } duk_replace((duk_context *) lex_ctx->thr, lex_ctx->slot1_idx); /* could also just pop? */ @@ -74345,7 +78527,7 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, */ if (DUK__ISDIGIT(DUK__L0()) || duk_unicode_is_identifier_start(DUK__L0())) { - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid numeric literal"); + goto fail_number_literal; } out_token->num = val; @@ -74356,7 +78538,7 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, } else if (x < 0) { advtok = DUK__ADVTOK(0, DUK_TOK_EOF); } else { - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid token"); + goto fail_token; } skip_slow_path: @@ -74380,6 +78562,38 @@ void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, } else { out_token->allow_auto_semi = 0; } + + return; + + fail_token_limit: + DUK_ERROR_RANGE(lex_ctx->thr, DUK_STR_TOKEN_LIMIT); + return; + + fail_token: + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_TOKEN); + return; + + fail_number_literal: + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_NUMBER_LITERAL); + return; + + fail_escape: + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_ESCAPE); + return; + + fail_unterm_regexp: + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_REGEXP); + return; + + fail_unterm_comment: + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_COMMENT); + return; + +#if !defined(DUK_USE_REGEXP_SUPPORT) + fail_regexp_support: + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_REGEXP_SUPPORT_DISABLED); + return; +#endif } #if defined(DUK_USE_REGEXP_SUPPORT) @@ -74398,8 +78612,7 @@ DUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token duk_codepoint_t x, y; if (++lex_ctx->token_count >= lex_ctx->token_limit) { - DUK_ERROR_RANGE(lex_ctx->thr, "token limit"); - return; /* unreachable */ + goto fail_token_limit; } DUK_MEMZERO(out_token, sizeof(*out_token)); @@ -74410,22 +78623,22 @@ DUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token DUK_DDD(DUK_DDDPRINT("parsing regexp token, L0=%ld, L1=%ld", (long) x, (long) y)); switch (x) { - case '|': { + case DUK_ASC_PIPE: { advtok = DUK__ADVTOK(1, DUK_RETOK_DISJUNCTION); break; } - case '^': { + case DUK_ASC_CARET: { advtok = DUK__ADVTOK(1, DUK_RETOK_ASSERT_START); break; } - case '$': { + case DUK_ASC_DOLLAR: { advtok = DUK__ADVTOK(1, DUK_RETOK_ASSERT_END); break; } - case '?': { + case DUK_ASC_QUESTION: { out_token->qmin = 0; out_token->qmax = 1; - if (y == '?') { + if (y == DUK_ASC_QUESTION) { advtok = DUK__ADVTOK(2, DUK_RETOK_QUANTIFIER); out_token->greedy = 0; } else { @@ -74434,10 +78647,10 @@ DUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token } break; } - case '*': { + case DUK_ASC_STAR: { out_token->qmin = 0; out_token->qmax = DUK_RE_QUANTIFIER_INFINITE; - if (y == '?') { + if (y == DUK_ASC_QUESTION) { advtok = DUK__ADVTOK(2, DUK_RETOK_QUANTIFIER); out_token->greedy = 0; } else { @@ -74446,10 +78659,10 @@ DUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token } break; } - case '+': { + case DUK_ASC_PLUS: { out_token->qmin = 1; out_token->qmax = DUK_RE_QUANTIFIER_INFINITE; - if (y == '?') { + if (y == DUK_ASC_QUESTION) { advtok = DUK__ADVTOK(2, DUK_RETOK_QUANTIFIER); out_token->greedy = 0; } else { @@ -74458,16 +78671,16 @@ DUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token } break; } - case '{': { + case DUK_ASC_LCURLY: { /* Production allows 'DecimalDigits', including leading zeroes */ duk_uint_fast32_t val1 = 0; duk_uint_fast32_t val2 = DUK_RE_QUANTIFIER_INFINITE; duk_small_int_t digits = 0; -#if defined(DUK_USE_ES6_REGEXP_BRACES) +#if defined(DUK_USE_ES6_REGEXP_SYNTAX) duk_lexer_point lex_pt; #endif -#if defined(DUK_USE_ES6_REGEXP_BRACES) +#if defined(DUK_USE_ES6_REGEXP_SYNTAX) /* Store lexer position, restoring if quantifier is invalid. */ DUK_LEXER_GETPOINT(lex_ctx, &lex_pt); #endif @@ -74477,15 +78690,15 @@ DUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token x = DUK__L0(); if (DUK__ISDIGIT(x)) { digits++; - val1 = val1 * 10 + (duk_uint_fast32_t) duk__hexval(lex_ctx, x); - } else if (x == ',') { + val1 = val1 * 10 + (duk_uint_fast32_t) duk__hexval(x); + } else if (x == DUK_ASC_COMMA) { if (digits > DUK__MAX_RE_QUANT_DIGITS) { goto invalid_quantifier; } if (val2 != DUK_RE_QUANTIFIER_INFINITE) { goto invalid_quantifier; } - if (DUK__L1() == '}') { + if (DUK__L1() == DUK_ASC_RCURLY) { /* form: { DecimalDigits , }, val1 = min count */ if (digits == 0) { goto invalid_quantifier; @@ -74498,7 +78711,7 @@ DUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token val2 = val1; val1 = 0; digits = 0; /* not strictly necessary because of lookahead '}' above */ - } else if (x == '}') { + } else if (x == DUK_ASC_RCURLY) { if (digits > DUK__MAX_RE_QUANT_DIGITS) { goto invalid_quantifier; } @@ -74520,7 +78733,7 @@ DUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token goto invalid_quantifier; } } - if (DUK__L0() == '?') { + if (DUK__L0() == DUK_ASC_QUESTION) { out_token->greedy = 0; DUK__ADVANCECHARS(lex_ctx, 1); } else { @@ -74529,78 +78742,80 @@ DUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token advtok = DUK__ADVTOK(0, DUK_RETOK_QUANTIFIER); break; invalid_quantifier: -#if defined(DUK_USE_ES6_REGEXP_BRACES) +#if defined(DUK_USE_ES6_REGEXP_SYNTAX) /* Failed to match the quantifier, restore lexer and parse * opening brace as a literal. */ DUK_LEXER_SETPOINT(lex_ctx, &lex_pt); advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_CHAR); - out_token->num = '{'; + out_token->num = DUK_ASC_LCURLY; #else - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid regexp quantifier"); + goto fail_quantifier; #endif break; } - case '.': { + case DUK_ASC_PERIOD: { advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_PERIOD); break; } - case '\\': { + case DUK_ASC_BACKSLASH: { /* The E5.1 specification does not seem to allow IdentifierPart characters * to be used as identity escapes. Unfortunately this includes '$', which * cannot be escaped as '\$'; it needs to be escaped e.g. as '\u0024'. * Many other implementations (including V8 and Rhino, for instance) do - * accept '\$' as a valid identity escape, which is quite pragmatic. - * See: test-regexp-identity-escape-dollar.js. + * accept '\$' as a valid identity escape, which is quite pragmatic, and + * ES2015 Annex B relaxes the rules to allow these (and other) real world forms. */ advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_CHAR); /* default: char escape (two chars) */ - if (y == 'b') { + if (y == DUK_ASC_LC_B) { advtok = DUK__ADVTOK(2, DUK_RETOK_ASSERT_WORD_BOUNDARY); - } else if (y == 'B') { + } else if (y == DUK_ASC_UC_B) { advtok = DUK__ADVTOK(2, DUK_RETOK_ASSERT_NOT_WORD_BOUNDARY); - } else if (y == 'f') { + } else if (y == DUK_ASC_LC_F) { out_token->num = 0x000c; - } else if (y == 'n') { + } else if (y == DUK_ASC_LC_N) { out_token->num = 0x000a; - } else if (y == 't') { + } else if (y == DUK_ASC_LC_T) { out_token->num = 0x0009; - } else if (y == 'r') { + } else if (y == DUK_ASC_LC_R) { out_token->num = 0x000d; - } else if (y == 'v') { + } else if (y == DUK_ASC_LC_V) { out_token->num = 0x000b; - } else if (y == 'c') { + } else if (y == DUK_ASC_LC_C) { x = DUK__L2(); - if ((x >= 'a' && x <= 'z') || - (x >= 'A' && x <= 'Z')) { + if ((x >= DUK_ASC_LC_A && x <= DUK_ASC_LC_Z) || + (x >= DUK_ASC_UC_A && x <= DUK_ASC_UC_Z)) { out_token->num = (x % 32); advtok = DUK__ADVTOK(3, DUK_RETOK_ATOM_CHAR); } else { - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid regexp escape"); - } - } else if (y == 'x') { - out_token->num = duk__decode_hexesc_from_window(lex_ctx, 2); - advtok = DUK__ADVTOK(4, DUK_RETOK_ATOM_CHAR); - } else if (y == 'u') { - out_token->num = duk__decode_uniesc_from_window(lex_ctx, 2); - advtok = DUK__ADVTOK(6, DUK_RETOK_ATOM_CHAR); - } else if (y == 'd') { + goto fail_escape; + } + } else if (y == DUK_ASC_LC_X || y == DUK_ASC_LC_U) { + /* The token value is the Unicode codepoint without + * it being decode into surrogate pair characters + * here. The \u{H+} is only allowed in Unicode mode + * which we don't support yet. + */ + out_token->num = duk__lexer_parse_escape(lex_ctx, 0 /*allow_es6*/); + advtok = DUK__ADVTOK(0, DUK_RETOK_ATOM_CHAR); + } else if (y == DUK_ASC_LC_D) { advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_DIGIT); - } else if (y == 'D') { + } else if (y == DUK_ASC_UC_D) { advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_NOT_DIGIT); - } else if (y == 's') { + } else if (y == DUK_ASC_LC_S) { advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_WHITE); - } else if (y == 'S') { + } else if (y == DUK_ASC_UC_S) { advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_NOT_WHITE); - } else if (y == 'w') { + } else if (y == DUK_ASC_LC_W) { advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_WORD_CHAR); - } else if (y == 'W') { + } else if (y == DUK_ASC_UC_W) { advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_NOT_WORD_CHAR); } else if (DUK__ISDIGIT(y)) { /* E5 Section 15.10.2.11 */ - if (y == '0') { + if (y == DUK_ASC_0) { if (DUK__ISDIGIT(DUK__L2())) { - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid regexp escape"); + goto fail_escape; } out_token->num = 0x0000; advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_CHAR); @@ -74610,46 +78825,56 @@ DUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token duk_small_int_t i; for (i = 0; ; i++) { if (i >= DUK__MAX_RE_DECESC_DIGITS) { - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid regexp escape"); + goto fail_escape; } DUK__ADVANCECHARS(lex_ctx, 1); /* eat backslash on entry */ x = DUK__L0(); if (!DUK__ISDIGIT(x)) { break; } - val = val * 10 + (duk_uint_fast32_t) duk__hexval(lex_ctx, x); + val = val * 10 + (duk_uint_fast32_t) duk__hexval(x); } /* DUK__L0() cannot be a digit, because the loop doesn't terminate if it is */ advtok = DUK__ADVTOK(0, DUK_RETOK_ATOM_BACKREFERENCE); out_token->num = val; } +#if defined(DUK_USE_ES6_REGEXP_SYNTAX) + } else if (y >= 0) { + /* For ES2015 Annex B, accept any source character as identity + * escape except 'c' which is used for control characters. + * http://www.ecma-international.org/ecma-262/6.0/#sec-regular-expressions-patterns + * Careful not to match end-of-buffer (<0) here. + * This is not yet full ES2015 Annex B because cases above + * (like hex escape) won't backtrack. + */ + DUK_ASSERT(y != DUK_ASC_LC_C); /* covered above */ +#else /* DUK_USE_ES6_REGEXP_SYNTAX */ } else if ((y >= 0 && !duk_unicode_is_identifier_part(y)) || -#if defined(DUK_USE_NONSTD_REGEXP_DOLLAR_ESCAPE) - y == '$' || -#endif y == DUK_UNICODE_CP_ZWNJ || y == DUK_UNICODE_CP_ZWJ) { - /* IdentityEscape, with dollar added as a valid additional - * non-standard escape (see test-regexp-identity-escape-dollar.js). - * Careful not to match end-of-buffer (<0) here. + /* For ES5.1 identity escapes are not allowed for identifier + * parts. This conflicts with a lot of real world code as this + * doesn't e.g. allow escaping a dollar sign as /\$/, see + * test-regexp-identity-escape-dollar.js. */ +#endif /* DUK_USE_ES6_REGEXP_SYNTAX */ out_token->num = y; } else { - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid regexp escape"); + goto fail_escape; } break; } - case '(': { + case DUK_ASC_LPAREN: { /* XXX: naming is inconsistent: ATOM_END_GROUP ends an ASSERT_START_LOOKAHEAD */ - if (y == '?') { - if (DUK__L2() == '=') { + if (y == DUK_ASC_QUESTION) { + if (DUK__L2() == DUK_ASC_EQUALS) { /* (?= */ advtok = DUK__ADVTOK(3, DUK_RETOK_ASSERT_START_POS_LOOKAHEAD); - } else if (DUK__L2() == '!') { + } else if (DUK__L2() == DUK_ASC_EXCLAMATION) { /* (?! */ advtok = DUK__ADVTOK(3, DUK_RETOK_ASSERT_START_NEG_LOOKAHEAD); - } else if (DUK__L2() == ':') { + } else if (DUK__L2() == DUK_ASC_COLON) { /* (?: */ advtok = DUK__ADVTOK(3, DUK_RETOK_ATOM_START_NONCAPTURE_GROUP); } @@ -74659,32 +78884,37 @@ DUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token } break; } - case ')': { + case DUK_ASC_RPAREN: { advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_END_GROUP); break; } - case '[': { + case DUK_ASC_LBRACKET: { /* * To avoid creating a heavy intermediate value for the list of ranges, * only the start token ('[' or '[^') is parsed here. The regexp * compiler parses the ranges itself. */ + + /* XXX: with DUK_USE_ES6_REGEXP_SYNTAX we should allow left bracket + * literal too, but it's not easy to parse without backtracking. + */ + advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_START_CHARCLASS); - if (y == '^') { + if (y == DUK_ASC_CARET) { advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_START_CHARCLASS_INVERTED); } break; } -#if !defined(DUK_USE_ES6_REGEXP_BRACES) - case '}': -#endif - case ']': { +#if !defined(DUK_USE_ES6_REGEXP_SYNTAX) + case DUK_ASC_RCURLY: + case DUK_ASC_RBRACKET: { /* Although these could be parsed as PatternCharacters unambiguously (here), * E5 Section 15.10.1 grammar explicitly forbids these as PatternCharacters. */ - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid regexp character"); + goto fail_invalid_char; break; } +#endif case -1: { /* EOF */ advtok = DUK__ADVTOK(0, DUK_TOK_EOF); @@ -74704,6 +78934,25 @@ DUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token DUK__ADVANCEBYTES(lex_ctx, advtok >> 8); out_token->t = advtok & 0xff; + return; + + fail_token_limit: + DUK_ERROR_RANGE(lex_ctx->thr, DUK_STR_TOKEN_LIMIT); + return; + + fail_escape: + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_ESCAPE); + return; + +#if !defined(DUK_USE_ES6_REGEXP_SYNTAX) + fail_invalid_char: + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_CHARACTER); + return; + + fail_quantifier: + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_QUANTIFIER); + return; +#endif } /* @@ -74749,26 +78998,29 @@ DUK_INTERNAL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range duk_codepoint_t ch; duk_codepoint_t x; duk_bool_t dash = 0; + duk_small_int_t adv = 0; DUK_DD(DUK_DDPRINT("parsing regexp ranges")); for (;;) { + DUK__ADVANCECHARS(lex_ctx, adv); + adv = 1; + x = DUK__L0(); - DUK__ADVANCECHARS(lex_ctx, 1); ch = -1; /* not strictly necessary, but avoids "uninitialized variable" warnings */ DUK_UNREF(ch); if (x < 0) { - DUK_ERROR_SYNTAX(lex_ctx->thr, "eof in character class"); - } else if (x == ']') { - DUK_ASSERT(!dash); /* lookup should prevent this */ + goto fail_unterm_charclass; + } else if (x == DUK_ASC_RBRACKET) { if (start >= 0) { gen_range(userdata, start, start, 0); } + DUK__ADVANCECHARS(lex_ctx, 1); /* eat ']' before finishing */ break; - } else if (x == '-') { - if (start >= 0 && !dash && DUK__L0() != ']') { + } else if (x == DUK_ASC_MINUS) { + if (start >= 0 && !dash && DUK__L0() != DUK_ASC_RBRACKET) { /* '-' as a range indicator */ dash = 1; continue; @@ -74776,7 +79028,7 @@ DUK_INTERNAL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range /* '-' verbatim */ ch = x; } - } else if (x == '\\') { + } else if (x == DUK_ASC_BACKSLASH) { /* * The escapes are same as outside a character class, except that \b has a * different meaning, and \B and backreferences are prohibited (see E5 @@ -74785,79 +79037,79 @@ DUK_INTERNAL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range * range for it. */ - x = DUK__L0(); - DUK__ADVANCECHARS(lex_ctx, 1); + /* XXX: ES2015 surrogate pair handling. */ + + x = DUK__L1(); + + adv = 2; - if (x == 'b') { + if (x == DUK_ASC_LC_B) { /* Note: '\b' in char class is different than outside (assertion), * '\B' is not allowed and is caught by the duk_unicode_is_identifier_part() * check below. */ ch = 0x0008; - } else if (x == 'f') { + } else if (x == DUK_ASC_LC_F) { ch = 0x000c; - } else if (x == 'n') { + } else if (x == DUK_ASC_LC_N) { ch = 0x000a; - } else if (x == 't') { + } else if (x == DUK_ASC_LC_T) { ch = 0x0009; - } else if (x == 'r') { + } else if (x == DUK_ASC_LC_R) { ch = 0x000d; - } else if (x == 'v') { + } else if (x == DUK_ASC_LC_V) { ch = 0x000b; - } else if (x == 'c') { - x = DUK__L0(); - DUK__ADVANCECHARS(lex_ctx, 1); - if ((x >= 'a' && x <= 'z') || - (x >= 'A' && x <= 'Z')) { + } else if (x == DUK_ASC_LC_C) { + x = DUK__L2(); + adv = 3; + if ((x >= DUK_ASC_LC_A && x <= DUK_ASC_LC_Z) || + (x >= DUK_ASC_UC_A && x <= DUK_ASC_UC_Z)) { ch = (x % 32); } else { - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid regexp escape"); - return; /* never reached, but avoids warnings of - * potentially unused variables. - */ + goto fail_escape; } - } else if (x == 'x') { - ch = duk__decode_hexesc_from_window(lex_ctx, 0); - DUK__ADVANCECHARS(lex_ctx, 2); - } else if (x == 'u') { - ch = duk__decode_uniesc_from_window(lex_ctx, 0); - DUK__ADVANCECHARS(lex_ctx, 4); - } else if (x == 'd') { + } else if (x == DUK_ASC_LC_X || x == DUK_ASC_LC_U) { + /* The \u{H+} form is only allowed in Unicode mode which + * we don't support yet. + */ + ch = duk__lexer_parse_escape(lex_ctx, 0 /*allow_es6*/); + adv = 0; + } else if (x == DUK_ASC_LC_D) { duk__emit_u16_direct_ranges(lex_ctx, gen_range, userdata, duk_unicode_re_ranges_digit, sizeof(duk_unicode_re_ranges_digit) / sizeof(duk_uint16_t)); ch = -1; - } else if (x == 'D') { + } else if (x == DUK_ASC_UC_D) { duk__emit_u16_direct_ranges(lex_ctx, gen_range, userdata, duk_unicode_re_ranges_not_digit, sizeof(duk_unicode_re_ranges_not_digit) / sizeof(duk_uint16_t)); ch = -1; - } else if (x == 's') { + } else if (x == DUK_ASC_LC_S) { duk__emit_u16_direct_ranges(lex_ctx, gen_range, userdata, duk_unicode_re_ranges_white, sizeof(duk_unicode_re_ranges_white) / sizeof(duk_uint16_t)); ch = -1; - } else if (x == 'S') { + } else if (x == DUK_ASC_UC_S) { duk__emit_u16_direct_ranges(lex_ctx, gen_range, userdata, duk_unicode_re_ranges_not_white, sizeof(duk_unicode_re_ranges_not_white) / sizeof(duk_uint16_t)); ch = -1; - } else if (x == 'w') { + } else if (x == DUK_ASC_LC_W) { duk__emit_u16_direct_ranges(lex_ctx, gen_range, userdata, duk_unicode_re_ranges_wordchar, sizeof(duk_unicode_re_ranges_wordchar) / sizeof(duk_uint16_t)); ch = -1; - } else if (x == 'W') { + } else if (x == DUK_ASC_UC_W) { duk__emit_u16_direct_ranges(lex_ctx, gen_range, userdata, @@ -74866,20 +79118,29 @@ DUK_INTERNAL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range ch = -1; } else if (DUK__ISDIGIT(x)) { /* DecimalEscape, only \0 is allowed, no leading zeroes are allowed */ - if (x == '0' && !DUK__ISDIGIT(DUK__L0())) { + if (x == DUK_ASC_0 && !DUK__ISDIGIT(DUK__L2())) { ch = 0x0000; } else { - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid regexp escape"); + goto fail_escape; } - } else if (!duk_unicode_is_identifier_part(x) -#if defined(DUK_USE_NONSTD_REGEXP_DOLLAR_ESCAPE) - || x == '$' -#endif - ) { - /* IdentityEscape */ +#if defined(DUK_USE_ES6_REGEXP_SYNTAX) + } else if (x >= 0) { + /* IdentityEscape: ES2015 Annex B allows almost all + * source characters here. Match anything except + * EOF here. + */ ch = x; +#else /* DUK_USE_ES6_REGEXP_SYNTAX */ + } else if (!duk_unicode_is_identifier_part(x)) { + /* IdentityEscape: ES5.1 doesn't allow identity escape + * for identifier part characters, which conflicts with + * some real world code. For example, it doesn't allow + * /[\$]/ which is awkward. + */ + ch = x; +#endif /* DUK_USE_ES6_REGEXP_SYNTAX */ } else { - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid regexp escape"); + goto fail_escape; } } else { /* character represents itself */ @@ -74896,7 +79157,7 @@ DUK_INTERNAL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range */ if (start >= 0) { if (dash) { - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid range"); + goto fail_range; } else { gen_range(userdata, start, start, 0); start = -1; @@ -74907,7 +79168,7 @@ DUK_INTERNAL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range if (start >= 0) { if (dash) { if (start > ch) { - DUK_ERROR_SYNTAX(lex_ctx->thr, "invalid range"); + goto fail_range; } gen_range(userdata, start, ch, 0); start = -1; @@ -74924,9 +79185,43 @@ DUK_INTERNAL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range } return; + + fail_escape: + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_ESCAPE); + return; + + fail_range: + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_RANGE); + return; + + fail_unterm_charclass: + DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_CHARCLASS); + return; } #endif /* DUK_USE_REGEXP_SUPPORT */ + +/* automatic undefs */ +#undef DUK__ADVANCEBYTES +#undef DUK__ADVANCECHARS +#undef DUK__ADVTOK +#undef DUK__APPENDBUFFER +#undef DUK__APPENDBUFFER_ASCII +#undef DUK__INITBUFFER +#undef DUK__ISDIGIT +#undef DUK__ISDIGIT03 +#undef DUK__ISDIGIT47 +#undef DUK__ISHEXDIGIT +#undef DUK__ISOCTDIGIT +#undef DUK__L0 +#undef DUK__L1 +#undef DUK__L2 +#undef DUK__L3 +#undef DUK__L4 +#undef DUK__L5 +#undef DUK__LOOKUP +#undef DUK__MAX_RE_DECESC_DIGITS +#undef DUK__MAX_RE_QUANT_DIGITS #line 1 "duk_numconv.c" /* * Number-to-string and string-to-number conversions. @@ -74940,7 +79235,7 @@ DUK_INTERNAL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range * See: doc/number-conversion.rst. */ -/* include removed: duk_internal.h */ +/* #include duk_internal.h -> already included */ #define DUK__IEEE_DOUBLE_EXP_BIAS 1023 #define DUK__IEEE_DOUBLE_EXP_MIN (-1022) /* biased exp == 0 -> denormal, exp -1022 */ @@ -74948,7 +79243,7 @@ DUK_INTERNAL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range #define DUK__DIGITCHAR(x) duk_lc_digits[(x)] /* - * Tables generated with src/gennumdigits.py. + * Tables generated with util/gennumdigits.py. * * duk__str2num_digits_for_radix indicates, for each radix, how many input * digits should be considered significant for string-to-number conversion. @@ -75003,7 +79298,7 @@ DUK_LOCAL const duk__exp_limits duk__str2num_exp_limits[] = { */ #define DUK__BI_MAX_PARTS 37 /* 37x32 = 1184 bits */ -#ifdef DUK_USE_DDDPRINT +#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) #define DUK__BI_PRINT(name,x) duk__bi_print((name),(x)) #else #define DUK__BI_PRINT(name,x) @@ -75015,7 +79310,7 @@ typedef struct { duk_uint32_t v[DUK__BI_MAX_PARTS]; /* low to high */ } duk__bigint; -#ifdef DUK_USE_DDDPRINT +#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) DUK_LOCAL void duk__bi_print(const char *name, duk__bigint *x) { /* Overestimate required size; debug code so not critical to be tight. */ char buf[DUK__BI_MAX_PARTS * 9 + 64]; @@ -75035,7 +79330,7 @@ DUK_LOCAL void duk__bi_print(const char *name, duk__bigint *x) { } #endif -#ifdef DUK_USE_ASSERTIONS +#if defined(DUK_USE_ASSERTIONS) DUK_LOCAL duk_small_int_t duk__bi_is_valid(duk__bigint *x) { return (duk_small_int_t) ( ((x->n >= 0) && (x->n <= DUK__BI_MAX_PARTS)) /* is valid size */ && @@ -75120,7 +79415,7 @@ DUK_LOCAL int duk__bi_compare(duk__bigint *x, duk__bigint *y) { } /* x <- y + z */ -#ifdef DUK_USE_64BIT_OPS +#if defined(DUK_USE_64BIT_OPS) DUK_LOCAL void duk__bi_add(duk__bigint *x, duk__bigint *y, duk__bigint *z) { duk_uint64_t tmp; duk_small_int_t i, ny, nz; @@ -75230,7 +79525,7 @@ DUK_LOCAL void duk__bi_add_copy(duk__bigint *x, duk__bigint *y, duk__bigint *t) #endif /* x <- y - z, require x >= y => z >= 0, i.e. y >= z */ -#ifdef DUK_USE_64BIT_OPS +#if defined(DUK_USE_64BIT_OPS) DUK_LOCAL void duk__bi_sub(duk__bigint *x, duk__bigint *y, duk__bigint *z) { duk_small_int_t i, ny, nz; duk_uint32_t ty, tz; @@ -75347,7 +79642,7 @@ DUK_LOCAL void duk__bi_mul(duk__bigint *x, duk__bigint *y, duk__bigint *z) { nz = z->n; for (i = 0; i < y->n; i++) { -#ifdef DUK_USE_64BIT_OPS +#if defined(DUK_USE_64BIT_OPS) duk_uint64_t tmp = 0U; for (j = 0; j < nz; j++) { tmp += (duk_uint64_t) y->v[i] * (duk_uint64_t) z->v[j] + x->v[i+j]; @@ -76027,7 +80322,7 @@ DUK_LOCAL void duk__dragon4_generate(duk__numconv_stringify_ctx *nc_ctx) { DUK_DDD(DUK_DDDPRINT("generate finished")); -#ifdef DUK_USE_DDDPRINT +#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) { duk_uint8_t buf[2048]; duk_small_int_t i, t; @@ -76691,24 +80986,6 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk const duk_uint8_t *p; duk_small_int_t ch; - /* This seems to waste a lot of stack frame entries, but good compilers - * will compute these as needed below. Some of these initial flags are - * also modified in the code below, so they can't all be removed. - */ - duk_small_int_t trim_white = (flags & DUK_S2N_FLAG_TRIM_WHITE); - duk_small_int_t allow_expt = (flags & DUK_S2N_FLAG_ALLOW_EXP); - duk_small_int_t allow_garbage = (flags & DUK_S2N_FLAG_ALLOW_GARBAGE); - duk_small_int_t allow_plus = (flags & DUK_S2N_FLAG_ALLOW_PLUS); - duk_small_int_t allow_minus = (flags & DUK_S2N_FLAG_ALLOW_MINUS); - duk_small_int_t allow_infinity = (flags & DUK_S2N_FLAG_ALLOW_INF); - duk_small_int_t allow_frac = (flags & DUK_S2N_FLAG_ALLOW_FRAC); - duk_small_int_t allow_naked_frac = (flags & DUK_S2N_FLAG_ALLOW_NAKED_FRAC); - duk_small_int_t allow_empty_frac = (flags & DUK_S2N_FLAG_ALLOW_EMPTY_FRAC); - duk_small_int_t allow_empty = (flags & DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO); - duk_small_int_t allow_leading_zero = (flags & DUK_S2N_FLAG_ALLOW_LEADING_ZERO); - duk_small_int_t allow_auto_hex_int = (flags & DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT); - duk_small_int_t allow_auto_oct_int = (flags & DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT); - DUK_DDD(DUK_DDDPRINT("parse number: %!T, radix=%ld, flags=0x%08lx", (duk_tval *) duk_get_tval(ctx, -1), (long) radix, (unsigned long) flags)); @@ -76731,9 +81008,13 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk * Automatic hex number detection (leading '0x' or '0X') and octal * number detection (leading '0' followed by at least one octal digit) * is done here too. + * + * Symbols are not explicitly rejected here (that's up to the caller). + * If a symbol were passed here, it should ultimately safely fail + * parsing due to a syntax error. */ - if (trim_white) { + if (flags & DUK_S2N_FLAG_TRIM_WHITE) { /* Leading / trailing whitespace is sometimes accepted and * sometimes not. After white space trimming, all valid input * characters are pure ASCII. @@ -76747,13 +81028,13 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk neg = 0; ch = *p; if (ch == (duk_small_int_t) '+') { - if (!allow_plus) { + if ((flags & DUK_S2N_FLAG_ALLOW_PLUS) == 0) { DUK_DDD(DUK_DDDPRINT("parse failed: leading plus sign not allowed")); goto parse_fail; } p++; } else if (ch == (duk_small_int_t) '-') { - if (!allow_minus) { + if ((flags & DUK_S2N_FLAG_ALLOW_MINUS) == 0) { DUK_DDD(DUK_DDDPRINT("parse failed: leading minus sign not allowed")); goto parse_fail; } @@ -76761,8 +81042,7 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk neg = 1; } - ch = *p; - if (allow_infinity && ch == (duk_small_int_t) 'I') { + if ((flags & DUK_S2N_FLAG_ALLOW_INF) && DUK_STRNCMP((const char *) p, "Infinity", 8) == 0) { /* Don't check for Infinity unless the context allows it. * 'Infinity' is a valid integer literal in e.g. base-36: * @@ -76770,41 +81050,49 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk * 1461559270678 */ - const duk_uint8_t *q; - - /* borrow literal Infinity from builtin string */ - q = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(DUK_HTHREAD_STRING_INFINITY(thr)); - if (DUK_STRNCMP((const char *) p, (const char *) q, 8) == 0) { - if (!allow_garbage && (p[8] != (duk_uint8_t) 0)) { - DUK_DDD(DUK_DDDPRINT("parse failed: trailing garbage after matching 'Infinity' not allowed")); - goto parse_fail; - } else { - res = DUK_DOUBLE_INFINITY; - goto negcheck_and_ret; - } + if ((flags & DUK_S2N_FLAG_ALLOW_GARBAGE) == 0 && p[8] != DUK_ASC_NUL) { + DUK_DDD(DUK_DDDPRINT("parse failed: trailing garbage after matching 'Infinity' not allowed")); + goto parse_fail; + } else { + res = DUK_DOUBLE_INFINITY; + goto negcheck_and_ret; } } + ch = *p; if (ch == (duk_small_int_t) '0') { duk_small_int_t detect_radix = 0; - ch = p[1]; - if (allow_auto_hex_int && (ch == (duk_small_int_t) 'x' || ch == (duk_small_int_t) 'X')) { + ch = DUK_LOWERCASE_CHAR_ASCII(p[1]); /* 'x' or 'X' -> 'x' */ + if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT) && ch == DUK_ASC_LC_X) { DUK_DDD(DUK_DDDPRINT("detected 0x/0X hex prefix, changing radix and preventing fractions and exponent")); detect_radix = 16; - allow_empty = 0; /* interpret e.g. '0x' and '0xg' as a NaN (= parse error) */ - p += 2; - } else if (allow_auto_oct_int && (ch >= (duk_small_int_t) '0' && ch <= (duk_small_int_t) '9')) { +#if 0 + } else if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_LEGACY_OCT_INT) && + (ch >= (duk_small_int_t) '0' && ch <= (duk_small_int_t) '9')) { DUK_DDD(DUK_DDDPRINT("detected 0n oct prefix, changing radix and preventing fractions and exponent")); detect_radix = 8; - allow_empty = 1; /* interpret e.g. '09' as '0', not NaN */ + + /* NOTE: if this legacy octal case is added back, it has + * different flags and 'p' advance so this needs to be + * reworked. + */ + flags |= DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO; /* interpret e.g. '09' as '0', not NaN */ p += 1; +#endif + } else if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT) && ch == DUK_ASC_LC_O) { + DUK_DDD(DUK_DDDPRINT("detected 0o oct prefix, changing radix and preventing fractions and exponent")); + detect_radix = 8; + } else if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_BIN_INT) && ch == DUK_ASC_LC_B) { + DUK_DDD(DUK_DDDPRINT("detected 0b bin prefix, changing radix and preventing fractions and exponent")); + detect_radix = 2; } if (detect_radix > 0) { radix = detect_radix; - allow_expt = 0; - allow_frac = 0; - allow_naked_frac = 0; - allow_empty_frac = 0; - allow_leading_zero = 1; /* allow e.g. '0x0009' and '00077' */ + /* Clear empty as zero flag: interpret e.g. '0x' and '0xg' as a NaN (= parse error) */ + flags &= ~(DUK_S2N_FLAG_ALLOW_EXP | DUK_S2N_FLAG_ALLOW_EMPTY_FRAC | + DUK_S2N_FLAG_ALLOW_FRAC | DUK_S2N_FLAG_ALLOW_NAKED_FRAC | + DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO); + flags |= DUK_S2N_FLAG_ALLOW_LEADING_ZERO; /* allow e.g. '0x0009' and '0b00010001' */ + p += 2; } } @@ -76875,14 +81163,14 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk /* Most common cases first. */ if (ch >= (duk_small_int_t) '0' && ch <= (duk_small_int_t) '9') { - dig = (int) ch - '0' + 0; + dig = (duk_small_int_t) ch - '0' + 0; } else if (ch == (duk_small_int_t) '.') { /* A leading digit is not required in some cases, e.g. accept ".123". * In other cases (JSON.parse()) a leading digit is required. This * is checked for after the loop. */ if (dig_frac >= 0 || dig_expt >= 0) { - if (allow_garbage) { + if (flags & DUK_S2N_FLAG_ALLOW_GARBAGE) { DUK_DDD(DUK_DDDPRINT("garbage termination (invalid period)")); break; } else { @@ -76891,11 +81179,11 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk } } - if (!allow_frac) { + if ((flags & DUK_S2N_FLAG_ALLOW_FRAC) == 0) { /* Some contexts don't allow fractions at all; this can't be a * post-check because the state ('f' and expt) would be incorrect. */ - if (allow_garbage) { + if (flags & DUK_S2N_FLAG_ALLOW_GARBAGE) { DUK_DDD(DUK_DDDPRINT("garbage termination (invalid first period)")); break; } else { @@ -76909,7 +81197,8 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk } else if (ch == (duk_small_int_t) 0) { DUK_DDD(DUK_DDDPRINT("NUL termination")); break; - } else if (allow_expt && dig_expt < 0 && (ch == (duk_small_int_t) 'e' || ch == (duk_small_int_t) 'E')) { + } else if ((flags & DUK_S2N_FLAG_ALLOW_EXP) && + dig_expt < 0 && (ch == (duk_small_int_t) 'e' || ch == (duk_small_int_t) 'E')) { /* Note: we don't parse back exponent notation for anything else * than radix 10, so this is not an ambiguous check (e.g. hex * exponent values may have 'e' either as a significand digit @@ -76944,7 +81233,7 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk DUK_ASSERT((dig >= 0 && dig <= 35) || dig == 255); if (dig >= radix) { - if (allow_garbage) { + if (flags & DUK_S2N_FLAG_ALLOW_GARBAGE) { DUK_DDD(DUK_DDDPRINT("garbage termination")); break; } else { @@ -77006,7 +81295,7 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk /* Leading zero. */ if (dig_lzero > 0 && dig_whole > 1) { - if (!allow_leading_zero) { + if ((flags & DUK_S2N_FLAG_ALLOW_LEADING_ZERO) == 0) { DUK_DDD(DUK_DDDPRINT("parse failed: leading zeroes not allowed in integer part")); goto parse_fail; } @@ -77021,14 +81310,14 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk goto parse_fail; } else if (dig_frac > 0) { /* ".123" */ - if (!allow_naked_frac) { + if ((flags & DUK_S2N_FLAG_ALLOW_NAKED_FRAC) == 0) { DUK_DDD(DUK_DDDPRINT("parse failed: fraction part not allowed without " "leading integer digit(s)")); goto parse_fail; } } else { /* empty ("") is allowed in some formats (e.g. Number(''), as zero */ - if (!allow_empty) { + if ((flags & DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO) == 0) { DUK_DDD(DUK_DDDPRINT("parse failed: empty string not allowed (as zero)")); goto parse_fail; } @@ -77036,7 +81325,7 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk } else { if (dig_frac == 0) { /* "123." is allowed in some formats */ - if (!allow_empty_frac) { + if ((flags & DUK_S2N_FLAG_ALLOW_EMPTY_FRAC) == 0) { DUK_DDD(DUK_DDDPRINT("parse failed: empty fractions")); goto parse_fail; } @@ -77054,7 +81343,7 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk */ if (dig_expt == 0) { - if (!allow_garbage) { + if ((flags & DUK_S2N_FLAG_ALLOW_GARBAGE) == 0) { DUK_DDD(DUK_DDDPRINT("parse failed: empty exponent")); goto parse_fail; } @@ -77169,6 +81458,10 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk /* * Convert binary digits into an IEEE double. Need to handle * denormals and rounding correctly. + * + * Some call sites currently assume the result is always a + * non-fastint double. If this is changed, check all call + * sites. */ duk__dragon4_ctx_to_double(nc_ctx, &res); @@ -77194,6 +81487,19 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk DUK_ERROR_RANGE(thr, "exponent too large"); return; } + +/* automatic undefs */ +#undef DUK__BI_MAX_PARTS +#undef DUK__BI_PRINT +#undef DUK__DIGITCHAR +#undef DUK__DRAGON4_OUTPUT_PREINC +#undef DUK__IEEE_DOUBLE_EXP_BIAS +#undef DUK__IEEE_DOUBLE_EXP_MIN +#undef DUK__MAX_FORMATTED_LENGTH +#undef DUK__MAX_OUTPUT_DIGITS +#undef DUK__NO_EXP +#undef DUK__NUMCONV_CTX_BIGINTS_SIZE +#undef DUK__NUMCONV_CTX_NUM_BIGINTS #line 1 "duk_regexp_compiler.c" /* * Regexp compilation. @@ -77215,9 +81521,9 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk * size when emitting bytecode (slower). */ -/* include removed: duk_internal.h */ +/* #include duk_internal.h -> already included */ -#ifdef DUK_USE_REGEXP_SUPPORT +#if defined(DUK_USE_REGEXP_SUPPORT) /* * Helper macros @@ -77225,7 +81531,6 @@ DUK_INTERNAL void duk_numconv_parse(duk_context *ctx, duk_small_int_t radix, duk #define DUK__RE_INITIAL_BUFSIZE 64 -#undef DUK__RE_BUFLEN #define DUK__RE_BUFLEN(re_ctx) \ DUK_BW_GET_SIZE(re_ctx->thr, &re_ctx->bw) @@ -77288,31 +81593,45 @@ DUK_LOCAL duk_uint32_t duk__insert_u32(duk_re_compiler_ctx *re_ctx, duk_uint32_t return (duk_uint32_t) len; } -DUK_LOCAL duk_uint32_t duk__append_u32(duk_re_compiler_ctx *re_ctx, duk_uint32_t x) { - duk_uint8_t buf[DUK_UNICODE_MAX_XUTF8_LENGTH]; - duk_small_int_t len; +DUK_LOCAL void duk__append_u32(duk_re_compiler_ctx *re_ctx, duk_uint32_t x) { + DUK_BW_WRITE_ENSURE_XUTF8(re_ctx->thr, &re_ctx->bw, x); +} - len = duk_unicode_encode_xutf8((duk_ucodepoint_t) x, buf); - DUK_BW_WRITE_ENSURE_BYTES(re_ctx->thr, &re_ctx->bw, buf, len); - return (duk_uint32_t) len; +DUK_LOCAL void duk__append_7bit(duk_re_compiler_ctx *re_ctx, duk_uint32_t x) { +#if defined(DUK_USE_PREFER_SIZE) + duk__append_u32(re_ctx, x); +#else + DUK_ASSERT(x <= 0x7fU); + DUK_BW_WRITE_ENSURE_U8(re_ctx->thr, &re_ctx->bw, (duk_uint8_t) x); +#endif } +#if 0 +DUK_LOCAL void duk__append_2bytes(duk_re_compiler_ctx *re_ctx, duk_uint8_t x, duk_uint8_t y) { + DUK_BW_WRITE_ENSURE_U8_2(re_ctx->thr, &re_ctx->bw, x, y); +} +#endif + DUK_LOCAL duk_uint32_t duk__insert_i32(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_int32_t x) { return duk__insert_u32(re_ctx, offset, duk__encode_i32(x)); } +DUK_LOCAL void duk__append_reop(duk_re_compiler_ctx *re_ctx, duk_uint32_t reop) { + DUK_ASSERT(reop <= 0x7fU); + (void) duk__append_7bit(re_ctx, reop); +} + #if 0 /* unused */ -DUK_LOCAL duk_uint32_t duk__append_i32(duk_re_compiler_ctx *re_ctx, duk_int32_t x) { - return duk__append_u32(re_ctx, duk__encode_i32(x)); +DUK_LOCAL void duk__append_i32(duk_re_compiler_ctx *re_ctx, duk_int32_t x) { + duk__append_u32(re_ctx, duk__encode_i32(x)); } #endif /* special helper for emitting u16 lists (used for character ranges for built-in char classes) */ DUK_LOCAL void duk__append_u16_list(duk_re_compiler_ctx *re_ctx, const duk_uint16_t *values, duk_uint32_t count) { /* Call sites don't need the result length so it's not accumulated. */ - while (count > 0) { - (void) duk__append_u32(re_ctx, (duk_uint32_t) (*values++)); - count--; + while (count-- > 0) { + duk__append_u32(re_ctx, (duk_uint32_t) (*values++)); } } @@ -77342,17 +81661,66 @@ DUK_LOCAL void duk__remove_slice(duk_re_compiler_ctx *re_ctx, duk_uint32_t data_ * variable length UTF-8 encoding. See doc/regexp.rst for discussion. */ DUK_LOCAL duk_uint32_t duk__insert_jump_offset(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_int32_t skip) { - duk_small_int_t len; - - /* XXX: solve into closed form (smaller code) */ - +#if 0 + /* Iterative solution. */ if (skip < 0) { + duk_small_int_t len; /* two encoding attempts suffices */ len = duk_unicode_get_xutf8_length((duk_codepoint_t) duk__encode_i32(skip)); len = duk_unicode_get_xutf8_length((duk_codepoint_t) duk__encode_i32(skip - (duk_int32_t) len)); DUK_ASSERT(duk_unicode_get_xutf8_length(duk__encode_i32(skip - (duk_int32_t) len)) == len); /* no change */ skip -= (duk_int32_t) len; } +#endif + +#if defined(DUK_USE_PREFER_SIZE) + /* Closed form solution, this produces smallest code. + * See re_neg_jump_offset (closed2). + */ + if (skip < 0) { + skip--; + if (skip < -0x3fL) { + skip--; + } + if (skip < -0x3ffL) { + skip--; + } + if (skip < -0x7fffL) { + skip--; + } + if (skip < -0xfffffL) { + skip--; + } + if (skip < -0x1ffffffL) { + skip--; + } + if (skip < -0x3fffffffL) { + skip--; + } + } +#else /* DUK_USE_PREFER_SIZE */ + /* Closed form solution, this produces fastest code. + * See re_neg_jump_offset (closed1). + */ + if (skip < 0) { + if (skip >= -0x3eL) { + skip -= 1; + } else if (skip >= -0x3fdL) { + skip -= 2; + } else if (skip >= -0x7ffcL) { + skip -= 3; + } else if (skip >= -0xffffbL) { + skip -= 4; + } else if (skip >= -0x1fffffaL) { + skip -= 5; + } else if (skip >= -0x3ffffff9L) { + skip -= 6; + } else { + skip -= 7; + } + } +#endif /* DUK_USE_PREFER_SIZE */ + return duk__insert_i32(re_ctx, offset, skip); } @@ -77480,6 +81848,28 @@ DUK_LOCAL void duk__generate_ranges(void *userdata, duk_codepoint_t r1, duk_code * as complex though. */ +DUK_LOCAL const duk_uint16_t * const duk__re_range_lookup1[3] = { + duk_unicode_re_ranges_digit, + duk_unicode_re_ranges_white, + duk_unicode_re_ranges_wordchar +}; +DUK_LOCAL const duk_uint8_t duk__re_range_lookup2[3] = { + sizeof(duk_unicode_re_ranges_digit) / (2 * sizeof(duk_uint16_t)), + sizeof(duk_unicode_re_ranges_white) / (2 * sizeof(duk_uint16_t)), + sizeof(duk_unicode_re_ranges_wordchar) / (2 * sizeof(duk_uint16_t)) +}; + +DUK_LOCAL void duk__append_range_atom_matcher(duk_re_compiler_ctx *re_ctx, duk_small_uint_t re_op, const duk_uint16_t *ranges, duk_small_uint_t count) { +#if 0 + DUK_ASSERT(re_op <= 0x7fUL); + DUK_ASSERT(count <= 0x7fUL); + duk__append_2bytes(re_ctx, (duk_uint8_t) re_op, (duk_uint8_t) count); +#endif + duk__append_reop(re_ctx, re_op); + duk__append_7bit(re_ctx, count); + duk__append_u16_list(re_ctx, ranges, count * 2); +} + DUK_LOCAL void duk__parse_disjunction(duk_re_compiler_ctx *re_ctx, duk_bool_t expect_eof, duk__re_disjunction_info *out_atom_info) { duk_int32_t atom_start_offset = -1; /* negative -> no atom matched on previous round */ duk_int32_t atom_char_length = 0; /* negative -> complex atom */ @@ -77557,7 +81947,7 @@ DUK_LOCAL void duk__parse_disjunction(duk_re_compiler_ctx *re_ctx, duk_bool_t ex unpatched_disjunction_split = entry_offset + 1; /* +1 for opcode */ /* add a new pending match jump for latest finished alternative */ - duk__append_u32(re_ctx, DUK_REOP_JUMP); + duk__append_reop(re_ctx, DUK_REOP_JUMP); unpatched_disjunction_jump = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); /* 'taint' result as complex */ @@ -77600,7 +81990,7 @@ DUK_LOCAL void duk__parse_disjunction(duk_re_compiler_ctx *re_ctx, duk_bool_t ex } } - duk__append_u32(re_ctx, DUK_REOP_MATCH); /* complete 'sub atom' */ + duk__append_reop(re_ctx, DUK_REOP_MATCH); /* complete 'sub atom' */ atom_code_length = (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - atom_start_offset); offset = atom_start_offset; @@ -77678,14 +82068,14 @@ DUK_LOCAL void duk__parse_disjunction(duk_re_compiler_ctx *re_ctx, duk_bool_t ex /* Special case: original qmin was zero so there is nothing * to repeat. Emit an atom copy but jump over it here. */ - duk__append_u32(re_ctx, DUK_REOP_JUMP); + duk__append_reop(re_ctx, DUK_REOP_JUMP); duk__append_jump_offset(re_ctx, atom_code_length); duk__append_slice(re_ctx, atom_start_offset, atom_code_length); } if (re_ctx->curr_token.greedy) { - duk__append_u32(re_ctx, DUK_REOP_SPLIT2); /* prefer jump */ + duk__append_reop(re_ctx, DUK_REOP_SPLIT2); /* prefer jump */ } else { - duk__append_u32(re_ctx, DUK_REOP_SPLIT1); /* prefer direct */ + duk__append_reop(re_ctx, DUK_REOP_SPLIT1); /* prefer direct */ } duk__append_jump_offset(re_ctx, -atom_code_length - 1); /* -1 for opcode */ } else { @@ -77729,19 +82119,19 @@ DUK_LOCAL void duk__parse_disjunction(duk_re_compiler_ctx *re_ctx, duk_bool_t ex break; } case DUK_RETOK_ASSERT_START: { - duk__append_u32(re_ctx, DUK_REOP_ASSERT_START); + duk__append_reop(re_ctx, DUK_REOP_ASSERT_START); break; } case DUK_RETOK_ASSERT_END: { - duk__append_u32(re_ctx, DUK_REOP_ASSERT_END); + duk__append_reop(re_ctx, DUK_REOP_ASSERT_END); break; } case DUK_RETOK_ASSERT_WORD_BOUNDARY: { - duk__append_u32(re_ctx, DUK_REOP_ASSERT_WORD_BOUNDARY); + duk__append_reop(re_ctx, DUK_REOP_ASSERT_WORD_BOUNDARY); break; } case DUK_RETOK_ASSERT_NOT_WORD_BOUNDARY: { - duk__append_u32(re_ctx, DUK_REOP_ASSERT_NOT_WORD_BOUNDARY); + duk__append_reop(re_ctx, DUK_REOP_ASSERT_NOT_WORD_BOUNDARY); break; } case DUK_RETOK_ASSERT_START_POS_LOOKAHEAD: @@ -77752,7 +82142,7 @@ DUK_LOCAL void duk__parse_disjunction(duk_re_compiler_ctx *re_ctx, duk_bool_t ex offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx); duk__parse_disjunction(re_ctx, 0, &tmp_disj); - duk__append_u32(re_ctx, DUK_REOP_MATCH); + duk__append_reop(re_ctx, DUK_REOP_MATCH); (void) duk__insert_u32(re_ctx, offset, opcode); (void) duk__insert_jump_offset(re_ctx, @@ -77768,19 +82158,25 @@ DUK_LOCAL void duk__parse_disjunction(duk_re_compiler_ctx *re_ctx, duk_bool_t ex case DUK_RETOK_ATOM_PERIOD: { new_atom_char_length = 1; new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); - duk__append_u32(re_ctx, DUK_REOP_PERIOD); + duk__append_reop(re_ctx, DUK_REOP_PERIOD); break; } case DUK_RETOK_ATOM_CHAR: { /* Note: successive characters could be joined into string matches * but this is not trivial (consider e.g. '/xyz+/); see docs for * more discussion. + * + * No support for \u{H+} yet. While only BMP Unicode escapes are + * supported for RegExps at present, 'ch' may still be a non-BMP + * codepoint if it is decoded straight from source text UTF-8. + * There's no non-BMP support yet so this is handled simply by + * matching the non-BMP character (which is custom behavior). */ duk_uint32_t ch; new_atom_char_length = 1; new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); - duk__append_u32(re_ctx, DUK_REOP_CHAR); + duk__append_reop(re_ctx, DUK_REOP_CHAR); ch = re_ctx->curr_token.num; if (re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) { ch = duk_unicode_re_canonicalize_char(re_ctx->thr, ch); @@ -77789,36 +82185,31 @@ DUK_LOCAL void duk__parse_disjunction(duk_re_compiler_ctx *re_ctx, duk_bool_t ex break; } case DUK_RETOK_ATOM_DIGIT: - case DUK_RETOK_ATOM_NOT_DIGIT: { - new_atom_char_length = 1; - new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); - duk__append_u32(re_ctx, - (re_ctx->curr_token.t == DUK_RETOK_ATOM_DIGIT) ? - DUK_REOP_RANGES : DUK_REOP_INVRANGES); - duk__append_u32(re_ctx, sizeof(duk_unicode_re_ranges_digit) / (2 * sizeof(duk_uint16_t))); - duk__append_u16_list(re_ctx, duk_unicode_re_ranges_digit, sizeof(duk_unicode_re_ranges_digit) / sizeof(duk_uint16_t)); - break; - } + case DUK_RETOK_ATOM_NOT_DIGIT: case DUK_RETOK_ATOM_WHITE: - case DUK_RETOK_ATOM_NOT_WHITE: { - new_atom_char_length = 1; - new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); - duk__append_u32(re_ctx, - (re_ctx->curr_token.t == DUK_RETOK_ATOM_WHITE) ? - DUK_REOP_RANGES : DUK_REOP_INVRANGES); - duk__append_u32(re_ctx, sizeof(duk_unicode_re_ranges_white) / (2 * sizeof(duk_uint16_t))); - duk__append_u16_list(re_ctx, duk_unicode_re_ranges_white, sizeof(duk_unicode_re_ranges_white) / sizeof(duk_uint16_t)); - break; - } + case DUK_RETOK_ATOM_NOT_WHITE: case DUK_RETOK_ATOM_WORD_CHAR: case DUK_RETOK_ATOM_NOT_WORD_CHAR: { + duk_small_uint_t re_op; + duk_small_uint_t idx; + new_atom_char_length = 1; new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); - duk__append_u32(re_ctx, - (re_ctx->curr_token.t == DUK_RETOK_ATOM_WORD_CHAR) ? - DUK_REOP_RANGES : DUK_REOP_INVRANGES); - duk__append_u32(re_ctx, sizeof(duk_unicode_re_ranges_wordchar) / (2 * sizeof(duk_uint16_t))); - duk__append_u16_list(re_ctx, duk_unicode_re_ranges_wordchar, sizeof(duk_unicode_re_ranges_wordchar) / sizeof(duk_uint16_t)); + + DUK_ASSERT((DUK_RETOK_ATOM_DIGIT & 0x01) != 0); + DUK_ASSERT((DUK_RETOK_ATOM_WHITE & 0x01) != 0); + DUK_ASSERT((DUK_RETOK_ATOM_WORD_CHAR & 0x01) != 0); + DUK_ASSERT((DUK_RETOK_ATOM_NOT_DIGIT & 0x01) == 0); + DUK_ASSERT((DUK_RETOK_ATOM_NOT_WHITE & 0x01) == 0); + DUK_ASSERT((DUK_RETOK_ATOM_NOT_WORD_CHAR & 0x01) == 0); + re_op = (re_ctx->curr_token.t & 0x01) ? DUK_REOP_RANGES : DUK_REOP_INVRANGES; + + DUK_ASSERT(DUK_RETOK_ATOM_WHITE == DUK_RETOK_ATOM_DIGIT + 2); + DUK_ASSERT(DUK_RETOK_ATOM_WORD_CHAR == DUK_RETOK_ATOM_DIGIT + 4); + idx = (re_ctx->curr_token.t - DUK_RETOK_ATOM_DIGIT) >> 1; + DUK_ASSERT(idx <= 2); /* Assume continuous token numbers; also checks negative underflow. */ + + duk__append_range_atom_matcher(re_ctx, re_op, duk__re_range_lookup1[idx], duk__re_range_lookup2[idx]); break; } case DUK_RETOK_ATOM_BACKREFERENCE: { @@ -77828,7 +82219,7 @@ DUK_LOCAL void duk__parse_disjunction(duk_re_compiler_ctx *re_ctx, duk_bool_t ex } new_atom_char_length = -1; /* mark as complex */ new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); - duk__append_u32(re_ctx, DUK_REOP_BACKREFERENCE); + duk__append_reop(re_ctx, DUK_REOP_BACKREFERENCE); duk__append_u32(re_ctx, backref); break; } @@ -77838,10 +82229,10 @@ DUK_LOCAL void duk__parse_disjunction(duk_re_compiler_ctx *re_ctx, duk_bool_t ex new_atom_char_length = -1; /* mark as complex (capture handling) */ new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); cap = ++re_ctx->captures; - duk__append_u32(re_ctx, DUK_REOP_SAVE); + duk__append_reop(re_ctx, DUK_REOP_SAVE); duk__append_u32(re_ctx, cap * 2); duk__parse_disjunction(re_ctx, 0, &tmp_disj); /* retval (sub-atom char length) unused, tainted as complex above */ - duk__append_u32(re_ctx, DUK_REOP_SAVE); + duk__append_reop(re_ctx, DUK_REOP_SAVE); duk__append_u32(re_ctx, cap * 2 + 1); break; } @@ -77884,9 +82275,9 @@ DUK_LOCAL void duk__parse_disjunction(duk_re_compiler_ctx *re_ctx, duk_bool_t ex /* insert ranges instruction, range count patched in later */ new_atom_char_length = 1; new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); - duk__append_u32(re_ctx, - (re_ctx->curr_token.t == DUK_RETOK_ATOM_START_CHARCLASS) ? - DUK_REOP_RANGES : DUK_REOP_INVRANGES); + duk__append_reop(re_ctx, + (re_ctx->curr_token.t == DUK_RETOK_ATOM_START_CHARCLASS) ? + DUK_REOP_RANGES : DUK_REOP_INVRANGES); offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx); /* patch in range count later */ /* parse ranges until character class ends */ @@ -77973,22 +82364,22 @@ DUK_LOCAL duk_uint32_t duk__parse_regexp_flags(duk_hthread *thr, duk_hstring *h) while (p < p_end) { duk_uint8_t c = *p++; - switch ((int) c) { - case (int) 'g': { + switch (c) { + case (duk_uint8_t) 'g': { if (flags & DUK_RE_FLAG_GLOBAL) { goto error; } flags |= DUK_RE_FLAG_GLOBAL; break; } - case (int) 'i': { + case (duk_uint8_t) 'i': { if (flags & DUK_RE_FLAG_IGNORE_CASE) { goto error; } flags |= DUK_RE_FLAG_IGNORE_CASE; break; } - case (int) 'm': { + case (duk_uint8_t) 'm': { if (flags & DUK_RE_FLAG_MULTILINE) { goto error; } @@ -78038,14 +82429,12 @@ DUK_LOCAL void duk__create_escaped_source(duk_hthread *thr, int idx_pattern) { duk_size_t i, n; duk_uint_fast8_t c_prev, c; - h = duk_get_hstring(ctx, idx_pattern); - DUK_ASSERT(h != NULL); + h = duk_known_hstring(ctx, idx_pattern); p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h); n = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h); if (n == 0) { - /* return '(?:)' */ - duk_push_hstring_stridx(ctx, DUK_STRIDX_ESCAPED_EMPTY_REGEXP); + duk_push_string(ctx, "(?:)"); return; } @@ -78072,7 +82461,9 @@ DUK_LOCAL void duk__create_escaped_source(duk_hthread *thr, int idx_pattern) { } DUK_BW_SETPTR_AND_COMPACT(thr, bw, q); - duk_to_string(ctx, -1); /* -> [ ... escaped_source ] */ + (void) duk_buffer_to_string(ctx, -1); /* Safe if input is safe. */ + + /* [ ... escaped_source ] */ } /* @@ -78106,8 +82497,8 @@ DUK_INTERNAL void duk_regexp_compile(duk_hthread *thr) { */ /* TypeError if fails */ - h_pattern = duk_require_hstring(ctx, -2); - h_flags = duk_require_hstring(ctx, -1); + h_pattern = duk_require_hstring_notsymbol(ctx, -2); + h_flags = duk_require_hstring_notsymbol(ctx, -1); /* * Create normalized 'source' property (E5 Section 15.10.3). @@ -78154,12 +82545,12 @@ DUK_INTERNAL void duk_regexp_compile(duk_hthread *thr) { DUK_DD(DUK_DDPRINT("starting regexp compilation")); - duk__append_u32(&re_ctx, DUK_REOP_SAVE); - duk__append_u32(&re_ctx, 0); + duk__append_reop(&re_ctx, DUK_REOP_SAVE); + duk__append_7bit(&re_ctx, 0); duk__parse_disjunction(&re_ctx, 1 /*expect_eof*/, &ign_disj); - duk__append_u32(&re_ctx, DUK_REOP_SAVE); - duk__append_u32(&re_ctx, 1); - duk__append_u32(&re_ctx, DUK_REOP_MATCH); + duk__append_reop(&re_ctx, DUK_REOP_SAVE); + duk__append_7bit(&re_ctx, 1); + duk__append_reop(&re_ctx, DUK_REOP_MATCH); /* * Check for invalid backreferences; note that it is NOT an error @@ -78185,7 +82576,7 @@ DUK_INTERNAL void duk_regexp_compile(duk_hthread *thr) { /* [ ... pattern flags escaped_source buffer ] */ DUK_BW_COMPACT(thr, &re_ctx.bw); - duk_to_string(ctx, -1); /* coerce to string */ + (void) duk_buffer_to_string(ctx, -1); /* Safe because flags is at most 7 bit. */ /* [ ... pattern flags escaped_source bytecode ] */ @@ -78213,23 +82604,11 @@ DUK_INTERNAL void duk_regexp_compile(duk_hthread *thr) { DUK_INTERNAL void duk_regexp_create_instance(duk_hthread *thr) { duk_context *ctx = (duk_context *) thr; duk_hobject *h; - duk_hstring *h_bc; - duk_small_int_t re_flags; - - /* [ ... escape_source bytecode ] */ - - h_bc = duk_get_hstring(ctx, -1); - DUK_ASSERT(h_bc != NULL); - DUK_ASSERT(DUK_HSTRING_GET_BYTELEN(h_bc) >= 1); /* always at least the header */ - DUK_ASSERT(DUK_HSTRING_GET_CHARLEN(h_bc) >= 1); - DUK_ASSERT((duk_small_int_t) DUK_HSTRING_GET_DATA(h_bc)[0] < 0x80); /* flags always encodes to 1 byte */ - re_flags = (duk_small_int_t) DUK_HSTRING_GET_DATA(h_bc)[0]; /* [ ... escaped_source bytecode ] */ duk_push_object(ctx); - h = duk_get_hobject(ctx, -1); - DUK_ASSERT(h != NULL); + h = duk_known_hobject(ctx, -1); duk_insert(ctx, -3); /* [ ... regexp_object escaped_source bytecode ] */ @@ -78237,36 +82616,34 @@ DUK_INTERNAL void duk_regexp_create_instance(duk_hthread *thr) { DUK_HOBJECT_SET_CLASS_NUMBER(h, DUK_HOBJECT_CLASS_REGEXP); DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h, thr->builtins[DUK_BIDX_REGEXP_PROTOTYPE]); - duk_xdef_prop_stridx(ctx, -3, DUK_STRIDX_INT_BYTECODE, DUK_PROPDESC_FLAGS_NONE); + duk_xdef_prop_stridx_short(ctx, -3, DUK_STRIDX_INT_BYTECODE, DUK_PROPDESC_FLAGS_NONE); /* [ ... regexp_object escaped_source ] */ - duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_SOURCE, DUK_PROPDESC_FLAGS_NONE); - - /* [ ... regexp_object ] */ - - duk_push_boolean(ctx, (re_flags & DUK_RE_FLAG_GLOBAL)); - duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_GLOBAL, DUK_PROPDESC_FLAGS_NONE); + /* In ES2015 .source, and the .global, .multiline, etc flags are + * inherited getters. Store the escaped source as an internal + * property for the getter. + */ - duk_push_boolean(ctx, (re_flags & DUK_RE_FLAG_IGNORE_CASE)); - duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_IGNORE_CASE, DUK_PROPDESC_FLAGS_NONE); + duk_xdef_prop_stridx_short(ctx, -2, DUK_STRIDX_INT_SOURCE, DUK_PROPDESC_FLAGS_NONE); - duk_push_boolean(ctx, (re_flags & DUK_RE_FLAG_MULTILINE)); - duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_MULTILINE, DUK_PROPDESC_FLAGS_NONE); + /* [ ... regexp_object ] */ duk_push_int(ctx, 0); - duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_LAST_INDEX, DUK_PROPDESC_FLAGS_W); + duk_xdef_prop_stridx_short(ctx, -2, DUK_STRIDX_LAST_INDEX, DUK_PROPDESC_FLAGS_W); /* [ ... regexp_object ] */ } -#undef DUK__RE_BUFLEN - #else /* DUK_USE_REGEXP_SUPPORT */ /* regexp support disabled */ #endif /* DUK_USE_REGEXP_SUPPORT */ + +/* automatic undefs */ +#undef DUK__RE_BUFLEN +#undef DUK__RE_INITIAL_BUFSIZE #line 1 "duk_regexp_executor.c" /* * Regexp executor. @@ -78284,9 +82661,9 @@ DUK_INTERNAL void duk_regexp_create_instance(duk_hthread *thr) { * This also requires a regexp bytecode change. */ -/* include removed: duk_internal.h */ +/* #include duk_internal.h -> already included */ -#ifdef DUK_USE_REGEXP_SUPPORT +#if defined(DUK_USE_REGEXP_SUPPORT) /* * Helpers for UTF-8 handling @@ -78337,7 +82714,7 @@ DUK_LOCAL const duk_uint8_t *duk__utf8_backtrack(duk_hthread *thr, const duk_uin return p; fail: - DUK_ERROR_INTERNAL_DEFMSG(thr); + DUK_ERROR_INTERNAL(thr); return NULL; /* never here */ } @@ -78368,7 +82745,7 @@ DUK_LOCAL const duk_uint8_t *duk__utf8_advance(duk_hthread *thr, const duk_uint8 return p; fail: - DUK_ERROR_INTERNAL_DEFMSG(thr); + DUK_ERROR_INTERNAL(thr); return NULL; /* never here */ } @@ -78378,10 +82755,15 @@ DUK_LOCAL const duk_uint8_t *duk__utf8_advance(duk_hthread *thr, const duk_uint8 /* Get a (possibly canonicalized) input character from current sp. The input * itself is never modified, and captures always record non-canonicalized - * characters even in case-insensitive matching. + * characters even in case-insensitive matching. Return <0 if out of input. */ DUK_LOCAL duk_codepoint_t duk__inp_get_cp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **sp) { - duk_codepoint_t res = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(re_ctx->thr, sp, re_ctx->input, re_ctx->input_end); + duk_codepoint_t res; + + if (*sp >= re_ctx->input_end) { + return -1; + } + res = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(re_ctx->thr, sp, re_ctx->input, re_ctx->input_end); if (re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) { res = duk_unicode_re_canonicalize_char(re_ctx->thr, res); } @@ -78424,7 +82806,15 @@ DUK_LOCAL const duk_uint8_t *duk__match_regexp(duk_re_matcher_ctx *re_ctx, const } re_ctx->steps_count++; + /* Opcodes are at most 7 bits now so they encode to one byte. If this + * were not the case or 'pc' is invalid here (due to a bug etc) we'll + * still fail safely through the switch default case. + */ + DUK_ASSERT(pc[0] <= 0x7fU); +#if 0 op = (duk_small_int_t) duk__bc_get_u32(re_ctx, &pc); +#endif + op = *pc++; DUK_DDD(DUK_DDDPRINT("match: rec=%ld, steps=%ld, pc (after op)=%ld, sp=%ld, op=%ld", (long) re_ctx->recursion_depth, @@ -78456,10 +82846,17 @@ DUK_LOCAL const duk_uint8_t *duk__match_regexp(duk_re_matcher_ctx *re_ctx, const c1 = (duk_codepoint_t) duk__bc_get_u32(re_ctx, &pc); DUK_ASSERT(!(re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) || c1 == duk_unicode_re_canonicalize_char(re_ctx->thr, c1)); /* canonicalized by compiler */ - if (sp >= re_ctx->input_end) { + c2 = duk__inp_get_cp(re_ctx, &sp); + /* No need to check for c2 < 0 (end of input): because c1 >= 0, it + * will fail the match below automatically and cause goto fail. + */ +#if 0 + if (c2 < 0) { goto fail; } - c2 = duk__inp_get_cp(re_ctx, &sp); +#endif + DUK_ASSERT(c1 >= 0); + DUK_DDD(DUK_DDDPRINT("char match, c1=%ld, c2=%ld", (long) c1, (long) c2)); if (c1 != c2) { goto fail; @@ -78469,11 +82866,8 @@ DUK_LOCAL const duk_uint8_t *duk__match_regexp(duk_re_matcher_ctx *re_ctx, const case DUK_REOP_PERIOD: { duk_codepoint_t c; - if (sp >= re_ctx->input_end) { - goto fail; - } c = duk__inp_get_cp(re_ctx, &sp); - if (duk_unicode_is_line_terminator(c)) { + if (c < 0 || duk_unicode_is_line_terminator(c)) { /* E5 Sections 15.10.2.8, 7.3 */ goto fail; } @@ -78486,10 +82880,10 @@ DUK_LOCAL const duk_uint8_t *duk__match_regexp(duk_re_matcher_ctx *re_ctx, const duk_small_int_t match; n = duk__bc_get_u32(re_ctx, &pc); - if (sp >= re_ctx->input_end) { + c = duk__inp_get_cp(re_ctx, &sp); + if (c < 0) { goto fail; } - c = duk__inp_get_cp(re_ctx, &sp); match = 0; while (n) { @@ -78540,14 +82934,14 @@ DUK_LOCAL const duk_uint8_t *duk__match_regexp(duk_re_matcher_ctx *re_ctx, const duk_codepoint_t c; const duk_uint8_t *tmp_sp; - if (sp >= re_ctx->input_end) { + tmp_sp = sp; + c = duk__inp_get_cp(re_ctx, &tmp_sp); + if (c < 0) { break; } if (!(re_ctx->re_flags & DUK_RE_FLAG_MULTILINE)) { goto fail; } - tmp_sp = sp; - c = duk__inp_get_cp(re_ctx, &tmp_sp); if (duk_unicode_is_line_terminator(c)) { /* E5 Sections 15.10.2.8, 7.3 */ break; @@ -78730,7 +83124,7 @@ DUK_LOCAL const duk_uint8_t *duk__match_regexp(duk_re_matcher_ctx *re_ctx, const * slightly higher code footprint. */ duk_uint32_t idx_start, idx_count; -#ifdef DUK_USE_EXPLICIT_NULL_INIT +#if defined(DUK_USE_EXPLICIT_NULL_INIT) duk_uint32_t idx_end, idx; #endif duk_uint8_t **range_save; @@ -78751,11 +83145,11 @@ DUK_LOCAL const duk_uint8_t *duk__match_regexp(duk_re_matcher_ctx *re_ctx, const DUK_ASSERT(idx_count > 0); duk_require_stack((duk_context *) re_ctx->thr, 1); - range_save = (duk_uint8_t **) duk_push_fixed_buffer((duk_context *) re_ctx->thr, - sizeof(duk_uint8_t *) * idx_count); + range_save = (duk_uint8_t **) duk_push_fixed_buffer_nozero((duk_context *) re_ctx->thr, + sizeof(duk_uint8_t *) * idx_count); DUK_ASSERT(range_save != NULL); DUK_MEMCPY(range_save, re_ctx->saved + idx_start, sizeof(duk_uint8_t *) * idx_count); -#ifdef DUK_USE_EXPLICIT_NULL_INIT +#if defined(DUK_USE_EXPLICIT_NULL_INIT) idx_end = idx_start + idx_count; for (idx = idx_start; idx < idx_end; idx++) { re_ctx->saved[idx] = NULL; @@ -78808,8 +83202,8 @@ DUK_LOCAL const duk_uint8_t *duk__match_regexp(duk_re_matcher_ctx *re_ctx, const DUK_ASSERT(re_ctx->nsaved > 0); duk_require_stack((duk_context *) re_ctx->thr, 1); - full_save = (duk_uint8_t **) duk_push_fixed_buffer((duk_context *) re_ctx->thr, - sizeof(duk_uint8_t *) * re_ctx->nsaved); + full_save = (duk_uint8_t **) duk_push_fixed_buffer_nozero((duk_context *) re_ctx->thr, + sizeof(duk_uint8_t *) * re_ctx->nsaved); DUK_ASSERT(full_save != NULL); DUK_MEMCPY(full_save, re_ctx->saved, sizeof(duk_uint8_t *) * re_ctx->nsaved); @@ -78884,11 +83278,17 @@ DUK_LOCAL const duk_uint8_t *duk__match_regexp(duk_re_matcher_ctx *re_ctx, const * valid compiled regexps cannot write a saved[] entry * which points to outside the string. */ - if (sp >= re_ctx->input_end) { - goto fail; - } c1 = duk__inp_get_cp(re_ctx, &p); + DUK_ASSERT(c1 >= 0); c2 = duk__inp_get_cp(re_ctx, &sp); + /* No need for an explicit c2 < 0 check: because c1 >= 0, + * the comparison will always fail if c2 < 0. + */ +#if 0 + if (c2 < 0) { + goto fail; + } +#endif if (c1 != c2) { goto fail; } @@ -78911,7 +83311,7 @@ DUK_LOCAL const duk_uint8_t *duk__match_regexp(duk_re_matcher_ctx *re_ctx, const return NULL; internal_error: - DUK_ERROR_INTERNAL_DEFMSG(re_ctx->thr); + DUK_ERROR_INTERNAL(re_ctx->thr); return NULL; /* never here */ } @@ -78933,6 +83333,7 @@ DUK_LOCAL void duk__regexp_match_helper(duk_hthread *thr, duk_small_int_t force_ duk_hobject *h_regexp; duk_hstring *h_bytecode; duk_hstring *h_input; + duk_uint8_t *p_buf; const duk_uint8_t *pc; const duk_uint8_t *sp; duk_small_int_t match = 0; @@ -78960,11 +83361,10 @@ DUK_LOCAL void duk__regexp_match_helper(duk_hthread *thr, duk_small_int_t force_ DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(h_regexp) == DUK_HOBJECT_CLASS_REGEXP); DUK_UNREF(h_regexp); - duk_to_string(ctx, -1); - h_input = duk_get_hstring(ctx, -1); + h_input = duk_to_hstring(ctx, -1); DUK_ASSERT(h_input != NULL); - duk_get_prop_stridx(ctx, -2, DUK_STRIDX_INT_BYTECODE); /* [ ... re_obj input ] -> [ ... re_obj input bc ] */ + duk_get_prop_stridx_short(ctx, -2, DUK_STRIDX_INT_BYTECODE); /* [ ... re_obj input ] -> [ ... re_obj input bc ] */ h_bytecode = duk_require_hstring(ctx, -1); /* no regexp instance should exist without a non-configurable bytecode property */ DUK_ASSERT(h_bytecode != NULL); @@ -79003,17 +83403,21 @@ DUK_LOCAL void duk__regexp_match_helper(duk_hthread *thr, duk_small_int_t force_ DUK_ASSERT(re_ctx.nsaved >= 2); DUK_ASSERT((re_ctx.nsaved % 2) == 0); - duk_push_fixed_buffer(ctx, sizeof(duk_uint8_t *) * re_ctx.nsaved); + p_buf = (duk_uint8_t *) duk_push_fixed_buffer(ctx, sizeof(duk_uint8_t *) * re_ctx.nsaved); /* rely on zeroing */ + DUK_UNREF(p_buf); re_ctx.saved = (const duk_uint8_t **) duk_get_buffer(ctx, -1, NULL); DUK_ASSERT(re_ctx.saved != NULL); /* [ ... re_obj input bc saved_buf ] */ - /* buffer is automatically zeroed */ -#ifdef DUK_USE_EXPLICIT_NULL_INIT +#if defined(DUK_USE_EXPLICIT_NULL_INIT) for (i = 0; i < re_ctx.nsaved; i++) { re_ctx.saved[i] = (duk_uint8_t *) NULL; } +#elif defined(DUK_USE_ZERO_BUFFER_DATA) + /* buffer is automatically zeroed */ +#else + DUK_MEMZERO((void *) p_buf, sizeof(duk_uint8_t *) * re_ctx.nsaved); #endif DUK_DDD(DUK_DDDPRINT("regexp ctx initialized, flags=0x%08lx, nsaved=%ld, recursion_limit=%ld, steps_limit=%ld", @@ -79039,7 +83443,7 @@ DUK_LOCAL void duk__regexp_match_helper(duk_hthread *thr, duk_small_int_t force_ /* [ ... re_obj input bc saved_buf ] */ - duk_get_prop_stridx(ctx, -4, DUK_STRIDX_LAST_INDEX); /* -> [ ... re_obj input bc saved_buf lastIndex ] */ + duk_get_prop_stridx_short(ctx, -4, DUK_STRIDX_LAST_INDEX); /* -> [ ... re_obj input bc saved_buf lastIndex ] */ (void) duk_to_int(ctx, -1); /* ToInteger(lastIndex) */ d = duk_get_number(ctx, -1); /* integer, but may be +/- Infinite, +/- zero (not NaN, though) */ duk_pop(ctx); @@ -79149,7 +83553,7 @@ DUK_LOCAL void duk__regexp_match_helper(duk_hthread *thr, duk_small_int_t force_ /* [ ... re_obj input bc saved_buf ] */ if (match) { -#ifdef DUK_USE_ASSERTIONS +#if defined(DUK_USE_ASSERTIONS) duk_hobject *h_res; #endif duk_uint32_t char_end_offset = 0; @@ -79166,7 +83570,7 @@ DUK_LOCAL void duk__regexp_match_helper(duk_hthread *thr, duk_small_int_t force_ duk_push_array(ctx); -#ifdef DUK_USE_ASSERTIONS +#if defined(DUK_USE_ASSERTIONS) h_res = duk_require_hobject(ctx, -1); DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(h_res)); DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(h_res)); @@ -79176,32 +83580,27 @@ DUK_LOCAL void duk__regexp_match_helper(duk_hthread *thr, duk_small_int_t force_ /* [ ... re_obj input bc saved_buf res_obj ] */ duk_push_u32(ctx, char_offset); - duk_xdef_prop_stridx_wec(ctx, -2, DUK_STRIDX_INDEX); + duk_xdef_prop_stridx_short_wec(ctx, -2, DUK_STRIDX_INDEX); - duk_dup(ctx, -4); - duk_xdef_prop_stridx_wec(ctx, -2, DUK_STRIDX_INPUT); + duk_dup_m4(ctx); + duk_xdef_prop_stridx_short_wec(ctx, -2, DUK_STRIDX_INPUT); for (i = 0; i < re_ctx.nsaved; i += 2) { /* Captures which are undefined have NULL pointers and are returned * as 'undefined'. The same is done when saved[] pointers are insane * (this should, of course, never happen in practice). */ - if (re_ctx.saved[i] && re_ctx.saved[i+1] && re_ctx.saved[i+1] >= re_ctx.saved[i]) { - duk_hstring *h_saved; - + if (re_ctx.saved[i] && re_ctx.saved[i + 1] && re_ctx.saved[i + 1] >= re_ctx.saved[i]) { duk_push_lstring(ctx, (const char *) re_ctx.saved[i], (duk_size_t) (re_ctx.saved[i+1] - re_ctx.saved[i])); - h_saved = duk_get_hstring(ctx, -1); - DUK_ASSERT(h_saved != NULL); - if (i == 0) { /* Assumes that saved[0] and saved[1] are always * set by regexp bytecode (if not, char_end_offset * will be zero). Also assumes clen reflects the * correct char length. */ - char_end_offset = char_offset + DUK_HSTRING_GET_CHARLEN(h_saved); + char_end_offset = char_offset + (duk_uint32_t) duk_get_length(ctx, -1); /* add charlen */ } } else { duk_push_undefined(ctx); @@ -79218,7 +83617,7 @@ DUK_LOCAL void duk__regexp_match_helper(duk_hthread *thr, duk_small_int_t force_ if (global) { /* global regexp: lastIndex updated on match */ duk_push_u32(ctx, char_end_offset); - duk_put_prop_stridx(ctx, -6, DUK_STRIDX_LAST_INDEX); + duk_put_prop_stridx_short(ctx, -6, DUK_STRIDX_LAST_INDEX); } else { /* non-global regexp: lastIndex never updated on match */ ; @@ -79237,7 +83636,7 @@ DUK_LOCAL void duk__regexp_match_helper(duk_hthread *thr, duk_small_int_t force_ /* [ ... re_obj input bc saved_buf res_obj ] */ duk_push_int(ctx, 0); - duk_put_prop_stridx(ctx, -6, DUK_STRIDX_LAST_INDEX); + duk_put_prop_stridx_short(ctx, -6, DUK_STRIDX_LAST_INDEX); } /* [ ... re_obj input bc saved_buf res_obj ] */ @@ -79277,7 +83676,7 @@ DUK_INTERNAL void duk_regexp_match_force_global(duk_hthread *thr) { * compiler/platform problems which cannot be detected at compile time. */ -/* include removed: duk_internal.h */ +/* #include duk_internal.h -> already included */ #if defined(DUK_USE_SELF_TESTS) @@ -79287,43 +83686,93 @@ DUK_INTERNAL void duk_regexp_match_force_global(duk_hthread *thr) { typedef union { double d; - duk_uint8_t c[8]; + duk_uint8_t x[8]; } duk__test_double_union; +/* Self test failed. Expects a local variable 'error_count' to exist. */ +#define DUK__FAILED(msg) do { \ + DUK_D(DUK_DPRINT("self test failed: " #msg " at " DUK_FILE_MACRO ":" DUK_MACRO_STRINGIFY(DUK_LINE_MACRO))); \ + error_count++; \ + } while (0) + #define DUK__DBLUNION_CMP_TRUE(a,b) do { \ if (DUK_MEMCMP((const void *) (a), (const void *) (b), sizeof(duk__test_double_union)) != 0) { \ - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: double union compares false (expected true)"); \ + DUK__FAILED("double union compares false (expected true)"); \ } \ } while (0) #define DUK__DBLUNION_CMP_FALSE(a,b) do { \ if (DUK_MEMCMP((const void *) (a), (const void *) (b), sizeof(duk__test_double_union)) == 0) { \ - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: double union compares true (expected false)"); \ + DUK__FAILED("double union compares true (expected false)"); \ } \ } while (0) typedef union { duk_uint32_t i; - duk_uint8_t c[8]; + duk_uint8_t x[8]; } duk__test_u32_union; +#if defined(DUK_USE_INTEGER_LE) +#define DUK__U32_INIT(u, a, b, c, d) do { \ + (u)->x[0] = (d); (u)->x[1] = (c); (u)->x[2] = (b); (u)->x[3] = (a); \ + } while (0) +#elif defined(DUK_USE_INTEGER_ME) +#error integer mixed endian not supported now +#elif defined(DUK_USE_INTEGER_BE) +#define DUK__U32_INIT(u, a, b, c, d) do { \ + (u)->x[0] = (a); (u)->x[1] = (b); (u)->x[2] = (c); (u)->x[3] = (d); \ + } while (0) +#else +#error unknown integer endianness +#endif + +#if defined(DUK_USE_DOUBLE_LE) +#define DUK__DOUBLE_INIT(u, a, b, c, d, e, f, g, h) do { \ + (u)->x[0] = (h); (u)->x[1] = (g); (u)->x[2] = (f); (u)->x[3] = (e); \ + (u)->x[4] = (d); (u)->x[5] = (c); (u)->x[6] = (b); (u)->x[7] = (a); \ + } while (0) +#define DUK__DOUBLE_COMPARE(u, a, b, c, d, e, f, g, h) \ + ((u)->x[0] == (h) && (u)->x[1] == (g) && (u)->x[2] == (f) && (u)->x[3] == (e) && \ + (u)->x[4] == (d) && (u)->x[5] == (c) && (u)->x[6] == (b) && (u)->x[7] == (a)) +#elif defined(DUK_USE_DOUBLE_ME) +#define DUK__DOUBLE_INIT(u, a, b, c, d, e, f, g, h) do { \ + (u)->x[0] = (d); (u)->x[1] = (c); (u)->x[2] = (b); (u)->x[3] = (a); \ + (u)->x[4] = (h); (u)->x[5] = (g); (u)->x[6] = (f); (u)->x[7] = (e); \ + } while (0) +#define DUK__DOUBLE_COMPARE(u, a, b, c, d, e, f, g, h) \ + ((u)->x[0] == (d) && (u)->x[1] == (c) && (u)->x[2] == (b) && (u)->x[3] == (a) && \ + (u)->x[4] == (h) && (u)->x[5] == (g) && (u)->x[6] == (f) && (u)->x[7] == (e)) +#elif defined(DUK_USE_DOUBLE_BE) +#define DUK__DOUBLE_INIT(u, a, b, c, d, e, f, g, h) do { \ + (u)->x[0] = (a); (u)->x[1] = (b); (u)->x[2] = (c); (u)->x[3] = (d); \ + (u)->x[4] = (e); (u)->x[5] = (f); (u)->x[6] = (g); (u)->x[7] = (h); \ + } while (0) +#define DUK__DOUBLE_COMPARE(u, a, b, c, d, e, f, g, h) \ + ((u)->x[0] == (a) && (u)->x[1] == (b) && (u)->x[2] == (c) && (u)->x[3] == (d) && \ + (u)->x[4] == (e) && (u)->x[5] == (f) && (u)->x[6] == (g) && (u)->x[7] == (h)) +#else +#error unknown double endianness +#endif + /* * Various sanity checks for typing */ -DUK_LOCAL void duk__selftest_types(void) { +DUK_LOCAL duk_uint_t duk__selftest_types(void) { + duk_uint_t error_count = 0; + if (!(sizeof(duk_int8_t) == 1 && sizeof(duk_uint8_t) == 1 && sizeof(duk_int16_t) == 2 && sizeof(duk_uint16_t) == 2 && sizeof(duk_int32_t) == 4 && sizeof(duk_uint32_t) == 4)) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: duk_(u)int{8,16,32}_t size"); + DUK__FAILED("duk_(u)int{8,16,32}_t size"); } #if defined(DUK_USE_64BIT_OPS) if (!(sizeof(duk_int64_t) == 8 && sizeof(duk_uint64_t) == 8)) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: duk_(u)int64_t size"); + DUK__FAILED("duk_(u)int64_t size"); } #endif @@ -79331,30 +83780,37 @@ DUK_LOCAL void duk__selftest_types(void) { /* Some internal code now assumes that all duk_uint_t values * can be expressed with a duk_size_t. */ - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: duk_size_t is smaller than duk_uint_t"); + DUK__FAILED("duk_size_t is smaller than duk_uint_t"); } if (!(sizeof(duk_int_t) >= 4)) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: duk_int_t is not 32 bits"); + DUK__FAILED("duk_int_t is not 32 bits"); } + + return error_count; } /* * Packed tval sanity */ -DUK_LOCAL void duk__selftest_packed_tval(void) { +DUK_LOCAL duk_uint_t duk__selftest_packed_tval(void) { + duk_uint_t error_count = 0; + #if defined(DUK_USE_PACKED_TVAL) if (sizeof(void *) > 4) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: packed duk_tval in use but sizeof(void *) > 4"); + DUK__FAILED("packed duk_tval in use but sizeof(void *) > 4"); } #endif + + return error_count; } /* * Two's complement arithmetic. */ -DUK_LOCAL void duk__selftest_twos_complement(void) { +DUK_LOCAL duk_uint_t duk__selftest_twos_complement(void) { + duk_uint_t error_count = 0; volatile int test; test = -1; @@ -79362,8 +83818,10 @@ DUK_LOCAL void duk__selftest_twos_complement(void) { * 'test' will be 0xFF for two's complement. */ if (((volatile duk_uint8_t *) &test)[0] != (duk_uint8_t) 0xff) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: two's complement arithmetic"); + DUK__FAILED("two's complement arithmetic"); } + + return error_count; } /* @@ -79372,7 +83830,8 @@ DUK_LOCAL void duk__selftest_twos_complement(void) { * defines. */ -DUK_LOCAL void duk__selftest_byte_order(void) { +DUK_LOCAL duk_uint_t duk__selftest_byte_order(void) { + duk_uint_t error_count = 0; duk__test_u32_union u1; duk__test_double_union u2; @@ -79380,43 +83839,27 @@ DUK_LOCAL void duk__selftest_byte_order(void) { * >>> struct.pack('>d', 102030405060).encode('hex') * '4237c17c6dc40000' */ -#if defined(DUK_USE_INTEGER_LE) - u1.c[0] = 0xef; u1.c[1] = 0xbe; u1.c[2] = 0xad; u1.c[3] = 0xde; -#elif defined(DUK_USE_INTEGER_ME) -#error integer mixed endian not supported now -#elif defined(DUK_USE_INTEGER_BE) - u1.c[0] = 0xde; u1.c[1] = 0xad; u1.c[2] = 0xbe; u1.c[3] = 0xef; -#else -#error unknown integer endianness -#endif -#if defined(DUK_USE_DOUBLE_LE) - u2.c[0] = 0x00; u2.c[1] = 0x00; u2.c[2] = 0xc4; u2.c[3] = 0x6d; - u2.c[4] = 0x7c; u2.c[5] = 0xc1; u2.c[6] = 0x37; u2.c[7] = 0x42; -#elif defined(DUK_USE_DOUBLE_ME) - u2.c[0] = 0x7c; u2.c[1] = 0xc1; u2.c[2] = 0x37; u2.c[3] = 0x42; - u2.c[4] = 0x00; u2.c[5] = 0x00; u2.c[6] = 0xc4; u2.c[7] = 0x6d; -#elif defined(DUK_USE_DOUBLE_BE) - u2.c[0] = 0x42; u2.c[1] = 0x37; u2.c[2] = 0xc1; u2.c[3] = 0x7c; - u2.c[4] = 0x6d; u2.c[5] = 0xc4; u2.c[6] = 0x00; u2.c[7] = 0x00; -#else -#error unknown double endianness -#endif + DUK__U32_INIT(&u1, 0xde, 0xad, 0xbe, 0xef); + DUK__DOUBLE_INIT(&u2, 0x42, 0x37, 0xc1, 0x7c, 0x6d, 0xc4, 0x00, 0x00); if (u1.i != (duk_uint32_t) 0xdeadbeefUL) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: duk_uint32_t byte order"); + DUK__FAILED("duk_uint32_t byte order"); } if (u2.d != (double) 102030405060.0) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: double byte order"); + DUK__FAILED("double byte order"); } + + return error_count; } /* * DUK_BSWAP macros */ -DUK_LOCAL void duk__selftest_bswap_macros(void) { +DUK_LOCAL duk_uint_t duk__selftest_bswap_macros(void) { + duk_uint_t error_count = 0; duk_uint32_t x32; duk_uint16_t x16; duk_double_union du; @@ -79425,13 +83868,13 @@ DUK_LOCAL void duk__selftest_bswap_macros(void) { x16 = 0xbeefUL; x16 = DUK_BSWAP16(x16); if (x16 != (duk_uint16_t) 0xefbeUL) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: DUK_BSWAP16"); + DUK__FAILED("DUK_BSWAP16"); } x32 = 0xdeadbeefUL; x32 = DUK_BSWAP32(x32); if (x32 != (duk_uint32_t) 0xefbeaddeUL) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: DUK_BSWAP32"); + DUK__FAILED("DUK_BSWAP32"); } /* >>> struct.unpack('>d', '4000112233445566'.decode('hex')) @@ -79443,7 +83886,7 @@ DUK_LOCAL void duk__selftest_bswap_macros(void) { DUK_DBLUNION_DOUBLE_NTOH(&du); du_diff = du.d - 2.008366013071895; #if 0 - DUK_FPRINTF(DUK_STDERR, "du_diff: %lg\n", (double) du_diff); + DUK_D(DUK_DPRINT("du_diff: %lg\n", (double) du_diff)); #endif if (du_diff > 1e-15) { /* Allow very small lenience because some compilers won't parse @@ -79451,74 +83894,199 @@ DUK_LOCAL void duk__selftest_bswap_macros(void) { * Linux gcc-4.8 -m32 at least). */ #if 0 - DUK_FPRINTF(DUK_STDERR, "Result of DUK_DBLUNION_DOUBLE_NTOH: %02x %02x %02x %02x %02x %02x %02x %02x\n", + DUK_D(DUK_DPRINT("Result of DUK_DBLUNION_DOUBLE_NTOH: %02x %02x %02x %02x %02x %02x %02x %02x\n", (unsigned int) du.uc[0], (unsigned int) du.uc[1], (unsigned int) du.uc[2], (unsigned int) du.uc[3], (unsigned int) du.uc[4], (unsigned int) du.uc[5], - (unsigned int) du.uc[6], (unsigned int) du.uc[7]); + (unsigned int) du.uc[6], (unsigned int) du.uc[7])); #endif - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: DUK_DBLUNION_DOUBLE_NTOH"); + DUK__FAILED("DUK_DBLUNION_DOUBLE_NTOH"); } + + return error_count; } /* * Basic double / byte union memory layout. */ -DUK_LOCAL void duk__selftest_double_union_size(void) { +DUK_LOCAL duk_uint_t duk__selftest_double_union_size(void) { + duk_uint_t error_count = 0; + if (sizeof(duk__test_double_union) != 8) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: invalid union size"); + DUK__FAILED("invalid union size"); } + + return error_count; } /* * Union aliasing, see misc/clang_aliasing.c. */ -DUK_LOCAL void duk__selftest_double_aliasing(void) { - duk__test_double_union a, b; - +DUK_LOCAL duk_uint_t duk__selftest_double_aliasing(void) { /* This testcase fails when Emscripten-generated code runs on Firefox. * It's not an issue because the failure should only affect packed * duk_tval representation, which is not used with Emscripten. */ -#if !defined(DUK_USE_PACKED_TVAL) - DUK_D(DUK_DPRINT("skip double aliasing self test when duk_tval is not packed")); - return; -#endif +#if defined(DUK_USE_PACKED_TVAL) + duk_uint_t error_count = 0; + duk__test_double_union a, b; /* Test signaling NaN and alias assignment in all endianness combinations. */ /* little endian */ - a.c[0] = 0x11; a.c[1] = 0x22; a.c[2] = 0x33; a.c[3] = 0x44; - a.c[4] = 0x00; a.c[5] = 0x00; a.c[6] = 0xf1; a.c[7] = 0xff; + a.x[0] = 0x11; a.x[1] = 0x22; a.x[2] = 0x33; a.x[3] = 0x44; + a.x[4] = 0x00; a.x[5] = 0x00; a.x[6] = 0xf1; a.x[7] = 0xff; b = a; DUK__DBLUNION_CMP_TRUE(&a, &b); /* big endian */ - a.c[0] = 0xff; a.c[1] = 0xf1; a.c[2] = 0x00; a.c[3] = 0x00; - a.c[4] = 0x44; a.c[5] = 0x33; a.c[6] = 0x22; a.c[7] = 0x11; + a.x[0] = 0xff; a.x[1] = 0xf1; a.x[2] = 0x00; a.x[3] = 0x00; + a.x[4] = 0x44; a.x[5] = 0x33; a.x[6] = 0x22; a.x[7] = 0x11; b = a; DUK__DBLUNION_CMP_TRUE(&a, &b); /* mixed endian */ - a.c[0] = 0x00; a.c[1] = 0x00; a.c[2] = 0xf1; a.c[3] = 0xff; - a.c[4] = 0x11; a.c[5] = 0x22; a.c[6] = 0x33; a.c[7] = 0x44; + a.x[0] = 0x00; a.x[1] = 0x00; a.x[2] = 0xf1; a.x[3] = 0xff; + a.x[4] = 0x11; a.x[5] = 0x22; a.x[6] = 0x33; a.x[7] = 0x44; b = a; DUK__DBLUNION_CMP_TRUE(&a, &b); + + return error_count; +#else + DUK_D(DUK_DPRINT("skip double aliasing self test when duk_tval is not packed")); + return 0; +#endif } /* * Zero sign, see misc/tcc_zerosign2.c. */ -DUK_LOCAL void duk__selftest_double_zero_sign(void) { +DUK_LOCAL duk_uint_t duk__selftest_double_zero_sign(void) { + duk_uint_t error_count = 0; duk__test_double_union a, b; a.d = 0.0; b.d = -a.d; DUK__DBLUNION_CMP_FALSE(&a, &b); + + return error_count; +} + +/* + * Rounding mode: Duktape assumes round-to-nearest, check that this is true. + * If we had C99 fenv.h we could check that fegetround() == FE_TONEAREST, + * but we don't want to rely on that header; and even if we did, it's good + * to ensure the rounding actually works. + */ + +DUK_LOCAL duk_uint_t duk__selftest_double_rounding(void) { + duk_uint_t error_count = 0; + duk__test_double_union a, b, c; + +#if 0 + /* Include and test manually; these trigger failures: */ + fesetround(FE_UPWARD); + fesetround(FE_DOWNWARD); + fesetround(FE_TOWARDZERO); + + /* This is the default and passes. */ + fesetround(FE_TONEAREST); +#endif + + /* Rounding tests check that none of the other modes (round to + * +Inf, round to -Inf, round to zero) can be active: + * http://www.gnu.org/software/libc/manual/html_node/Rounding.html + */ + + /* 1.0 + 2^(-53): result is midway between 1.0 and 1.0 + ulp. + * Round to nearest: 1.0 + * Round to +Inf: 1.0 + ulp + * Round to -Inf: 1.0 + * Round to zero: 1.0 + * => Correct result eliminates round to +Inf. + */ + DUK__DOUBLE_INIT(&a, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); + DUK__DOUBLE_INIT(&b, 0x3c, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); + DUK_MEMSET((void *) &c, 0, sizeof(c)); + c.d = a.d + b.d; + if (!DUK__DOUBLE_COMPARE(&c, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)) { + DUK_D(DUK_DPRINT("broken result (native endiannesss): %02x %02x %02x %02x %02x %02x %02x %02x", + (unsigned int) c.x[0], (unsigned int) c.x[1], + (unsigned int) c.x[2], (unsigned int) c.x[3], + (unsigned int) c.x[4], (unsigned int) c.x[5], + (unsigned int) c.x[6], (unsigned int) c.x[7])); + DUK__FAILED("invalid result from 1.0 + 0.5ulp"); + } + + /* (1.0 + ulp) + 2^(-53): result is midway between 1.0 + ulp and 1.0 + 2*ulp. + * Round to nearest: 1.0 + 2*ulp (round to even mantissa) + * Round to +Inf: 1.0 + 2*ulp + * Round to -Inf: 1.0 + ulp + * Round to zero: 1.0 + ulp + * => Correct result eliminates round to -Inf and round to zero. + */ + DUK__DOUBLE_INIT(&a, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01); + DUK__DOUBLE_INIT(&b, 0x3c, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); + DUK_MEMSET((void *) &c, 0, sizeof(c)); + c.d = a.d + b.d; + if (!DUK__DOUBLE_COMPARE(&c, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02)) { + DUK_D(DUK_DPRINT("broken result (native endiannesss): %02x %02x %02x %02x %02x %02x %02x %02x", + (unsigned int) c.x[0], (unsigned int) c.x[1], + (unsigned int) c.x[2], (unsigned int) c.x[3], + (unsigned int) c.x[4], (unsigned int) c.x[5], + (unsigned int) c.x[6], (unsigned int) c.x[7])); + DUK__FAILED("invalid result from (1.0 + ulp) + 0.5ulp"); + } + + /* Could do negative number testing too, but the tests above should + * differentiate between IEEE 754 rounding modes. + */ + return error_count; +} + +/* + * fmod(): often a portability issue in embedded or bare platform targets. + * Check for at least minimally correct behavior. Unlike some other math + * functions (like cos()) Duktape relies on fmod() internally too. + */ + +DUK_LOCAL duk_uint_t duk__selftest_fmod(void) { + duk_uint_t error_count = 0; + duk__test_double_union u1, u2; + + /* fmod() with integer argument and exponent 2^32 is used by e.g. + * ToUint32() and some Duktape internals. + */ + u1.d = DUK_FMOD(10.0, 4294967296.0); + u2.d = 10.0; + DUK__DBLUNION_CMP_TRUE(&u1, &u2); + + u1.d = DUK_FMOD(4294967306.0, 4294967296.0); + u2.d = 10.0; + DUK__DBLUNION_CMP_TRUE(&u1, &u2); + + u1.d = DUK_FMOD(73014444042.0, 4294967296.0); + u2.d = 10.0; + DUK__DBLUNION_CMP_TRUE(&u1, &u2); + + /* C99 behavior is for fmod() result sign to mathc argument sign. */ + u1.d = DUK_FMOD(-10.0, 4294967296.0); + u2.d = -10.0; + DUK__DBLUNION_CMP_TRUE(&u1, &u2); + + u1.d = DUK_FMOD(-4294967306.0, 4294967296.0); + u2.d = -10.0; + DUK__DBLUNION_CMP_TRUE(&u1, &u2); + + u1.d = DUK_FMOD(-73014444042.0, 4294967296.0); + u2.d = -10.0; + DUK__DBLUNION_CMP_TRUE(&u1, &u2); + + return error_count; } /* @@ -79528,20 +84096,23 @@ DUK_LOCAL void duk__selftest_double_zero_sign(void) { * selftest ensures they're correctly detected and used. */ -DUK_LOCAL void duk__selftest_struct_align(void) { +DUK_LOCAL duk_uint_t duk__selftest_struct_align(void) { + duk_uint_t error_count = 0; + #if (DUK_USE_ALIGN_BY == 4) if ((sizeof(duk_hbuffer_fixed) % 4) != 0) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: sizeof(duk_hbuffer_fixed) not aligned to 4"); + DUK__FAILED("sizeof(duk_hbuffer_fixed) not aligned to 4"); } #elif (DUK_USE_ALIGN_BY == 8) if ((sizeof(duk_hbuffer_fixed) % 8) != 0) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: sizeof(duk_hbuffer_fixed) not aligned to 8"); + DUK__FAILED("sizeof(duk_hbuffer_fixed) not aligned to 8"); } #elif (DUK_USE_ALIGN_BY == 1) /* no check */ #else #error invalid DUK_USE_ALIGN_BY #endif + return error_count; } /* @@ -79551,7 +84122,8 @@ DUK_LOCAL void duk__selftest_struct_align(void) { * but don't work correctly. Test for known cases. */ -DUK_LOCAL void duk__selftest_64bit_arithmetic(void) { +DUK_LOCAL duk_uint_t duk__selftest_64bit_arithmetic(void) { + duk_uint_t error_count = 0; #if defined(DUK_USE_64BIT_OPS) volatile duk_int64_t i; volatile duk_double_t d; @@ -79560,22 +84132,25 @@ DUK_LOCAL void duk__selftest_64bit_arithmetic(void) { d = 2147483648.0; i = (duk_int64_t) d; if (i != 0x80000000LL) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: casting 2147483648.0 to duk_int64_t failed"); + DUK__FAILED("casting 2147483648.0 to duk_int64_t failed"); } #else /* nop */ #endif + return error_count; } /* * Casting */ -DUK_LOCAL void duk__selftest_cast_double_to_small_uint(void) { +DUK_LOCAL duk_uint_t duk__selftest_cast_double_to_small_uint(void) { /* * https://github.com/svaarala/duktape/issues/127#issuecomment-77863473 */ + duk_uint_t error_count = 0; + duk_double_t d1, d2; duk_small_uint_t u; @@ -79589,7 +84164,7 @@ DUK_LOCAL void duk__selftest_cast_double_to_small_uint(void) { d2 = (duk_double_t) u; if (!(d1 == 1.0 && u == 1 && d2 == 1.0 && d1 == d2)) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: double to duk_small_uint_t cast failed"); + DUK__FAILED("double to duk_small_uint_t cast failed"); } /* Same test with volatiles */ @@ -79599,11 +84174,13 @@ DUK_LOCAL void duk__selftest_cast_double_to_small_uint(void) { d2v = (duk_double_t) uv; if (!(d1v == 1.0 && uv == 1 && d2v == 1.0 && d1v == d2v)) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: double to duk_small_uint_t cast failed"); + DUK__FAILED("double to duk_small_uint_t cast failed"); } + + return error_count; } -DUK_LOCAL void duk__selftest_cast_double_to_uint32(void) { +DUK_LOCAL duk_uint_t duk__selftest_cast_double_to_uint32(void) { /* * This test fails on an exotic ARM target; double-to-uint * cast is incorrectly clamped to -signed- int highest value. @@ -79611,6 +84188,7 @@ DUK_LOCAL void duk__selftest_cast_double_to_uint32(void) { * https://github.com/svaarala/duktape/issues/336 */ + duk_uint_t error_count = 0; duk_double_t dv; duk_uint32_t uv; @@ -79618,34 +84196,109 @@ DUK_LOCAL void duk__selftest_cast_double_to_uint32(void) { uv = (duk_uint32_t) dv; if (uv != 0xdeadbeefUL) { - DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: double to duk_uint32_t cast failed"); + DUK__FAILED("double to duk_uint32_t cast failed"); } + + return error_count; } /* - * Self test main + * Minimal test of user supplied allocation functions + * + * - Basic alloc + realloc + free cycle + * + * - Realloc to significantly larger size to (hopefully) trigger a + * relocation and check that relocation copying works */ -DUK_INTERNAL void duk_selftest_run_tests(void) { - duk__selftest_types(); - duk__selftest_packed_tval(); - duk__selftest_twos_complement(); - duk__selftest_byte_order(); - duk__selftest_bswap_macros(); - duk__selftest_double_union_size(); - duk__selftest_double_aliasing(); - duk__selftest_double_zero_sign(); - duk__selftest_struct_align(); - duk__selftest_64bit_arithmetic(); - duk__selftest_cast_double_to_small_uint(); - duk__selftest_cast_double_to_uint32(); +DUK_LOCAL duk_uint_t duk__selftest_alloc_funcs(duk_alloc_function alloc_func, + duk_realloc_function realloc_func, + duk_free_function free_func, + void *udata) { + duk_uint_t error_count = 0; + void *ptr; + void *new_ptr; + duk_small_int_t i, j; + unsigned char x; + + if (alloc_func == NULL || realloc_func == NULL || free_func == NULL) { + return 0; + } + + for (i = 1; i <= 256; i++) { + ptr = alloc_func(udata, i); + if (ptr == NULL) { + DUK_D(DUK_DPRINT("alloc failed, ignore")); + continue; /* alloc failed, ignore */ + } + for (j = 0; j < i; j++) { + ((unsigned char *) ptr)[j] = (unsigned char) (0x80 + j); + } + new_ptr = realloc_func(udata, ptr, 1024); + if (new_ptr == NULL) { + DUK_D(DUK_DPRINT("realloc failed, ignore")); + free_func(udata, ptr); + continue; /* realloc failed, ignore */ + } + ptr = new_ptr; + for (j = 0; j < i; j++) { + x = ((unsigned char *) ptr)[j]; + if (x != (unsigned char) (0x80 + j)) { + DUK_D(DUK_DPRINT("byte at index %ld doesn't match after realloc: %02lx", + (long) j, (unsigned long) x)); + DUK__FAILED("byte compare after realloc"); + break; + } + } + free_func(udata, ptr); + } + + return error_count; } -#undef DUK__DBLUNION_CMP_TRUE -#undef DUK__DBLUNION_CMP_FALSE +/* + * Self test main + */ + +DUK_INTERNAL duk_uint_t duk_selftest_run_tests(duk_alloc_function alloc_func, + duk_realloc_function realloc_func, + duk_free_function free_func, + void *udata) { + duk_uint_t error_count = 0; + + DUK_D(DUK_DPRINT("self test starting")); + + error_count += duk__selftest_types(); + error_count += duk__selftest_packed_tval(); + error_count += duk__selftest_twos_complement(); + error_count += duk__selftest_byte_order(); + error_count += duk__selftest_bswap_macros(); + error_count += duk__selftest_double_union_size(); + error_count += duk__selftest_double_aliasing(); + error_count += duk__selftest_double_zero_sign(); + error_count += duk__selftest_double_rounding(); + error_count += duk__selftest_fmod(); + error_count += duk__selftest_struct_align(); + error_count += duk__selftest_64bit_arithmetic(); + error_count += duk__selftest_cast_double_to_small_uint(); + error_count += duk__selftest_cast_double_to_uint32(); + error_count += duk__selftest_alloc_funcs(alloc_func, realloc_func, free_func, udata); + + DUK_D(DUK_DPRINT("self test complete, total error count: %ld", (long) error_count)); + + return error_count; +} #endif /* DUK_USE_SELF_TESTS */ -/* include removed: duk_internal.h */ + +/* automatic undefs */ +#undef DUK__DBLUNION_CMP_FALSE +#undef DUK__DBLUNION_CMP_TRUE +#undef DUK__DOUBLE_COMPARE +#undef DUK__DOUBLE_INIT +#undef DUK__FAILED +#undef DUK__U32_INIT +/* #include duk_internal.h -> already included */ #line 2 "duk_tval.c" #if defined(DUK_USE_FASTINT) @@ -79667,7 +84320,7 @@ DUK_INTERNAL void duk_selftest_run_tests(void) { * See doc/fastint.rst for details. */ -DUK_INTERNAL DUK_ALWAYS_INLINE void duk_tval_set_number_chkfast(duk_tval *tv, duk_double_t x) { +DUK_INTERNAL DUK_ALWAYS_INLINE void duk_tval_set_number_chkfast_fast(duk_tval *tv, duk_double_t x) { duk_double_union du; duk_int64_t i; duk_small_int_t expt; @@ -79710,6 +84363,10 @@ DUK_INTERNAL DUK_ALWAYS_INLINE void duk_tval_set_number_chkfast(duk_tval *tv, du return; } +DUK_INTERNAL DUK_NOINLINE void duk_tval_set_number_chkfast_slow(duk_tval *tv, duk_double_t x) { + duk_tval_set_number_chkfast_fast(tv, x); +} + /* * Manually optimized number-to-double conversion */ @@ -79745,7 +84402,7 @@ DUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_tval_get_number_unpacked(duk_tva duk_double_union du; duk_uint64_t t; - DUK_ASSERT(tv->t == DUK__TAG_NUMBER || tv->t == DUK_TAG_FASTINT); + DUK_ASSERT(tv->t == DUK_TAG_NUMBER || tv->t == DUK_TAG_FASTINT); if (tv->t == DUK_TAG_FASTINT) { if (tv->v.fi >= 0) { @@ -79789,7 +84446,7 @@ DUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_tval_get_number_unpacked_fastint * Unicode support tables automatically generated during build. */ -/* include removed: duk_internal.h */ +/* #include duk_internal.h -> already included */ /* * Unicode tables containing ranges of Unicode characters in a @@ -79800,53 +84457,64 @@ DUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_tval_get_number_unpacked_fastint * compactness is most important. * * The tables are matched using uni_range_match() and the format - * is described in src/extract_chars.py. + * is described in tools/extract_chars.py. */ -#ifdef DUK_USE_SOURCE_NONBMP +#if defined(DUK_USE_SOURCE_NONBMP) /* IdentifierStart production with ASCII excluded */ /* duk_unicode_ids_noa[] */ /* * Automatically generated by extract_chars.py, do not edit! */ -const duk_uint8_t duk_unicode_ids_noa[791] = { -249,176,176,80,111,7,47,15,47,254,11,197,191,0,72,2,15,115,66,19,57,2,34,2, -240,66,244,50,247,185,248,234,241,99,8,241,127,58,240,182,47,31,241,191,21, -18,245,50,15,1,24,27,35,15,2,2,240,239,15,244,156,15,10,241,26,21,6,240, -101,10,4,15,9,240,159,157,242,100,15,4,8,159,1,98,102,115,19,240,98,98,4, -52,15,2,14,18,47,0,31,5,85,19,240,98,98,18,18,31,17,50,15,5,47,2,130,34, -240,98,98,18,68,15,4,15,1,31,21,115,19,240,98,98,18,68,15,16,18,47,1,15,3, -2,84,34,52,18,2,20,20,36,191,8,15,38,114,34,240,114,146,68,15,12,23,31,21, -114,34,240,114,146,68,15,18,2,31,1,31,4,114,34,241,147,15,2,15,3,31,10,86, -240,36,240,130,130,3,111,44,242,2,29,111,44,18,3,18,3,7,50,98,34,2,3,18,50, -26,3,66,15,7,31,20,15,49,114,241,79,13,79,101,241,191,6,15,2,85,52,4,24,37, -205,15,3,241,107,241,178,4,255,224,59,35,54,32,35,63,25,35,63,17,35,54,32, -35,62,47,41,35,63,51,241,127,0,240,47,69,223,254,21,227,240,18,240,166,243, -180,47,1,194,63,0,240,47,0,240,47,0,194,47,1,242,79,21,5,15,53,244,137,241, -146,6,243,107,240,223,37,240,227,76,241,207,7,111,42,240,122,242,95,68,15, -79,241,255,3,111,41,240,238,31,2,241,111,12,241,79,27,43,241,79,93,50,63,0, -251,15,50,255,224,8,53,63,22,53,55,32,32,32,47,15,63,37,38,32,66,38,67,53, -92,98,38,246,96,224,240,44,245,112,80,57,32,68,112,32,32,35,42,51,100,80, -240,63,25,255,233,107,241,242,241,242,247,87,63,3,241,107,242,106,15,2,240, -122,98,98,98,98,98,98,98,111,66,15,254,12,146,240,184,132,52,95,70,114,47, -74,35,111,25,79,78,240,63,11,242,127,0,255,224,244,255,240,0,138,143,60, -255,240,4,11,239,38,255,227,127,243,95,30,63,253,79,0,177,240,111,31,240, -47,9,159,64,241,152,63,87,51,33,240,9,244,39,34,35,47,7,240,255,36,240,15, -34,243,5,64,240,15,12,191,7,240,191,13,143,31,240,224,242,47,25,240,146,39, -240,111,7,64,111,32,32,65,52,48,32,240,162,241,85,53,53,166,38,248,63,19, -240,255,255,0,26,150,223,7,95,33,255,240,0,255,143,254,2,3,242,227,245,175, -24,109,70,2,146,194,66,2,18,18,245,207,19,255,224,93,240,79,48,63,38,241, -171,246,100,47,119,241,111,10,127,10,207,73,69,53,53,50,241,91,47,10,47,3, -33,46,61,241,79,107,243,127,37,255,223,13,79,33,242,31,15,240,63,11,242, -127,14,63,20,87,36,241,207,142,255,226,86,83,2,241,194,20,3,240,127,156, -240,107,240,175,184,15,1,50,34,240,191,30,240,223,117,242,107,240,107,240, -63,127,243,159,254,42,239,37,243,223,29,255,238,68,255,226,97,248,63,83, -255,234,145,255,227,33,255,240,2,44,95,254,18,191,255,0,52,187,31,255,0,18, -242,244,82,243,114,19,3,19,50,178,2,98,243,18,51,114,98,240,194,50,66,4,98, -255,224,70,63,9,47,9,47,15,47,9,47,15,47,9,47,15,47,9,47,15,47,9,39,255, -240,1,114,143,255,0,149,201,241,191,254,242,124,252,239,255,0,46,214,255, -225,16,0, +const duk_uint8_t duk_unicode_ids_noa[1036] = { +249,176,176,80,111,7,47,15,47,254,11,197,191,0,72,2,15,115,66,19,50,7,2,34, +2,240,66,244,50,247,185,249,98,241,99,8,241,127,58,240,182,47,31,241,191, +21,18,245,50,15,1,24,27,35,15,2,2,240,239,15,244,156,15,10,241,26,21,6,240, +101,10,4,15,9,240,159,57,240,82,127,56,242,100,15,4,8,159,1,240,5,115,19, +240,98,98,4,52,15,2,14,18,47,0,31,5,85,19,240,98,98,18,18,31,17,50,15,5,47, +2,130,34,240,98,98,18,68,15,4,15,1,31,9,12,115,19,240,98,98,18,68,15,16,18, +47,1,15,3,2,84,34,52,18,2,20,20,36,191,8,15,38,114,34,240,114,240,4,15,12, +38,31,16,5,114,34,240,114,146,68,15,18,2,31,1,31,4,114,34,241,147,15,2,6, +41,47,10,86,240,36,240,130,130,3,111,44,242,2,29,111,44,18,3,18,3,7,50,98, +34,2,3,18,50,26,3,66,15,7,63,18,15,49,114,241,79,13,79,101,241,191,6,15,2, +85,52,4,24,37,205,15,3,241,98,6,3,241,178,255,224,63,35,54,32,35,63,25,35, +63,17,35,54,32,35,62,47,41,35,63,51,241,127,0,240,47,70,53,79,254,21,227, +240,18,240,166,243,180,168,194,63,0,240,47,0,240,47,0,194,47,1,242,79,21,5, +15,53,244,137,67,241,34,6,243,107,240,255,35,240,227,76,241,197,240,175,40, +240,122,242,95,68,15,79,241,255,3,111,41,240,238,27,241,207,12,241,79,27, +43,241,67,143,82,50,52,26,251,15,50,255,224,8,53,63,22,53,55,32,32,32,47, +15,63,37,38,32,66,38,67,53,92,98,38,246,96,224,240,44,245,112,80,57,32,68, +112,32,32,35,42,51,100,80,240,63,25,255,233,107,241,242,241,242,247,87,52, +29,241,98,6,3,242,136,15,2,240,122,98,98,98,98,98,98,98,111,66,15,254,12, +146,240,184,132,52,95,70,114,47,74,35,111,25,79,78,240,63,11,242,127,0,255, +224,244,255,240,0,138,143,60,255,240,4,12,143,28,255,227,127,243,95,30,63, +253,79,0,177,240,111,31,240,47,15,63,64,241,152,63,87,63,20,39,243,26,34, +35,47,7,240,255,36,240,15,34,243,5,64,32,223,12,191,7,240,191,13,143,31, +240,224,240,36,41,180,47,25,240,146,39,240,111,7,64,79,34,32,65,52,48,32, +240,162,58,130,213,53,53,166,38,47,27,41,191,99,240,255,255,0,26,150,223,7, +95,33,255,240,0,255,143,254,6,3,245,175,24,109,70,2,146,194,66,2,18,18,245, +207,19,255,224,93,240,79,48,63,38,241,171,246,100,47,119,241,111,10,127,10, +207,73,69,53,53,50,241,91,47,10,47,3,33,46,61,241,79,107,243,127,37,255, +223,13,79,33,242,31,16,240,47,11,111,22,191,14,63,20,87,36,241,207,142,240, +79,20,95,20,95,24,159,36,248,239,254,2,154,240,107,127,138,83,2,241,194,20, +3,240,123,240,122,240,255,51,240,50,27,240,107,240,175,56,242,135,31,50,15, +1,50,34,240,191,30,240,212,240,223,21,114,240,207,13,242,107,240,107,240, +62,240,47,96,243,159,41,242,62,242,63,254,32,79,37,243,223,29,241,47,9,240, +207,20,241,191,19,64,223,32,240,3,240,112,32,241,95,2,47,9,244,102,32,35, +46,41,143,31,241,135,49,63,6,38,33,36,64,240,64,212,249,15,37,240,67,242, +127,32,240,97,32,250,175,31,241,179,241,111,32,240,96,242,223,27,244,127, +10,255,224,122,243,15,17,15,254,11,79,41,255,152,47,21,240,48,242,63,14, +255,226,100,255,226,140,245,143,95,240,63,180,255,233,176,255,227,33,255, +238,197,255,225,57,255,240,1,10,223,254,18,184,240,255,99,240,239,4,242,15, +2,63,17,240,86,240,63,254,38,79,53,192,243,76,243,32,241,31,255,0,6,223, +240,95,254,30,95,255,0,20,1,31,254,175,47,91,108,72,137,255,240,0,101,175, +69,47,55,33,48,49,51,43,32,38,47,49,35,55,38,47,12,35,36,32,70,47,254,4,99, +240,146,240,146,240,242,240,146,240,242,240,146,240,242,240,146,240,242, +240,146,127,254,242,143,181,242,223,52,255,227,176,50,240,178,18,3,2,146, +50,2,7,5,2,2,2,34,18,3,2,2,2,2,2,18,3,50,98,50,50,2,146,240,22,34,66,240, +31,255,0,0,56,255,240,9,92,159,27,255,239,39,207,206,63,255,0,5,116,255, +240,1,133,47,254,17,0, }; #else /* IdentifierStart production with ASCII and non-BMP excluded */ @@ -79855,38 +84523,39 @@ const duk_uint8_t duk_unicode_ids_noa[791] = { * Automatically generated by extract_chars.py, do not edit! */ -const duk_uint8_t duk_unicode_ids_noabmp[611] = { -249,176,176,80,111,7,47,15,47,254,11,197,191,0,72,2,15,115,66,19,57,2,34,2, -240,66,244,50,247,185,248,234,241,99,8,241,127,58,240,182,47,31,241,191,21, -18,245,50,15,1,24,27,35,15,2,2,240,239,15,244,156,15,10,241,26,21,6,240, -101,10,4,15,9,240,159,157,242,100,15,4,8,159,1,98,102,115,19,240,98,98,4, -52,15,2,14,18,47,0,31,5,85,19,240,98,98,18,18,31,17,50,15,5,47,2,130,34, -240,98,98,18,68,15,4,15,1,31,21,115,19,240,98,98,18,68,15,16,18,47,1,15,3, -2,84,34,52,18,2,20,20,36,191,8,15,38,114,34,240,114,146,68,15,12,23,31,21, -114,34,240,114,146,68,15,18,2,31,1,31,4,114,34,241,147,15,2,15,3,31,10,86, -240,36,240,130,130,3,111,44,242,2,29,111,44,18,3,18,3,7,50,98,34,2,3,18,50, -26,3,66,15,7,31,20,15,49,114,241,79,13,79,101,241,191,6,15,2,85,52,4,24,37, -205,15,3,241,107,241,178,4,255,224,59,35,54,32,35,63,25,35,63,17,35,54,32, -35,62,47,41,35,63,51,241,127,0,240,47,69,223,254,21,227,240,18,240,166,243, -180,47,1,194,63,0,240,47,0,240,47,0,194,47,1,242,79,21,5,15,53,244,137,241, -146,6,243,107,240,223,37,240,227,76,241,207,7,111,42,240,122,242,95,68,15, -79,241,255,3,111,41,240,238,31,2,241,111,12,241,79,27,43,241,79,93,50,63,0, -251,15,50,255,224,8,53,63,22,53,55,32,32,32,47,15,63,37,38,32,66,38,67,53, -92,98,38,246,96,224,240,44,245,112,80,57,32,68,112,32,32,35,42,51,100,80, -240,63,25,255,233,107,241,242,241,242,247,87,63,3,241,107,242,106,15,2,240, -122,98,98,98,98,98,98,98,111,66,15,254,12,146,240,184,132,52,95,70,114,47, -74,35,111,25,79,78,240,63,11,242,127,0,255,224,244,255,240,0,138,143,60, -255,240,4,11,239,38,255,227,127,243,95,30,63,253,79,0,177,240,111,31,240, -47,9,159,64,241,152,63,87,51,33,240,9,244,39,34,35,47,7,240,255,36,240,15, -34,243,5,64,240,15,12,191,7,240,191,13,143,31,240,224,242,47,25,240,146,39, -240,111,7,64,111,32,32,65,52,48,32,240,162,241,85,53,53,166,38,248,63,19, -240,255,255,0,26,150,223,7,95,33,255,240,0,255,143,254,2,3,242,227,245,175, -24,109,70,2,146,194,66,2,18,18,245,207,19,255,224,93,240,79,48,63,38,241, -171,246,100,47,119,241,111,10,127,10,207,73,69,53,53,50,0, +const duk_uint8_t duk_unicode_ids_noabmp[625] = { +249,176,176,80,111,7,47,15,47,254,11,197,191,0,72,2,15,115,66,19,50,7,2,34, +2,240,66,244,50,247,185,249,98,241,99,8,241,127,58,240,182,47,31,241,191, +21,18,245,50,15,1,24,27,35,15,2,2,240,239,15,244,156,15,10,241,26,21,6,240, +101,10,4,15,9,240,159,57,240,82,127,56,242,100,15,4,8,159,1,240,5,115,19, +240,98,98,4,52,15,2,14,18,47,0,31,5,85,19,240,98,98,18,18,31,17,50,15,5,47, +2,130,34,240,98,98,18,68,15,4,15,1,31,9,12,115,19,240,98,98,18,68,15,16,18, +47,1,15,3,2,84,34,52,18,2,20,20,36,191,8,15,38,114,34,240,114,240,4,15,12, +38,31,16,5,114,34,240,114,146,68,15,18,2,31,1,31,4,114,34,241,147,15,2,6, +41,47,10,86,240,36,240,130,130,3,111,44,242,2,29,111,44,18,3,18,3,7,50,98, +34,2,3,18,50,26,3,66,15,7,63,18,15,49,114,241,79,13,79,101,241,191,6,15,2, +85,52,4,24,37,205,15,3,241,98,6,3,241,178,255,224,63,35,54,32,35,63,25,35, +63,17,35,54,32,35,62,47,41,35,63,51,241,127,0,240,47,70,53,79,254,21,227, +240,18,240,166,243,180,168,194,63,0,240,47,0,240,47,0,194,47,1,242,79,21,5, +15,53,244,137,67,241,34,6,243,107,240,255,35,240,227,76,241,197,240,175,40, +240,122,242,95,68,15,79,241,255,3,111,41,240,238,27,241,207,12,241,79,27, +43,241,67,143,82,50,52,26,251,15,50,255,224,8,53,63,22,53,55,32,32,32,47, +15,63,37,38,32,66,38,67,53,92,98,38,246,96,224,240,44,245,112,80,57,32,68, +112,32,32,35,42,51,100,80,240,63,25,255,233,107,241,242,241,242,247,87,52, +29,241,98,6,3,242,136,15,2,240,122,98,98,98,98,98,98,98,111,66,15,254,12, +146,240,184,132,52,95,70,114,47,74,35,111,25,79,78,240,63,11,242,127,0,255, +224,244,255,240,0,138,143,60,255,240,4,12,143,28,255,227,127,243,95,30,63, +253,79,0,177,240,111,31,240,47,15,63,64,241,152,63,87,63,20,39,243,26,34, +35,47,7,240,255,36,240,15,34,243,5,64,32,223,12,191,7,240,191,13,143,31, +240,224,240,36,41,180,47,25,240,146,39,240,111,7,64,79,34,32,65,52,48,32, +240,162,58,130,213,53,53,166,38,47,27,41,191,99,240,255,255,0,26,150,223,7, +95,33,255,240,0,255,143,254,6,3,245,175,24,109,70,2,146,194,66,2,18,18,245, +207,19,255,224,93,240,79,48,63,38,241,171,246,100,47,119,241,111,10,127,10, +207,73,69,53,53,50,0, }; #endif -#ifdef DUK_USE_SOURCE_NONBMP +#if defined(DUK_USE_SOURCE_NONBMP) /* IdentifierStart production with Letter and ASCII excluded */ /* duk_unicode_ids_m_let_noa[] */ /* @@ -79895,7 +84564,7 @@ const duk_uint8_t duk_unicode_ids_noabmp[611] = { const duk_uint8_t duk_unicode_ids_m_let_noa[42] = { 255,240,0,94,18,255,233,99,241,51,63,254,215,32,240,184,240,2,255,240,6,89, -249,255,240,4,148,79,37,255,224,192,9,15,120,79,255,0,15,30,245,48, +249,255,240,4,148,79,37,255,224,192,9,15,120,79,255,0,15,30,245,240, }; #else /* IdentifierStart production with Letter, ASCII, and non-BMP excluded */ @@ -79910,33 +84579,39 @@ const duk_uint8_t duk_unicode_ids_m_let_noabmp[24] = { }; #endif -#ifdef DUK_USE_SOURCE_NONBMP +#if defined(DUK_USE_SOURCE_NONBMP) /* IdentifierPart production with IdentifierStart and ASCII excluded */ /* duk_unicode_idp_m_ids_noa[] */ /* * Automatically generated by extract_chars.py, do not edit! */ -const duk_uint8_t duk_unicode_idp_m_ids_noa[397] = { +const duk_uint8_t duk_unicode_idp_m_ids_noa[530] = { 255,225,243,246,15,254,0,116,255,191,29,32,33,33,32,243,170,242,47,15,112, 245,118,53,49,35,57,240,144,241,15,11,244,218,240,25,241,56,241,67,40,34, -36,241,210,249,99,242,130,47,2,38,177,57,240,50,242,160,38,49,50,160,177, -57,240,50,242,160,36,81,50,64,240,107,64,194,242,160,39,34,34,240,97,57, -240,50,242,160,38,49,50,145,177,57,240,64,242,212,66,35,160,240,9,240,50, -242,198,34,35,129,193,57,240,65,242,160,38,34,35,129,193,57,240,65,242,198, -34,35,160,177,57,240,65,243,128,85,32,39,240,65,242,240,54,215,41,244,144, -53,33,197,57,243,1,121,192,32,32,81,242,63,4,33,106,47,20,160,245,111,4,41, -211,82,34,54,67,235,46,255,225,179,47,254,42,98,240,242,240,241,241,1,243, -79,14,160,57,241,50,57,248,16,246,139,91,185,245,47,1,129,121,242,244,242, -185,47,13,58,121,245,132,242,31,1,201,240,56,210,241,9,105,241,237,242,47, -4,153,121,246,130,47,5,80,80,251,255,23,240,115,255,225,0,31,35,31,5,15, -109,197,4,191,254,175,34,247,240,245,47,16,255,225,30,95,91,31,255,0,100, -121,159,55,13,31,100,31,254,0,64,64,80,240,148,244,161,242,79,1,201,127,2, -240,9,240,231,240,188,241,227,242,29,240,25,244,29,208,145,57,241,48,242, -96,34,49,97,32,255,224,21,114,19,159,255,0,62,24,15,254,29,95,0,240,38,209, -240,162,251,41,241,112,255,225,177,15,254,25,105,255,228,75,34,22,63,26,37, -15,254,75,66,242,126,241,25,240,34,241,250,255,240,10,249,228,69,151,54, -241,3,248,98,255,228,125,242,47,255,12,23,244,254,0, +36,241,210,246,173,47,17,242,130,47,2,38,177,57,240,50,242,160,38,49,50, +160,177,57,240,50,242,160,36,81,50,64,240,107,64,194,242,160,39,34,34,240, +97,57,240,50,242,160,38,49,50,145,177,57,240,64,242,212,66,35,160,240,9, +240,35,242,198,34,35,129,193,57,240,50,242,160,38,34,35,129,193,57,240,50, +242,198,34,35,160,177,57,240,65,243,128,85,32,39,121,49,242,240,54,215,41, +244,144,53,33,197,57,243,1,121,192,32,32,81,242,63,4,33,106,47,20,160,245, +111,4,41,211,82,34,54,67,235,46,255,225,179,47,254,42,98,240,242,240,241, +241,1,243,47,16,160,57,241,50,57,245,209,241,64,246,139,91,185,247,41,242, +244,242,185,47,13,58,121,240,141,243,68,242,31,1,201,240,56,210,241,12,57, +241,237,242,47,4,153,121,246,130,47,5,80,82,65,251,143,38,100,255,225,0,31, +35,31,5,15,109,197,4,191,254,175,34,247,240,245,47,16,255,225,30,95,91,31, +255,0,100,121,159,55,5,159,18,31,66,31,254,0,64,64,80,240,148,244,161,242, +79,2,185,127,2,240,9,240,231,240,188,241,227,242,29,240,25,192,185,242,29, +208,145,57,241,50,242,64,34,49,97,32,241,180,97,253,231,33,57,255,240,3, +225,128,255,225,213,240,15,2,240,4,31,10,47,178,159,23,15,254,27,16,253,64, +248,116,255,224,25,159,254,68,178,33,99,241,162,80,249,113,255,228,13,47, +39,239,17,159,1,63,31,175,39,151,47,22,210,159,37,13,47,34,218,36,159,68, +183,15,146,182,151,63,42,2,99,19,42,11,19,100,79,178,240,42,159,72,240,77, +159,199,99,143,13,31,68,240,31,1,159,67,201,159,69,229,159,254,9,169,255, +226,57,114,127,2,159,42,240,98,223,255,0,60,157,159,120,79,45,111,11,159, +254,46,191,30,240,35,255,240,3,191,225,255,240,0,59,164,69,151,54,241,3, +248,98,255,228,125,242,47,254,15,79,39,95,34,144,240,0,240,132,46,255,228, +68,98,240,19,98,18,79,254,121,150,245,246,105,255,240,192,105,175,224,0, }; #else /* IdentifierPart production with IdentifierStart, ASCII, and non-BMP excluded */ @@ -79945,29 +84620,29 @@ const duk_uint8_t duk_unicode_idp_m_ids_noa[397] = { * Automatically generated by extract_chars.py, do not edit! */ -const duk_uint8_t duk_unicode_idp_m_ids_noabmp[348] = { +const duk_uint8_t duk_unicode_idp_m_ids_noabmp[357] = { 255,225,243,246,15,254,0,116,255,191,29,32,33,33,32,243,170,242,47,15,112, 245,118,53,49,35,57,240,144,241,15,11,244,218,240,25,241,56,241,67,40,34, -36,241,210,249,99,242,130,47,2,38,177,57,240,50,242,160,38,49,50,160,177, -57,240,50,242,160,36,81,50,64,240,107,64,194,242,160,39,34,34,240,97,57, -240,50,242,160,38,49,50,145,177,57,240,64,242,212,66,35,160,240,9,240,50, -242,198,34,35,129,193,57,240,65,242,160,38,34,35,129,193,57,240,65,242,198, -34,35,160,177,57,240,65,243,128,85,32,39,240,65,242,240,54,215,41,244,144, -53,33,197,57,243,1,121,192,32,32,81,242,63,4,33,106,47,20,160,245,111,4,41, -211,82,34,54,67,235,46,255,225,179,47,254,42,98,240,242,240,241,241,1,243, -79,14,160,57,241,50,57,248,16,246,139,91,185,245,47,1,129,121,242,244,242, -185,47,13,58,121,245,132,242,31,1,201,240,56,210,241,9,105,241,237,242,47, -4,153,121,246,130,47,5,80,80,251,255,23,240,115,255,225,0,31,35,31,5,15, -109,197,4,191,254,175,34,247,240,245,47,16,255,225,30,95,91,31,255,0,100, -121,159,55,13,31,100,31,254,0,64,64,80,240,148,244,161,242,79,1,201,127,2, -240,9,240,231,240,188,241,227,242,29,240,25,244,29,208,145,57,241,48,242, -96,34,49,97,32,255,224,21,114,19,159,255,0,62,24,15,254,29,95,0,240,38,209, -240,162,251,41,241,112,0, +36,241,210,246,173,47,17,242,130,47,2,38,177,57,240,50,242,160,38,49,50, +160,177,57,240,50,242,160,36,81,50,64,240,107,64,194,242,160,39,34,34,240, +97,57,240,50,242,160,38,49,50,145,177,57,240,64,242,212,66,35,160,240,9, +240,35,242,198,34,35,129,193,57,240,50,242,160,38,34,35,129,193,57,240,50, +242,198,34,35,160,177,57,240,65,243,128,85,32,39,121,49,242,240,54,215,41, +244,144,53,33,197,57,243,1,121,192,32,32,81,242,63,4,33,106,47,20,160,245, +111,4,41,211,82,34,54,67,235,46,255,225,179,47,254,42,98,240,242,240,241, +241,1,243,47,16,160,57,241,50,57,245,209,241,64,246,139,91,185,247,41,242, +244,242,185,47,13,58,121,240,141,243,68,242,31,1,201,240,56,210,241,12,57, +241,237,242,47,4,153,121,246,130,47,5,80,82,65,251,143,38,100,255,225,0,31, +35,31,5,15,109,197,4,191,254,175,34,247,240,245,47,16,255,225,30,95,91,31, +255,0,100,121,159,55,5,159,18,31,66,31,254,0,64,64,80,240,148,244,161,242, +79,2,185,127,2,240,9,240,231,240,188,241,227,242,29,240,25,192,185,242,29, +208,145,57,241,50,242,64,34,49,97,32,241,180,97,253,231,33,57,255,240,3, +225,128,255,225,213,240,15,2,240,4,31,10,47,178,159,23,0, }; #endif /* - * Case conversion tables generated using src/extract_caseconv.py. + * Case conversion tables generated using tools/extract_caseconv.py. */ /* duk_unicode_caseconv_uc[] */ @@ -79977,95 +84652,102 @@ const duk_uint8_t duk_unicode_idp_m_ids_noabmp[348] = { * Automatically generated by extract_caseconv.py, do not edit! */ -const duk_uint8_t duk_unicode_caseconv_uc[1288] = { -132,3,128,3,0,184,7,192,6,192,112,35,242,199,224,64,74,192,49,32,128,162, +const duk_uint8_t duk_unicode_caseconv_uc[1386] = { +144,3,128,3,0,184,7,192,6,192,112,35,242,199,224,64,74,192,49,32,128,162, 128,108,65,1,189,129,254,131,3,173,3,136,6,7,98,7,34,68,15,12,14,140,72,30, -104,28,112,32,67,0,65,4,0,138,0,128,4,1,88,65,76,83,15,128,15,132,8,31,16, -31,24,12,62,64,62,80,32,124,192,124,224,64,250,0,250,64,97,246,1,246,129,3, -238,3,247,64,135,220,135,242,2,15,187,15,237,2,31,120,31,248,4,62,244,63, -212,8,125,240,127,232,16,253,128,253,192,33,253,1,253,128,67,252,3,253,0, -136,92,8,88,8,18,104,18,91,26,44,48,44,0,94,90,0,33,64,155,253,7,252,132, -212,0,32,32,32,6,0,76,192,76,129,128,157,0,156,136,1,75,1,74,46,2,244,2, -242,12,6,12,6,8,16,13,8,13,0,48,27,64,27,48,64,57,192,57,162,0,119,192,119, -132,128,252,128,252,20,2,35,2,34,18,4,142,4,140,20,13,196,13,192,16,30,200, -30,192,192,70,16,70,2,32,145,96,145,70,193,48,129,48,67,130,104,130,104,44, -30,1,30,0,150,61,66,61,64,192,125,68,125,100,33,99,65,99,56,50,200,18,200, -6,69,157,133,157,96,169,144,105,144,11,211,64,211,64,12,167,35,167,34,15, -78,103,78,100,126,157,234,157,228,21,59,253,59,240,90,122,26,122,0,163,128, -214,128,214,2,1,197,1,196,6,3,140,3,136,12,7,200,7,196,16,20,0,13,48,32,63, -128,63,112,69,142,101,142,64,130,1,136,1,135,4,3,114,3,112,8,26,120,202, -120,176,65,1,30,1,29,130,2,105,1,150,5,255,96,22,160,115,128,31,224,47,0, -38,32,9,32,47,224,10,96,48,0,72,96,50,64,50,32,50,160,62,192,51,32,51,0,51, -64,71,160,51,192,68,0,53,0,52,224,55,224,62,224,59,160,49,192,62,96,62,32, -74,5,141,224,74,37,141,160,74,69,142,0,74,96,48,32,74,128,48,192,75,32,49, -224,75,96,50,0,76,0,50,96,76,96,50,128,76,180,241,160,77,0,50,224,77,101, -140,64,78,37,141,192,78,64,51,160,78,160,51,224,79,165,140,128,81,0,53,192, -81,32,72,128,81,128,72,160,82,64,54,224,104,160,115,32,110,224,110,192,117, -128,112,192,120,64,116,96,121,128,113,128,122,0,114,64,122,32,115,0,122, -160,116,192,122,192,116,0,122,224,121,224,126,0,115,64,126,32,116,32,126, -64,127,32,126,160,114,160,153,224,152,3,175,52,239,163,175,165,140,99,211, -99,204,3,247,192,115,35,252,163,253,132,41,196,38,68,48,132,48,101,140,37, -140,5,140,160,71,69,140,192,71,217,128,55,224,5,48,5,48,20,152,10,240,1,56, -7,194,0,74,3,12,3,144,192,230,64,194,0,192,64,236,48,58,80,48,128,48,16,88, -120,20,212,21,72,122,90,0,72,3,49,30,151,128,21,0,194,7,166,32,5,112,48, -161,233,152,1,100,12,40,122,106,0,65,2,190,31,80,128,233,64,196,199,212, -176,58,80,49,48,48,1,245,76,14,148,12,76,12,4,125,91,3,165,3,19,3,66,31, -128,135,194,0,230,71,224,97,240,144,57,145,248,40,124,40,14,100,126,14,31, -11,3,153,31,132,135,195,0,230,71,225,97,240,208,57,145,248,104,124,56,14, -100,126,30,31,15,3,153,31,136,135,194,0,230,71,226,97,240,144,57,145,248, -168,124,40,14,100,126,46,31,11,3,153,31,140,135,195,0,230,71,227,97,240, -208,57,145,248,232,124,56,14,100,126,62,31,15,3,153,31,144,135,202,0,230, -71,228,97,242,144,57,145,249,40,124,168,14,100,126,78,31,43,3,153,31,148, -135,203,0,230,71,229,97,242,208,57,145,249,104,124,184,14,100,126,94,31,47, -3,153,31,152,135,202,0,230,71,230,97,242,144,57,145,249,168,124,168,14,100, -126,110,31,43,3,153,31,156,135,203,0,230,71,231,97,242,208,57,145,249,232, -124,184,14,100,126,126,31,47,3,153,31,160,135,218,0,230,71,232,97,246,144, -57,145,250,40,125,168,14,100,126,142,31,107,3,153,31,164,135,219,0,230,71, -233,97,246,208,57,145,250,104,125,184,14,100,126,158,31,111,3,153,31,168, -135,218,0,230,71,234,97,246,144,57,145,250,168,125,168,14,100,126,174,31, -107,3,153,31,172,135,219,0,230,71,235,97,246,208,57,145,250,232,125,184,14, -100,126,190,31,111,3,153,31,178,135,238,128,230,71,236,224,57,16,57,145, -251,72,14,24,14,100,126,218,3,145,3,66,31,183,192,228,64,208,128,230,71, -239,32,57,16,57,145,252,40,127,40,14,100,127,14,3,151,3,153,31,196,128,226, -64,230,71,241,160,57,112,52,33,252,124,14,92,13,8,14,100,127,50,3,151,3, -153,31,210,192,230,64,194,0,192,7,244,240,57,144,48,128,48,17,253,104,14, -100,13,8,127,95,3,153,3,8,3,66,31,226,192,233,64,194,0,192,7,248,240,58,80, -48,128,48,17,254,72,14,132,12,76,127,154,3,165,3,66,31,231,192,233,64,194, -0,208,135,252,161,255,160,57,145,255,56,14,164,14,100,127,210,3,143,3,153, -31,246,128,234,64,208,135,253,240,58,144,52,32,57,145,255,200,14,164,14, -103,236,2,0,70,0,70,251,1,128,17,128,18,126,192,160,4,96,4,207,176,60,1,24, -1,24,1,39,236,19,0,70,0,70,0,76,251,5,128,20,192,21,62,193,160,5,48,5,79, -177,56,21,16,21,27,236,82,5,68,5,53,251,21,129,81,1,78,254,197,160,84,224, -84,111,177,120,21,16,20,244, +104,28,112,32,67,0,65,4,0,138,0,128,4,1,88,65,76,83,9,252,9,248,6,28,131,4, +33,4,62,0,62,16,32,124,64,124,96,48,249,0,249,64,129,243,1,243,129,3,232,3, +233,1,135,216,7,218,4,15,184,15,221,2,31,114,31,200,8,62,236,63,180,8,125, +224,127,224,16,251,208,255,80,33,247,193,255,160,67,246,3,247,0,135,244,7, +246,1,15,240,15,244,2,33,112,33,96,32,73,160,73,108,104,176,192,176,1,121, +104,0,133,2,106,183,1,58,10,31,232,63,228,38,162,1,1,1,0,48,2,102,2,100,12, +4,232,4,228,64,10,88,10,81,112,23,160,23,144,96,48,96,48,64,128,104,64,104, +1,128,218,0,217,130,1,206,1,205,16,3,190,3,188,36,7,228,7,224,160,17,24,17, +16,144,36,112,36,96,160,110,32,110,0,128,246,64,246,6,2,48,130,48,17,4,139, +4,138,54,9,132,9,130,28,19,68,19,65,128,240,8,240,4,177,234,17,234,6,3,234, +35,235,33,11,26,11,25,193,150,64,150,64,50,44,236,44,235,5,76,131,76,128, +94,154,6,154,0,117,57,29,57,16,122,115,58,115,35,244,239,84,239,32,169,223, +233,223,130,211,200,211,200,2,167,151,167,150,21,79,107,79,104,8,112,26, +208,26,192,64,56,160,56,128,192,113,128,113,1,128,249,0,248,130,2,128,1, +166,4,7,240,7,238,8,177,204,177,200,16,96,49,0,48,224,128,110,64,110,1,1, +51,83,213,2,0,48,35,192,35,176,64,77,32,50,192,139,73,196,49,193,127,48,2, +212,14,112,3,252,5,224,4,196,1,36,5,252,1,76,6,0,9,12,6,72,6,68,6,84,7,216, +6,100,6,96,6,104,8,244,6,120,8,128,6,160,6,156,6,252,7,220,7,116,6,56,7, +204,7,196,9,64,177,188,9,68,177,180,9,72,177,192,9,76,6,4,9,80,6,24,9,100, +6,60,9,108,6,64,9,114,158,172,9,128,6,76,9,134,158,176,9,140,6,80,9,150, +158,52,9,160,6,92,9,172,177,136,9,178,158,180,9,196,177,184,9,200,6,116,9, +212,6,124,9,244,177,144,10,30,158,196,10,32,6,184,10,36,9,16,10,48,9,20,10, +72,6,220,10,118,158,200,10,122,158,192,13,20,14,100,13,220,13,216,14,176, +14,24,15,8,14,140,15,48,14,48,15,64,14,72,15,68,14,96,15,84,14,152,15,88, +14,128,15,92,15,60,15,192,14,104,15,196,14,132,15,200,15,228,15,204,13,252, +15,212,14,84,19,60,19,0,114,0,16,72,114,4,16,80,114,8,16,120,114,20,16,136, +114,24,16,168,114,28,17,136,114,34,153,40,117,230,157,244,117,244,177,140, +122,108,121,128,126,248,14,100,127,148,127,176,133,56,132,200,134,16,134, +12,177,132,177,128,177,148,8,232,177,152,8,248,179,204,179,202,158,50,158, +46,173,78,158,207,48,6,252,0,166,0,166,2,147,1,94,0,39,0,248,64,9,64,97, +128,114,24,28,200,24,64,24,8,29,134,7,74,6,16,6,2,11,15,2,154,130,169,15, +75,64,9,0,102,35,210,240,2,160,24,64,244,196,0,174,6,20,61,51,0,44,129,133, +15,77,64,8,32,87,195,234,16,29,40,24,152,250,150,7,74,6,38,6,0,62,169,129, +210,129,137,129,128,143,171,96,116,160,98,96,104,67,240,16,248,64,28,200, +252,12,62,18,7,50,63,5,15,133,1,204,143,193,195,225,96,115,35,240,144,248, +96,28,200,252,44,62,26,7,50,63,13,15,135,1,204,143,195,195,225,224,115,35, +241,16,248,64,28,200,252,76,62,18,7,50,63,21,15,133,1,204,143,197,195,225, +96,115,35,241,144,248,96,28,200,252,108,62,26,7,50,63,29,15,135,1,204,143, +199,195,225,224,115,35,242,16,249,64,28,200,252,140,62,82,7,50,63,37,15, +149,1,204,143,201,195,229,96,115,35,242,144,249,96,28,200,252,172,62,90,7, +50,63,45,15,151,1,204,143,203,195,229,224,115,35,243,16,249,64,28,200,252, +204,62,82,7,50,63,53,15,149,1,204,143,205,195,229,96,115,35,243,144,249,96, +28,200,252,236,62,90,7,50,63,61,15,151,1,204,143,207,195,229,224,115,35, +244,16,251,64,28,200,253,12,62,210,7,50,63,69,15,181,1,204,143,209,195,237, +96,115,35,244,144,251,96,28,200,253,44,62,218,7,50,63,77,15,183,1,204,143, +211,195,237,224,115,35,245,16,251,64,28,200,253,76,62,210,7,50,63,85,15, +181,1,204,143,213,195,237,96,115,35,245,144,251,96,28,200,253,108,62,218,7, +50,63,93,15,183,1,204,143,215,195,237,224,115,35,246,80,253,208,28,200,253, +156,7,34,7,50,63,105,1,195,1,204,143,219,64,114,32,104,67,246,248,28,136, +26,16,28,200,253,228,7,34,7,50,63,133,15,229,1,204,143,225,192,114,224,115, +35,248,144,28,72,28,200,254,52,7,46,6,132,63,143,129,203,129,161,1,204,143, +230,64,114,224,115,35,250,88,28,200,24,64,24,0,254,158,7,50,6,16,6,2,63, +173,1,204,129,161,15,235,224,115,32,97,0,104,67,252,88,29,40,24,64,24,0, +255,30,7,74,6,16,6,2,63,201,1,208,129,137,143,243,64,116,160,104,67,252, +248,29,40,24,64,26,16,255,148,63,244,7,50,63,231,1,212,129,204,143,250,64, +113,224,115,35,254,208,29,72,26,16,255,190,7,82,6,132,7,50,63,249,1,212, +129,204,253,128,64,8,192,8,223,96,48,2,48,2,79,216,20,0,140,0,153,246,7, +128,35,0,35,0,36,253,130,96,8,192,8,192,9,159,96,176,2,152,2,167,216,52,0, +166,0,169,246,39,2,162,2,163,125,138,64,168,128,166,191,98,176,42,32,41, +223,216,180,10,156,10,141,246,47,2,162,2,158,128, }; -const duk_uint8_t duk_unicode_caseconv_lc[616] = { -144,3,0,3,128,184,6,192,7,192,112,24,144,37,96,64,54,32,81,64,128,226,0, +const duk_uint8_t duk_unicode_caseconv_lc[680] = { +152,3,0,3,128,184,6,192,7,192,112,24,144,37,96,64,54,32,81,64,128,226,0, 235,65,129,199,1,230,130,3,145,3,177,34,7,70,7,134,36,15,244,13,236,24,32, -0,34,129,0,65,0,67,4,0,166,32,172,41,132,40,11,64,19,15,132,15,128,8,31,24, -31,16,12,62,80,62,64,32,124,224,124,192,64,250,64,250,0,97,246,129,246,1,3, -241,3,240,2,7,230,7,228,4,15,212,15,208,8,31,184,31,176,4,63,116,62,224,8, -127,32,125,200,32,254,192,254,128,33,253,161,247,96,67,253,3,252,0,135,250, -135,222,129,15,252,15,188,2,31,250,31,124,4,66,192,66,224,64,146,216,147, -64,209,96,1,97,130,242,199,224,35,240,95,228,63,232,38,161,1,0,1,1,48,2, -100,2,102,12,4,228,4,232,64,10,80,10,89,112,23,144,23,160,96,48,64,48,96, -128,104,0,104,65,128,217,128,218,2,1,203,1,204,18,3,188,3,190,36,7,200,7, -204,16,15,192,15,201,64,34,32,34,49,32,72,192,72,225,64,220,0,220,65,1,236, -1,236,140,4,96,4,97,34,9,20,9,22,108,19,4,19,8,56,38,128,38,138,193,224,1, -224,25,99,212,3,212,44,7,214,71,212,66,22,51,150,52,3,44,128,44,129,100,89, -214,89,216,10,153,2,153,4,189,52,5,52,8,202,114,42,114,48,244,230,84,230, -103,233,222,105,222,129,83,191,83,191,133,167,160,167,161,10,48,13,48,20,0, -32,26,192,26,208,64,56,128,56,192,192,113,64,113,129,1,251,129,252,2,44, -114,44,115,4,16,12,56,12,64,32,27,128,27,144,64,211,197,211,198,2,8,6,88,9, -164,16,17,216,17,224,47,245,1,120,0,255,1,129,2,83,1,134,2,84,1,142,1,221, -1,143,2,89,1,144,2,91,1,145,1,146,1,147,2,96,1,148,2,99,1,151,2,104,1,152, -1,153,1,157,2,114,1,159,2,117,1,167,1,168,1,174,2,136,1,183,2,146,1,241,1, -243,1,246,1,149,1,247,1,191,2,32,1,158,2,58,44,101,2,61,1,154,2,62,44,102, -2,67,1,128,2,68,2,137,2,69,2,140,3,118,3,119,3,134,3,172,3,140,3,204,3,207, -3,215,3,244,3,184,3,249,3,242,4,192,4,207,30,158,0,223,31,188,31,179,31, -204,31,195,31,236,31,229,31,252,31,243,33,38,3,201,33,42,0,107,33,43,0,229, -33,50,33,78,33,131,33,132,44,96,44,97,44,98,2,107,44,99,29,125,44,100,2, -125,44,109,2,81,44,110,2,113,44,111,2,80,44,112,2,82,167,125,29,121,167, -141,2,101,2,2,97,0,52,129,131,128, +0,34,129,0,65,0,67,4,0,166,32,172,41,132,40,11,64,19,9,208,85,184,80,19, +240,19,248,12,62,16,62,0,32,124,96,124,64,48,249,64,249,0,129,243,129,243, +1,3,233,3,232,1,135,218,7,216,4,15,196,15,192,8,31,152,31,144,16,63,80,63, +64,32,126,224,126,192,16,253,208,251,128,33,252,129,247,32,131,251,3,250,0, +135,246,135,221,129,15,244,15,240,2,31,234,31,122,4,63,240,62,240,8,127, +232,125,240,17,11,1,11,129,2,75,98,77,3,69,128,5,134,11,203,31,128,143,193, +127,144,255,160,154,140,4,0,4,4,192,9,144,9,152,48,19,144,19,161,0,41,64, +41,101,192,94,64,94,129,128,193,0,193,130,1,160,1,161,6,3,102,3,104,8,7,44, +7,48,72,14,240,14,248,144,31,32,31,48,64,63,0,63,37,0,136,128,136,196,129, +35,1,35,133,3,112,3,113,4,7,176,7,178,48,17,128,17,132,136,36,80,36,89,176, +76,16,76,32,224,154,0,154,44,7,128,7,128,101,143,80,15,80,176,31,89,31,81, +8,88,206,88,208,12,178,0,178,5,145,103,89,103,96,42,100,10,100,18,244,208, +20,208,35,169,200,169,200,195,211,153,83,153,159,167,121,167,122,5,78,253, +78,254,22,158,66,158,68,21,60,181,60,184,170,123,74,123,80,67,0,211,1,64,2, +1,172,1,173,4,3,136,3,140,12,7,20,7,24,16,31,184,31,192,34,199,34,199,48, +65,128,195,128,196,2,1,184,1,185,5,79,84,4,204,8,0,192,101,128,154,65,1,29, +129,30,2,16,199,45,39,5,251,240,23,128,15,240,24,16,37,48,24,96,37,64,24, +224,29,208,24,240,37,144,25,0,37,176,25,16,25,32,25,48,38,0,25,64,38,48,25, +112,38,128,25,128,25,144,25,208,39,32,25,240,39,80,26,112,26,128,26,224,40, +128,27,112,41,32,31,16,31,48,31,96,25,80,31,112,27,240,34,0,25,224,35,162, +198,80,35,208,25,160,35,226,198,96,36,48,24,0,36,64,40,144,36,80,40,192,55, +96,55,112,55,240,63,48,56,96,58,192,56,192,60,192,60,240,61,112,63,64,59, +128,63,144,63,32,76,0,76,241,233,224,13,241,251,193,251,49,252,193,252,49, +254,193,254,81,255,193,255,50,18,96,60,146,18,160,6,178,18,176,14,82,19,34, +20,226,24,50,24,66,198,2,198,18,198,32,38,178,198,49,215,210,198,64,39,210, +198,208,37,18,198,224,39,18,198,240,37,2,199,0,37,34,207,34,207,58,119,209, +215,154,120,186,120,202,120,208,38,90,122,176,37,202,122,192,38,26,122,208, +38,202,123,0,41,234,123,16,40,122,123,32,41,218,123,58,181,48,32,38,16,3, +72,24,56, }; #if defined(DUK_USE_REGEXP_CANON_WORKAROUND) @@ -80105,5803 +84787,5800 @@ const duk_uint16_t duk_unicode_re_canon_lookup[65536] = { 540,540,542,542,544,545,546,546,548,548,550,550,552,552,554,554,556,556, 558,558,560,560,562,562,564,565,566,567,568,569,570,571,571,573,574,11390, 11391,577,577,579,580,581,582,582,584,584,586,586,588,588,590,590,11375, -11373,11376,385,390,597,393,394,600,399,602,400,604,605,606,607,403,609, -610,404,612,42893L,614,615,407,406,618,11362,620,621,622,412,624,11374,413, -627,628,415,630,631,632,633,634,635,636,11364,638,639,422,641,642,425,644, -645,646,647,430,580,433,434,581,653,654,655,656,657,439,659,660,661,662, -663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680, -681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698, -699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716, -717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734, -735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752, -753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770, -771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788, -789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806, -807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824, -825,826,827,828,829,830,831,832,833,834,835,836,921,838,839,840,841,842, -843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860, -861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878, -879,880,880,882,882,884,885,886,886,888,889,890,1021,1022,1023,894,895,896, -897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914, -915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932, -933,934,935,936,937,938,939,902,904,905,906,944,913,914,915,916,917,918, -919,920,921,922,923,924,925,926,927,928,929,931,931,932,933,934,935,936, -937,938,939,908,910,911,975,914,920,978,979,980,934,928,975,984,984,986, -986,988,988,990,990,992,992,994,994,996,996,998,998,1000,1000,1002,1002, -1004,1004,1006,1006,922,929,1017,1011,1012,917,1014,1015,1015,1017,1018, -1018,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033, -1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048, -1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063, -1064,1065,1066,1067,1068,1069,1070,1071,1040,1041,1042,1043,1044,1045,1046, -1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061, -1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1024,1025,1026,1027,1028, -1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1120,1120,1122,1122, -1124,1124,1126,1126,1128,1128,1130,1130,1132,1132,1134,1134,1136,1136,1138, -1138,1140,1140,1142,1142,1144,1144,1146,1146,1148,1148,1150,1150,1152,1152, -1154,1155,1156,1157,1158,1159,1160,1161,1162,1162,1164,1164,1166,1166,1168, -1168,1170,1170,1172,1172,1174,1174,1176,1176,1178,1178,1180,1180,1182,1182, -1184,1184,1186,1186,1188,1188,1190,1190,1192,1192,1194,1194,1196,1196,1198, -1198,1200,1200,1202,1202,1204,1204,1206,1206,1208,1208,1210,1210,1212,1212, -1214,1214,1216,1217,1217,1219,1219,1221,1221,1223,1223,1225,1225,1227,1227, -1229,1229,1216,1232,1232,1234,1234,1236,1236,1238,1238,1240,1240,1242,1242, -1244,1244,1246,1246,1248,1248,1250,1250,1252,1252,1254,1254,1256,1256,1258, -1258,1260,1260,1262,1262,1264,1264,1266,1266,1268,1268,1270,1270,1272,1272, -1274,1274,1276,1276,1278,1278,1280,1280,1282,1282,1284,1284,1286,1286,1288, -1288,1290,1290,1292,1292,1294,1294,1296,1296,1298,1298,1300,1300,1302,1302, -1304,1304,1306,1306,1308,1308,1310,1310,1312,1312,1314,1314,1316,1316,1318, -1318,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333, -1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348, -1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363, -1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1329,1330, -1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345, -1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360, -1361,1362,1363,1364,1365,1366,1415,1416,1417,1418,1419,1420,1421,1422,1423, -1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438, -1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453, -1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468, -1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483, -1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498, -1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513, -1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528, -1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543, -1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558, -1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573, -1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588, -1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603, -1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618, -1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633, -1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648, -1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663, -1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678, -1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693, -1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708, -1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723, -1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738, -1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753, -1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768, -1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783, -1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798, -1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813, -1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828, -1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843, -1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858, -1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873, -1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888, -1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903, -1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918, -1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933, -1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948, -1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963, -1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978, -1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993, -1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008, -2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023, -2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038, -2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053, -2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068, -2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083, -2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098, -2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113, -2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128, -2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143, -2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158, -2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173, -2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188, -2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203, -2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218, -2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233, -2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248, -2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263, -2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278, -2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293, -2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308, -2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323, -2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338, -2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353, -2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368, -2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383, -2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398, -2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413, -2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428, -2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443, -2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458, -2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473, -2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2488, -2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503, -2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518, -2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533, -2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548, -2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563, -2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578, -2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593, -2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608, -2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623, -2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638, -2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653, -2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668, -2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683, -2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698, -2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713, -2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728, -2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743, -2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758, -2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773, -2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788, -2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803, -2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818, -2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833, -2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848, -2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863, -2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878, -2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893, -2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908, -2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923, -2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938, -2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953, -2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968, -2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983, -2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998, -2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013, -3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028, -3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043, -3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058, -3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073, -3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088, -3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103, -3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118, -3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133, -3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148, -3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,3160,3161,3162,3163, -3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178, -3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193, -3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,3205,3206,3207,3208, -3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,3220,3221,3222,3223, -3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238, -3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253, -3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268, -3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283, -3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298, -3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3312,3313, -3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,3328, -3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, -3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358, -3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373, -3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388, -3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403, -3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418, -3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433, -3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448, -3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463, -3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478, -3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493, -3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508, -3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,3520,3521,3522,3523, -3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538, -3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553, -3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568, -3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579,3580,3581,3582,3583, -3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598, -3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613, -3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628, -3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643, -3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658, -3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673, -3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685,3686,3687,3688, -3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699,3700,3701,3702,3703, -3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,3715,3716,3717,3718, -3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733, -3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3748, -3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763, -3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778, -3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793, -3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804,3805,3806,3807,3808, -3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,3822,3823, -3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838, -3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853, -3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864,3865,3866,3867,3868, -3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3883, -3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,3895,3896,3897,3898, -3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3912,3913, -3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928, -3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943, -3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,3955,3956,3957,3958, -3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3973, -3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988, -3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003, -4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018, -4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029,4030,4031,4032,4033, -4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044,4045,4046,4047,4048, -4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,4060,4061,4062,4063, -4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074,4075,4076,4077,4078, -4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089,4090,4091,4092,4093, -4094,4095,4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,4107,4108, -4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119,4120,4121,4122,4123, -4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,4138, -4139,4140,4141,4142,4143,4144,4145,4146,4147,4148,4149,4150,4151,4152,4153, -4154,4155,4156,4157,4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168, -4169,4170,4171,4172,4173,4174,4175,4176,4177,4178,4179,4180,4181,4182,4183, -4184,4185,4186,4187,4188,4189,4190,4191,4192,4193,4194,4195,4196,4197,4198, -4199,4200,4201,4202,4203,4204,4205,4206,4207,4208,4209,4210,4211,4212,4213, -4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,4225,4226,4227,4228, -4229,4230,4231,4232,4233,4234,4235,4236,4237,4238,4239,4240,4241,4242,4243, -4244,4245,4246,4247,4248,4249,4250,4251,4252,4253,4254,4255,4256,4257,4258, -4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273, -4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288, -4289,4290,4291,4292,4293,4294,4295,4296,4297,4298,4299,4300,4301,4302,4303, -4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318, -4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333, -4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4347,4348, -4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363, -4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378, -4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,4390,4391,4392,4393, -4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,4405,4406,4407,4408, -4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419,4420,4421,4422,4423, -4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434,4435,4436,4437,4438, -4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450,4451,4452,4453, -4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468, -4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479,4480,4481,4482,4483, -4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,4495,4496,4497,4498, -4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,4510,4511,4512,4513, -4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524,4525,4526,4527,4528, -4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,4540,4541,4542,4543, -4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554,4555,4556,4557,4558, -4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569,4570,4571,4572,4573, -4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,4585,4586,4587,4588, -4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,4600,4601,4602,4603, -4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618, -4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629,4630,4631,4632,4633, -4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644,4645,4646,4647,4648, -4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659,4660,4661,4662,4663, -4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674,4675,4676,4677,4678, -4679,4680,4681,4682,4683,4684,4685,4686,4687,4688,4689,4690,4691,4692,4693, -4694,4695,4696,4697,4698,4699,4700,4701,4702,4703,4704,4705,4706,4707,4708, -4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,4720,4721,4722,4723, -4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4736,4737,4738, -4739,4740,4741,4742,4743,4744,4745,4746,4747,4748,4749,4750,4751,4752,4753, -4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,4765,4766,4767,4768, -4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779,4780,4781,4782,4783, -4784,4785,4786,4787,4788,4789,4790,4791,4792,4793,4794,4795,4796,4797,4798, -4799,4800,4801,4802,4803,4804,4805,4806,4807,4808,4809,4810,4811,4812,4813, -4814,4815,4816,4817,4818,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828, -4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843, -4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858, -4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869,4870,4871,4872,4873, -4874,4875,4876,4877,4878,4879,4880,4881,4882,4883,4884,4885,4886,4887,4888, -4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,4900,4901,4902,4903, -4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918, -4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,4930,4931,4932,4933, -4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,4945,4946,4947,4948, -4949,4950,4951,4952,4953,4954,4955,4956,4957,4958,4959,4960,4961,4962,4963, -4964,4965,4966,4967,4968,4969,4970,4971,4972,4973,4974,4975,4976,4977,4978, -4979,4980,4981,4982,4983,4984,4985,4986,4987,4988,4989,4990,4991,4992,4993, -4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,5005,5006,5007,5008, -5009,5010,5011,5012,5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023, -5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038, -5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053, -5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068, -5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083, -5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098, -5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,5113, -5114,5115,5116,5117,5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128, -5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143, -5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,5155,5156,5157,5158, -5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173, -5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188, -5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,5200,5201,5202,5203, -5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,5215,5216,5217,5218, -5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233, -5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,5248, -5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263, -5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, -5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, -5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,5305,5306,5307,5308, -5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,5322,5323, -5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334,5335,5336,5337,5338, -5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, -5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368, -5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383, -5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398, -5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,5413, -5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428, -5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440,5441,5442,5443, -5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458, -5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473, -5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, -5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503, -5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518, -5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533, -5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548, -5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563, -5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574,5575,5576,5577,5578, -5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589,5590,5591,5592,5593, -5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604,5605,5606,5607,5608, -5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619,5620,5621,5622,5623, -5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638, -5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5650,5651,5652,5653, -5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,5665,5666,5667,5668, -5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680,5681,5682,5683, -5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696,5697,5698, -5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712,5713, -5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, -5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743, -5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758, -5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773, -5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788, -5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803, -5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,5816,5817,5818, -5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,5832,5833, -5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,5848, -5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860,5861,5862,5863, -5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876,5877,5878, -5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892,5893, -5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, -5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923, -5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938, -5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953, -5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, -5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983, -5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998, -5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013, -6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028, -6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043, -6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058, -6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071,6072,6073, -6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,6085,6086,6087,6088, -6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102,6103, -6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, -6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132,6133, -6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, -6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, -6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178, -6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193, -6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208, -6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223, -6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238, -6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253, -6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264,6265,6266,6267,6268, -6269,6270,6271,6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283, -6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298, -6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6311,6312,6313, -6314,6315,6316,6317,6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328, -6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339,6340,6341,6342,6343, -6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358, -6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373, -6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384,6385,6386,6387,6388, -6389,6390,6391,6392,6393,6394,6395,6396,6397,6398,6399,6400,6401,6402,6403, -6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,6415,6416,6417,6418, -6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429,6430,6431,6432,6433, -6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6444,6445,6446,6447,6448, -6449,6450,6451,6452,6453,6454,6455,6456,6457,6458,6459,6460,6461,6462,6463, -6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474,6475,6476,6477,6478, -6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,6490,6491,6492,6493, -6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504,6505,6506,6507,6508, -6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,6520,6521,6522,6523, -6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535,6536,6537,6538, -6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,6552,6553, -6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,6566,6567,6568, -6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581,6582,6583, -6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,6598, -6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, -6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628, -6629,6630,6631,6632,6633,6634,6635,6636,6637,6638,6639,6640,6641,6642,6643, -6644,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658, -6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673, -6674,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688, -6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703, -6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718, -6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731,6732,6733, -6734,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,6746,6747,6748, -6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761,6762,6763, -6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778, -6779,6780,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793, -6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808, -6809,6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823, -6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,6837,6838, -6839,6840,6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853, -6854,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868, -6869,6870,6871,6872,6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883, -6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894,6895,6896,6897,6898, -6899,6900,6901,6902,6903,6904,6905,6906,6907,6908,6909,6910,6911,6912,6913, -6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928, -6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939,6940,6941,6942,6943, -6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954,6955,6956,6957,6958, -6959,6960,6961,6962,6963,6964,6965,6966,6967,6968,6969,6970,6971,6972,6973, -6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984,6985,6986,6987,6988, -6989,6990,6991,6992,6993,6994,6995,6996,6997,6998,6999,7000,7001,7002,7003, -7004,7005,7006,7007,7008,7009,7010,7011,7012,7013,7014,7015,7016,7017,7018, -7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029,7030,7031,7032,7033, -7034,7035,7036,7037,7038,7039,7040,7041,7042,7043,7044,7045,7046,7047,7048, -7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059,7060,7061,7062,7063, -7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074,7075,7076,7077,7078, -7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090,7091,7092,7093, -7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106,7107,7108, -7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,7123, -7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, -7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153, -7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168, -7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, -7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198, -7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, -7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228, -7229,7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243, -7244,7245,7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258, -7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273, -7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288, -7289,7290,7291,7292,7293,7294,7295,7296,7297,7298,7299,7300,7301,7302,7303, -7304,7305,7306,7307,7308,7309,7310,7311,7312,7313,7314,7315,7316,7317,7318, -7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,7329,7330,7331,7332,7333, -7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348, -7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359,7360,7361,7362,7363, -7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375,7376,7377,7378, -7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,7392,7393, -7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407,7408, -7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, -7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438, -7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453, -7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468, -7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483, -7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498, -7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513, -7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528, -7529,7530,7531,7532,7533,7534,7535,7536,7537,7538,7539,7540,7541,7542,7543, -7544,42877L,7546,7547,7548,11363,7550,7551,7552,7553,7554,7555,7556,7557, -7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,7568,7569,7570,7571,7572, -7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587, -7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602, -7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,7616,7617, -7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,7632, -7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, -7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662, -7663,7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677, -7678,7679,7680,7680,7682,7682,7684,7684,7686,7686,7688,7688,7690,7690,7692, -7692,7694,7694,7696,7696,7698,7698,7700,7700,7702,7702,7704,7704,7706,7706, -7708,7708,7710,7710,7712,7712,7714,7714,7716,7716,7718,7718,7720,7720,7722, -7722,7724,7724,7726,7726,7728,7728,7730,7730,7732,7732,7734,7734,7736,7736, -7738,7738,7740,7740,7742,7742,7744,7744,7746,7746,7748,7748,7750,7750,7752, -7752,7754,7754,7756,7756,7758,7758,7760,7760,7762,7762,7764,7764,7766,7766, -7768,7768,7770,7770,7772,7772,7774,7774,7776,7776,7778,7778,7780,7780,7782, -7782,7784,7784,7786,7786,7788,7788,7790,7790,7792,7792,7794,7794,7796,7796, -7798,7798,7800,7800,7802,7802,7804,7804,7806,7806,7808,7808,7810,7810,7812, -7812,7814,7814,7816,7816,7818,7818,7820,7820,7822,7822,7824,7824,7826,7826, -7828,7828,7830,7831,7832,7833,7834,7776,7836,7837,7838,7839,7840,7840,7842, -7842,7844,7844,7846,7846,7848,7848,7850,7850,7852,7852,7854,7854,7856,7856, -7858,7858,7860,7860,7862,7862,7864,7864,7866,7866,7868,7868,7870,7870,7872, -7872,7874,7874,7876,7876,7878,7878,7880,7880,7882,7882,7884,7884,7886,7886, -7888,7888,7890,7890,7892,7892,7894,7894,7896,7896,7898,7898,7900,7900,7902, -7902,7904,7904,7906,7906,7908,7908,7910,7910,7912,7912,7914,7914,7916,7916, -7918,7918,7920,7920,7922,7922,7924,7924,7926,7926,7928,7928,7930,7930,7932, -7932,7934,7934,7944,7945,7946,7947,7948,7949,7950,7951,7944,7945,7946,7947, -7948,7949,7950,7951,7960,7961,7962,7963,7964,7965,7958,7959,7960,7961,7962, -7963,7964,7965,7966,7967,7976,7977,7978,7979,7980,7981,7982,7983,7976,7977, -7978,7979,7980,7981,7982,7983,7992,7993,7994,7995,7996,7997,7998,7999,7992, -7993,7994,7995,7996,7997,7998,7999,8008,8009,8010,8011,8012,8013,8006,8007, -8008,8009,8010,8011,8012,8013,8014,8015,8016,8025,8018,8027,8020,8029,8022, -8031,8024,8025,8026,8027,8028,8029,8030,8031,8040,8041,8042,8043,8044,8045, -8046,8047,8040,8041,8042,8043,8044,8045,8046,8047,8122,8123,8136,8137,8138, -8139,8154,8155,8184,8185,8170,8171,8186,8187,8062,8063,8064,8065,8066,8067, -8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080,8081,8082, -8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097, -8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,8120, -8121,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,921,8127, -8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142, -8143,8152,8153,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157, -8158,8159,8168,8169,8162,8163,8164,8172,8166,8167,8168,8169,8170,8171,8172, -8173,8174,8175,8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187, -8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202, -8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, -8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232, -8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247, -8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261,8262, -8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, -8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292, -8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307, -8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, -8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, -8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352, -8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, -8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, -8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397, -8398,8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412, -8413,8414,8415,8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427, -8428,8429,8430,8431,8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442, -8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457, -8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472, -8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485,8486,8487, -8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502, -8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, -8518,8519,8520,8521,8522,8523,8524,8525,8498,8527,8528,8529,8530,8531,8532, -8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547, -8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8544,8545,8546, -8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8576,8577, -8578,8579,8579,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592, -8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, -8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622, -8623,8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637, -8638,8639,8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652, -8653,8654,8655,8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667, -8668,8669,8670,8671,8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682, -8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693,8694,8695,8696,8697, -8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709,8710,8711,8712, -8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725,8726,8727, -8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741,8742, -8743,8744,8745,8746,8747,8748,8749,8750,8751,8752,8753,8754,8755,8756,8757, -8758,8759,8760,8761,8762,8763,8764,8765,8766,8767,8768,8769,8770,8771,8772, -8773,8774,8775,8776,8777,8778,8779,8780,8781,8782,8783,8784,8785,8786,8787, -8788,8789,8790,8791,8792,8793,8794,8795,8796,8797,8798,8799,8800,8801,8802, -8803,8804,8805,8806,8807,8808,8809,8810,8811,8812,8813,8814,8815,8816,8817, -8818,8819,8820,8821,8822,8823,8824,8825,8826,8827,8828,8829,8830,8831,8832, -8833,8834,8835,8836,8837,8838,8839,8840,8841,8842,8843,8844,8845,8846,8847, -8848,8849,8850,8851,8852,8853,8854,8855,8856,8857,8858,8859,8860,8861,8862, -8863,8864,8865,8866,8867,8868,8869,8870,8871,8872,8873,8874,8875,8876,8877, -8878,8879,8880,8881,8882,8883,8884,8885,8886,8887,8888,8889,8890,8891,8892, -8893,8894,8895,8896,8897,8898,8899,8900,8901,8902,8903,8904,8905,8906,8907, -8908,8909,8910,8911,8912,8913,8914,8915,8916,8917,8918,8919,8920,8921,8922, -8923,8924,8925,8926,8927,8928,8929,8930,8931,8932,8933,8934,8935,8936,8937, -8938,8939,8940,8941,8942,8943,8944,8945,8946,8947,8948,8949,8950,8951,8952, -8953,8954,8955,8956,8957,8958,8959,8960,8961,8962,8963,8964,8965,8966,8967, -8968,8969,8970,8971,8972,8973,8974,8975,8976,8977,8978,8979,8980,8981,8982, -8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,8993,8994,8995,8996,8997, -8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008,9009,9010,9011,9012, -9013,9014,9015,9016,9017,9018,9019,9020,9021,9022,9023,9024,9025,9026,9027, -9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039,9040,9041,9042, -9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055,9056,9057, -9058,9059,9060,9061,9062,9063,9064,9065,9066,9067,9068,9069,9070,9071,9072, -9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085,9086,9087, -9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101,9102, -9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, -9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132, -9133,9134,9135,9136,9137,9138,9139,9140,9141,9142,9143,9144,9145,9146,9147, -9148,9149,9150,9151,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162, -9163,9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,9176,9177, -9178,9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192, -9193,9194,9195,9196,9197,9198,9199,9200,9201,9202,9203,9204,9205,9206,9207, -9208,9209,9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222, -9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237, -9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9248,9249,9250,9251,9252, -9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267, -9268,9269,9270,9271,9272,9273,9274,9275,9276,9277,9278,9279,9280,9281,9282, -9283,9284,9285,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297, -9298,9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312, -9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327, -9328,9329,9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342, -9343,9344,9345,9346,9347,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357, -9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372, -9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,9384,9385,9386,9387, -9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402, -9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,9417, -9418,9419,9420,9421,9422,9423,9398,9399,9400,9401,9402,9403,9404,9405,9406, -9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,9417,9418,9419,9420,9421, -9422,9423,9450,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461,9462, -9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,9473,9474,9475,9476,9477, -9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492, -9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507, -9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522, -9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537, -9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, -9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567, -9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582, -9583,9584,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597, -9598,9599,9600,9601,9602,9603,9604,9605,9606,9607,9608,9609,9610,9611,9612, -9613,9614,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627, -9628,9629,9630,9631,9632,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642, -9643,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657, -9658,9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672, -9673,9674,9675,9676,9677,9678,9679,9680,9681,9682,9683,9684,9685,9686,9687, -9688,9689,9690,9691,9692,9693,9694,9695,9696,9697,9698,9699,9700,9701,9702, -9703,9704,9705,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715,9716,9717, -9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731,9732, -9733,9734,9735,9736,9737,9738,9739,9740,9741,9742,9743,9744,9745,9746,9747, -9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,9759,9760,9761,9762, -9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776,9777, -9778,9779,9780,9781,9782,9783,9784,9785,9786,9787,9788,9789,9790,9791,9792, -9793,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806,9807, -9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, -9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837, -9838,9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852, -9853,9854,9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867, -9868,9869,9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882, -9883,9884,9885,9886,9887,9888,9889,9890,9891,9892,9893,9894,9895,9896,9897, -9898,9899,9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912, -9913,9914,9915,9916,9917,9918,9919,9920,9921,9922,9923,9924,9925,9926,9927, -9928,9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942, -9943,9944,9945,9946,9947,9948,9949,9950,9951,9952,9953,9954,9955,9956,9957, -9958,9959,9960,9961,9962,9963,9964,9965,9966,9967,9968,9969,9970,9971,9972, -9973,9974,9975,9976,9977,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, -9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001, -10002,10003,10004,10005,10006,10007,10008,10009,10010,10011,10012,10013, -10014,10015,10016,10017,10018,10019,10020,10021,10022,10023,10024,10025, -10026,10027,10028,10029,10030,10031,10032,10033,10034,10035,10036,10037, -10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,10049, -10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061, -10062,10063,10064,10065,10066,10067,10068,10069,10070,10071,10072,10073, -10074,10075,10076,10077,10078,10079,10080,10081,10082,10083,10084,10085, -10086,10087,10088,10089,10090,10091,10092,10093,10094,10095,10096,10097, -10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109, -10110,10111,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121, -10122,10123,10124,10125,10126,10127,10128,10129,10130,10131,10132,10133, -10134,10135,10136,10137,10138,10139,10140,10141,10142,10143,10144,10145, -10146,10147,10148,10149,10150,10151,10152,10153,10154,10155,10156,10157, -10158,10159,10160,10161,10162,10163,10164,10165,10166,10167,10168,10169, -10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181, -10182,10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,10193, -10194,10195,10196,10197,10198,10199,10200,10201,10202,10203,10204,10205, -10206,10207,10208,10209,10210,10211,10212,10213,10214,10215,10216,10217, -10218,10219,10220,10221,10222,10223,10224,10225,10226,10227,10228,10229, -10230,10231,10232,10233,10234,10235,10236,10237,10238,10239,10240,10241, -10242,10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253, -10254,10255,10256,10257,10258,10259,10260,10261,10262,10263,10264,10265, -10266,10267,10268,10269,10270,10271,10272,10273,10274,10275,10276,10277, -10278,10279,10280,10281,10282,10283,10284,10285,10286,10287,10288,10289, -10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301, -10302,10303,10304,10305,10306,10307,10308,10309,10310,10311,10312,10313, -10314,10315,10316,10317,10318,10319,10320,10321,10322,10323,10324,10325, -10326,10327,10328,10329,10330,10331,10332,10333,10334,10335,10336,10337, -10338,10339,10340,10341,10342,10343,10344,10345,10346,10347,10348,10349, -10350,10351,10352,10353,10354,10355,10356,10357,10358,10359,10360,10361, -10362,10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373, -10374,10375,10376,10377,10378,10379,10380,10381,10382,10383,10384,10385, -10386,10387,10388,10389,10390,10391,10392,10393,10394,10395,10396,10397, -10398,10399,10400,10401,10402,10403,10404,10405,10406,10407,10408,10409, -10410,10411,10412,10413,10414,10415,10416,10417,10418,10419,10420,10421, -10422,10423,10424,10425,10426,10427,10428,10429,10430,10431,10432,10433, -10434,10435,10436,10437,10438,10439,10440,10441,10442,10443,10444,10445, -10446,10447,10448,10449,10450,10451,10452,10453,10454,10455,10456,10457, -10458,10459,10460,10461,10462,10463,10464,10465,10466,10467,10468,10469, -10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481, -10482,10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493, -10494,10495,10496,10497,10498,10499,10500,10501,10502,10503,10504,10505, -10506,10507,10508,10509,10510,10511,10512,10513,10514,10515,10516,10517, -10518,10519,10520,10521,10522,10523,10524,10525,10526,10527,10528,10529, -10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541, -10542,10543,10544,10545,10546,10547,10548,10549,10550,10551,10552,10553, -10554,10555,10556,10557,10558,10559,10560,10561,10562,10563,10564,10565, -10566,10567,10568,10569,10570,10571,10572,10573,10574,10575,10576,10577, -10578,10579,10580,10581,10582,10583,10584,10585,10586,10587,10588,10589, -10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601, -10602,10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613, -10614,10615,10616,10617,10618,10619,10620,10621,10622,10623,10624,10625, -10626,10627,10628,10629,10630,10631,10632,10633,10634,10635,10636,10637, -10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648,10649, -10650,10651,10652,10653,10654,10655,10656,10657,10658,10659,10660,10661, -10662,10663,10664,10665,10666,10667,10668,10669,10670,10671,10672,10673, -10674,10675,10676,10677,10678,10679,10680,10681,10682,10683,10684,10685, -10686,10687,10688,10689,10690,10691,10692,10693,10694,10695,10696,10697, -10698,10699,10700,10701,10702,10703,10704,10705,10706,10707,10708,10709, -10710,10711,10712,10713,10714,10715,10716,10717,10718,10719,10720,10721, -10722,10723,10724,10725,10726,10727,10728,10729,10730,10731,10732,10733, -10734,10735,10736,10737,10738,10739,10740,10741,10742,10743,10744,10745, -10746,10747,10748,10749,10750,10751,10752,10753,10754,10755,10756,10757, -10758,10759,10760,10761,10762,10763,10764,10765,10766,10767,10768,10769, -10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780,10781, -10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793, -10794,10795,10796,10797,10798,10799,10800,10801,10802,10803,10804,10805, -10806,10807,10808,10809,10810,10811,10812,10813,10814,10815,10816,10817, -10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828,10829, -10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841, -10842,10843,10844,10845,10846,10847,10848,10849,10850,10851,10852,10853, -10854,10855,10856,10857,10858,10859,10860,10861,10862,10863,10864,10865, -10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876,10877, -10878,10879,10880,10881,10882,10883,10884,10885,10886,10887,10888,10889, -10890,10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901, -10902,10903,10904,10905,10906,10907,10908,10909,10910,10911,10912,10913, -10914,10915,10916,10917,10918,10919,10920,10921,10922,10923,10924,10925, -10926,10927,10928,10929,10930,10931,10932,10933,10934,10935,10936,10937, -10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949, -10950,10951,10952,10953,10954,10955,10956,10957,10958,10959,10960,10961, -10962,10963,10964,10965,10966,10967,10968,10969,10970,10971,10972,10973, -10974,10975,10976,10977,10978,10979,10980,10981,10982,10983,10984,10985, -10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997, -10998,10999,11000,11001,11002,11003,11004,11005,11006,11007,11008,11009, -11010,11011,11012,11013,11014,11015,11016,11017,11018,11019,11020,11021, -11022,11023,11024,11025,11026,11027,11028,11029,11030,11031,11032,11033, -11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044,11045, -11046,11047,11048,11049,11050,11051,11052,11053,11054,11055,11056,11057, -11058,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069, -11070,11071,11072,11073,11074,11075,11076,11077,11078,11079,11080,11081, -11082,11083,11084,11085,11086,11087,11088,11089,11090,11091,11092,11093, -11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104,11105, -11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,11116,11117, -11118,11119,11120,11121,11122,11123,11124,11125,11126,11127,11128,11129, -11130,11131,11132,11133,11134,11135,11136,11137,11138,11139,11140,11141, -11142,11143,11144,11145,11146,11147,11148,11149,11150,11151,11152,11153, -11154,11155,11156,11157,11158,11159,11160,11161,11162,11163,11164,11165, -11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177, -11178,11179,11180,11181,11182,11183,11184,11185,11186,11187,11188,11189, -11190,11191,11192,11193,11194,11195,11196,11197,11198,11199,11200,11201, -11202,11203,11204,11205,11206,11207,11208,11209,11210,11211,11212,11213, -11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, -11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237, -11238,11239,11240,11241,11242,11243,11244,11245,11246,11247,11248,11249, -11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261, -11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273, -11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285, -11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297, -11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309, -11310,11311,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273, -11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285, -11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297, -11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309, -11310,11359,11360,11360,11362,11363,11364,570,574,11367,11367,11369,11369, -11371,11371,11373,11374,11375,11376,11377,11378,11378,11380,11381,11381, -11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11392,11394, -11394,11396,11396,11398,11398,11400,11400,11402,11402,11404,11404,11406, -11406,11408,11408,11410,11410,11412,11412,11414,11414,11416,11416,11418, -11418,11420,11420,11422,11422,11424,11424,11426,11426,11428,11428,11430, -11430,11432,11432,11434,11434,11436,11436,11438,11438,11440,11440,11442, -11442,11444,11444,11446,11446,11448,11448,11450,11450,11452,11452,11454, -11454,11456,11456,11458,11458,11460,11460,11462,11462,11464,11464,11466, -11466,11468,11468,11470,11470,11472,11472,11474,11474,11476,11476,11478, -11478,11480,11480,11482,11482,11484,11484,11486,11486,11488,11488,11490, -11490,11492,11493,11494,11495,11496,11497,11498,11499,11499,11501,11501, -11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514, -11515,11516,11517,11518,11519,4256,4257,4258,4259,4260,4261,4262,4263,4264, -4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279, -4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293, -11558,11559,11560,11561,11562,11563,11564,11565,11566,11567,11568,11569, -11570,11571,11572,11573,11574,11575,11576,11577,11578,11579,11580,11581, -11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,11592,11593, -11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,11605, -11606,11607,11608,11609,11610,11611,11612,11613,11614,11615,11616,11617, -11618,11619,11620,11621,11622,11623,11624,11625,11626,11627,11628,11629, -11630,11631,11632,11633,11634,11635,11636,11637,11638,11639,11640,11641, -11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653, -11654,11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665, -11666,11667,11668,11669,11670,11671,11672,11673,11674,11675,11676,11677, -11678,11679,11680,11681,11682,11683,11684,11685,11686,11687,11688,11689, -11690,11691,11692,11693,11694,11695,11696,11697,11698,11699,11700,11701, -11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713, -11714,11715,11716,11717,11718,11719,11720,11721,11722,11723,11724,11725, -11726,11727,11728,11729,11730,11731,11732,11733,11734,11735,11736,11737, -11738,11739,11740,11741,11742,11743,11744,11745,11746,11747,11748,11749, -11750,11751,11752,11753,11754,11755,11756,11757,11758,11759,11760,11761, -11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773, -11774,11775,11776,11777,11778,11779,11780,11781,11782,11783,11784,11785, -11786,11787,11788,11789,11790,11791,11792,11793,11794,11795,11796,11797, -11798,11799,11800,11801,11802,11803,11804,11805,11806,11807,11808,11809, -11810,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, -11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833, -11834,11835,11836,11837,11838,11839,11840,11841,11842,11843,11844,11845, -11846,11847,11848,11849,11850,11851,11852,11853,11854,11855,11856,11857, -11858,11859,11860,11861,11862,11863,11864,11865,11866,11867,11868,11869, -11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881, -11882,11883,11884,11885,11886,11887,11888,11889,11890,11891,11892,11893, -11894,11895,11896,11897,11898,11899,11900,11901,11902,11903,11904,11905, -11906,11907,11908,11909,11910,11911,11912,11913,11914,11915,11916,11917, -11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928,11929, -11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941, -11942,11943,11944,11945,11946,11947,11948,11949,11950,11951,11952,11953, -11954,11955,11956,11957,11958,11959,11960,11961,11962,11963,11964,11965, -11966,11967,11968,11969,11970,11971,11972,11973,11974,11975,11976,11977, -11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,11988,11989, -11990,11991,11992,11993,11994,11995,11996,11997,11998,11999,12000,12001, -12002,12003,12004,12005,12006,12007,12008,12009,12010,12011,12012,12013, -12014,12015,12016,12017,12018,12019,12020,12021,12022,12023,12024,12025, -12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, -12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049, -12050,12051,12052,12053,12054,12055,12056,12057,12058,12059,12060,12061, -12062,12063,12064,12065,12066,12067,12068,12069,12070,12071,12072,12073, -12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084,12085, -12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097, -12098,12099,12100,12101,12102,12103,12104,12105,12106,12107,12108,12109, -12110,12111,12112,12113,12114,12115,12116,12117,12118,12119,12120,12121, -12122,12123,12124,12125,12126,12127,12128,12129,12130,12131,12132,12133, -12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145, -12146,12147,12148,12149,12150,12151,12152,12153,12154,12155,12156,12157, -12158,12159,12160,12161,12162,12163,12164,12165,12166,12167,12168,12169, -12170,12171,12172,12173,12174,12175,12176,12177,12178,12179,12180,12181, -12182,12183,12184,12185,12186,12187,12188,12189,12190,12191,12192,12193, -12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204,12205, -12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217, -12218,12219,12220,12221,12222,12223,12224,12225,12226,12227,12228,12229, -12230,12231,12232,12233,12234,12235,12236,12237,12238,12239,12240,12241, -12242,12243,12244,12245,12246,12247,12248,12249,12250,12251,12252,12253, -12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264,12265, -12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277, -12278,12279,12280,12281,12282,12283,12284,12285,12286,12287,12288,12289, -12290,12291,12292,12293,12294,12295,12296,12297,12298,12299,12300,12301, -12302,12303,12304,12305,12306,12307,12308,12309,12310,12311,12312,12313, -12314,12315,12316,12317,12318,12319,12320,12321,12322,12323,12324,12325, -12326,12327,12328,12329,12330,12331,12332,12333,12334,12335,12336,12337, -12338,12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349, -12350,12351,12352,12353,12354,12355,12356,12357,12358,12359,12360,12361, -12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373, -12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385, -12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397, -12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409, -12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421, -12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433, -12434,12435,12436,12437,12438,12439,12440,12441,12442,12443,12444,12445, -12446,12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457, -12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469, -12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481, -12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493, -12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505, -12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517, -12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529, -12530,12531,12532,12533,12534,12535,12536,12537,12538,12539,12540,12541, -12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,12552,12553, -12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565, -12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577, -12578,12579,12580,12581,12582,12583,12584,12585,12586,12587,12588,12589, -12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600,12601, -12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613, -12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625, -12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637, -12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649, -12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661, -12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673, -12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685, -12686,12687,12688,12689,12690,12691,12692,12693,12694,12695,12696,12697, -12698,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709, -12710,12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721, -12722,12723,12724,12725,12726,12727,12728,12729,12730,12731,12732,12733, -12734,12735,12736,12737,12738,12739,12740,12741,12742,12743,12744,12745, -12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757, -12758,12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769, -12770,12771,12772,12773,12774,12775,12776,12777,12778,12779,12780,12781, -12782,12783,12784,12785,12786,12787,12788,12789,12790,12791,12792,12793, -12794,12795,12796,12797,12798,12799,12800,12801,12802,12803,12804,12805, -12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817, -12818,12819,12820,12821,12822,12823,12824,12825,12826,12827,12828,12829, -12830,12831,12832,12833,12834,12835,12836,12837,12838,12839,12840,12841, -12842,12843,12844,12845,12846,12847,12848,12849,12850,12851,12852,12853, -12854,12855,12856,12857,12858,12859,12860,12861,12862,12863,12864,12865, -12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877, -12878,12879,12880,12881,12882,12883,12884,12885,12886,12887,12888,12889, -12890,12891,12892,12893,12894,12895,12896,12897,12898,12899,12900,12901, -12902,12903,12904,12905,12906,12907,12908,12909,12910,12911,12912,12913, -12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925, -12926,12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937, -12938,12939,12940,12941,12942,12943,12944,12945,12946,12947,12948,12949, -12950,12951,12952,12953,12954,12955,12956,12957,12958,12959,12960,12961, -12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, -12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985, -12986,12987,12988,12989,12990,12991,12992,12993,12994,12995,12996,12997, -12998,12999,13000,13001,13002,13003,13004,13005,13006,13007,13008,13009, -13010,13011,13012,13013,13014,13015,13016,13017,13018,13019,13020,13021, -13022,13023,13024,13025,13026,13027,13028,13029,13030,13031,13032,13033, -13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045, -13046,13047,13048,13049,13050,13051,13052,13053,13054,13055,13056,13057, -13058,13059,13060,13061,13062,13063,13064,13065,13066,13067,13068,13069, -13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, -13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093, -13094,13095,13096,13097,13098,13099,13100,13101,13102,13103,13104,13105, -13106,13107,13108,13109,13110,13111,13112,13113,13114,13115,13116,13117, -13118,13119,13120,13121,13122,13123,13124,13125,13126,13127,13128,13129, -13130,13131,13132,13133,13134,13135,13136,13137,13138,13139,13140,13141, -13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153, -13154,13155,13156,13157,13158,13159,13160,13161,13162,13163,13164,13165, -13166,13167,13168,13169,13170,13171,13172,13173,13174,13175,13176,13177, -13178,13179,13180,13181,13182,13183,13184,13185,13186,13187,13188,13189, -13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, -13202,13203,13204,13205,13206,13207,13208,13209,13210,13211,13212,13213, -13214,13215,13216,13217,13218,13219,13220,13221,13222,13223,13224,13225, -13226,13227,13228,13229,13230,13231,13232,13233,13234,13235,13236,13237, -13238,13239,13240,13241,13242,13243,13244,13245,13246,13247,13248,13249, -13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260,13261, -13262,13263,13264,13265,13266,13267,13268,13269,13270,13271,13272,13273, -13274,13275,13276,13277,13278,13279,13280,13281,13282,13283,13284,13285, -13286,13287,13288,13289,13290,13291,13292,13293,13294,13295,13296,13297, -13298,13299,13300,13301,13302,13303,13304,13305,13306,13307,13308,13309, -13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, -13322,13323,13324,13325,13326,13327,13328,13329,13330,13331,13332,13333, -13334,13335,13336,13337,13338,13339,13340,13341,13342,13343,13344,13345, -13346,13347,13348,13349,13350,13351,13352,13353,13354,13355,13356,13357, -13358,13359,13360,13361,13362,13363,13364,13365,13366,13367,13368,13369, -13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381, -13382,13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393, -13394,13395,13396,13397,13398,13399,13400,13401,13402,13403,13404,13405, -13406,13407,13408,13409,13410,13411,13412,13413,13414,13415,13416,13417, -13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429, -13430,13431,13432,13433,13434,13435,13436,13437,13438,13439,13440,13441, -13442,13443,13444,13445,13446,13447,13448,13449,13450,13451,13452,13453, -13454,13455,13456,13457,13458,13459,13460,13461,13462,13463,13464,13465, -13466,13467,13468,13469,13470,13471,13472,13473,13474,13475,13476,13477, -13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489, -13490,13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501, -13502,13503,13504,13505,13506,13507,13508,13509,13510,13511,13512,13513, -13514,13515,13516,13517,13518,13519,13520,13521,13522,13523,13524,13525, -13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537, -13538,13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549, -13550,13551,13552,13553,13554,13555,13556,13557,13558,13559,13560,13561, -13562,13563,13564,13565,13566,13567,13568,13569,13570,13571,13572,13573, -13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585, -13586,13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597, -13598,13599,13600,13601,13602,13603,13604,13605,13606,13607,13608,13609, -13610,13611,13612,13613,13614,13615,13616,13617,13618,13619,13620,13621, -13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633, -13634,13635,13636,13637,13638,13639,13640,13641,13642,13643,13644,13645, -13646,13647,13648,13649,13650,13651,13652,13653,13654,13655,13656,13657, -13658,13659,13660,13661,13662,13663,13664,13665,13666,13667,13668,13669, -13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680,13681, -13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693, -13694,13695,13696,13697,13698,13699,13700,13701,13702,13703,13704,13705, -13706,13707,13708,13709,13710,13711,13712,13713,13714,13715,13716,13717, -13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728,13729, -13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741, -13742,13743,13744,13745,13746,13747,13748,13749,13750,13751,13752,13753, -13754,13755,13756,13757,13758,13759,13760,13761,13762,13763,13764,13765, -13766,13767,13768,13769,13770,13771,13772,13773,13774,13775,13776,13777, -13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789, -13790,13791,13792,13793,13794,13795,13796,13797,13798,13799,13800,13801, -13802,13803,13804,13805,13806,13807,13808,13809,13810,13811,13812,13813, -13814,13815,13816,13817,13818,13819,13820,13821,13822,13823,13824,13825, -13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837, -13838,13839,13840,13841,13842,13843,13844,13845,13846,13847,13848,13849, -13850,13851,13852,13853,13854,13855,13856,13857,13858,13859,13860,13861, -13862,13863,13864,13865,13866,13867,13868,13869,13870,13871,13872,13873, -13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885, -13886,13887,13888,13889,13890,13891,13892,13893,13894,13895,13896,13897, -13898,13899,13900,13901,13902,13903,13904,13905,13906,13907,13908,13909, -13910,13911,13912,13913,13914,13915,13916,13917,13918,13919,13920,13921, -13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933, -13934,13935,13936,13937,13938,13939,13940,13941,13942,13943,13944,13945, -13946,13947,13948,13949,13950,13951,13952,13953,13954,13955,13956,13957, -13958,13959,13960,13961,13962,13963,13964,13965,13966,13967,13968,13969, -13970,13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981, -13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993, -13994,13995,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005, -14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017, -14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029, -14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041, -14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053, -14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065, -14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077, -14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089, -14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101, -14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113, -14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125, -14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137, -14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149, -14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161, -14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173, -14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185, -14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197, -14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209, -14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221, -14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233, -14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245, -14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257, -14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269, -14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281, -14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293, -14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305, -14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317, -14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329, -14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341, -14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353, -14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365, -14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377, -14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389, -14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401, -14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413, -14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425, -14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437, -14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449, -14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461, -14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473, -14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485, -14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497, -14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509, -14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521, -14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533, -14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545, -14546,14547,14548,14549,14550,14551,14552,14553,14554,14555,14556,14557, -14558,14559,14560,14561,14562,14563,14564,14565,14566,14567,14568,14569, -14570,14571,14572,14573,14574,14575,14576,14577,14578,14579,14580,14581, -14582,14583,14584,14585,14586,14587,14588,14589,14590,14591,14592,14593, -14594,14595,14596,14597,14598,14599,14600,14601,14602,14603,14604,14605, -14606,14607,14608,14609,14610,14611,14612,14613,14614,14615,14616,14617, -14618,14619,14620,14621,14622,14623,14624,14625,14626,14627,14628,14629, -14630,14631,14632,14633,14634,14635,14636,14637,14638,14639,14640,14641, -14642,14643,14644,14645,14646,14647,14648,14649,14650,14651,14652,14653, -14654,14655,14656,14657,14658,14659,14660,14661,14662,14663,14664,14665, -14666,14667,14668,14669,14670,14671,14672,14673,14674,14675,14676,14677, -14678,14679,14680,14681,14682,14683,14684,14685,14686,14687,14688,14689, -14690,14691,14692,14693,14694,14695,14696,14697,14698,14699,14700,14701, -14702,14703,14704,14705,14706,14707,14708,14709,14710,14711,14712,14713, -14714,14715,14716,14717,14718,14719,14720,14721,14722,14723,14724,14725, -14726,14727,14728,14729,14730,14731,14732,14733,14734,14735,14736,14737, -14738,14739,14740,14741,14742,14743,14744,14745,14746,14747,14748,14749, -14750,14751,14752,14753,14754,14755,14756,14757,14758,14759,14760,14761, -14762,14763,14764,14765,14766,14767,14768,14769,14770,14771,14772,14773, -14774,14775,14776,14777,14778,14779,14780,14781,14782,14783,14784,14785, -14786,14787,14788,14789,14790,14791,14792,14793,14794,14795,14796,14797, -14798,14799,14800,14801,14802,14803,14804,14805,14806,14807,14808,14809, -14810,14811,14812,14813,14814,14815,14816,14817,14818,14819,14820,14821, -14822,14823,14824,14825,14826,14827,14828,14829,14830,14831,14832,14833, -14834,14835,14836,14837,14838,14839,14840,14841,14842,14843,14844,14845, -14846,14847,14848,14849,14850,14851,14852,14853,14854,14855,14856,14857, -14858,14859,14860,14861,14862,14863,14864,14865,14866,14867,14868,14869, -14870,14871,14872,14873,14874,14875,14876,14877,14878,14879,14880,14881, -14882,14883,14884,14885,14886,14887,14888,14889,14890,14891,14892,14893, -14894,14895,14896,14897,14898,14899,14900,14901,14902,14903,14904,14905, -14906,14907,14908,14909,14910,14911,14912,14913,14914,14915,14916,14917, -14918,14919,14920,14921,14922,14923,14924,14925,14926,14927,14928,14929, -14930,14931,14932,14933,14934,14935,14936,14937,14938,14939,14940,14941, -14942,14943,14944,14945,14946,14947,14948,14949,14950,14951,14952,14953, -14954,14955,14956,14957,14958,14959,14960,14961,14962,14963,14964,14965, -14966,14967,14968,14969,14970,14971,14972,14973,14974,14975,14976,14977, -14978,14979,14980,14981,14982,14983,14984,14985,14986,14987,14988,14989, -14990,14991,14992,14993,14994,14995,14996,14997,14998,14999,15000,15001, -15002,15003,15004,15005,15006,15007,15008,15009,15010,15011,15012,15013, -15014,15015,15016,15017,15018,15019,15020,15021,15022,15023,15024,15025, -15026,15027,15028,15029,15030,15031,15032,15033,15034,15035,15036,15037, -15038,15039,15040,15041,15042,15043,15044,15045,15046,15047,15048,15049, -15050,15051,15052,15053,15054,15055,15056,15057,15058,15059,15060,15061, -15062,15063,15064,15065,15066,15067,15068,15069,15070,15071,15072,15073, -15074,15075,15076,15077,15078,15079,15080,15081,15082,15083,15084,15085, -15086,15087,15088,15089,15090,15091,15092,15093,15094,15095,15096,15097, -15098,15099,15100,15101,15102,15103,15104,15105,15106,15107,15108,15109, -15110,15111,15112,15113,15114,15115,15116,15117,15118,15119,15120,15121, -15122,15123,15124,15125,15126,15127,15128,15129,15130,15131,15132,15133, -15134,15135,15136,15137,15138,15139,15140,15141,15142,15143,15144,15145, -15146,15147,15148,15149,15150,15151,15152,15153,15154,15155,15156,15157, -15158,15159,15160,15161,15162,15163,15164,15165,15166,15167,15168,15169, -15170,15171,15172,15173,15174,15175,15176,15177,15178,15179,15180,15181, -15182,15183,15184,15185,15186,15187,15188,15189,15190,15191,15192,15193, -15194,15195,15196,15197,15198,15199,15200,15201,15202,15203,15204,15205, -15206,15207,15208,15209,15210,15211,15212,15213,15214,15215,15216,15217, -15218,15219,15220,15221,15222,15223,15224,15225,15226,15227,15228,15229, -15230,15231,15232,15233,15234,15235,15236,15237,15238,15239,15240,15241, -15242,15243,15244,15245,15246,15247,15248,15249,15250,15251,15252,15253, -15254,15255,15256,15257,15258,15259,15260,15261,15262,15263,15264,15265, -15266,15267,15268,15269,15270,15271,15272,15273,15274,15275,15276,15277, -15278,15279,15280,15281,15282,15283,15284,15285,15286,15287,15288,15289, -15290,15291,15292,15293,15294,15295,15296,15297,15298,15299,15300,15301, -15302,15303,15304,15305,15306,15307,15308,15309,15310,15311,15312,15313, -15314,15315,15316,15317,15318,15319,15320,15321,15322,15323,15324,15325, -15326,15327,15328,15329,15330,15331,15332,15333,15334,15335,15336,15337, -15338,15339,15340,15341,15342,15343,15344,15345,15346,15347,15348,15349, -15350,15351,15352,15353,15354,15355,15356,15357,15358,15359,15360,15361, -15362,15363,15364,15365,15366,15367,15368,15369,15370,15371,15372,15373, -15374,15375,15376,15377,15378,15379,15380,15381,15382,15383,15384,15385, -15386,15387,15388,15389,15390,15391,15392,15393,15394,15395,15396,15397, -15398,15399,15400,15401,15402,15403,15404,15405,15406,15407,15408,15409, -15410,15411,15412,15413,15414,15415,15416,15417,15418,15419,15420,15421, -15422,15423,15424,15425,15426,15427,15428,15429,15430,15431,15432,15433, -15434,15435,15436,15437,15438,15439,15440,15441,15442,15443,15444,15445, -15446,15447,15448,15449,15450,15451,15452,15453,15454,15455,15456,15457, -15458,15459,15460,15461,15462,15463,15464,15465,15466,15467,15468,15469, -15470,15471,15472,15473,15474,15475,15476,15477,15478,15479,15480,15481, -15482,15483,15484,15485,15486,15487,15488,15489,15490,15491,15492,15493, -15494,15495,15496,15497,15498,15499,15500,15501,15502,15503,15504,15505, -15506,15507,15508,15509,15510,15511,15512,15513,15514,15515,15516,15517, -15518,15519,15520,15521,15522,15523,15524,15525,15526,15527,15528,15529, -15530,15531,15532,15533,15534,15535,15536,15537,15538,15539,15540,15541, -15542,15543,15544,15545,15546,15547,15548,15549,15550,15551,15552,15553, -15554,15555,15556,15557,15558,15559,15560,15561,15562,15563,15564,15565, -15566,15567,15568,15569,15570,15571,15572,15573,15574,15575,15576,15577, -15578,15579,15580,15581,15582,15583,15584,15585,15586,15587,15588,15589, -15590,15591,15592,15593,15594,15595,15596,15597,15598,15599,15600,15601, -15602,15603,15604,15605,15606,15607,15608,15609,15610,15611,15612,15613, -15614,15615,15616,15617,15618,15619,15620,15621,15622,15623,15624,15625, -15626,15627,15628,15629,15630,15631,15632,15633,15634,15635,15636,15637, -15638,15639,15640,15641,15642,15643,15644,15645,15646,15647,15648,15649, -15650,15651,15652,15653,15654,15655,15656,15657,15658,15659,15660,15661, -15662,15663,15664,15665,15666,15667,15668,15669,15670,15671,15672,15673, -15674,15675,15676,15677,15678,15679,15680,15681,15682,15683,15684,15685, -15686,15687,15688,15689,15690,15691,15692,15693,15694,15695,15696,15697, -15698,15699,15700,15701,15702,15703,15704,15705,15706,15707,15708,15709, -15710,15711,15712,15713,15714,15715,15716,15717,15718,15719,15720,15721, -15722,15723,15724,15725,15726,15727,15728,15729,15730,15731,15732,15733, -15734,15735,15736,15737,15738,15739,15740,15741,15742,15743,15744,15745, -15746,15747,15748,15749,15750,15751,15752,15753,15754,15755,15756,15757, -15758,15759,15760,15761,15762,15763,15764,15765,15766,15767,15768,15769, -15770,15771,15772,15773,15774,15775,15776,15777,15778,15779,15780,15781, -15782,15783,15784,15785,15786,15787,15788,15789,15790,15791,15792,15793, -15794,15795,15796,15797,15798,15799,15800,15801,15802,15803,15804,15805, -15806,15807,15808,15809,15810,15811,15812,15813,15814,15815,15816,15817, -15818,15819,15820,15821,15822,15823,15824,15825,15826,15827,15828,15829, -15830,15831,15832,15833,15834,15835,15836,15837,15838,15839,15840,15841, -15842,15843,15844,15845,15846,15847,15848,15849,15850,15851,15852,15853, -15854,15855,15856,15857,15858,15859,15860,15861,15862,15863,15864,15865, -15866,15867,15868,15869,15870,15871,15872,15873,15874,15875,15876,15877, -15878,15879,15880,15881,15882,15883,15884,15885,15886,15887,15888,15889, -15890,15891,15892,15893,15894,15895,15896,15897,15898,15899,15900,15901, -15902,15903,15904,15905,15906,15907,15908,15909,15910,15911,15912,15913, -15914,15915,15916,15917,15918,15919,15920,15921,15922,15923,15924,15925, -15926,15927,15928,15929,15930,15931,15932,15933,15934,15935,15936,15937, -15938,15939,15940,15941,15942,15943,15944,15945,15946,15947,15948,15949, -15950,15951,15952,15953,15954,15955,15956,15957,15958,15959,15960,15961, -15962,15963,15964,15965,15966,15967,15968,15969,15970,15971,15972,15973, -15974,15975,15976,15977,15978,15979,15980,15981,15982,15983,15984,15985, -15986,15987,15988,15989,15990,15991,15992,15993,15994,15995,15996,15997, -15998,15999,16000,16001,16002,16003,16004,16005,16006,16007,16008,16009, -16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16020,16021, -16022,16023,16024,16025,16026,16027,16028,16029,16030,16031,16032,16033, -16034,16035,16036,16037,16038,16039,16040,16041,16042,16043,16044,16045, -16046,16047,16048,16049,16050,16051,16052,16053,16054,16055,16056,16057, -16058,16059,16060,16061,16062,16063,16064,16065,16066,16067,16068,16069, -16070,16071,16072,16073,16074,16075,16076,16077,16078,16079,16080,16081, -16082,16083,16084,16085,16086,16087,16088,16089,16090,16091,16092,16093, -16094,16095,16096,16097,16098,16099,16100,16101,16102,16103,16104,16105, -16106,16107,16108,16109,16110,16111,16112,16113,16114,16115,16116,16117, -16118,16119,16120,16121,16122,16123,16124,16125,16126,16127,16128,16129, -16130,16131,16132,16133,16134,16135,16136,16137,16138,16139,16140,16141, -16142,16143,16144,16145,16146,16147,16148,16149,16150,16151,16152,16153, -16154,16155,16156,16157,16158,16159,16160,16161,16162,16163,16164,16165, -16166,16167,16168,16169,16170,16171,16172,16173,16174,16175,16176,16177, -16178,16179,16180,16181,16182,16183,16184,16185,16186,16187,16188,16189, -16190,16191,16192,16193,16194,16195,16196,16197,16198,16199,16200,16201, -16202,16203,16204,16205,16206,16207,16208,16209,16210,16211,16212,16213, -16214,16215,16216,16217,16218,16219,16220,16221,16222,16223,16224,16225, -16226,16227,16228,16229,16230,16231,16232,16233,16234,16235,16236,16237, -16238,16239,16240,16241,16242,16243,16244,16245,16246,16247,16248,16249, -16250,16251,16252,16253,16254,16255,16256,16257,16258,16259,16260,16261, -16262,16263,16264,16265,16266,16267,16268,16269,16270,16271,16272,16273, -16274,16275,16276,16277,16278,16279,16280,16281,16282,16283,16284,16285, -16286,16287,16288,16289,16290,16291,16292,16293,16294,16295,16296,16297, -16298,16299,16300,16301,16302,16303,16304,16305,16306,16307,16308,16309, -16310,16311,16312,16313,16314,16315,16316,16317,16318,16319,16320,16321, -16322,16323,16324,16325,16326,16327,16328,16329,16330,16331,16332,16333, -16334,16335,16336,16337,16338,16339,16340,16341,16342,16343,16344,16345, -16346,16347,16348,16349,16350,16351,16352,16353,16354,16355,16356,16357, -16358,16359,16360,16361,16362,16363,16364,16365,16366,16367,16368,16369, -16370,16371,16372,16373,16374,16375,16376,16377,16378,16379,16380,16381, -16382,16383,16384,16385,16386,16387,16388,16389,16390,16391,16392,16393, -16394,16395,16396,16397,16398,16399,16400,16401,16402,16403,16404,16405, -16406,16407,16408,16409,16410,16411,16412,16413,16414,16415,16416,16417, -16418,16419,16420,16421,16422,16423,16424,16425,16426,16427,16428,16429, -16430,16431,16432,16433,16434,16435,16436,16437,16438,16439,16440,16441, -16442,16443,16444,16445,16446,16447,16448,16449,16450,16451,16452,16453, -16454,16455,16456,16457,16458,16459,16460,16461,16462,16463,16464,16465, -16466,16467,16468,16469,16470,16471,16472,16473,16474,16475,16476,16477, -16478,16479,16480,16481,16482,16483,16484,16485,16486,16487,16488,16489, -16490,16491,16492,16493,16494,16495,16496,16497,16498,16499,16500,16501, -16502,16503,16504,16505,16506,16507,16508,16509,16510,16511,16512,16513, -16514,16515,16516,16517,16518,16519,16520,16521,16522,16523,16524,16525, -16526,16527,16528,16529,16530,16531,16532,16533,16534,16535,16536,16537, -16538,16539,16540,16541,16542,16543,16544,16545,16546,16547,16548,16549, -16550,16551,16552,16553,16554,16555,16556,16557,16558,16559,16560,16561, -16562,16563,16564,16565,16566,16567,16568,16569,16570,16571,16572,16573, -16574,16575,16576,16577,16578,16579,16580,16581,16582,16583,16584,16585, -16586,16587,16588,16589,16590,16591,16592,16593,16594,16595,16596,16597, -16598,16599,16600,16601,16602,16603,16604,16605,16606,16607,16608,16609, -16610,16611,16612,16613,16614,16615,16616,16617,16618,16619,16620,16621, -16622,16623,16624,16625,16626,16627,16628,16629,16630,16631,16632,16633, -16634,16635,16636,16637,16638,16639,16640,16641,16642,16643,16644,16645, -16646,16647,16648,16649,16650,16651,16652,16653,16654,16655,16656,16657, -16658,16659,16660,16661,16662,16663,16664,16665,16666,16667,16668,16669, -16670,16671,16672,16673,16674,16675,16676,16677,16678,16679,16680,16681, -16682,16683,16684,16685,16686,16687,16688,16689,16690,16691,16692,16693, -16694,16695,16696,16697,16698,16699,16700,16701,16702,16703,16704,16705, -16706,16707,16708,16709,16710,16711,16712,16713,16714,16715,16716,16717, -16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728,16729, -16730,16731,16732,16733,16734,16735,16736,16737,16738,16739,16740,16741, -16742,16743,16744,16745,16746,16747,16748,16749,16750,16751,16752,16753, -16754,16755,16756,16757,16758,16759,16760,16761,16762,16763,16764,16765, -16766,16767,16768,16769,16770,16771,16772,16773,16774,16775,16776,16777, -16778,16779,16780,16781,16782,16783,16784,16785,16786,16787,16788,16789, -16790,16791,16792,16793,16794,16795,16796,16797,16798,16799,16800,16801, -16802,16803,16804,16805,16806,16807,16808,16809,16810,16811,16812,16813, -16814,16815,16816,16817,16818,16819,16820,16821,16822,16823,16824,16825, -16826,16827,16828,16829,16830,16831,16832,16833,16834,16835,16836,16837, -16838,16839,16840,16841,16842,16843,16844,16845,16846,16847,16848,16849, -16850,16851,16852,16853,16854,16855,16856,16857,16858,16859,16860,16861, -16862,16863,16864,16865,16866,16867,16868,16869,16870,16871,16872,16873, -16874,16875,16876,16877,16878,16879,16880,16881,16882,16883,16884,16885, -16886,16887,16888,16889,16890,16891,16892,16893,16894,16895,16896,16897, -16898,16899,16900,16901,16902,16903,16904,16905,16906,16907,16908,16909, -16910,16911,16912,16913,16914,16915,16916,16917,16918,16919,16920,16921, -16922,16923,16924,16925,16926,16927,16928,16929,16930,16931,16932,16933, -16934,16935,16936,16937,16938,16939,16940,16941,16942,16943,16944,16945, -16946,16947,16948,16949,16950,16951,16952,16953,16954,16955,16956,16957, -16958,16959,16960,16961,16962,16963,16964,16965,16966,16967,16968,16969, -16970,16971,16972,16973,16974,16975,16976,16977,16978,16979,16980,16981, -16982,16983,16984,16985,16986,16987,16988,16989,16990,16991,16992,16993, -16994,16995,16996,16997,16998,16999,17000,17001,17002,17003,17004,17005, -17006,17007,17008,17009,17010,17011,17012,17013,17014,17015,17016,17017, -17018,17019,17020,17021,17022,17023,17024,17025,17026,17027,17028,17029, -17030,17031,17032,17033,17034,17035,17036,17037,17038,17039,17040,17041, -17042,17043,17044,17045,17046,17047,17048,17049,17050,17051,17052,17053, -17054,17055,17056,17057,17058,17059,17060,17061,17062,17063,17064,17065, -17066,17067,17068,17069,17070,17071,17072,17073,17074,17075,17076,17077, -17078,17079,17080,17081,17082,17083,17084,17085,17086,17087,17088,17089, -17090,17091,17092,17093,17094,17095,17096,17097,17098,17099,17100,17101, -17102,17103,17104,17105,17106,17107,17108,17109,17110,17111,17112,17113, -17114,17115,17116,17117,17118,17119,17120,17121,17122,17123,17124,17125, -17126,17127,17128,17129,17130,17131,17132,17133,17134,17135,17136,17137, -17138,17139,17140,17141,17142,17143,17144,17145,17146,17147,17148,17149, -17150,17151,17152,17153,17154,17155,17156,17157,17158,17159,17160,17161, -17162,17163,17164,17165,17166,17167,17168,17169,17170,17171,17172,17173, -17174,17175,17176,17177,17178,17179,17180,17181,17182,17183,17184,17185, -17186,17187,17188,17189,17190,17191,17192,17193,17194,17195,17196,17197, -17198,17199,17200,17201,17202,17203,17204,17205,17206,17207,17208,17209, -17210,17211,17212,17213,17214,17215,17216,17217,17218,17219,17220,17221, -17222,17223,17224,17225,17226,17227,17228,17229,17230,17231,17232,17233, -17234,17235,17236,17237,17238,17239,17240,17241,17242,17243,17244,17245, -17246,17247,17248,17249,17250,17251,17252,17253,17254,17255,17256,17257, -17258,17259,17260,17261,17262,17263,17264,17265,17266,17267,17268,17269, -17270,17271,17272,17273,17274,17275,17276,17277,17278,17279,17280,17281, -17282,17283,17284,17285,17286,17287,17288,17289,17290,17291,17292,17293, -17294,17295,17296,17297,17298,17299,17300,17301,17302,17303,17304,17305, -17306,17307,17308,17309,17310,17311,17312,17313,17314,17315,17316,17317, -17318,17319,17320,17321,17322,17323,17324,17325,17326,17327,17328,17329, -17330,17331,17332,17333,17334,17335,17336,17337,17338,17339,17340,17341, -17342,17343,17344,17345,17346,17347,17348,17349,17350,17351,17352,17353, -17354,17355,17356,17357,17358,17359,17360,17361,17362,17363,17364,17365, -17366,17367,17368,17369,17370,17371,17372,17373,17374,17375,17376,17377, -17378,17379,17380,17381,17382,17383,17384,17385,17386,17387,17388,17389, -17390,17391,17392,17393,17394,17395,17396,17397,17398,17399,17400,17401, -17402,17403,17404,17405,17406,17407,17408,17409,17410,17411,17412,17413, -17414,17415,17416,17417,17418,17419,17420,17421,17422,17423,17424,17425, -17426,17427,17428,17429,17430,17431,17432,17433,17434,17435,17436,17437, -17438,17439,17440,17441,17442,17443,17444,17445,17446,17447,17448,17449, -17450,17451,17452,17453,17454,17455,17456,17457,17458,17459,17460,17461, -17462,17463,17464,17465,17466,17467,17468,17469,17470,17471,17472,17473, -17474,17475,17476,17477,17478,17479,17480,17481,17482,17483,17484,17485, -17486,17487,17488,17489,17490,17491,17492,17493,17494,17495,17496,17497, -17498,17499,17500,17501,17502,17503,17504,17505,17506,17507,17508,17509, -17510,17511,17512,17513,17514,17515,17516,17517,17518,17519,17520,17521, -17522,17523,17524,17525,17526,17527,17528,17529,17530,17531,17532,17533, -17534,17535,17536,17537,17538,17539,17540,17541,17542,17543,17544,17545, -17546,17547,17548,17549,17550,17551,17552,17553,17554,17555,17556,17557, -17558,17559,17560,17561,17562,17563,17564,17565,17566,17567,17568,17569, -17570,17571,17572,17573,17574,17575,17576,17577,17578,17579,17580,17581, -17582,17583,17584,17585,17586,17587,17588,17589,17590,17591,17592,17593, -17594,17595,17596,17597,17598,17599,17600,17601,17602,17603,17604,17605, -17606,17607,17608,17609,17610,17611,17612,17613,17614,17615,17616,17617, -17618,17619,17620,17621,17622,17623,17624,17625,17626,17627,17628,17629, -17630,17631,17632,17633,17634,17635,17636,17637,17638,17639,17640,17641, -17642,17643,17644,17645,17646,17647,17648,17649,17650,17651,17652,17653, -17654,17655,17656,17657,17658,17659,17660,17661,17662,17663,17664,17665, -17666,17667,17668,17669,17670,17671,17672,17673,17674,17675,17676,17677, -17678,17679,17680,17681,17682,17683,17684,17685,17686,17687,17688,17689, -17690,17691,17692,17693,17694,17695,17696,17697,17698,17699,17700,17701, -17702,17703,17704,17705,17706,17707,17708,17709,17710,17711,17712,17713, -17714,17715,17716,17717,17718,17719,17720,17721,17722,17723,17724,17725, -17726,17727,17728,17729,17730,17731,17732,17733,17734,17735,17736,17737, -17738,17739,17740,17741,17742,17743,17744,17745,17746,17747,17748,17749, -17750,17751,17752,17753,17754,17755,17756,17757,17758,17759,17760,17761, -17762,17763,17764,17765,17766,17767,17768,17769,17770,17771,17772,17773, -17774,17775,17776,17777,17778,17779,17780,17781,17782,17783,17784,17785, -17786,17787,17788,17789,17790,17791,17792,17793,17794,17795,17796,17797, -17798,17799,17800,17801,17802,17803,17804,17805,17806,17807,17808,17809, -17810,17811,17812,17813,17814,17815,17816,17817,17818,17819,17820,17821, -17822,17823,17824,17825,17826,17827,17828,17829,17830,17831,17832,17833, -17834,17835,17836,17837,17838,17839,17840,17841,17842,17843,17844,17845, -17846,17847,17848,17849,17850,17851,17852,17853,17854,17855,17856,17857, -17858,17859,17860,17861,17862,17863,17864,17865,17866,17867,17868,17869, -17870,17871,17872,17873,17874,17875,17876,17877,17878,17879,17880,17881, -17882,17883,17884,17885,17886,17887,17888,17889,17890,17891,17892,17893, -17894,17895,17896,17897,17898,17899,17900,17901,17902,17903,17904,17905, -17906,17907,17908,17909,17910,17911,17912,17913,17914,17915,17916,17917, -17918,17919,17920,17921,17922,17923,17924,17925,17926,17927,17928,17929, -17930,17931,17932,17933,17934,17935,17936,17937,17938,17939,17940,17941, -17942,17943,17944,17945,17946,17947,17948,17949,17950,17951,17952,17953, -17954,17955,17956,17957,17958,17959,17960,17961,17962,17963,17964,17965, -17966,17967,17968,17969,17970,17971,17972,17973,17974,17975,17976,17977, -17978,17979,17980,17981,17982,17983,17984,17985,17986,17987,17988,17989, -17990,17991,17992,17993,17994,17995,17996,17997,17998,17999,18000,18001, -18002,18003,18004,18005,18006,18007,18008,18009,18010,18011,18012,18013, -18014,18015,18016,18017,18018,18019,18020,18021,18022,18023,18024,18025, -18026,18027,18028,18029,18030,18031,18032,18033,18034,18035,18036,18037, -18038,18039,18040,18041,18042,18043,18044,18045,18046,18047,18048,18049, -18050,18051,18052,18053,18054,18055,18056,18057,18058,18059,18060,18061, -18062,18063,18064,18065,18066,18067,18068,18069,18070,18071,18072,18073, -18074,18075,18076,18077,18078,18079,18080,18081,18082,18083,18084,18085, -18086,18087,18088,18089,18090,18091,18092,18093,18094,18095,18096,18097, -18098,18099,18100,18101,18102,18103,18104,18105,18106,18107,18108,18109, -18110,18111,18112,18113,18114,18115,18116,18117,18118,18119,18120,18121, -18122,18123,18124,18125,18126,18127,18128,18129,18130,18131,18132,18133, -18134,18135,18136,18137,18138,18139,18140,18141,18142,18143,18144,18145, -18146,18147,18148,18149,18150,18151,18152,18153,18154,18155,18156,18157, -18158,18159,18160,18161,18162,18163,18164,18165,18166,18167,18168,18169, -18170,18171,18172,18173,18174,18175,18176,18177,18178,18179,18180,18181, -18182,18183,18184,18185,18186,18187,18188,18189,18190,18191,18192,18193, -18194,18195,18196,18197,18198,18199,18200,18201,18202,18203,18204,18205, -18206,18207,18208,18209,18210,18211,18212,18213,18214,18215,18216,18217, -18218,18219,18220,18221,18222,18223,18224,18225,18226,18227,18228,18229, -18230,18231,18232,18233,18234,18235,18236,18237,18238,18239,18240,18241, -18242,18243,18244,18245,18246,18247,18248,18249,18250,18251,18252,18253, -18254,18255,18256,18257,18258,18259,18260,18261,18262,18263,18264,18265, -18266,18267,18268,18269,18270,18271,18272,18273,18274,18275,18276,18277, -18278,18279,18280,18281,18282,18283,18284,18285,18286,18287,18288,18289, -18290,18291,18292,18293,18294,18295,18296,18297,18298,18299,18300,18301, -18302,18303,18304,18305,18306,18307,18308,18309,18310,18311,18312,18313, -18314,18315,18316,18317,18318,18319,18320,18321,18322,18323,18324,18325, -18326,18327,18328,18329,18330,18331,18332,18333,18334,18335,18336,18337, -18338,18339,18340,18341,18342,18343,18344,18345,18346,18347,18348,18349, -18350,18351,18352,18353,18354,18355,18356,18357,18358,18359,18360,18361, -18362,18363,18364,18365,18366,18367,18368,18369,18370,18371,18372,18373, -18374,18375,18376,18377,18378,18379,18380,18381,18382,18383,18384,18385, -18386,18387,18388,18389,18390,18391,18392,18393,18394,18395,18396,18397, -18398,18399,18400,18401,18402,18403,18404,18405,18406,18407,18408,18409, -18410,18411,18412,18413,18414,18415,18416,18417,18418,18419,18420,18421, -18422,18423,18424,18425,18426,18427,18428,18429,18430,18431,18432,18433, -18434,18435,18436,18437,18438,18439,18440,18441,18442,18443,18444,18445, -18446,18447,18448,18449,18450,18451,18452,18453,18454,18455,18456,18457, -18458,18459,18460,18461,18462,18463,18464,18465,18466,18467,18468,18469, -18470,18471,18472,18473,18474,18475,18476,18477,18478,18479,18480,18481, -18482,18483,18484,18485,18486,18487,18488,18489,18490,18491,18492,18493, -18494,18495,18496,18497,18498,18499,18500,18501,18502,18503,18504,18505, -18506,18507,18508,18509,18510,18511,18512,18513,18514,18515,18516,18517, -18518,18519,18520,18521,18522,18523,18524,18525,18526,18527,18528,18529, -18530,18531,18532,18533,18534,18535,18536,18537,18538,18539,18540,18541, -18542,18543,18544,18545,18546,18547,18548,18549,18550,18551,18552,18553, -18554,18555,18556,18557,18558,18559,18560,18561,18562,18563,18564,18565, -18566,18567,18568,18569,18570,18571,18572,18573,18574,18575,18576,18577, -18578,18579,18580,18581,18582,18583,18584,18585,18586,18587,18588,18589, -18590,18591,18592,18593,18594,18595,18596,18597,18598,18599,18600,18601, -18602,18603,18604,18605,18606,18607,18608,18609,18610,18611,18612,18613, -18614,18615,18616,18617,18618,18619,18620,18621,18622,18623,18624,18625, -18626,18627,18628,18629,18630,18631,18632,18633,18634,18635,18636,18637, -18638,18639,18640,18641,18642,18643,18644,18645,18646,18647,18648,18649, -18650,18651,18652,18653,18654,18655,18656,18657,18658,18659,18660,18661, -18662,18663,18664,18665,18666,18667,18668,18669,18670,18671,18672,18673, -18674,18675,18676,18677,18678,18679,18680,18681,18682,18683,18684,18685, -18686,18687,18688,18689,18690,18691,18692,18693,18694,18695,18696,18697, -18698,18699,18700,18701,18702,18703,18704,18705,18706,18707,18708,18709, -18710,18711,18712,18713,18714,18715,18716,18717,18718,18719,18720,18721, -18722,18723,18724,18725,18726,18727,18728,18729,18730,18731,18732,18733, -18734,18735,18736,18737,18738,18739,18740,18741,18742,18743,18744,18745, -18746,18747,18748,18749,18750,18751,18752,18753,18754,18755,18756,18757, -18758,18759,18760,18761,18762,18763,18764,18765,18766,18767,18768,18769, -18770,18771,18772,18773,18774,18775,18776,18777,18778,18779,18780,18781, -18782,18783,18784,18785,18786,18787,18788,18789,18790,18791,18792,18793, -18794,18795,18796,18797,18798,18799,18800,18801,18802,18803,18804,18805, -18806,18807,18808,18809,18810,18811,18812,18813,18814,18815,18816,18817, -18818,18819,18820,18821,18822,18823,18824,18825,18826,18827,18828,18829, -18830,18831,18832,18833,18834,18835,18836,18837,18838,18839,18840,18841, -18842,18843,18844,18845,18846,18847,18848,18849,18850,18851,18852,18853, -18854,18855,18856,18857,18858,18859,18860,18861,18862,18863,18864,18865, -18866,18867,18868,18869,18870,18871,18872,18873,18874,18875,18876,18877, -18878,18879,18880,18881,18882,18883,18884,18885,18886,18887,18888,18889, -18890,18891,18892,18893,18894,18895,18896,18897,18898,18899,18900,18901, -18902,18903,18904,18905,18906,18907,18908,18909,18910,18911,18912,18913, -18914,18915,18916,18917,18918,18919,18920,18921,18922,18923,18924,18925, -18926,18927,18928,18929,18930,18931,18932,18933,18934,18935,18936,18937, -18938,18939,18940,18941,18942,18943,18944,18945,18946,18947,18948,18949, -18950,18951,18952,18953,18954,18955,18956,18957,18958,18959,18960,18961, -18962,18963,18964,18965,18966,18967,18968,18969,18970,18971,18972,18973, -18974,18975,18976,18977,18978,18979,18980,18981,18982,18983,18984,18985, -18986,18987,18988,18989,18990,18991,18992,18993,18994,18995,18996,18997, -18998,18999,19000,19001,19002,19003,19004,19005,19006,19007,19008,19009, -19010,19011,19012,19013,19014,19015,19016,19017,19018,19019,19020,19021, -19022,19023,19024,19025,19026,19027,19028,19029,19030,19031,19032,19033, -19034,19035,19036,19037,19038,19039,19040,19041,19042,19043,19044,19045, -19046,19047,19048,19049,19050,19051,19052,19053,19054,19055,19056,19057, -19058,19059,19060,19061,19062,19063,19064,19065,19066,19067,19068,19069, -19070,19071,19072,19073,19074,19075,19076,19077,19078,19079,19080,19081, -19082,19083,19084,19085,19086,19087,19088,19089,19090,19091,19092,19093, -19094,19095,19096,19097,19098,19099,19100,19101,19102,19103,19104,19105, -19106,19107,19108,19109,19110,19111,19112,19113,19114,19115,19116,19117, -19118,19119,19120,19121,19122,19123,19124,19125,19126,19127,19128,19129, -19130,19131,19132,19133,19134,19135,19136,19137,19138,19139,19140,19141, -19142,19143,19144,19145,19146,19147,19148,19149,19150,19151,19152,19153, -19154,19155,19156,19157,19158,19159,19160,19161,19162,19163,19164,19165, -19166,19167,19168,19169,19170,19171,19172,19173,19174,19175,19176,19177, -19178,19179,19180,19181,19182,19183,19184,19185,19186,19187,19188,19189, -19190,19191,19192,19193,19194,19195,19196,19197,19198,19199,19200,19201, -19202,19203,19204,19205,19206,19207,19208,19209,19210,19211,19212,19213, -19214,19215,19216,19217,19218,19219,19220,19221,19222,19223,19224,19225, -19226,19227,19228,19229,19230,19231,19232,19233,19234,19235,19236,19237, -19238,19239,19240,19241,19242,19243,19244,19245,19246,19247,19248,19249, -19250,19251,19252,19253,19254,19255,19256,19257,19258,19259,19260,19261, -19262,19263,19264,19265,19266,19267,19268,19269,19270,19271,19272,19273, -19274,19275,19276,19277,19278,19279,19280,19281,19282,19283,19284,19285, -19286,19287,19288,19289,19290,19291,19292,19293,19294,19295,19296,19297, -19298,19299,19300,19301,19302,19303,19304,19305,19306,19307,19308,19309, -19310,19311,19312,19313,19314,19315,19316,19317,19318,19319,19320,19321, -19322,19323,19324,19325,19326,19327,19328,19329,19330,19331,19332,19333, -19334,19335,19336,19337,19338,19339,19340,19341,19342,19343,19344,19345, -19346,19347,19348,19349,19350,19351,19352,19353,19354,19355,19356,19357, -19358,19359,19360,19361,19362,19363,19364,19365,19366,19367,19368,19369, -19370,19371,19372,19373,19374,19375,19376,19377,19378,19379,19380,19381, -19382,19383,19384,19385,19386,19387,19388,19389,19390,19391,19392,19393, -19394,19395,19396,19397,19398,19399,19400,19401,19402,19403,19404,19405, -19406,19407,19408,19409,19410,19411,19412,19413,19414,19415,19416,19417, -19418,19419,19420,19421,19422,19423,19424,19425,19426,19427,19428,19429, -19430,19431,19432,19433,19434,19435,19436,19437,19438,19439,19440,19441, -19442,19443,19444,19445,19446,19447,19448,19449,19450,19451,19452,19453, -19454,19455,19456,19457,19458,19459,19460,19461,19462,19463,19464,19465, -19466,19467,19468,19469,19470,19471,19472,19473,19474,19475,19476,19477, -19478,19479,19480,19481,19482,19483,19484,19485,19486,19487,19488,19489, -19490,19491,19492,19493,19494,19495,19496,19497,19498,19499,19500,19501, -19502,19503,19504,19505,19506,19507,19508,19509,19510,19511,19512,19513, -19514,19515,19516,19517,19518,19519,19520,19521,19522,19523,19524,19525, -19526,19527,19528,19529,19530,19531,19532,19533,19534,19535,19536,19537, -19538,19539,19540,19541,19542,19543,19544,19545,19546,19547,19548,19549, -19550,19551,19552,19553,19554,19555,19556,19557,19558,19559,19560,19561, -19562,19563,19564,19565,19566,19567,19568,19569,19570,19571,19572,19573, -19574,19575,19576,19577,19578,19579,19580,19581,19582,19583,19584,19585, -19586,19587,19588,19589,19590,19591,19592,19593,19594,19595,19596,19597, -19598,19599,19600,19601,19602,19603,19604,19605,19606,19607,19608,19609, -19610,19611,19612,19613,19614,19615,19616,19617,19618,19619,19620,19621, -19622,19623,19624,19625,19626,19627,19628,19629,19630,19631,19632,19633, -19634,19635,19636,19637,19638,19639,19640,19641,19642,19643,19644,19645, -19646,19647,19648,19649,19650,19651,19652,19653,19654,19655,19656,19657, -19658,19659,19660,19661,19662,19663,19664,19665,19666,19667,19668,19669, -19670,19671,19672,19673,19674,19675,19676,19677,19678,19679,19680,19681, -19682,19683,19684,19685,19686,19687,19688,19689,19690,19691,19692,19693, -19694,19695,19696,19697,19698,19699,19700,19701,19702,19703,19704,19705, -19706,19707,19708,19709,19710,19711,19712,19713,19714,19715,19716,19717, -19718,19719,19720,19721,19722,19723,19724,19725,19726,19727,19728,19729, -19730,19731,19732,19733,19734,19735,19736,19737,19738,19739,19740,19741, -19742,19743,19744,19745,19746,19747,19748,19749,19750,19751,19752,19753, -19754,19755,19756,19757,19758,19759,19760,19761,19762,19763,19764,19765, -19766,19767,19768,19769,19770,19771,19772,19773,19774,19775,19776,19777, -19778,19779,19780,19781,19782,19783,19784,19785,19786,19787,19788,19789, -19790,19791,19792,19793,19794,19795,19796,19797,19798,19799,19800,19801, -19802,19803,19804,19805,19806,19807,19808,19809,19810,19811,19812,19813, -19814,19815,19816,19817,19818,19819,19820,19821,19822,19823,19824,19825, -19826,19827,19828,19829,19830,19831,19832,19833,19834,19835,19836,19837, -19838,19839,19840,19841,19842,19843,19844,19845,19846,19847,19848,19849, -19850,19851,19852,19853,19854,19855,19856,19857,19858,19859,19860,19861, -19862,19863,19864,19865,19866,19867,19868,19869,19870,19871,19872,19873, -19874,19875,19876,19877,19878,19879,19880,19881,19882,19883,19884,19885, -19886,19887,19888,19889,19890,19891,19892,19893,19894,19895,19896,19897, -19898,19899,19900,19901,19902,19903,19904,19905,19906,19907,19908,19909, -19910,19911,19912,19913,19914,19915,19916,19917,19918,19919,19920,19921, -19922,19923,19924,19925,19926,19927,19928,19929,19930,19931,19932,19933, -19934,19935,19936,19937,19938,19939,19940,19941,19942,19943,19944,19945, -19946,19947,19948,19949,19950,19951,19952,19953,19954,19955,19956,19957, -19958,19959,19960,19961,19962,19963,19964,19965,19966,19967,19968,19969, -19970,19971,19972,19973,19974,19975,19976,19977,19978,19979,19980,19981, -19982,19983,19984,19985,19986,19987,19988,19989,19990,19991,19992,19993, -19994,19995,19996,19997,19998,19999,20000,20001,20002,20003,20004,20005, -20006,20007,20008,20009,20010,20011,20012,20013,20014,20015,20016,20017, -20018,20019,20020,20021,20022,20023,20024,20025,20026,20027,20028,20029, -20030,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041, -20042,20043,20044,20045,20046,20047,20048,20049,20050,20051,20052,20053, -20054,20055,20056,20057,20058,20059,20060,20061,20062,20063,20064,20065, -20066,20067,20068,20069,20070,20071,20072,20073,20074,20075,20076,20077, -20078,20079,20080,20081,20082,20083,20084,20085,20086,20087,20088,20089, -20090,20091,20092,20093,20094,20095,20096,20097,20098,20099,20100,20101, -20102,20103,20104,20105,20106,20107,20108,20109,20110,20111,20112,20113, -20114,20115,20116,20117,20118,20119,20120,20121,20122,20123,20124,20125, -20126,20127,20128,20129,20130,20131,20132,20133,20134,20135,20136,20137, -20138,20139,20140,20141,20142,20143,20144,20145,20146,20147,20148,20149, -20150,20151,20152,20153,20154,20155,20156,20157,20158,20159,20160,20161, -20162,20163,20164,20165,20166,20167,20168,20169,20170,20171,20172,20173, -20174,20175,20176,20177,20178,20179,20180,20181,20182,20183,20184,20185, -20186,20187,20188,20189,20190,20191,20192,20193,20194,20195,20196,20197, -20198,20199,20200,20201,20202,20203,20204,20205,20206,20207,20208,20209, -20210,20211,20212,20213,20214,20215,20216,20217,20218,20219,20220,20221, -20222,20223,20224,20225,20226,20227,20228,20229,20230,20231,20232,20233, -20234,20235,20236,20237,20238,20239,20240,20241,20242,20243,20244,20245, -20246,20247,20248,20249,20250,20251,20252,20253,20254,20255,20256,20257, -20258,20259,20260,20261,20262,20263,20264,20265,20266,20267,20268,20269, -20270,20271,20272,20273,20274,20275,20276,20277,20278,20279,20280,20281, -20282,20283,20284,20285,20286,20287,20288,20289,20290,20291,20292,20293, -20294,20295,20296,20297,20298,20299,20300,20301,20302,20303,20304,20305, -20306,20307,20308,20309,20310,20311,20312,20313,20314,20315,20316,20317, -20318,20319,20320,20321,20322,20323,20324,20325,20326,20327,20328,20329, -20330,20331,20332,20333,20334,20335,20336,20337,20338,20339,20340,20341, -20342,20343,20344,20345,20346,20347,20348,20349,20350,20351,20352,20353, -20354,20355,20356,20357,20358,20359,20360,20361,20362,20363,20364,20365, -20366,20367,20368,20369,20370,20371,20372,20373,20374,20375,20376,20377, -20378,20379,20380,20381,20382,20383,20384,20385,20386,20387,20388,20389, -20390,20391,20392,20393,20394,20395,20396,20397,20398,20399,20400,20401, -20402,20403,20404,20405,20406,20407,20408,20409,20410,20411,20412,20413, -20414,20415,20416,20417,20418,20419,20420,20421,20422,20423,20424,20425, -20426,20427,20428,20429,20430,20431,20432,20433,20434,20435,20436,20437, -20438,20439,20440,20441,20442,20443,20444,20445,20446,20447,20448,20449, -20450,20451,20452,20453,20454,20455,20456,20457,20458,20459,20460,20461, -20462,20463,20464,20465,20466,20467,20468,20469,20470,20471,20472,20473, -20474,20475,20476,20477,20478,20479,20480,20481,20482,20483,20484,20485, -20486,20487,20488,20489,20490,20491,20492,20493,20494,20495,20496,20497, -20498,20499,20500,20501,20502,20503,20504,20505,20506,20507,20508,20509, -20510,20511,20512,20513,20514,20515,20516,20517,20518,20519,20520,20521, -20522,20523,20524,20525,20526,20527,20528,20529,20530,20531,20532,20533, -20534,20535,20536,20537,20538,20539,20540,20541,20542,20543,20544,20545, -20546,20547,20548,20549,20550,20551,20552,20553,20554,20555,20556,20557, -20558,20559,20560,20561,20562,20563,20564,20565,20566,20567,20568,20569, -20570,20571,20572,20573,20574,20575,20576,20577,20578,20579,20580,20581, -20582,20583,20584,20585,20586,20587,20588,20589,20590,20591,20592,20593, -20594,20595,20596,20597,20598,20599,20600,20601,20602,20603,20604,20605, -20606,20607,20608,20609,20610,20611,20612,20613,20614,20615,20616,20617, -20618,20619,20620,20621,20622,20623,20624,20625,20626,20627,20628,20629, -20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641, -20642,20643,20644,20645,20646,20647,20648,20649,20650,20651,20652,20653, -20654,20655,20656,20657,20658,20659,20660,20661,20662,20663,20664,20665, -20666,20667,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677, -20678,20679,20680,20681,20682,20683,20684,20685,20686,20687,20688,20689, -20690,20691,20692,20693,20694,20695,20696,20697,20698,20699,20700,20701, -20702,20703,20704,20705,20706,20707,20708,20709,20710,20711,20712,20713, -20714,20715,20716,20717,20718,20719,20720,20721,20722,20723,20724,20725, -20726,20727,20728,20729,20730,20731,20732,20733,20734,20735,20736,20737, -20738,20739,20740,20741,20742,20743,20744,20745,20746,20747,20748,20749, -20750,20751,20752,20753,20754,20755,20756,20757,20758,20759,20760,20761, -20762,20763,20764,20765,20766,20767,20768,20769,20770,20771,20772,20773, -20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785, -20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797, -20798,20799,20800,20801,20802,20803,20804,20805,20806,20807,20808,20809, -20810,20811,20812,20813,20814,20815,20816,20817,20818,20819,20820,20821, -20822,20823,20824,20825,20826,20827,20828,20829,20830,20831,20832,20833, -20834,20835,20836,20837,20838,20839,20840,20841,20842,20843,20844,20845, -20846,20847,20848,20849,20850,20851,20852,20853,20854,20855,20856,20857, -20858,20859,20860,20861,20862,20863,20864,20865,20866,20867,20868,20869, -20870,20871,20872,20873,20874,20875,20876,20877,20878,20879,20880,20881, -20882,20883,20884,20885,20886,20887,20888,20889,20890,20891,20892,20893, -20894,20895,20896,20897,20898,20899,20900,20901,20902,20903,20904,20905, -20906,20907,20908,20909,20910,20911,20912,20913,20914,20915,20916,20917, -20918,20919,20920,20921,20922,20923,20924,20925,20926,20927,20928,20929, -20930,20931,20932,20933,20934,20935,20936,20937,20938,20939,20940,20941, -20942,20943,20944,20945,20946,20947,20948,20949,20950,20951,20952,20953, -20954,20955,20956,20957,20958,20959,20960,20961,20962,20963,20964,20965, -20966,20967,20968,20969,20970,20971,20972,20973,20974,20975,20976,20977, -20978,20979,20980,20981,20982,20983,20984,20985,20986,20987,20988,20989, -20990,20991,20992,20993,20994,20995,20996,20997,20998,20999,21000,21001, -21002,21003,21004,21005,21006,21007,21008,21009,21010,21011,21012,21013, -21014,21015,21016,21017,21018,21019,21020,21021,21022,21023,21024,21025, -21026,21027,21028,21029,21030,21031,21032,21033,21034,21035,21036,21037, -21038,21039,21040,21041,21042,21043,21044,21045,21046,21047,21048,21049, -21050,21051,21052,21053,21054,21055,21056,21057,21058,21059,21060,21061, -21062,21063,21064,21065,21066,21067,21068,21069,21070,21071,21072,21073, -21074,21075,21076,21077,21078,21079,21080,21081,21082,21083,21084,21085, -21086,21087,21088,21089,21090,21091,21092,21093,21094,21095,21096,21097, -21098,21099,21100,21101,21102,21103,21104,21105,21106,21107,21108,21109, -21110,21111,21112,21113,21114,21115,21116,21117,21118,21119,21120,21121, -21122,21123,21124,21125,21126,21127,21128,21129,21130,21131,21132,21133, -21134,21135,21136,21137,21138,21139,21140,21141,21142,21143,21144,21145, -21146,21147,21148,21149,21150,21151,21152,21153,21154,21155,21156,21157, -21158,21159,21160,21161,21162,21163,21164,21165,21166,21167,21168,21169, -21170,21171,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181, -21182,21183,21184,21185,21186,21187,21188,21189,21190,21191,21192,21193, -21194,21195,21196,21197,21198,21199,21200,21201,21202,21203,21204,21205, -21206,21207,21208,21209,21210,21211,21212,21213,21214,21215,21216,21217, -21218,21219,21220,21221,21222,21223,21224,21225,21226,21227,21228,21229, -21230,21231,21232,21233,21234,21235,21236,21237,21238,21239,21240,21241, -21242,21243,21244,21245,21246,21247,21248,21249,21250,21251,21252,21253, -21254,21255,21256,21257,21258,21259,21260,21261,21262,21263,21264,21265, -21266,21267,21268,21269,21270,21271,21272,21273,21274,21275,21276,21277, -21278,21279,21280,21281,21282,21283,21284,21285,21286,21287,21288,21289, -21290,21291,21292,21293,21294,21295,21296,21297,21298,21299,21300,21301, -21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21313, -21314,21315,21316,21317,21318,21319,21320,21321,21322,21323,21324,21325, -21326,21327,21328,21329,21330,21331,21332,21333,21334,21335,21336,21337, -21338,21339,21340,21341,21342,21343,21344,21345,21346,21347,21348,21349, -21350,21351,21352,21353,21354,21355,21356,21357,21358,21359,21360,21361, -21362,21363,21364,21365,21366,21367,21368,21369,21370,21371,21372,21373, -21374,21375,21376,21377,21378,21379,21380,21381,21382,21383,21384,21385, -21386,21387,21388,21389,21390,21391,21392,21393,21394,21395,21396,21397, -21398,21399,21400,21401,21402,21403,21404,21405,21406,21407,21408,21409, -21410,21411,21412,21413,21414,21415,21416,21417,21418,21419,21420,21421, -21422,21423,21424,21425,21426,21427,21428,21429,21430,21431,21432,21433, -21434,21435,21436,21437,21438,21439,21440,21441,21442,21443,21444,21445, -21446,21447,21448,21449,21450,21451,21452,21453,21454,21455,21456,21457, -21458,21459,21460,21461,21462,21463,21464,21465,21466,21467,21468,21469, -21470,21471,21472,21473,21474,21475,21476,21477,21478,21479,21480,21481, -21482,21483,21484,21485,21486,21487,21488,21489,21490,21491,21492,21493, -21494,21495,21496,21497,21498,21499,21500,21501,21502,21503,21504,21505, -21506,21507,21508,21509,21510,21511,21512,21513,21514,21515,21516,21517, -21518,21519,21520,21521,21522,21523,21524,21525,21526,21527,21528,21529, -21530,21531,21532,21533,21534,21535,21536,21537,21538,21539,21540,21541, -21542,21543,21544,21545,21546,21547,21548,21549,21550,21551,21552,21553, -21554,21555,21556,21557,21558,21559,21560,21561,21562,21563,21564,21565, -21566,21567,21568,21569,21570,21571,21572,21573,21574,21575,21576,21577, -21578,21579,21580,21581,21582,21583,21584,21585,21586,21587,21588,21589, -21590,21591,21592,21593,21594,21595,21596,21597,21598,21599,21600,21601, -21602,21603,21604,21605,21606,21607,21608,21609,21610,21611,21612,21613, -21614,21615,21616,21617,21618,21619,21620,21621,21622,21623,21624,21625, -21626,21627,21628,21629,21630,21631,21632,21633,21634,21635,21636,21637, -21638,21639,21640,21641,21642,21643,21644,21645,21646,21647,21648,21649, -21650,21651,21652,21653,21654,21655,21656,21657,21658,21659,21660,21661, -21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673, -21674,21675,21676,21677,21678,21679,21680,21681,21682,21683,21684,21685, -21686,21687,21688,21689,21690,21691,21692,21693,21694,21695,21696,21697, -21698,21699,21700,21701,21702,21703,21704,21705,21706,21707,21708,21709, -21710,21711,21712,21713,21714,21715,21716,21717,21718,21719,21720,21721, -21722,21723,21724,21725,21726,21727,21728,21729,21730,21731,21732,21733, -21734,21735,21736,21737,21738,21739,21740,21741,21742,21743,21744,21745, -21746,21747,21748,21749,21750,21751,21752,21753,21754,21755,21756,21757, -21758,21759,21760,21761,21762,21763,21764,21765,21766,21767,21768,21769, -21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781, -21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793, -21794,21795,21796,21797,21798,21799,21800,21801,21802,21803,21804,21805, -21806,21807,21808,21809,21810,21811,21812,21813,21814,21815,21816,21817, -21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829, -21830,21831,21832,21833,21834,21835,21836,21837,21838,21839,21840,21841, -21842,21843,21844,21845,21846,21847,21848,21849,21850,21851,21852,21853, -21854,21855,21856,21857,21858,21859,21860,21861,21862,21863,21864,21865, -21866,21867,21868,21869,21870,21871,21872,21873,21874,21875,21876,21877, -21878,21879,21880,21881,21882,21883,21884,21885,21886,21887,21888,21889, -21890,21891,21892,21893,21894,21895,21896,21897,21898,21899,21900,21901, -21902,21903,21904,21905,21906,21907,21908,21909,21910,21911,21912,21913, -21914,21915,21916,21917,21918,21919,21920,21921,21922,21923,21924,21925, -21926,21927,21928,21929,21930,21931,21932,21933,21934,21935,21936,21937, -21938,21939,21940,21941,21942,21943,21944,21945,21946,21947,21948,21949, -21950,21951,21952,21953,21954,21955,21956,21957,21958,21959,21960,21961, -21962,21963,21964,21965,21966,21967,21968,21969,21970,21971,21972,21973, -21974,21975,21976,21977,21978,21979,21980,21981,21982,21983,21984,21985, -21986,21987,21988,21989,21990,21991,21992,21993,21994,21995,21996,21997, -21998,21999,22000,22001,22002,22003,22004,22005,22006,22007,22008,22009, -22010,22011,22012,22013,22014,22015,22016,22017,22018,22019,22020,22021, -22022,22023,22024,22025,22026,22027,22028,22029,22030,22031,22032,22033, -22034,22035,22036,22037,22038,22039,22040,22041,22042,22043,22044,22045, -22046,22047,22048,22049,22050,22051,22052,22053,22054,22055,22056,22057, -22058,22059,22060,22061,22062,22063,22064,22065,22066,22067,22068,22069, -22070,22071,22072,22073,22074,22075,22076,22077,22078,22079,22080,22081, -22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22092,22093, -22094,22095,22096,22097,22098,22099,22100,22101,22102,22103,22104,22105, -22106,22107,22108,22109,22110,22111,22112,22113,22114,22115,22116,22117, -22118,22119,22120,22121,22122,22123,22124,22125,22126,22127,22128,22129, -22130,22131,22132,22133,22134,22135,22136,22137,22138,22139,22140,22141, -22142,22143,22144,22145,22146,22147,22148,22149,22150,22151,22152,22153, -22154,22155,22156,22157,22158,22159,22160,22161,22162,22163,22164,22165, -22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177, -22178,22179,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189, -22190,22191,22192,22193,22194,22195,22196,22197,22198,22199,22200,22201, -22202,22203,22204,22205,22206,22207,22208,22209,22210,22211,22212,22213, -22214,22215,22216,22217,22218,22219,22220,22221,22222,22223,22224,22225, -22226,22227,22228,22229,22230,22231,22232,22233,22234,22235,22236,22237, -22238,22239,22240,22241,22242,22243,22244,22245,22246,22247,22248,22249, -22250,22251,22252,22253,22254,22255,22256,22257,22258,22259,22260,22261, -22262,22263,22264,22265,22266,22267,22268,22269,22270,22271,22272,22273, -22274,22275,22276,22277,22278,22279,22280,22281,22282,22283,22284,22285, -22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297, -22298,22299,22300,22301,22302,22303,22304,22305,22306,22307,22308,22309, -22310,22311,22312,22313,22314,22315,22316,22317,22318,22319,22320,22321, -22322,22323,22324,22325,22326,22327,22328,22329,22330,22331,22332,22333, -22334,22335,22336,22337,22338,22339,22340,22341,22342,22343,22344,22345, -22346,22347,22348,22349,22350,22351,22352,22353,22354,22355,22356,22357, -22358,22359,22360,22361,22362,22363,22364,22365,22366,22367,22368,22369, -22370,22371,22372,22373,22374,22375,22376,22377,22378,22379,22380,22381, -22382,22383,22384,22385,22386,22387,22388,22389,22390,22391,22392,22393, -22394,22395,22396,22397,22398,22399,22400,22401,22402,22403,22404,22405, -22406,22407,22408,22409,22410,22411,22412,22413,22414,22415,22416,22417, -22418,22419,22420,22421,22422,22423,22424,22425,22426,22427,22428,22429, -22430,22431,22432,22433,22434,22435,22436,22437,22438,22439,22440,22441, -22442,22443,22444,22445,22446,22447,22448,22449,22450,22451,22452,22453, -22454,22455,22456,22457,22458,22459,22460,22461,22462,22463,22464,22465, -22466,22467,22468,22469,22470,22471,22472,22473,22474,22475,22476,22477, -22478,22479,22480,22481,22482,22483,22484,22485,22486,22487,22488,22489, -22490,22491,22492,22493,22494,22495,22496,22497,22498,22499,22500,22501, -22502,22503,22504,22505,22506,22507,22508,22509,22510,22511,22512,22513, -22514,22515,22516,22517,22518,22519,22520,22521,22522,22523,22524,22525, -22526,22527,22528,22529,22530,22531,22532,22533,22534,22535,22536,22537, -22538,22539,22540,22541,22542,22543,22544,22545,22546,22547,22548,22549, -22550,22551,22552,22553,22554,22555,22556,22557,22558,22559,22560,22561, -22562,22563,22564,22565,22566,22567,22568,22569,22570,22571,22572,22573, -22574,22575,22576,22577,22578,22579,22580,22581,22582,22583,22584,22585, -22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22596,22597, -22598,22599,22600,22601,22602,22603,22604,22605,22606,22607,22608,22609, -22610,22611,22612,22613,22614,22615,22616,22617,22618,22619,22620,22621, -22622,22623,22624,22625,22626,22627,22628,22629,22630,22631,22632,22633, -22634,22635,22636,22637,22638,22639,22640,22641,22642,22643,22644,22645, -22646,22647,22648,22649,22650,22651,22652,22653,22654,22655,22656,22657, -22658,22659,22660,22661,22662,22663,22664,22665,22666,22667,22668,22669, -22670,22671,22672,22673,22674,22675,22676,22677,22678,22679,22680,22681, -22682,22683,22684,22685,22686,22687,22688,22689,22690,22691,22692,22693, -22694,22695,22696,22697,22698,22699,22700,22701,22702,22703,22704,22705, -22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22716,22717, -22718,22719,22720,22721,22722,22723,22724,22725,22726,22727,22728,22729, -22730,22731,22732,22733,22734,22735,22736,22737,22738,22739,22740,22741, -22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753, -22754,22755,22756,22757,22758,22759,22760,22761,22762,22763,22764,22765, -22766,22767,22768,22769,22770,22771,22772,22773,22774,22775,22776,22777, -22778,22779,22780,22781,22782,22783,22784,22785,22786,22787,22788,22789, -22790,22791,22792,22793,22794,22795,22796,22797,22798,22799,22800,22801, -22802,22803,22804,22805,22806,22807,22808,22809,22810,22811,22812,22813, -22814,22815,22816,22817,22818,22819,22820,22821,22822,22823,22824,22825, -22826,22827,22828,22829,22830,22831,22832,22833,22834,22835,22836,22837, -22838,22839,22840,22841,22842,22843,22844,22845,22846,22847,22848,22849, -22850,22851,22852,22853,22854,22855,22856,22857,22858,22859,22860,22861, -22862,22863,22864,22865,22866,22867,22868,22869,22870,22871,22872,22873, -22874,22875,22876,22877,22878,22879,22880,22881,22882,22883,22884,22885, -22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897, -22898,22899,22900,22901,22902,22903,22904,22905,22906,22907,22908,22909, -22910,22911,22912,22913,22914,22915,22916,22917,22918,22919,22920,22921, -22922,22923,22924,22925,22926,22927,22928,22929,22930,22931,22932,22933, -22934,22935,22936,22937,22938,22939,22940,22941,22942,22943,22944,22945, -22946,22947,22948,22949,22950,22951,22952,22953,22954,22955,22956,22957, -22958,22959,22960,22961,22962,22963,22964,22965,22966,22967,22968,22969, -22970,22971,22972,22973,22974,22975,22976,22977,22978,22979,22980,22981, -22982,22983,22984,22985,22986,22987,22988,22989,22990,22991,22992,22993, -22994,22995,22996,22997,22998,22999,23000,23001,23002,23003,23004,23005, -23006,23007,23008,23009,23010,23011,23012,23013,23014,23015,23016,23017, -23018,23019,23020,23021,23022,23023,23024,23025,23026,23027,23028,23029, -23030,23031,23032,23033,23034,23035,23036,23037,23038,23039,23040,23041, -23042,23043,23044,23045,23046,23047,23048,23049,23050,23051,23052,23053, -23054,23055,23056,23057,23058,23059,23060,23061,23062,23063,23064,23065, -23066,23067,23068,23069,23070,23071,23072,23073,23074,23075,23076,23077, -23078,23079,23080,23081,23082,23083,23084,23085,23086,23087,23088,23089, -23090,23091,23092,23093,23094,23095,23096,23097,23098,23099,23100,23101, -23102,23103,23104,23105,23106,23107,23108,23109,23110,23111,23112,23113, -23114,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23125, -23126,23127,23128,23129,23130,23131,23132,23133,23134,23135,23136,23137, -23138,23139,23140,23141,23142,23143,23144,23145,23146,23147,23148,23149, -23150,23151,23152,23153,23154,23155,23156,23157,23158,23159,23160,23161, -23162,23163,23164,23165,23166,23167,23168,23169,23170,23171,23172,23173, -23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185, -23186,23187,23188,23189,23190,23191,23192,23193,23194,23195,23196,23197, -23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209, -23210,23211,23212,23213,23214,23215,23216,23217,23218,23219,23220,23221, -23222,23223,23224,23225,23226,23227,23228,23229,23230,23231,23232,23233, -23234,23235,23236,23237,23238,23239,23240,23241,23242,23243,23244,23245, -23246,23247,23248,23249,23250,23251,23252,23253,23254,23255,23256,23257, -23258,23259,23260,23261,23262,23263,23264,23265,23266,23267,23268,23269, -23270,23271,23272,23273,23274,23275,23276,23277,23278,23279,23280,23281, -23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293, -23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23305, -23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317, -23318,23319,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329, -23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341, -23342,23343,23344,23345,23346,23347,23348,23349,23350,23351,23352,23353, -23354,23355,23356,23357,23358,23359,23360,23361,23362,23363,23364,23365, -23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23376,23377, -23378,23379,23380,23381,23382,23383,23384,23385,23386,23387,23388,23389, -23390,23391,23392,23393,23394,23395,23396,23397,23398,23399,23400,23401, -23402,23403,23404,23405,23406,23407,23408,23409,23410,23411,23412,23413, -23414,23415,23416,23417,23418,23419,23420,23421,23422,23423,23424,23425, -23426,23427,23428,23429,23430,23431,23432,23433,23434,23435,23436,23437, -23438,23439,23440,23441,23442,23443,23444,23445,23446,23447,23448,23449, -23450,23451,23452,23453,23454,23455,23456,23457,23458,23459,23460,23461, -23462,23463,23464,23465,23466,23467,23468,23469,23470,23471,23472,23473, -23474,23475,23476,23477,23478,23479,23480,23481,23482,23483,23484,23485, -23486,23487,23488,23489,23490,23491,23492,23493,23494,23495,23496,23497, -23498,23499,23500,23501,23502,23503,23504,23505,23506,23507,23508,23509, -23510,23511,23512,23513,23514,23515,23516,23517,23518,23519,23520,23521, -23522,23523,23524,23525,23526,23527,23528,23529,23530,23531,23532,23533, -23534,23535,23536,23537,23538,23539,23540,23541,23542,23543,23544,23545, -23546,23547,23548,23549,23550,23551,23552,23553,23554,23555,23556,23557, -23558,23559,23560,23561,23562,23563,23564,23565,23566,23567,23568,23569, -23570,23571,23572,23573,23574,23575,23576,23577,23578,23579,23580,23581, -23582,23583,23584,23585,23586,23587,23588,23589,23590,23591,23592,23593, -23594,23595,23596,23597,23598,23599,23600,23601,23602,23603,23604,23605, -23606,23607,23608,23609,23610,23611,23612,23613,23614,23615,23616,23617, -23618,23619,23620,23621,23622,23623,23624,23625,23626,23627,23628,23629, -23630,23631,23632,23633,23634,23635,23636,23637,23638,23639,23640,23641, -23642,23643,23644,23645,23646,23647,23648,23649,23650,23651,23652,23653, -23654,23655,23656,23657,23658,23659,23660,23661,23662,23663,23664,23665, -23666,23667,23668,23669,23670,23671,23672,23673,23674,23675,23676,23677, -23678,23679,23680,23681,23682,23683,23684,23685,23686,23687,23688,23689, -23690,23691,23692,23693,23694,23695,23696,23697,23698,23699,23700,23701, -23702,23703,23704,23705,23706,23707,23708,23709,23710,23711,23712,23713, -23714,23715,23716,23717,23718,23719,23720,23721,23722,23723,23724,23725, -23726,23727,23728,23729,23730,23731,23732,23733,23734,23735,23736,23737, -23738,23739,23740,23741,23742,23743,23744,23745,23746,23747,23748,23749, -23750,23751,23752,23753,23754,23755,23756,23757,23758,23759,23760,23761, -23762,23763,23764,23765,23766,23767,23768,23769,23770,23771,23772,23773, -23774,23775,23776,23777,23778,23779,23780,23781,23782,23783,23784,23785, -23786,23787,23788,23789,23790,23791,23792,23793,23794,23795,23796,23797, -23798,23799,23800,23801,23802,23803,23804,23805,23806,23807,23808,23809, -23810,23811,23812,23813,23814,23815,23816,23817,23818,23819,23820,23821, -23822,23823,23824,23825,23826,23827,23828,23829,23830,23831,23832,23833, -23834,23835,23836,23837,23838,23839,23840,23841,23842,23843,23844,23845, -23846,23847,23848,23849,23850,23851,23852,23853,23854,23855,23856,23857, -23858,23859,23860,23861,23862,23863,23864,23865,23866,23867,23868,23869, -23870,23871,23872,23873,23874,23875,23876,23877,23878,23879,23880,23881, -23882,23883,23884,23885,23886,23887,23888,23889,23890,23891,23892,23893, -23894,23895,23896,23897,23898,23899,23900,23901,23902,23903,23904,23905, -23906,23907,23908,23909,23910,23911,23912,23913,23914,23915,23916,23917, -23918,23919,23920,23921,23922,23923,23924,23925,23926,23927,23928,23929, -23930,23931,23932,23933,23934,23935,23936,23937,23938,23939,23940,23941, -23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953, -23954,23955,23956,23957,23958,23959,23960,23961,23962,23963,23964,23965, -23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977, -23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989, -23990,23991,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001, -24002,24003,24004,24005,24006,24007,24008,24009,24010,24011,24012,24013, -24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025, -24026,24027,24028,24029,24030,24031,24032,24033,24034,24035,24036,24037, -24038,24039,24040,24041,24042,24043,24044,24045,24046,24047,24048,24049, -24050,24051,24052,24053,24054,24055,24056,24057,24058,24059,24060,24061, -24062,24063,24064,24065,24066,24067,24068,24069,24070,24071,24072,24073, -24074,24075,24076,24077,24078,24079,24080,24081,24082,24083,24084,24085, -24086,24087,24088,24089,24090,24091,24092,24093,24094,24095,24096,24097, -24098,24099,24100,24101,24102,24103,24104,24105,24106,24107,24108,24109, -24110,24111,24112,24113,24114,24115,24116,24117,24118,24119,24120,24121, -24122,24123,24124,24125,24126,24127,24128,24129,24130,24131,24132,24133, -24134,24135,24136,24137,24138,24139,24140,24141,24142,24143,24144,24145, -24146,24147,24148,24149,24150,24151,24152,24153,24154,24155,24156,24157, -24158,24159,24160,24161,24162,24163,24164,24165,24166,24167,24168,24169, -24170,24171,24172,24173,24174,24175,24176,24177,24178,24179,24180,24181, -24182,24183,24184,24185,24186,24187,24188,24189,24190,24191,24192,24193, -24194,24195,24196,24197,24198,24199,24200,24201,24202,24203,24204,24205, -24206,24207,24208,24209,24210,24211,24212,24213,24214,24215,24216,24217, -24218,24219,24220,24221,24222,24223,24224,24225,24226,24227,24228,24229, -24230,24231,24232,24233,24234,24235,24236,24237,24238,24239,24240,24241, -24242,24243,24244,24245,24246,24247,24248,24249,24250,24251,24252,24253, -24254,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24265, -24266,24267,24268,24269,24270,24271,24272,24273,24274,24275,24276,24277, -24278,24279,24280,24281,24282,24283,24284,24285,24286,24287,24288,24289, -24290,24291,24292,24293,24294,24295,24296,24297,24298,24299,24300,24301, -24302,24303,24304,24305,24306,24307,24308,24309,24310,24311,24312,24313, -24314,24315,24316,24317,24318,24319,24320,24321,24322,24323,24324,24325, -24326,24327,24328,24329,24330,24331,24332,24333,24334,24335,24336,24337, -24338,24339,24340,24341,24342,24343,24344,24345,24346,24347,24348,24349, -24350,24351,24352,24353,24354,24355,24356,24357,24358,24359,24360,24361, -24362,24363,24364,24365,24366,24367,24368,24369,24370,24371,24372,24373, -24374,24375,24376,24377,24378,24379,24380,24381,24382,24383,24384,24385, -24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397, -24398,24399,24400,24401,24402,24403,24404,24405,24406,24407,24408,24409, -24410,24411,24412,24413,24414,24415,24416,24417,24418,24419,24420,24421, -24422,24423,24424,24425,24426,24427,24428,24429,24430,24431,24432,24433, -24434,24435,24436,24437,24438,24439,24440,24441,24442,24443,24444,24445, -24446,24447,24448,24449,24450,24451,24452,24453,24454,24455,24456,24457, -24458,24459,24460,24461,24462,24463,24464,24465,24466,24467,24468,24469, -24470,24471,24472,24473,24474,24475,24476,24477,24478,24479,24480,24481, -24482,24483,24484,24485,24486,24487,24488,24489,24490,24491,24492,24493, -24494,24495,24496,24497,24498,24499,24500,24501,24502,24503,24504,24505, -24506,24507,24508,24509,24510,24511,24512,24513,24514,24515,24516,24517, -24518,24519,24520,24521,24522,24523,24524,24525,24526,24527,24528,24529, -24530,24531,24532,24533,24534,24535,24536,24537,24538,24539,24540,24541, -24542,24543,24544,24545,24546,24547,24548,24549,24550,24551,24552,24553, -24554,24555,24556,24557,24558,24559,24560,24561,24562,24563,24564,24565, -24566,24567,24568,24569,24570,24571,24572,24573,24574,24575,24576,24577, -24578,24579,24580,24581,24582,24583,24584,24585,24586,24587,24588,24589, -24590,24591,24592,24593,24594,24595,24596,24597,24598,24599,24600,24601, -24602,24603,24604,24605,24606,24607,24608,24609,24610,24611,24612,24613, -24614,24615,24616,24617,24618,24619,24620,24621,24622,24623,24624,24625, -24626,24627,24628,24629,24630,24631,24632,24633,24634,24635,24636,24637, -24638,24639,24640,24641,24642,24643,24644,24645,24646,24647,24648,24649, -24650,24651,24652,24653,24654,24655,24656,24657,24658,24659,24660,24661, -24662,24663,24664,24665,24666,24667,24668,24669,24670,24671,24672,24673, -24674,24675,24676,24677,24678,24679,24680,24681,24682,24683,24684,24685, -24686,24687,24688,24689,24690,24691,24692,24693,24694,24695,24696,24697, -24698,24699,24700,24701,24702,24703,24704,24705,24706,24707,24708,24709, -24710,24711,24712,24713,24714,24715,24716,24717,24718,24719,24720,24721, -24722,24723,24724,24725,24726,24727,24728,24729,24730,24731,24732,24733, -24734,24735,24736,24737,24738,24739,24740,24741,24742,24743,24744,24745, -24746,24747,24748,24749,24750,24751,24752,24753,24754,24755,24756,24757, -24758,24759,24760,24761,24762,24763,24764,24765,24766,24767,24768,24769, -24770,24771,24772,24773,24774,24775,24776,24777,24778,24779,24780,24781, -24782,24783,24784,24785,24786,24787,24788,24789,24790,24791,24792,24793, -24794,24795,24796,24797,24798,24799,24800,24801,24802,24803,24804,24805, -24806,24807,24808,24809,24810,24811,24812,24813,24814,24815,24816,24817, -24818,24819,24820,24821,24822,24823,24824,24825,24826,24827,24828,24829, -24830,24831,24832,24833,24834,24835,24836,24837,24838,24839,24840,24841, -24842,24843,24844,24845,24846,24847,24848,24849,24850,24851,24852,24853, -24854,24855,24856,24857,24858,24859,24860,24861,24862,24863,24864,24865, -24866,24867,24868,24869,24870,24871,24872,24873,24874,24875,24876,24877, -24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889, -24890,24891,24892,24893,24894,24895,24896,24897,24898,24899,24900,24901, -24902,24903,24904,24905,24906,24907,24908,24909,24910,24911,24912,24913, -24914,24915,24916,24917,24918,24919,24920,24921,24922,24923,24924,24925, -24926,24927,24928,24929,24930,24931,24932,24933,24934,24935,24936,24937, -24938,24939,24940,24941,24942,24943,24944,24945,24946,24947,24948,24949, -24950,24951,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961, -24962,24963,24964,24965,24966,24967,24968,24969,24970,24971,24972,24973, -24974,24975,24976,24977,24978,24979,24980,24981,24982,24983,24984,24985, -24986,24987,24988,24989,24990,24991,24992,24993,24994,24995,24996,24997, -24998,24999,25000,25001,25002,25003,25004,25005,25006,25007,25008,25009, -25010,25011,25012,25013,25014,25015,25016,25017,25018,25019,25020,25021, -25022,25023,25024,25025,25026,25027,25028,25029,25030,25031,25032,25033, -25034,25035,25036,25037,25038,25039,25040,25041,25042,25043,25044,25045, -25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057, -25058,25059,25060,25061,25062,25063,25064,25065,25066,25067,25068,25069, -25070,25071,25072,25073,25074,25075,25076,25077,25078,25079,25080,25081, -25082,25083,25084,25085,25086,25087,25088,25089,25090,25091,25092,25093, -25094,25095,25096,25097,25098,25099,25100,25101,25102,25103,25104,25105, -25106,25107,25108,25109,25110,25111,25112,25113,25114,25115,25116,25117, -25118,25119,25120,25121,25122,25123,25124,25125,25126,25127,25128,25129, -25130,25131,25132,25133,25134,25135,25136,25137,25138,25139,25140,25141, -25142,25143,25144,25145,25146,25147,25148,25149,25150,25151,25152,25153, -25154,25155,25156,25157,25158,25159,25160,25161,25162,25163,25164,25165, -25166,25167,25168,25169,25170,25171,25172,25173,25174,25175,25176,25177, -25178,25179,25180,25181,25182,25183,25184,25185,25186,25187,25188,25189, -25190,25191,25192,25193,25194,25195,25196,25197,25198,25199,25200,25201, -25202,25203,25204,25205,25206,25207,25208,25209,25210,25211,25212,25213, -25214,25215,25216,25217,25218,25219,25220,25221,25222,25223,25224,25225, -25226,25227,25228,25229,25230,25231,25232,25233,25234,25235,25236,25237, -25238,25239,25240,25241,25242,25243,25244,25245,25246,25247,25248,25249, -25250,25251,25252,25253,25254,25255,25256,25257,25258,25259,25260,25261, -25262,25263,25264,25265,25266,25267,25268,25269,25270,25271,25272,25273, -25274,25275,25276,25277,25278,25279,25280,25281,25282,25283,25284,25285, -25286,25287,25288,25289,25290,25291,25292,25293,25294,25295,25296,25297, -25298,25299,25300,25301,25302,25303,25304,25305,25306,25307,25308,25309, -25310,25311,25312,25313,25314,25315,25316,25317,25318,25319,25320,25321, -25322,25323,25324,25325,25326,25327,25328,25329,25330,25331,25332,25333, -25334,25335,25336,25337,25338,25339,25340,25341,25342,25343,25344,25345, -25346,25347,25348,25349,25350,25351,25352,25353,25354,25355,25356,25357, -25358,25359,25360,25361,25362,25363,25364,25365,25366,25367,25368,25369, -25370,25371,25372,25373,25374,25375,25376,25377,25378,25379,25380,25381, -25382,25383,25384,25385,25386,25387,25388,25389,25390,25391,25392,25393, -25394,25395,25396,25397,25398,25399,25400,25401,25402,25403,25404,25405, -25406,25407,25408,25409,25410,25411,25412,25413,25414,25415,25416,25417, -25418,25419,25420,25421,25422,25423,25424,25425,25426,25427,25428,25429, -25430,25431,25432,25433,25434,25435,25436,25437,25438,25439,25440,25441, -25442,25443,25444,25445,25446,25447,25448,25449,25450,25451,25452,25453, -25454,25455,25456,25457,25458,25459,25460,25461,25462,25463,25464,25465, -25466,25467,25468,25469,25470,25471,25472,25473,25474,25475,25476,25477, -25478,25479,25480,25481,25482,25483,25484,25485,25486,25487,25488,25489, -25490,25491,25492,25493,25494,25495,25496,25497,25498,25499,25500,25501, -25502,25503,25504,25505,25506,25507,25508,25509,25510,25511,25512,25513, -25514,25515,25516,25517,25518,25519,25520,25521,25522,25523,25524,25525, -25526,25527,25528,25529,25530,25531,25532,25533,25534,25535,25536,25537, -25538,25539,25540,25541,25542,25543,25544,25545,25546,25547,25548,25549, -25550,25551,25552,25553,25554,25555,25556,25557,25558,25559,25560,25561, -25562,25563,25564,25565,25566,25567,25568,25569,25570,25571,25572,25573, -25574,25575,25576,25577,25578,25579,25580,25581,25582,25583,25584,25585, -25586,25587,25588,25589,25590,25591,25592,25593,25594,25595,25596,25597, -25598,25599,25600,25601,25602,25603,25604,25605,25606,25607,25608,25609, -25610,25611,25612,25613,25614,25615,25616,25617,25618,25619,25620,25621, -25622,25623,25624,25625,25626,25627,25628,25629,25630,25631,25632,25633, -25634,25635,25636,25637,25638,25639,25640,25641,25642,25643,25644,25645, -25646,25647,25648,25649,25650,25651,25652,25653,25654,25655,25656,25657, -25658,25659,25660,25661,25662,25663,25664,25665,25666,25667,25668,25669, -25670,25671,25672,25673,25674,25675,25676,25677,25678,25679,25680,25681, -25682,25683,25684,25685,25686,25687,25688,25689,25690,25691,25692,25693, -25694,25695,25696,25697,25698,25699,25700,25701,25702,25703,25704,25705, -25706,25707,25708,25709,25710,25711,25712,25713,25714,25715,25716,25717, -25718,25719,25720,25721,25722,25723,25724,25725,25726,25727,25728,25729, -25730,25731,25732,25733,25734,25735,25736,25737,25738,25739,25740,25741, -25742,25743,25744,25745,25746,25747,25748,25749,25750,25751,25752,25753, -25754,25755,25756,25757,25758,25759,25760,25761,25762,25763,25764,25765, -25766,25767,25768,25769,25770,25771,25772,25773,25774,25775,25776,25777, -25778,25779,25780,25781,25782,25783,25784,25785,25786,25787,25788,25789, -25790,25791,25792,25793,25794,25795,25796,25797,25798,25799,25800,25801, -25802,25803,25804,25805,25806,25807,25808,25809,25810,25811,25812,25813, -25814,25815,25816,25817,25818,25819,25820,25821,25822,25823,25824,25825, -25826,25827,25828,25829,25830,25831,25832,25833,25834,25835,25836,25837, -25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849, -25850,25851,25852,25853,25854,25855,25856,25857,25858,25859,25860,25861, -25862,25863,25864,25865,25866,25867,25868,25869,25870,25871,25872,25873, -25874,25875,25876,25877,25878,25879,25880,25881,25882,25883,25884,25885, -25886,25887,25888,25889,25890,25891,25892,25893,25894,25895,25896,25897, -25898,25899,25900,25901,25902,25903,25904,25905,25906,25907,25908,25909, -25910,25911,25912,25913,25914,25915,25916,25917,25918,25919,25920,25921, -25922,25923,25924,25925,25926,25927,25928,25929,25930,25931,25932,25933, -25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945, -25946,25947,25948,25949,25950,25951,25952,25953,25954,25955,25956,25957, -25958,25959,25960,25961,25962,25963,25964,25965,25966,25967,25968,25969, -25970,25971,25972,25973,25974,25975,25976,25977,25978,25979,25980,25981, -25982,25983,25984,25985,25986,25987,25988,25989,25990,25991,25992,25993, -25994,25995,25996,25997,25998,25999,26000,26001,26002,26003,26004,26005, -26006,26007,26008,26009,26010,26011,26012,26013,26014,26015,26016,26017, -26018,26019,26020,26021,26022,26023,26024,26025,26026,26027,26028,26029, -26030,26031,26032,26033,26034,26035,26036,26037,26038,26039,26040,26041, -26042,26043,26044,26045,26046,26047,26048,26049,26050,26051,26052,26053, -26054,26055,26056,26057,26058,26059,26060,26061,26062,26063,26064,26065, -26066,26067,26068,26069,26070,26071,26072,26073,26074,26075,26076,26077, -26078,26079,26080,26081,26082,26083,26084,26085,26086,26087,26088,26089, -26090,26091,26092,26093,26094,26095,26096,26097,26098,26099,26100,26101, -26102,26103,26104,26105,26106,26107,26108,26109,26110,26111,26112,26113, -26114,26115,26116,26117,26118,26119,26120,26121,26122,26123,26124,26125, -26126,26127,26128,26129,26130,26131,26132,26133,26134,26135,26136,26137, -26138,26139,26140,26141,26142,26143,26144,26145,26146,26147,26148,26149, -26150,26151,26152,26153,26154,26155,26156,26157,26158,26159,26160,26161, -26162,26163,26164,26165,26166,26167,26168,26169,26170,26171,26172,26173, -26174,26175,26176,26177,26178,26179,26180,26181,26182,26183,26184,26185, -26186,26187,26188,26189,26190,26191,26192,26193,26194,26195,26196,26197, -26198,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209, -26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221, -26222,26223,26224,26225,26226,26227,26228,26229,26230,26231,26232,26233, -26234,26235,26236,26237,26238,26239,26240,26241,26242,26243,26244,26245, -26246,26247,26248,26249,26250,26251,26252,26253,26254,26255,26256,26257, -26258,26259,26260,26261,26262,26263,26264,26265,26266,26267,26268,26269, -26270,26271,26272,26273,26274,26275,26276,26277,26278,26279,26280,26281, -26282,26283,26284,26285,26286,26287,26288,26289,26290,26291,26292,26293, -26294,26295,26296,26297,26298,26299,26300,26301,26302,26303,26304,26305, -26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317, -26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26329, -26330,26331,26332,26333,26334,26335,26336,26337,26338,26339,26340,26341, -26342,26343,26344,26345,26346,26347,26348,26349,26350,26351,26352,26353, -26354,26355,26356,26357,26358,26359,26360,26361,26362,26363,26364,26365, -26366,26367,26368,26369,26370,26371,26372,26373,26374,26375,26376,26377, -26378,26379,26380,26381,26382,26383,26384,26385,26386,26387,26388,26389, -26390,26391,26392,26393,26394,26395,26396,26397,26398,26399,26400,26401, -26402,26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413, -26414,26415,26416,26417,26418,26419,26420,26421,26422,26423,26424,26425, -26426,26427,26428,26429,26430,26431,26432,26433,26434,26435,26436,26437, -26438,26439,26440,26441,26442,26443,26444,26445,26446,26447,26448,26449, -26450,26451,26452,26453,26454,26455,26456,26457,26458,26459,26460,26461, -26462,26463,26464,26465,26466,26467,26468,26469,26470,26471,26472,26473, -26474,26475,26476,26477,26478,26479,26480,26481,26482,26483,26484,26485, -26486,26487,26488,26489,26490,26491,26492,26493,26494,26495,26496,26497, -26498,26499,26500,26501,26502,26503,26504,26505,26506,26507,26508,26509, -26510,26511,26512,26513,26514,26515,26516,26517,26518,26519,26520,26521, -26522,26523,26524,26525,26526,26527,26528,26529,26530,26531,26532,26533, -26534,26535,26536,26537,26538,26539,26540,26541,26542,26543,26544,26545, -26546,26547,26548,26549,26550,26551,26552,26553,26554,26555,26556,26557, -26558,26559,26560,26561,26562,26563,26564,26565,26566,26567,26568,26569, -26570,26571,26572,26573,26574,26575,26576,26577,26578,26579,26580,26581, -26582,26583,26584,26585,26586,26587,26588,26589,26590,26591,26592,26593, -26594,26595,26596,26597,26598,26599,26600,26601,26602,26603,26604,26605, -26606,26607,26608,26609,26610,26611,26612,26613,26614,26615,26616,26617, -26618,26619,26620,26621,26622,26623,26624,26625,26626,26627,26628,26629, -26630,26631,26632,26633,26634,26635,26636,26637,26638,26639,26640,26641, -26642,26643,26644,26645,26646,26647,26648,26649,26650,26651,26652,26653, -26654,26655,26656,26657,26658,26659,26660,26661,26662,26663,26664,26665, -26666,26667,26668,26669,26670,26671,26672,26673,26674,26675,26676,26677, -26678,26679,26680,26681,26682,26683,26684,26685,26686,26687,26688,26689, -26690,26691,26692,26693,26694,26695,26696,26697,26698,26699,26700,26701, -26702,26703,26704,26705,26706,26707,26708,26709,26710,26711,26712,26713, -26714,26715,26716,26717,26718,26719,26720,26721,26722,26723,26724,26725, -26726,26727,26728,26729,26730,26731,26732,26733,26734,26735,26736,26737, -26738,26739,26740,26741,26742,26743,26744,26745,26746,26747,26748,26749, -26750,26751,26752,26753,26754,26755,26756,26757,26758,26759,26760,26761, -26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773, -26774,26775,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785, -26786,26787,26788,26789,26790,26791,26792,26793,26794,26795,26796,26797, -26798,26799,26800,26801,26802,26803,26804,26805,26806,26807,26808,26809, -26810,26811,26812,26813,26814,26815,26816,26817,26818,26819,26820,26821, -26822,26823,26824,26825,26826,26827,26828,26829,26830,26831,26832,26833, -26834,26835,26836,26837,26838,26839,26840,26841,26842,26843,26844,26845, -26846,26847,26848,26849,26850,26851,26852,26853,26854,26855,26856,26857, -26858,26859,26860,26861,26862,26863,26864,26865,26866,26867,26868,26869, -26870,26871,26872,26873,26874,26875,26876,26877,26878,26879,26880,26881, -26882,26883,26884,26885,26886,26887,26888,26889,26890,26891,26892,26893, -26894,26895,26896,26897,26898,26899,26900,26901,26902,26903,26904,26905, -26906,26907,26908,26909,26910,26911,26912,26913,26914,26915,26916,26917, -26918,26919,26920,26921,26922,26923,26924,26925,26926,26927,26928,26929, -26930,26931,26932,26933,26934,26935,26936,26937,26938,26939,26940,26941, -26942,26943,26944,26945,26946,26947,26948,26949,26950,26951,26952,26953, -26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26965, -26966,26967,26968,26969,26970,26971,26972,26973,26974,26975,26976,26977, -26978,26979,26980,26981,26982,26983,26984,26985,26986,26987,26988,26989, -26990,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001, -27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013, -27014,27015,27016,27017,27018,27019,27020,27021,27022,27023,27024,27025, -27026,27027,27028,27029,27030,27031,27032,27033,27034,27035,27036,27037, -27038,27039,27040,27041,27042,27043,27044,27045,27046,27047,27048,27049, -27050,27051,27052,27053,27054,27055,27056,27057,27058,27059,27060,27061, -27062,27063,27064,27065,27066,27067,27068,27069,27070,27071,27072,27073, -27074,27075,27076,27077,27078,27079,27080,27081,27082,27083,27084,27085, -27086,27087,27088,27089,27090,27091,27092,27093,27094,27095,27096,27097, -27098,27099,27100,27101,27102,27103,27104,27105,27106,27107,27108,27109, -27110,27111,27112,27113,27114,27115,27116,27117,27118,27119,27120,27121, -27122,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27133, -27134,27135,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145, -27146,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157, -27158,27159,27160,27161,27162,27163,27164,27165,27166,27167,27168,27169, -27170,27171,27172,27173,27174,27175,27176,27177,27178,27179,27180,27181, -27182,27183,27184,27185,27186,27187,27188,27189,27190,27191,27192,27193, -27194,27195,27196,27197,27198,27199,27200,27201,27202,27203,27204,27205, -27206,27207,27208,27209,27210,27211,27212,27213,27214,27215,27216,27217, -27218,27219,27220,27221,27222,27223,27224,27225,27226,27227,27228,27229, -27230,27231,27232,27233,27234,27235,27236,27237,27238,27239,27240,27241, -27242,27243,27244,27245,27246,27247,27248,27249,27250,27251,27252,27253, -27254,27255,27256,27257,27258,27259,27260,27261,27262,27263,27264,27265, -27266,27267,27268,27269,27270,27271,27272,27273,27274,27275,27276,27277, -27278,27279,27280,27281,27282,27283,27284,27285,27286,27287,27288,27289, -27290,27291,27292,27293,27294,27295,27296,27297,27298,27299,27300,27301, -27302,27303,27304,27305,27306,27307,27308,27309,27310,27311,27312,27313, -27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325, -27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337, -27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349, -27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361, -27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373, -27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385, -27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397, -27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409, -27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421, -27422,27423,27424,27425,27426,27427,27428,27429,27430,27431,27432,27433, -27434,27435,27436,27437,27438,27439,27440,27441,27442,27443,27444,27445, -27446,27447,27448,27449,27450,27451,27452,27453,27454,27455,27456,27457, -27458,27459,27460,27461,27462,27463,27464,27465,27466,27467,27468,27469, -27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27481, -27482,27483,27484,27485,27486,27487,27488,27489,27490,27491,27492,27493, -27494,27495,27496,27497,27498,27499,27500,27501,27502,27503,27504,27505, -27506,27507,27508,27509,27510,27511,27512,27513,27514,27515,27516,27517, -27518,27519,27520,27521,27522,27523,27524,27525,27526,27527,27528,27529, -27530,27531,27532,27533,27534,27535,27536,27537,27538,27539,27540,27541, -27542,27543,27544,27545,27546,27547,27548,27549,27550,27551,27552,27553, -27554,27555,27556,27557,27558,27559,27560,27561,27562,27563,27564,27565, -27566,27567,27568,27569,27570,27571,27572,27573,27574,27575,27576,27577, -27578,27579,27580,27581,27582,27583,27584,27585,27586,27587,27588,27589, -27590,27591,27592,27593,27594,27595,27596,27597,27598,27599,27600,27601, -27602,27603,27604,27605,27606,27607,27608,27609,27610,27611,27612,27613, -27614,27615,27616,27617,27618,27619,27620,27621,27622,27623,27624,27625, -27626,27627,27628,27629,27630,27631,27632,27633,27634,27635,27636,27637, -27638,27639,27640,27641,27642,27643,27644,27645,27646,27647,27648,27649, -27650,27651,27652,27653,27654,27655,27656,27657,27658,27659,27660,27661, -27662,27663,27664,27665,27666,27667,27668,27669,27670,27671,27672,27673, -27674,27675,27676,27677,27678,27679,27680,27681,27682,27683,27684,27685, -27686,27687,27688,27689,27690,27691,27692,27693,27694,27695,27696,27697, -27698,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27709, -27710,27711,27712,27713,27714,27715,27716,27717,27718,27719,27720,27721, -27722,27723,27724,27725,27726,27727,27728,27729,27730,27731,27732,27733, -27734,27735,27736,27737,27738,27739,27740,27741,27742,27743,27744,27745, -27746,27747,27748,27749,27750,27751,27752,27753,27754,27755,27756,27757, -27758,27759,27760,27761,27762,27763,27764,27765,27766,27767,27768,27769, -27770,27771,27772,27773,27774,27775,27776,27777,27778,27779,27780,27781, -27782,27783,27784,27785,27786,27787,27788,27789,27790,27791,27792,27793, -27794,27795,27796,27797,27798,27799,27800,27801,27802,27803,27804,27805, -27806,27807,27808,27809,27810,27811,27812,27813,27814,27815,27816,27817, -27818,27819,27820,27821,27822,27823,27824,27825,27826,27827,27828,27829, -27830,27831,27832,27833,27834,27835,27836,27837,27838,27839,27840,27841, -27842,27843,27844,27845,27846,27847,27848,27849,27850,27851,27852,27853, -27854,27855,27856,27857,27858,27859,27860,27861,27862,27863,27864,27865, -27866,27867,27868,27869,27870,27871,27872,27873,27874,27875,27876,27877, -27878,27879,27880,27881,27882,27883,27884,27885,27886,27887,27888,27889, -27890,27891,27892,27893,27894,27895,27896,27897,27898,27899,27900,27901, -27902,27903,27904,27905,27906,27907,27908,27909,27910,27911,27912,27913, -27914,27915,27916,27917,27918,27919,27920,27921,27922,27923,27924,27925, -27926,27927,27928,27929,27930,27931,27932,27933,27934,27935,27936,27937, -27938,27939,27940,27941,27942,27943,27944,27945,27946,27947,27948,27949, -27950,27951,27952,27953,27954,27955,27956,27957,27958,27959,27960,27961, -27962,27963,27964,27965,27966,27967,27968,27969,27970,27971,27972,27973, -27974,27975,27976,27977,27978,27979,27980,27981,27982,27983,27984,27985, -27986,27987,27988,27989,27990,27991,27992,27993,27994,27995,27996,27997, -27998,27999,28000,28001,28002,28003,28004,28005,28006,28007,28008,28009, -28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021, -28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033, -28034,28035,28036,28037,28038,28039,28040,28041,28042,28043,28044,28045, -28046,28047,28048,28049,28050,28051,28052,28053,28054,28055,28056,28057, -28058,28059,28060,28061,28062,28063,28064,28065,28066,28067,28068,28069, -28070,28071,28072,28073,28074,28075,28076,28077,28078,28079,28080,28081, -28082,28083,28084,28085,28086,28087,28088,28089,28090,28091,28092,28093, -28094,28095,28096,28097,28098,28099,28100,28101,28102,28103,28104,28105, -28106,28107,28108,28109,28110,28111,28112,28113,28114,28115,28116,28117, -28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129, -28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141, -28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153, -28154,28155,28156,28157,28158,28159,28160,28161,28162,28163,28164,28165, -28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177, -28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189, -28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201, -28202,28203,28204,28205,28206,28207,28208,28209,28210,28211,28212,28213, -28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225, -28226,28227,28228,28229,28230,28231,28232,28233,28234,28235,28236,28237, -28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249, -28250,28251,28252,28253,28254,28255,28256,28257,28258,28259,28260,28261, -28262,28263,28264,28265,28266,28267,28268,28269,28270,28271,28272,28273, -28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285, -28286,28287,28288,28289,28290,28291,28292,28293,28294,28295,28296,28297, -28298,28299,28300,28301,28302,28303,28304,28305,28306,28307,28308,28309, -28310,28311,28312,28313,28314,28315,28316,28317,28318,28319,28320,28321, -28322,28323,28324,28325,28326,28327,28328,28329,28330,28331,28332,28333, -28334,28335,28336,28337,28338,28339,28340,28341,28342,28343,28344,28345, -28346,28347,28348,28349,28350,28351,28352,28353,28354,28355,28356,28357, -28358,28359,28360,28361,28362,28363,28364,28365,28366,28367,28368,28369, -28370,28371,28372,28373,28374,28375,28376,28377,28378,28379,28380,28381, -28382,28383,28384,28385,28386,28387,28388,28389,28390,28391,28392,28393, -28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28404,28405, -28406,28407,28408,28409,28410,28411,28412,28413,28414,28415,28416,28417, -28418,28419,28420,28421,28422,28423,28424,28425,28426,28427,28428,28429, -28430,28431,28432,28433,28434,28435,28436,28437,28438,28439,28440,28441, -28442,28443,28444,28445,28446,28447,28448,28449,28450,28451,28452,28453, -28454,28455,28456,28457,28458,28459,28460,28461,28462,28463,28464,28465, -28466,28467,28468,28469,28470,28471,28472,28473,28474,28475,28476,28477, -28478,28479,28480,28481,28482,28483,28484,28485,28486,28487,28488,28489, -28490,28491,28492,28493,28494,28495,28496,28497,28498,28499,28500,28501, -28502,28503,28504,28505,28506,28507,28508,28509,28510,28511,28512,28513, -28514,28515,28516,28517,28518,28519,28520,28521,28522,28523,28524,28525, -28526,28527,28528,28529,28530,28531,28532,28533,28534,28535,28536,28537, -28538,28539,28540,28541,28542,28543,28544,28545,28546,28547,28548,28549, -28550,28551,28552,28553,28554,28555,28556,28557,28558,28559,28560,28561, -28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28572,28573, -28574,28575,28576,28577,28578,28579,28580,28581,28582,28583,28584,28585, -28586,28587,28588,28589,28590,28591,28592,28593,28594,28595,28596,28597, -28598,28599,28600,28601,28602,28603,28604,28605,28606,28607,28608,28609, -28610,28611,28612,28613,28614,28615,28616,28617,28618,28619,28620,28621, -28622,28623,28624,28625,28626,28627,28628,28629,28630,28631,28632,28633, -28634,28635,28636,28637,28638,28639,28640,28641,28642,28643,28644,28645, -28646,28647,28648,28649,28650,28651,28652,28653,28654,28655,28656,28657, -28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669, -28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681, -28682,28683,28684,28685,28686,28687,28688,28689,28690,28691,28692,28693, -28694,28695,28696,28697,28698,28699,28700,28701,28702,28703,28704,28705, -28706,28707,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717, -28718,28719,28720,28721,28722,28723,28724,28725,28726,28727,28728,28729, -28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741, -28742,28743,28744,28745,28746,28747,28748,28749,28750,28751,28752,28753, -28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765, -28766,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777, -28778,28779,28780,28781,28782,28783,28784,28785,28786,28787,28788,28789, -28790,28791,28792,28793,28794,28795,28796,28797,28798,28799,28800,28801, -28802,28803,28804,28805,28806,28807,28808,28809,28810,28811,28812,28813, -28814,28815,28816,28817,28818,28819,28820,28821,28822,28823,28824,28825, -28826,28827,28828,28829,28830,28831,28832,28833,28834,28835,28836,28837, -28838,28839,28840,28841,28842,28843,28844,28845,28846,28847,28848,28849, -28850,28851,28852,28853,28854,28855,28856,28857,28858,28859,28860,28861, -28862,28863,28864,28865,28866,28867,28868,28869,28870,28871,28872,28873, -28874,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885, -28886,28887,28888,28889,28890,28891,28892,28893,28894,28895,28896,28897, -28898,28899,28900,28901,28902,28903,28904,28905,28906,28907,28908,28909, -28910,28911,28912,28913,28914,28915,28916,28917,28918,28919,28920,28921, -28922,28923,28924,28925,28926,28927,28928,28929,28930,28931,28932,28933, -28934,28935,28936,28937,28938,28939,28940,28941,28942,28943,28944,28945, -28946,28947,28948,28949,28950,28951,28952,28953,28954,28955,28956,28957, -28958,28959,28960,28961,28962,28963,28964,28965,28966,28967,28968,28969, -28970,28971,28972,28973,28974,28975,28976,28977,28978,28979,28980,28981, -28982,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993, -28994,28995,28996,28997,28998,28999,29000,29001,29002,29003,29004,29005, -29006,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017, -29018,29019,29020,29021,29022,29023,29024,29025,29026,29027,29028,29029, -29030,29031,29032,29033,29034,29035,29036,29037,29038,29039,29040,29041, -29042,29043,29044,29045,29046,29047,29048,29049,29050,29051,29052,29053, -29054,29055,29056,29057,29058,29059,29060,29061,29062,29063,29064,29065, -29066,29067,29068,29069,29070,29071,29072,29073,29074,29075,29076,29077, -29078,29079,29080,29081,29082,29083,29084,29085,29086,29087,29088,29089, -29090,29091,29092,29093,29094,29095,29096,29097,29098,29099,29100,29101, -29102,29103,29104,29105,29106,29107,29108,29109,29110,29111,29112,29113, -29114,29115,29116,29117,29118,29119,29120,29121,29122,29123,29124,29125, -29126,29127,29128,29129,29130,29131,29132,29133,29134,29135,29136,29137, -29138,29139,29140,29141,29142,29143,29144,29145,29146,29147,29148,29149, -29150,29151,29152,29153,29154,29155,29156,29157,29158,29159,29160,29161, -29162,29163,29164,29165,29166,29167,29168,29169,29170,29171,29172,29173, -29174,29175,29176,29177,29178,29179,29180,29181,29182,29183,29184,29185, -29186,29187,29188,29189,29190,29191,29192,29193,29194,29195,29196,29197, -29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209, -29210,29211,29212,29213,29214,29215,29216,29217,29218,29219,29220,29221, -29222,29223,29224,29225,29226,29227,29228,29229,29230,29231,29232,29233, -29234,29235,29236,29237,29238,29239,29240,29241,29242,29243,29244,29245, -29246,29247,29248,29249,29250,29251,29252,29253,29254,29255,29256,29257, -29258,29259,29260,29261,29262,29263,29264,29265,29266,29267,29268,29269, -29270,29271,29272,29273,29274,29275,29276,29277,29278,29279,29280,29281, -29282,29283,29284,29285,29286,29287,29288,29289,29290,29291,29292,29293, -29294,29295,29296,29297,29298,29299,29300,29301,29302,29303,29304,29305, -29306,29307,29308,29309,29310,29311,29312,29313,29314,29315,29316,29317, -29318,29319,29320,29321,29322,29323,29324,29325,29326,29327,29328,29329, -29330,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341, -29342,29343,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353, -29354,29355,29356,29357,29358,29359,29360,29361,29362,29363,29364,29365, -29366,29367,29368,29369,29370,29371,29372,29373,29374,29375,29376,29377, -29378,29379,29380,29381,29382,29383,29384,29385,29386,29387,29388,29389, -29390,29391,29392,29393,29394,29395,29396,29397,29398,29399,29400,29401, -29402,29403,29404,29405,29406,29407,29408,29409,29410,29411,29412,29413, -29414,29415,29416,29417,29418,29419,29420,29421,29422,29423,29424,29425, -29426,29427,29428,29429,29430,29431,29432,29433,29434,29435,29436,29437, -29438,29439,29440,29441,29442,29443,29444,29445,29446,29447,29448,29449, -29450,29451,29452,29453,29454,29455,29456,29457,29458,29459,29460,29461, -29462,29463,29464,29465,29466,29467,29468,29469,29470,29471,29472,29473, -29474,29475,29476,29477,29478,29479,29480,29481,29482,29483,29484,29485, -29486,29487,29488,29489,29490,29491,29492,29493,29494,29495,29496,29497, -29498,29499,29500,29501,29502,29503,29504,29505,29506,29507,29508,29509, -29510,29511,29512,29513,29514,29515,29516,29517,29518,29519,29520,29521, -29522,29523,29524,29525,29526,29527,29528,29529,29530,29531,29532,29533, -29534,29535,29536,29537,29538,29539,29540,29541,29542,29543,29544,29545, -29546,29547,29548,29549,29550,29551,29552,29553,29554,29555,29556,29557, -29558,29559,29560,29561,29562,29563,29564,29565,29566,29567,29568,29569, -29570,29571,29572,29573,29574,29575,29576,29577,29578,29579,29580,29581, -29582,29583,29584,29585,29586,29587,29588,29589,29590,29591,29592,29593, -29594,29595,29596,29597,29598,29599,29600,29601,29602,29603,29604,29605, -29606,29607,29608,29609,29610,29611,29612,29613,29614,29615,29616,29617, -29618,29619,29620,29621,29622,29623,29624,29625,29626,29627,29628,29629, -29630,29631,29632,29633,29634,29635,29636,29637,29638,29639,29640,29641, -29642,29643,29644,29645,29646,29647,29648,29649,29650,29651,29652,29653, -29654,29655,29656,29657,29658,29659,29660,29661,29662,29663,29664,29665, -29666,29667,29668,29669,29670,29671,29672,29673,29674,29675,29676,29677, -29678,29679,29680,29681,29682,29683,29684,29685,29686,29687,29688,29689, -29690,29691,29692,29693,29694,29695,29696,29697,29698,29699,29700,29701, -29702,29703,29704,29705,29706,29707,29708,29709,29710,29711,29712,29713, -29714,29715,29716,29717,29718,29719,29720,29721,29722,29723,29724,29725, -29726,29727,29728,29729,29730,29731,29732,29733,29734,29735,29736,29737, -29738,29739,29740,29741,29742,29743,29744,29745,29746,29747,29748,29749, -29750,29751,29752,29753,29754,29755,29756,29757,29758,29759,29760,29761, -29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773, -29774,29775,29776,29777,29778,29779,29780,29781,29782,29783,29784,29785, -29786,29787,29788,29789,29790,29791,29792,29793,29794,29795,29796,29797, -29798,29799,29800,29801,29802,29803,29804,29805,29806,29807,29808,29809, -29810,29811,29812,29813,29814,29815,29816,29817,29818,29819,29820,29821, -29822,29823,29824,29825,29826,29827,29828,29829,29830,29831,29832,29833, -29834,29835,29836,29837,29838,29839,29840,29841,29842,29843,29844,29845, -29846,29847,29848,29849,29850,29851,29852,29853,29854,29855,29856,29857, -29858,29859,29860,29861,29862,29863,29864,29865,29866,29867,29868,29869, -29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881, -29882,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893, -29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905, -29906,29907,29908,29909,29910,29911,29912,29913,29914,29915,29916,29917, -29918,29919,29920,29921,29922,29923,29924,29925,29926,29927,29928,29929, -29930,29931,29932,29933,29934,29935,29936,29937,29938,29939,29940,29941, -29942,29943,29944,29945,29946,29947,29948,29949,29950,29951,29952,29953, -29954,29955,29956,29957,29958,29959,29960,29961,29962,29963,29964,29965, -29966,29967,29968,29969,29970,29971,29972,29973,29974,29975,29976,29977, -29978,29979,29980,29981,29982,29983,29984,29985,29986,29987,29988,29989, -29990,29991,29992,29993,29994,29995,29996,29997,29998,29999,30000,30001, -30002,30003,30004,30005,30006,30007,30008,30009,30010,30011,30012,30013, -30014,30015,30016,30017,30018,30019,30020,30021,30022,30023,30024,30025, -30026,30027,30028,30029,30030,30031,30032,30033,30034,30035,30036,30037, -30038,30039,30040,30041,30042,30043,30044,30045,30046,30047,30048,30049, -30050,30051,30052,30053,30054,30055,30056,30057,30058,30059,30060,30061, -30062,30063,30064,30065,30066,30067,30068,30069,30070,30071,30072,30073, -30074,30075,30076,30077,30078,30079,30080,30081,30082,30083,30084,30085, -30086,30087,30088,30089,30090,30091,30092,30093,30094,30095,30096,30097, -30098,30099,30100,30101,30102,30103,30104,30105,30106,30107,30108,30109, -30110,30111,30112,30113,30114,30115,30116,30117,30118,30119,30120,30121, -30122,30123,30124,30125,30126,30127,30128,30129,30130,30131,30132,30133, -30134,30135,30136,30137,30138,30139,30140,30141,30142,30143,30144,30145, -30146,30147,30148,30149,30150,30151,30152,30153,30154,30155,30156,30157, -30158,30159,30160,30161,30162,30163,30164,30165,30166,30167,30168,30169, -30170,30171,30172,30173,30174,30175,30176,30177,30178,30179,30180,30181, -30182,30183,30184,30185,30186,30187,30188,30189,30190,30191,30192,30193, -30194,30195,30196,30197,30198,30199,30200,30201,30202,30203,30204,30205, -30206,30207,30208,30209,30210,30211,30212,30213,30214,30215,30216,30217, -30218,30219,30220,30221,30222,30223,30224,30225,30226,30227,30228,30229, -30230,30231,30232,30233,30234,30235,30236,30237,30238,30239,30240,30241, -30242,30243,30244,30245,30246,30247,30248,30249,30250,30251,30252,30253, -30254,30255,30256,30257,30258,30259,30260,30261,30262,30263,30264,30265, -30266,30267,30268,30269,30270,30271,30272,30273,30274,30275,30276,30277, -30278,30279,30280,30281,30282,30283,30284,30285,30286,30287,30288,30289, -30290,30291,30292,30293,30294,30295,30296,30297,30298,30299,30300,30301, -30302,30303,30304,30305,30306,30307,30308,30309,30310,30311,30312,30313, -30314,30315,30316,30317,30318,30319,30320,30321,30322,30323,30324,30325, -30326,30327,30328,30329,30330,30331,30332,30333,30334,30335,30336,30337, -30338,30339,30340,30341,30342,30343,30344,30345,30346,30347,30348,30349, -30350,30351,30352,30353,30354,30355,30356,30357,30358,30359,30360,30361, -30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30372,30373, -30374,30375,30376,30377,30378,30379,30380,30381,30382,30383,30384,30385, -30386,30387,30388,30389,30390,30391,30392,30393,30394,30395,30396,30397, -30398,30399,30400,30401,30402,30403,30404,30405,30406,30407,30408,30409, -30410,30411,30412,30413,30414,30415,30416,30417,30418,30419,30420,30421, -30422,30423,30424,30425,30426,30427,30428,30429,30430,30431,30432,30433, -30434,30435,30436,30437,30438,30439,30440,30441,30442,30443,30444,30445, -30446,30447,30448,30449,30450,30451,30452,30453,30454,30455,30456,30457, -30458,30459,30460,30461,30462,30463,30464,30465,30466,30467,30468,30469, -30470,30471,30472,30473,30474,30475,30476,30477,30478,30479,30480,30481, -30482,30483,30484,30485,30486,30487,30488,30489,30490,30491,30492,30493, -30494,30495,30496,30497,30498,30499,30500,30501,30502,30503,30504,30505, -30506,30507,30508,30509,30510,30511,30512,30513,30514,30515,30516,30517, -30518,30519,30520,30521,30522,30523,30524,30525,30526,30527,30528,30529, -30530,30531,30532,30533,30534,30535,30536,30537,30538,30539,30540,30541, -30542,30543,30544,30545,30546,30547,30548,30549,30550,30551,30552,30553, -30554,30555,30556,30557,30558,30559,30560,30561,30562,30563,30564,30565, -30566,30567,30568,30569,30570,30571,30572,30573,30574,30575,30576,30577, -30578,30579,30580,30581,30582,30583,30584,30585,30586,30587,30588,30589, -30590,30591,30592,30593,30594,30595,30596,30597,30598,30599,30600,30601, -30602,30603,30604,30605,30606,30607,30608,30609,30610,30611,30612,30613, -30614,30615,30616,30617,30618,30619,30620,30621,30622,30623,30624,30625, -30626,30627,30628,30629,30630,30631,30632,30633,30634,30635,30636,30637, -30638,30639,30640,30641,30642,30643,30644,30645,30646,30647,30648,30649, -30650,30651,30652,30653,30654,30655,30656,30657,30658,30659,30660,30661, -30662,30663,30664,30665,30666,30667,30668,30669,30670,30671,30672,30673, -30674,30675,30676,30677,30678,30679,30680,30681,30682,30683,30684,30685, -30686,30687,30688,30689,30690,30691,30692,30693,30694,30695,30696,30697, -30698,30699,30700,30701,30702,30703,30704,30705,30706,30707,30708,30709, -30710,30711,30712,30713,30714,30715,30716,30717,30718,30719,30720,30721, -30722,30723,30724,30725,30726,30727,30728,30729,30730,30731,30732,30733, -30734,30735,30736,30737,30738,30739,30740,30741,30742,30743,30744,30745, -30746,30747,30748,30749,30750,30751,30752,30753,30754,30755,30756,30757, -30758,30759,30760,30761,30762,30763,30764,30765,30766,30767,30768,30769, -30770,30771,30772,30773,30774,30775,30776,30777,30778,30779,30780,30781, -30782,30783,30784,30785,30786,30787,30788,30789,30790,30791,30792,30793, -30794,30795,30796,30797,30798,30799,30800,30801,30802,30803,30804,30805, -30806,30807,30808,30809,30810,30811,30812,30813,30814,30815,30816,30817, -30818,30819,30820,30821,30822,30823,30824,30825,30826,30827,30828,30829, -30830,30831,30832,30833,30834,30835,30836,30837,30838,30839,30840,30841, -30842,30843,30844,30845,30846,30847,30848,30849,30850,30851,30852,30853, -30854,30855,30856,30857,30858,30859,30860,30861,30862,30863,30864,30865, -30866,30867,30868,30869,30870,30871,30872,30873,30874,30875,30876,30877, -30878,30879,30880,30881,30882,30883,30884,30885,30886,30887,30888,30889, -30890,30891,30892,30893,30894,30895,30896,30897,30898,30899,30900,30901, -30902,30903,30904,30905,30906,30907,30908,30909,30910,30911,30912,30913, -30914,30915,30916,30917,30918,30919,30920,30921,30922,30923,30924,30925, -30926,30927,30928,30929,30930,30931,30932,30933,30934,30935,30936,30937, -30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949, -30950,30951,30952,30953,30954,30955,30956,30957,30958,30959,30960,30961, -30962,30963,30964,30965,30966,30967,30968,30969,30970,30971,30972,30973, -30974,30975,30976,30977,30978,30979,30980,30981,30982,30983,30984,30985, -30986,30987,30988,30989,30990,30991,30992,30993,30994,30995,30996,30997, -30998,30999,31000,31001,31002,31003,31004,31005,31006,31007,31008,31009, -31010,31011,31012,31013,31014,31015,31016,31017,31018,31019,31020,31021, -31022,31023,31024,31025,31026,31027,31028,31029,31030,31031,31032,31033, -31034,31035,31036,31037,31038,31039,31040,31041,31042,31043,31044,31045, -31046,31047,31048,31049,31050,31051,31052,31053,31054,31055,31056,31057, -31058,31059,31060,31061,31062,31063,31064,31065,31066,31067,31068,31069, -31070,31071,31072,31073,31074,31075,31076,31077,31078,31079,31080,31081, -31082,31083,31084,31085,31086,31087,31088,31089,31090,31091,31092,31093, -31094,31095,31096,31097,31098,31099,31100,31101,31102,31103,31104,31105, -31106,31107,31108,31109,31110,31111,31112,31113,31114,31115,31116,31117, -31118,31119,31120,31121,31122,31123,31124,31125,31126,31127,31128,31129, -31130,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141, -31142,31143,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153, -31154,31155,31156,31157,31158,31159,31160,31161,31162,31163,31164,31165, -31166,31167,31168,31169,31170,31171,31172,31173,31174,31175,31176,31177, -31178,31179,31180,31181,31182,31183,31184,31185,31186,31187,31188,31189, -31190,31191,31192,31193,31194,31195,31196,31197,31198,31199,31200,31201, -31202,31203,31204,31205,31206,31207,31208,31209,31210,31211,31212,31213, -31214,31215,31216,31217,31218,31219,31220,31221,31222,31223,31224,31225, -31226,31227,31228,31229,31230,31231,31232,31233,31234,31235,31236,31237, -31238,31239,31240,31241,31242,31243,31244,31245,31246,31247,31248,31249, -31250,31251,31252,31253,31254,31255,31256,31257,31258,31259,31260,31261, -31262,31263,31264,31265,31266,31267,31268,31269,31270,31271,31272,31273, -31274,31275,31276,31277,31278,31279,31280,31281,31282,31283,31284,31285, -31286,31287,31288,31289,31290,31291,31292,31293,31294,31295,31296,31297, -31298,31299,31300,31301,31302,31303,31304,31305,31306,31307,31308,31309, -31310,31311,31312,31313,31314,31315,31316,31317,31318,31319,31320,31321, -31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333, -31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31344,31345, -31346,31347,31348,31349,31350,31351,31352,31353,31354,31355,31356,31357, -31358,31359,31360,31361,31362,31363,31364,31365,31366,31367,31368,31369, -31370,31371,31372,31373,31374,31375,31376,31377,31378,31379,31380,31381, -31382,31383,31384,31385,31386,31387,31388,31389,31390,31391,31392,31393, -31394,31395,31396,31397,31398,31399,31400,31401,31402,31403,31404,31405, -31406,31407,31408,31409,31410,31411,31412,31413,31414,31415,31416,31417, -31418,31419,31420,31421,31422,31423,31424,31425,31426,31427,31428,31429, -31430,31431,31432,31433,31434,31435,31436,31437,31438,31439,31440,31441, -31442,31443,31444,31445,31446,31447,31448,31449,31450,31451,31452,31453, -31454,31455,31456,31457,31458,31459,31460,31461,31462,31463,31464,31465, -31466,31467,31468,31469,31470,31471,31472,31473,31474,31475,31476,31477, -31478,31479,31480,31481,31482,31483,31484,31485,31486,31487,31488,31489, -31490,31491,31492,31493,31494,31495,31496,31497,31498,31499,31500,31501, -31502,31503,31504,31505,31506,31507,31508,31509,31510,31511,31512,31513, -31514,31515,31516,31517,31518,31519,31520,31521,31522,31523,31524,31525, -31526,31527,31528,31529,31530,31531,31532,31533,31534,31535,31536,31537, -31538,31539,31540,31541,31542,31543,31544,31545,31546,31547,31548,31549, -31550,31551,31552,31553,31554,31555,31556,31557,31558,31559,31560,31561, -31562,31563,31564,31565,31566,31567,31568,31569,31570,31571,31572,31573, -31574,31575,31576,31577,31578,31579,31580,31581,31582,31583,31584,31585, -31586,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597, -31598,31599,31600,31601,31602,31603,31604,31605,31606,31607,31608,31609, -31610,31611,31612,31613,31614,31615,31616,31617,31618,31619,31620,31621, -31622,31623,31624,31625,31626,31627,31628,31629,31630,31631,31632,31633, -31634,31635,31636,31637,31638,31639,31640,31641,31642,31643,31644,31645, -31646,31647,31648,31649,31650,31651,31652,31653,31654,31655,31656,31657, -31658,31659,31660,31661,31662,31663,31664,31665,31666,31667,31668,31669, -31670,31671,31672,31673,31674,31675,31676,31677,31678,31679,31680,31681, -31682,31683,31684,31685,31686,31687,31688,31689,31690,31691,31692,31693, -31694,31695,31696,31697,31698,31699,31700,31701,31702,31703,31704,31705, -31706,31707,31708,31709,31710,31711,31712,31713,31714,31715,31716,31717, -31718,31719,31720,31721,31722,31723,31724,31725,31726,31727,31728,31729, -31730,31731,31732,31733,31734,31735,31736,31737,31738,31739,31740,31741, -31742,31743,31744,31745,31746,31747,31748,31749,31750,31751,31752,31753, -31754,31755,31756,31757,31758,31759,31760,31761,31762,31763,31764,31765, -31766,31767,31768,31769,31770,31771,31772,31773,31774,31775,31776,31777, -31778,31779,31780,31781,31782,31783,31784,31785,31786,31787,31788,31789, -31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31800,31801, -31802,31803,31804,31805,31806,31807,31808,31809,31810,31811,31812,31813, -31814,31815,31816,31817,31818,31819,31820,31821,31822,31823,31824,31825, -31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837, -31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849, -31850,31851,31852,31853,31854,31855,31856,31857,31858,31859,31860,31861, -31862,31863,31864,31865,31866,31867,31868,31869,31870,31871,31872,31873, -31874,31875,31876,31877,31878,31879,31880,31881,31882,31883,31884,31885, -31886,31887,31888,31889,31890,31891,31892,31893,31894,31895,31896,31897, -31898,31899,31900,31901,31902,31903,31904,31905,31906,31907,31908,31909, -31910,31911,31912,31913,31914,31915,31916,31917,31918,31919,31920,31921, -31922,31923,31924,31925,31926,31927,31928,31929,31930,31931,31932,31933, -31934,31935,31936,31937,31938,31939,31940,31941,31942,31943,31944,31945, -31946,31947,31948,31949,31950,31951,31952,31953,31954,31955,31956,31957, -31958,31959,31960,31961,31962,31963,31964,31965,31966,31967,31968,31969, -31970,31971,31972,31973,31974,31975,31976,31977,31978,31979,31980,31981, -31982,31983,31984,31985,31986,31987,31988,31989,31990,31991,31992,31993, -31994,31995,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005, -32006,32007,32008,32009,32010,32011,32012,32013,32014,32015,32016,32017, -32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029, -32030,32031,32032,32033,32034,32035,32036,32037,32038,32039,32040,32041, -32042,32043,32044,32045,32046,32047,32048,32049,32050,32051,32052,32053, -32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065, -32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077, -32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089, -32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101, -32102,32103,32104,32105,32106,32107,32108,32109,32110,32111,32112,32113, -32114,32115,32116,32117,32118,32119,32120,32121,32122,32123,32124,32125, -32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137, -32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149, -32150,32151,32152,32153,32154,32155,32156,32157,32158,32159,32160,32161, -32162,32163,32164,32165,32166,32167,32168,32169,32170,32171,32172,32173, -32174,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185, -32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197, -32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209, -32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221, -32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233, -32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245, -32246,32247,32248,32249,32250,32251,32252,32253,32254,32255,32256,32257, -32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269, -32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281, -32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293, -32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305, -32306,32307,32308,32309,32310,32311,32312,32313,32314,32315,32316,32317, -32318,32319,32320,32321,32322,32323,32324,32325,32326,32327,32328,32329, -32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341, -32342,32343,32344,32345,32346,32347,32348,32349,32350,32351,32352,32353, -32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365, -32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377, -32378,32379,32380,32381,32382,32383,32384,32385,32386,32387,32388,32389, -32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401, -32402,32403,32404,32405,32406,32407,32408,32409,32410,32411,32412,32413, -32414,32415,32416,32417,32418,32419,32420,32421,32422,32423,32424,32425, -32426,32427,32428,32429,32430,32431,32432,32433,32434,32435,32436,32437, -32438,32439,32440,32441,32442,32443,32444,32445,32446,32447,32448,32449, -32450,32451,32452,32453,32454,32455,32456,32457,32458,32459,32460,32461, -32462,32463,32464,32465,32466,32467,32468,32469,32470,32471,32472,32473, -32474,32475,32476,32477,32478,32479,32480,32481,32482,32483,32484,32485, -32486,32487,32488,32489,32490,32491,32492,32493,32494,32495,32496,32497, -32498,32499,32500,32501,32502,32503,32504,32505,32506,32507,32508,32509, -32510,32511,32512,32513,32514,32515,32516,32517,32518,32519,32520,32521, -32522,32523,32524,32525,32526,32527,32528,32529,32530,32531,32532,32533, -32534,32535,32536,32537,32538,32539,32540,32541,32542,32543,32544,32545, -32546,32547,32548,32549,32550,32551,32552,32553,32554,32555,32556,32557, -32558,32559,32560,32561,32562,32563,32564,32565,32566,32567,32568,32569, -32570,32571,32572,32573,32574,32575,32576,32577,32578,32579,32580,32581, -32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32592,32593, -32594,32595,32596,32597,32598,32599,32600,32601,32602,32603,32604,32605, -32606,32607,32608,32609,32610,32611,32612,32613,32614,32615,32616,32617, -32618,32619,32620,32621,32622,32623,32624,32625,32626,32627,32628,32629, -32630,32631,32632,32633,32634,32635,32636,32637,32638,32639,32640,32641, -32642,32643,32644,32645,32646,32647,32648,32649,32650,32651,32652,32653, -32654,32655,32656,32657,32658,32659,32660,32661,32662,32663,32664,32665, -32666,32667,32668,32669,32670,32671,32672,32673,32674,32675,32676,32677, -32678,32679,32680,32681,32682,32683,32684,32685,32686,32687,32688,32689, -32690,32691,32692,32693,32694,32695,32696,32697,32698,32699,32700,32701, -32702,32703,32704,32705,32706,32707,32708,32709,32710,32711,32712,32713, -32714,32715,32716,32717,32718,32719,32720,32721,32722,32723,32724,32725, -32726,32727,32728,32729,32730,32731,32732,32733,32734,32735,32736,32737, -32738,32739,32740,32741,32742,32743,32744,32745,32746,32747,32748,32749, -32750,32751,32752,32753,32754,32755,32756,32757,32758,32759,32760,32761, -32762,32763,32764,32765,32766,32767,32768L,32769L,32770L,32771L,32772L, -32773L,32774L,32775L,32776L,32777L,32778L,32779L,32780L,32781L,32782L, -32783L,32784L,32785L,32786L,32787L,32788L,32789L,32790L,32791L,32792L, -32793L,32794L,32795L,32796L,32797L,32798L,32799L,32800L,32801L,32802L, -32803L,32804L,32805L,32806L,32807L,32808L,32809L,32810L,32811L,32812L, -32813L,32814L,32815L,32816L,32817L,32818L,32819L,32820L,32821L,32822L, -32823L,32824L,32825L,32826L,32827L,32828L,32829L,32830L,32831L,32832L, -32833L,32834L,32835L,32836L,32837L,32838L,32839L,32840L,32841L,32842L, -32843L,32844L,32845L,32846L,32847L,32848L,32849L,32850L,32851L,32852L, -32853L,32854L,32855L,32856L,32857L,32858L,32859L,32860L,32861L,32862L, -32863L,32864L,32865L,32866L,32867L,32868L,32869L,32870L,32871L,32872L, -32873L,32874L,32875L,32876L,32877L,32878L,32879L,32880L,32881L,32882L, -32883L,32884L,32885L,32886L,32887L,32888L,32889L,32890L,32891L,32892L, -32893L,32894L,32895L,32896L,32897L,32898L,32899L,32900L,32901L,32902L, -32903L,32904L,32905L,32906L,32907L,32908L,32909L,32910L,32911L,32912L, -32913L,32914L,32915L,32916L,32917L,32918L,32919L,32920L,32921L,32922L, -32923L,32924L,32925L,32926L,32927L,32928L,32929L,32930L,32931L,32932L, -32933L,32934L,32935L,32936L,32937L,32938L,32939L,32940L,32941L,32942L, -32943L,32944L,32945L,32946L,32947L,32948L,32949L,32950L,32951L,32952L, -32953L,32954L,32955L,32956L,32957L,32958L,32959L,32960L,32961L,32962L, -32963L,32964L,32965L,32966L,32967L,32968L,32969L,32970L,32971L,32972L, -32973L,32974L,32975L,32976L,32977L,32978L,32979L,32980L,32981L,32982L, -32983L,32984L,32985L,32986L,32987L,32988L,32989L,32990L,32991L,32992L, -32993L,32994L,32995L,32996L,32997L,32998L,32999L,33000L,33001L,33002L, -33003L,33004L,33005L,33006L,33007L,33008L,33009L,33010L,33011L,33012L, -33013L,33014L,33015L,33016L,33017L,33018L,33019L,33020L,33021L,33022L, -33023L,33024L,33025L,33026L,33027L,33028L,33029L,33030L,33031L,33032L, -33033L,33034L,33035L,33036L,33037L,33038L,33039L,33040L,33041L,33042L, -33043L,33044L,33045L,33046L,33047L,33048L,33049L,33050L,33051L,33052L, -33053L,33054L,33055L,33056L,33057L,33058L,33059L,33060L,33061L,33062L, -33063L,33064L,33065L,33066L,33067L,33068L,33069L,33070L,33071L,33072L, -33073L,33074L,33075L,33076L,33077L,33078L,33079L,33080L,33081L,33082L, -33083L,33084L,33085L,33086L,33087L,33088L,33089L,33090L,33091L,33092L, -33093L,33094L,33095L,33096L,33097L,33098L,33099L,33100L,33101L,33102L, -33103L,33104L,33105L,33106L,33107L,33108L,33109L,33110L,33111L,33112L, -33113L,33114L,33115L,33116L,33117L,33118L,33119L,33120L,33121L,33122L, -33123L,33124L,33125L,33126L,33127L,33128L,33129L,33130L,33131L,33132L, -33133L,33134L,33135L,33136L,33137L,33138L,33139L,33140L,33141L,33142L, -33143L,33144L,33145L,33146L,33147L,33148L,33149L,33150L,33151L,33152L, -33153L,33154L,33155L,33156L,33157L,33158L,33159L,33160L,33161L,33162L, -33163L,33164L,33165L,33166L,33167L,33168L,33169L,33170L,33171L,33172L, -33173L,33174L,33175L,33176L,33177L,33178L,33179L,33180L,33181L,33182L, -33183L,33184L,33185L,33186L,33187L,33188L,33189L,33190L,33191L,33192L, -33193L,33194L,33195L,33196L,33197L,33198L,33199L,33200L,33201L,33202L, -33203L,33204L,33205L,33206L,33207L,33208L,33209L,33210L,33211L,33212L, -33213L,33214L,33215L,33216L,33217L,33218L,33219L,33220L,33221L,33222L, -33223L,33224L,33225L,33226L,33227L,33228L,33229L,33230L,33231L,33232L, -33233L,33234L,33235L,33236L,33237L,33238L,33239L,33240L,33241L,33242L, -33243L,33244L,33245L,33246L,33247L,33248L,33249L,33250L,33251L,33252L, -33253L,33254L,33255L,33256L,33257L,33258L,33259L,33260L,33261L,33262L, -33263L,33264L,33265L,33266L,33267L,33268L,33269L,33270L,33271L,33272L, -33273L,33274L,33275L,33276L,33277L,33278L,33279L,33280L,33281L,33282L, -33283L,33284L,33285L,33286L,33287L,33288L,33289L,33290L,33291L,33292L, -33293L,33294L,33295L,33296L,33297L,33298L,33299L,33300L,33301L,33302L, -33303L,33304L,33305L,33306L,33307L,33308L,33309L,33310L,33311L,33312L, -33313L,33314L,33315L,33316L,33317L,33318L,33319L,33320L,33321L,33322L, -33323L,33324L,33325L,33326L,33327L,33328L,33329L,33330L,33331L,33332L, -33333L,33334L,33335L,33336L,33337L,33338L,33339L,33340L,33341L,33342L, -33343L,33344L,33345L,33346L,33347L,33348L,33349L,33350L,33351L,33352L, -33353L,33354L,33355L,33356L,33357L,33358L,33359L,33360L,33361L,33362L, -33363L,33364L,33365L,33366L,33367L,33368L,33369L,33370L,33371L,33372L, -33373L,33374L,33375L,33376L,33377L,33378L,33379L,33380L,33381L,33382L, -33383L,33384L,33385L,33386L,33387L,33388L,33389L,33390L,33391L,33392L, -33393L,33394L,33395L,33396L,33397L,33398L,33399L,33400L,33401L,33402L, -33403L,33404L,33405L,33406L,33407L,33408L,33409L,33410L,33411L,33412L, -33413L,33414L,33415L,33416L,33417L,33418L,33419L,33420L,33421L,33422L, -33423L,33424L,33425L,33426L,33427L,33428L,33429L,33430L,33431L,33432L, -33433L,33434L,33435L,33436L,33437L,33438L,33439L,33440L,33441L,33442L, -33443L,33444L,33445L,33446L,33447L,33448L,33449L,33450L,33451L,33452L, -33453L,33454L,33455L,33456L,33457L,33458L,33459L,33460L,33461L,33462L, -33463L,33464L,33465L,33466L,33467L,33468L,33469L,33470L,33471L,33472L, -33473L,33474L,33475L,33476L,33477L,33478L,33479L,33480L,33481L,33482L, -33483L,33484L,33485L,33486L,33487L,33488L,33489L,33490L,33491L,33492L, -33493L,33494L,33495L,33496L,33497L,33498L,33499L,33500L,33501L,33502L, -33503L,33504L,33505L,33506L,33507L,33508L,33509L,33510L,33511L,33512L, -33513L,33514L,33515L,33516L,33517L,33518L,33519L,33520L,33521L,33522L, -33523L,33524L,33525L,33526L,33527L,33528L,33529L,33530L,33531L,33532L, -33533L,33534L,33535L,33536L,33537L,33538L,33539L,33540L,33541L,33542L, -33543L,33544L,33545L,33546L,33547L,33548L,33549L,33550L,33551L,33552L, -33553L,33554L,33555L,33556L,33557L,33558L,33559L,33560L,33561L,33562L, -33563L,33564L,33565L,33566L,33567L,33568L,33569L,33570L,33571L,33572L, -33573L,33574L,33575L,33576L,33577L,33578L,33579L,33580L,33581L,33582L, -33583L,33584L,33585L,33586L,33587L,33588L,33589L,33590L,33591L,33592L, -33593L,33594L,33595L,33596L,33597L,33598L,33599L,33600L,33601L,33602L, -33603L,33604L,33605L,33606L,33607L,33608L,33609L,33610L,33611L,33612L, -33613L,33614L,33615L,33616L,33617L,33618L,33619L,33620L,33621L,33622L, -33623L,33624L,33625L,33626L,33627L,33628L,33629L,33630L,33631L,33632L, -33633L,33634L,33635L,33636L,33637L,33638L,33639L,33640L,33641L,33642L, -33643L,33644L,33645L,33646L,33647L,33648L,33649L,33650L,33651L,33652L, -33653L,33654L,33655L,33656L,33657L,33658L,33659L,33660L,33661L,33662L, -33663L,33664L,33665L,33666L,33667L,33668L,33669L,33670L,33671L,33672L, -33673L,33674L,33675L,33676L,33677L,33678L,33679L,33680L,33681L,33682L, -33683L,33684L,33685L,33686L,33687L,33688L,33689L,33690L,33691L,33692L, -33693L,33694L,33695L,33696L,33697L,33698L,33699L,33700L,33701L,33702L, -33703L,33704L,33705L,33706L,33707L,33708L,33709L,33710L,33711L,33712L, -33713L,33714L,33715L,33716L,33717L,33718L,33719L,33720L,33721L,33722L, -33723L,33724L,33725L,33726L,33727L,33728L,33729L,33730L,33731L,33732L, -33733L,33734L,33735L,33736L,33737L,33738L,33739L,33740L,33741L,33742L, -33743L,33744L,33745L,33746L,33747L,33748L,33749L,33750L,33751L,33752L, -33753L,33754L,33755L,33756L,33757L,33758L,33759L,33760L,33761L,33762L, -33763L,33764L,33765L,33766L,33767L,33768L,33769L,33770L,33771L,33772L, -33773L,33774L,33775L,33776L,33777L,33778L,33779L,33780L,33781L,33782L, -33783L,33784L,33785L,33786L,33787L,33788L,33789L,33790L,33791L,33792L, -33793L,33794L,33795L,33796L,33797L,33798L,33799L,33800L,33801L,33802L, -33803L,33804L,33805L,33806L,33807L,33808L,33809L,33810L,33811L,33812L, -33813L,33814L,33815L,33816L,33817L,33818L,33819L,33820L,33821L,33822L, -33823L,33824L,33825L,33826L,33827L,33828L,33829L,33830L,33831L,33832L, -33833L,33834L,33835L,33836L,33837L,33838L,33839L,33840L,33841L,33842L, -33843L,33844L,33845L,33846L,33847L,33848L,33849L,33850L,33851L,33852L, -33853L,33854L,33855L,33856L,33857L,33858L,33859L,33860L,33861L,33862L, -33863L,33864L,33865L,33866L,33867L,33868L,33869L,33870L,33871L,33872L, -33873L,33874L,33875L,33876L,33877L,33878L,33879L,33880L,33881L,33882L, -33883L,33884L,33885L,33886L,33887L,33888L,33889L,33890L,33891L,33892L, -33893L,33894L,33895L,33896L,33897L,33898L,33899L,33900L,33901L,33902L, -33903L,33904L,33905L,33906L,33907L,33908L,33909L,33910L,33911L,33912L, -33913L,33914L,33915L,33916L,33917L,33918L,33919L,33920L,33921L,33922L, -33923L,33924L,33925L,33926L,33927L,33928L,33929L,33930L,33931L,33932L, -33933L,33934L,33935L,33936L,33937L,33938L,33939L,33940L,33941L,33942L, -33943L,33944L,33945L,33946L,33947L,33948L,33949L,33950L,33951L,33952L, -33953L,33954L,33955L,33956L,33957L,33958L,33959L,33960L,33961L,33962L, -33963L,33964L,33965L,33966L,33967L,33968L,33969L,33970L,33971L,33972L, -33973L,33974L,33975L,33976L,33977L,33978L,33979L,33980L,33981L,33982L, -33983L,33984L,33985L,33986L,33987L,33988L,33989L,33990L,33991L,33992L, -33993L,33994L,33995L,33996L,33997L,33998L,33999L,34000L,34001L,34002L, -34003L,34004L,34005L,34006L,34007L,34008L,34009L,34010L,34011L,34012L, -34013L,34014L,34015L,34016L,34017L,34018L,34019L,34020L,34021L,34022L, -34023L,34024L,34025L,34026L,34027L,34028L,34029L,34030L,34031L,34032L, -34033L,34034L,34035L,34036L,34037L,34038L,34039L,34040L,34041L,34042L, -34043L,34044L,34045L,34046L,34047L,34048L,34049L,34050L,34051L,34052L, -34053L,34054L,34055L,34056L,34057L,34058L,34059L,34060L,34061L,34062L, -34063L,34064L,34065L,34066L,34067L,34068L,34069L,34070L,34071L,34072L, -34073L,34074L,34075L,34076L,34077L,34078L,34079L,34080L,34081L,34082L, -34083L,34084L,34085L,34086L,34087L,34088L,34089L,34090L,34091L,34092L, -34093L,34094L,34095L,34096L,34097L,34098L,34099L,34100L,34101L,34102L, -34103L,34104L,34105L,34106L,34107L,34108L,34109L,34110L,34111L,34112L, -34113L,34114L,34115L,34116L,34117L,34118L,34119L,34120L,34121L,34122L, -34123L,34124L,34125L,34126L,34127L,34128L,34129L,34130L,34131L,34132L, -34133L,34134L,34135L,34136L,34137L,34138L,34139L,34140L,34141L,34142L, -34143L,34144L,34145L,34146L,34147L,34148L,34149L,34150L,34151L,34152L, -34153L,34154L,34155L,34156L,34157L,34158L,34159L,34160L,34161L,34162L, -34163L,34164L,34165L,34166L,34167L,34168L,34169L,34170L,34171L,34172L, -34173L,34174L,34175L,34176L,34177L,34178L,34179L,34180L,34181L,34182L, -34183L,34184L,34185L,34186L,34187L,34188L,34189L,34190L,34191L,34192L, -34193L,34194L,34195L,34196L,34197L,34198L,34199L,34200L,34201L,34202L, -34203L,34204L,34205L,34206L,34207L,34208L,34209L,34210L,34211L,34212L, -34213L,34214L,34215L,34216L,34217L,34218L,34219L,34220L,34221L,34222L, -34223L,34224L,34225L,34226L,34227L,34228L,34229L,34230L,34231L,34232L, -34233L,34234L,34235L,34236L,34237L,34238L,34239L,34240L,34241L,34242L, -34243L,34244L,34245L,34246L,34247L,34248L,34249L,34250L,34251L,34252L, -34253L,34254L,34255L,34256L,34257L,34258L,34259L,34260L,34261L,34262L, -34263L,34264L,34265L,34266L,34267L,34268L,34269L,34270L,34271L,34272L, -34273L,34274L,34275L,34276L,34277L,34278L,34279L,34280L,34281L,34282L, -34283L,34284L,34285L,34286L,34287L,34288L,34289L,34290L,34291L,34292L, -34293L,34294L,34295L,34296L,34297L,34298L,34299L,34300L,34301L,34302L, -34303L,34304L,34305L,34306L,34307L,34308L,34309L,34310L,34311L,34312L, -34313L,34314L,34315L,34316L,34317L,34318L,34319L,34320L,34321L,34322L, -34323L,34324L,34325L,34326L,34327L,34328L,34329L,34330L,34331L,34332L, -34333L,34334L,34335L,34336L,34337L,34338L,34339L,34340L,34341L,34342L, -34343L,34344L,34345L,34346L,34347L,34348L,34349L,34350L,34351L,34352L, -34353L,34354L,34355L,34356L,34357L,34358L,34359L,34360L,34361L,34362L, -34363L,34364L,34365L,34366L,34367L,34368L,34369L,34370L,34371L,34372L, -34373L,34374L,34375L,34376L,34377L,34378L,34379L,34380L,34381L,34382L, -34383L,34384L,34385L,34386L,34387L,34388L,34389L,34390L,34391L,34392L, -34393L,34394L,34395L,34396L,34397L,34398L,34399L,34400L,34401L,34402L, -34403L,34404L,34405L,34406L,34407L,34408L,34409L,34410L,34411L,34412L, -34413L,34414L,34415L,34416L,34417L,34418L,34419L,34420L,34421L,34422L, -34423L,34424L,34425L,34426L,34427L,34428L,34429L,34430L,34431L,34432L, -34433L,34434L,34435L,34436L,34437L,34438L,34439L,34440L,34441L,34442L, -34443L,34444L,34445L,34446L,34447L,34448L,34449L,34450L,34451L,34452L, -34453L,34454L,34455L,34456L,34457L,34458L,34459L,34460L,34461L,34462L, -34463L,34464L,34465L,34466L,34467L,34468L,34469L,34470L,34471L,34472L, -34473L,34474L,34475L,34476L,34477L,34478L,34479L,34480L,34481L,34482L, -34483L,34484L,34485L,34486L,34487L,34488L,34489L,34490L,34491L,34492L, -34493L,34494L,34495L,34496L,34497L,34498L,34499L,34500L,34501L,34502L, -34503L,34504L,34505L,34506L,34507L,34508L,34509L,34510L,34511L,34512L, -34513L,34514L,34515L,34516L,34517L,34518L,34519L,34520L,34521L,34522L, -34523L,34524L,34525L,34526L,34527L,34528L,34529L,34530L,34531L,34532L, -34533L,34534L,34535L,34536L,34537L,34538L,34539L,34540L,34541L,34542L, -34543L,34544L,34545L,34546L,34547L,34548L,34549L,34550L,34551L,34552L, -34553L,34554L,34555L,34556L,34557L,34558L,34559L,34560L,34561L,34562L, -34563L,34564L,34565L,34566L,34567L,34568L,34569L,34570L,34571L,34572L, -34573L,34574L,34575L,34576L,34577L,34578L,34579L,34580L,34581L,34582L, -34583L,34584L,34585L,34586L,34587L,34588L,34589L,34590L,34591L,34592L, -34593L,34594L,34595L,34596L,34597L,34598L,34599L,34600L,34601L,34602L, -34603L,34604L,34605L,34606L,34607L,34608L,34609L,34610L,34611L,34612L, -34613L,34614L,34615L,34616L,34617L,34618L,34619L,34620L,34621L,34622L, -34623L,34624L,34625L,34626L,34627L,34628L,34629L,34630L,34631L,34632L, -34633L,34634L,34635L,34636L,34637L,34638L,34639L,34640L,34641L,34642L, -34643L,34644L,34645L,34646L,34647L,34648L,34649L,34650L,34651L,34652L, -34653L,34654L,34655L,34656L,34657L,34658L,34659L,34660L,34661L,34662L, -34663L,34664L,34665L,34666L,34667L,34668L,34669L,34670L,34671L,34672L, -34673L,34674L,34675L,34676L,34677L,34678L,34679L,34680L,34681L,34682L, -34683L,34684L,34685L,34686L,34687L,34688L,34689L,34690L,34691L,34692L, -34693L,34694L,34695L,34696L,34697L,34698L,34699L,34700L,34701L,34702L, -34703L,34704L,34705L,34706L,34707L,34708L,34709L,34710L,34711L,34712L, -34713L,34714L,34715L,34716L,34717L,34718L,34719L,34720L,34721L,34722L, -34723L,34724L,34725L,34726L,34727L,34728L,34729L,34730L,34731L,34732L, -34733L,34734L,34735L,34736L,34737L,34738L,34739L,34740L,34741L,34742L, -34743L,34744L,34745L,34746L,34747L,34748L,34749L,34750L,34751L,34752L, -34753L,34754L,34755L,34756L,34757L,34758L,34759L,34760L,34761L,34762L, -34763L,34764L,34765L,34766L,34767L,34768L,34769L,34770L,34771L,34772L, -34773L,34774L,34775L,34776L,34777L,34778L,34779L,34780L,34781L,34782L, -34783L,34784L,34785L,34786L,34787L,34788L,34789L,34790L,34791L,34792L, -34793L,34794L,34795L,34796L,34797L,34798L,34799L,34800L,34801L,34802L, -34803L,34804L,34805L,34806L,34807L,34808L,34809L,34810L,34811L,34812L, -34813L,34814L,34815L,34816L,34817L,34818L,34819L,34820L,34821L,34822L, -34823L,34824L,34825L,34826L,34827L,34828L,34829L,34830L,34831L,34832L, -34833L,34834L,34835L,34836L,34837L,34838L,34839L,34840L,34841L,34842L, -34843L,34844L,34845L,34846L,34847L,34848L,34849L,34850L,34851L,34852L, -34853L,34854L,34855L,34856L,34857L,34858L,34859L,34860L,34861L,34862L, -34863L,34864L,34865L,34866L,34867L,34868L,34869L,34870L,34871L,34872L, -34873L,34874L,34875L,34876L,34877L,34878L,34879L,34880L,34881L,34882L, -34883L,34884L,34885L,34886L,34887L,34888L,34889L,34890L,34891L,34892L, -34893L,34894L,34895L,34896L,34897L,34898L,34899L,34900L,34901L,34902L, -34903L,34904L,34905L,34906L,34907L,34908L,34909L,34910L,34911L,34912L, -34913L,34914L,34915L,34916L,34917L,34918L,34919L,34920L,34921L,34922L, -34923L,34924L,34925L,34926L,34927L,34928L,34929L,34930L,34931L,34932L, -34933L,34934L,34935L,34936L,34937L,34938L,34939L,34940L,34941L,34942L, -34943L,34944L,34945L,34946L,34947L,34948L,34949L,34950L,34951L,34952L, -34953L,34954L,34955L,34956L,34957L,34958L,34959L,34960L,34961L,34962L, -34963L,34964L,34965L,34966L,34967L,34968L,34969L,34970L,34971L,34972L, -34973L,34974L,34975L,34976L,34977L,34978L,34979L,34980L,34981L,34982L, -34983L,34984L,34985L,34986L,34987L,34988L,34989L,34990L,34991L,34992L, -34993L,34994L,34995L,34996L,34997L,34998L,34999L,35000L,35001L,35002L, -35003L,35004L,35005L,35006L,35007L,35008L,35009L,35010L,35011L,35012L, -35013L,35014L,35015L,35016L,35017L,35018L,35019L,35020L,35021L,35022L, -35023L,35024L,35025L,35026L,35027L,35028L,35029L,35030L,35031L,35032L, -35033L,35034L,35035L,35036L,35037L,35038L,35039L,35040L,35041L,35042L, -35043L,35044L,35045L,35046L,35047L,35048L,35049L,35050L,35051L,35052L, -35053L,35054L,35055L,35056L,35057L,35058L,35059L,35060L,35061L,35062L, -35063L,35064L,35065L,35066L,35067L,35068L,35069L,35070L,35071L,35072L, -35073L,35074L,35075L,35076L,35077L,35078L,35079L,35080L,35081L,35082L, -35083L,35084L,35085L,35086L,35087L,35088L,35089L,35090L,35091L,35092L, -35093L,35094L,35095L,35096L,35097L,35098L,35099L,35100L,35101L,35102L, -35103L,35104L,35105L,35106L,35107L,35108L,35109L,35110L,35111L,35112L, -35113L,35114L,35115L,35116L,35117L,35118L,35119L,35120L,35121L,35122L, -35123L,35124L,35125L,35126L,35127L,35128L,35129L,35130L,35131L,35132L, -35133L,35134L,35135L,35136L,35137L,35138L,35139L,35140L,35141L,35142L, -35143L,35144L,35145L,35146L,35147L,35148L,35149L,35150L,35151L,35152L, -35153L,35154L,35155L,35156L,35157L,35158L,35159L,35160L,35161L,35162L, -35163L,35164L,35165L,35166L,35167L,35168L,35169L,35170L,35171L,35172L, -35173L,35174L,35175L,35176L,35177L,35178L,35179L,35180L,35181L,35182L, -35183L,35184L,35185L,35186L,35187L,35188L,35189L,35190L,35191L,35192L, -35193L,35194L,35195L,35196L,35197L,35198L,35199L,35200L,35201L,35202L, -35203L,35204L,35205L,35206L,35207L,35208L,35209L,35210L,35211L,35212L, -35213L,35214L,35215L,35216L,35217L,35218L,35219L,35220L,35221L,35222L, -35223L,35224L,35225L,35226L,35227L,35228L,35229L,35230L,35231L,35232L, -35233L,35234L,35235L,35236L,35237L,35238L,35239L,35240L,35241L,35242L, -35243L,35244L,35245L,35246L,35247L,35248L,35249L,35250L,35251L,35252L, -35253L,35254L,35255L,35256L,35257L,35258L,35259L,35260L,35261L,35262L, -35263L,35264L,35265L,35266L,35267L,35268L,35269L,35270L,35271L,35272L, -35273L,35274L,35275L,35276L,35277L,35278L,35279L,35280L,35281L,35282L, -35283L,35284L,35285L,35286L,35287L,35288L,35289L,35290L,35291L,35292L, -35293L,35294L,35295L,35296L,35297L,35298L,35299L,35300L,35301L,35302L, -35303L,35304L,35305L,35306L,35307L,35308L,35309L,35310L,35311L,35312L, -35313L,35314L,35315L,35316L,35317L,35318L,35319L,35320L,35321L,35322L, -35323L,35324L,35325L,35326L,35327L,35328L,35329L,35330L,35331L,35332L, -35333L,35334L,35335L,35336L,35337L,35338L,35339L,35340L,35341L,35342L, -35343L,35344L,35345L,35346L,35347L,35348L,35349L,35350L,35351L,35352L, -35353L,35354L,35355L,35356L,35357L,35358L,35359L,35360L,35361L,35362L, -35363L,35364L,35365L,35366L,35367L,35368L,35369L,35370L,35371L,35372L, -35373L,35374L,35375L,35376L,35377L,35378L,35379L,35380L,35381L,35382L, -35383L,35384L,35385L,35386L,35387L,35388L,35389L,35390L,35391L,35392L, -35393L,35394L,35395L,35396L,35397L,35398L,35399L,35400L,35401L,35402L, -35403L,35404L,35405L,35406L,35407L,35408L,35409L,35410L,35411L,35412L, -35413L,35414L,35415L,35416L,35417L,35418L,35419L,35420L,35421L,35422L, -35423L,35424L,35425L,35426L,35427L,35428L,35429L,35430L,35431L,35432L, -35433L,35434L,35435L,35436L,35437L,35438L,35439L,35440L,35441L,35442L, -35443L,35444L,35445L,35446L,35447L,35448L,35449L,35450L,35451L,35452L, -35453L,35454L,35455L,35456L,35457L,35458L,35459L,35460L,35461L,35462L, -35463L,35464L,35465L,35466L,35467L,35468L,35469L,35470L,35471L,35472L, -35473L,35474L,35475L,35476L,35477L,35478L,35479L,35480L,35481L,35482L, -35483L,35484L,35485L,35486L,35487L,35488L,35489L,35490L,35491L,35492L, -35493L,35494L,35495L,35496L,35497L,35498L,35499L,35500L,35501L,35502L, -35503L,35504L,35505L,35506L,35507L,35508L,35509L,35510L,35511L,35512L, -35513L,35514L,35515L,35516L,35517L,35518L,35519L,35520L,35521L,35522L, -35523L,35524L,35525L,35526L,35527L,35528L,35529L,35530L,35531L,35532L, -35533L,35534L,35535L,35536L,35537L,35538L,35539L,35540L,35541L,35542L, -35543L,35544L,35545L,35546L,35547L,35548L,35549L,35550L,35551L,35552L, -35553L,35554L,35555L,35556L,35557L,35558L,35559L,35560L,35561L,35562L, -35563L,35564L,35565L,35566L,35567L,35568L,35569L,35570L,35571L,35572L, -35573L,35574L,35575L,35576L,35577L,35578L,35579L,35580L,35581L,35582L, -35583L,35584L,35585L,35586L,35587L,35588L,35589L,35590L,35591L,35592L, -35593L,35594L,35595L,35596L,35597L,35598L,35599L,35600L,35601L,35602L, -35603L,35604L,35605L,35606L,35607L,35608L,35609L,35610L,35611L,35612L, -35613L,35614L,35615L,35616L,35617L,35618L,35619L,35620L,35621L,35622L, -35623L,35624L,35625L,35626L,35627L,35628L,35629L,35630L,35631L,35632L, -35633L,35634L,35635L,35636L,35637L,35638L,35639L,35640L,35641L,35642L, -35643L,35644L,35645L,35646L,35647L,35648L,35649L,35650L,35651L,35652L, -35653L,35654L,35655L,35656L,35657L,35658L,35659L,35660L,35661L,35662L, -35663L,35664L,35665L,35666L,35667L,35668L,35669L,35670L,35671L,35672L, -35673L,35674L,35675L,35676L,35677L,35678L,35679L,35680L,35681L,35682L, -35683L,35684L,35685L,35686L,35687L,35688L,35689L,35690L,35691L,35692L, -35693L,35694L,35695L,35696L,35697L,35698L,35699L,35700L,35701L,35702L, -35703L,35704L,35705L,35706L,35707L,35708L,35709L,35710L,35711L,35712L, -35713L,35714L,35715L,35716L,35717L,35718L,35719L,35720L,35721L,35722L, -35723L,35724L,35725L,35726L,35727L,35728L,35729L,35730L,35731L,35732L, -35733L,35734L,35735L,35736L,35737L,35738L,35739L,35740L,35741L,35742L, -35743L,35744L,35745L,35746L,35747L,35748L,35749L,35750L,35751L,35752L, -35753L,35754L,35755L,35756L,35757L,35758L,35759L,35760L,35761L,35762L, -35763L,35764L,35765L,35766L,35767L,35768L,35769L,35770L,35771L,35772L, -35773L,35774L,35775L,35776L,35777L,35778L,35779L,35780L,35781L,35782L, -35783L,35784L,35785L,35786L,35787L,35788L,35789L,35790L,35791L,35792L, -35793L,35794L,35795L,35796L,35797L,35798L,35799L,35800L,35801L,35802L, -35803L,35804L,35805L,35806L,35807L,35808L,35809L,35810L,35811L,35812L, -35813L,35814L,35815L,35816L,35817L,35818L,35819L,35820L,35821L,35822L, -35823L,35824L,35825L,35826L,35827L,35828L,35829L,35830L,35831L,35832L, -35833L,35834L,35835L,35836L,35837L,35838L,35839L,35840L,35841L,35842L, -35843L,35844L,35845L,35846L,35847L,35848L,35849L,35850L,35851L,35852L, -35853L,35854L,35855L,35856L,35857L,35858L,35859L,35860L,35861L,35862L, -35863L,35864L,35865L,35866L,35867L,35868L,35869L,35870L,35871L,35872L, -35873L,35874L,35875L,35876L,35877L,35878L,35879L,35880L,35881L,35882L, -35883L,35884L,35885L,35886L,35887L,35888L,35889L,35890L,35891L,35892L, -35893L,35894L,35895L,35896L,35897L,35898L,35899L,35900L,35901L,35902L, -35903L,35904L,35905L,35906L,35907L,35908L,35909L,35910L,35911L,35912L, -35913L,35914L,35915L,35916L,35917L,35918L,35919L,35920L,35921L,35922L, -35923L,35924L,35925L,35926L,35927L,35928L,35929L,35930L,35931L,35932L, -35933L,35934L,35935L,35936L,35937L,35938L,35939L,35940L,35941L,35942L, -35943L,35944L,35945L,35946L,35947L,35948L,35949L,35950L,35951L,35952L, -35953L,35954L,35955L,35956L,35957L,35958L,35959L,35960L,35961L,35962L, -35963L,35964L,35965L,35966L,35967L,35968L,35969L,35970L,35971L,35972L, -35973L,35974L,35975L,35976L,35977L,35978L,35979L,35980L,35981L,35982L, -35983L,35984L,35985L,35986L,35987L,35988L,35989L,35990L,35991L,35992L, -35993L,35994L,35995L,35996L,35997L,35998L,35999L,36000L,36001L,36002L, -36003L,36004L,36005L,36006L,36007L,36008L,36009L,36010L,36011L,36012L, -36013L,36014L,36015L,36016L,36017L,36018L,36019L,36020L,36021L,36022L, -36023L,36024L,36025L,36026L,36027L,36028L,36029L,36030L,36031L,36032L, -36033L,36034L,36035L,36036L,36037L,36038L,36039L,36040L,36041L,36042L, -36043L,36044L,36045L,36046L,36047L,36048L,36049L,36050L,36051L,36052L, -36053L,36054L,36055L,36056L,36057L,36058L,36059L,36060L,36061L,36062L, -36063L,36064L,36065L,36066L,36067L,36068L,36069L,36070L,36071L,36072L, -36073L,36074L,36075L,36076L,36077L,36078L,36079L,36080L,36081L,36082L, -36083L,36084L,36085L,36086L,36087L,36088L,36089L,36090L,36091L,36092L, -36093L,36094L,36095L,36096L,36097L,36098L,36099L,36100L,36101L,36102L, -36103L,36104L,36105L,36106L,36107L,36108L,36109L,36110L,36111L,36112L, -36113L,36114L,36115L,36116L,36117L,36118L,36119L,36120L,36121L,36122L, -36123L,36124L,36125L,36126L,36127L,36128L,36129L,36130L,36131L,36132L, -36133L,36134L,36135L,36136L,36137L,36138L,36139L,36140L,36141L,36142L, -36143L,36144L,36145L,36146L,36147L,36148L,36149L,36150L,36151L,36152L, -36153L,36154L,36155L,36156L,36157L,36158L,36159L,36160L,36161L,36162L, -36163L,36164L,36165L,36166L,36167L,36168L,36169L,36170L,36171L,36172L, -36173L,36174L,36175L,36176L,36177L,36178L,36179L,36180L,36181L,36182L, -36183L,36184L,36185L,36186L,36187L,36188L,36189L,36190L,36191L,36192L, -36193L,36194L,36195L,36196L,36197L,36198L,36199L,36200L,36201L,36202L, -36203L,36204L,36205L,36206L,36207L,36208L,36209L,36210L,36211L,36212L, -36213L,36214L,36215L,36216L,36217L,36218L,36219L,36220L,36221L,36222L, -36223L,36224L,36225L,36226L,36227L,36228L,36229L,36230L,36231L,36232L, -36233L,36234L,36235L,36236L,36237L,36238L,36239L,36240L,36241L,36242L, -36243L,36244L,36245L,36246L,36247L,36248L,36249L,36250L,36251L,36252L, -36253L,36254L,36255L,36256L,36257L,36258L,36259L,36260L,36261L,36262L, -36263L,36264L,36265L,36266L,36267L,36268L,36269L,36270L,36271L,36272L, -36273L,36274L,36275L,36276L,36277L,36278L,36279L,36280L,36281L,36282L, -36283L,36284L,36285L,36286L,36287L,36288L,36289L,36290L,36291L,36292L, -36293L,36294L,36295L,36296L,36297L,36298L,36299L,36300L,36301L,36302L, -36303L,36304L,36305L,36306L,36307L,36308L,36309L,36310L,36311L,36312L, -36313L,36314L,36315L,36316L,36317L,36318L,36319L,36320L,36321L,36322L, -36323L,36324L,36325L,36326L,36327L,36328L,36329L,36330L,36331L,36332L, -36333L,36334L,36335L,36336L,36337L,36338L,36339L,36340L,36341L,36342L, -36343L,36344L,36345L,36346L,36347L,36348L,36349L,36350L,36351L,36352L, -36353L,36354L,36355L,36356L,36357L,36358L,36359L,36360L,36361L,36362L, -36363L,36364L,36365L,36366L,36367L,36368L,36369L,36370L,36371L,36372L, -36373L,36374L,36375L,36376L,36377L,36378L,36379L,36380L,36381L,36382L, -36383L,36384L,36385L,36386L,36387L,36388L,36389L,36390L,36391L,36392L, -36393L,36394L,36395L,36396L,36397L,36398L,36399L,36400L,36401L,36402L, -36403L,36404L,36405L,36406L,36407L,36408L,36409L,36410L,36411L,36412L, -36413L,36414L,36415L,36416L,36417L,36418L,36419L,36420L,36421L,36422L, -36423L,36424L,36425L,36426L,36427L,36428L,36429L,36430L,36431L,36432L, -36433L,36434L,36435L,36436L,36437L,36438L,36439L,36440L,36441L,36442L, -36443L,36444L,36445L,36446L,36447L,36448L,36449L,36450L,36451L,36452L, -36453L,36454L,36455L,36456L,36457L,36458L,36459L,36460L,36461L,36462L, -36463L,36464L,36465L,36466L,36467L,36468L,36469L,36470L,36471L,36472L, -36473L,36474L,36475L,36476L,36477L,36478L,36479L,36480L,36481L,36482L, -36483L,36484L,36485L,36486L,36487L,36488L,36489L,36490L,36491L,36492L, -36493L,36494L,36495L,36496L,36497L,36498L,36499L,36500L,36501L,36502L, -36503L,36504L,36505L,36506L,36507L,36508L,36509L,36510L,36511L,36512L, -36513L,36514L,36515L,36516L,36517L,36518L,36519L,36520L,36521L,36522L, -36523L,36524L,36525L,36526L,36527L,36528L,36529L,36530L,36531L,36532L, -36533L,36534L,36535L,36536L,36537L,36538L,36539L,36540L,36541L,36542L, -36543L,36544L,36545L,36546L,36547L,36548L,36549L,36550L,36551L,36552L, -36553L,36554L,36555L,36556L,36557L,36558L,36559L,36560L,36561L,36562L, -36563L,36564L,36565L,36566L,36567L,36568L,36569L,36570L,36571L,36572L, -36573L,36574L,36575L,36576L,36577L,36578L,36579L,36580L,36581L,36582L, -36583L,36584L,36585L,36586L,36587L,36588L,36589L,36590L,36591L,36592L, -36593L,36594L,36595L,36596L,36597L,36598L,36599L,36600L,36601L,36602L, -36603L,36604L,36605L,36606L,36607L,36608L,36609L,36610L,36611L,36612L, -36613L,36614L,36615L,36616L,36617L,36618L,36619L,36620L,36621L,36622L, -36623L,36624L,36625L,36626L,36627L,36628L,36629L,36630L,36631L,36632L, -36633L,36634L,36635L,36636L,36637L,36638L,36639L,36640L,36641L,36642L, -36643L,36644L,36645L,36646L,36647L,36648L,36649L,36650L,36651L,36652L, -36653L,36654L,36655L,36656L,36657L,36658L,36659L,36660L,36661L,36662L, -36663L,36664L,36665L,36666L,36667L,36668L,36669L,36670L,36671L,36672L, -36673L,36674L,36675L,36676L,36677L,36678L,36679L,36680L,36681L,36682L, -36683L,36684L,36685L,36686L,36687L,36688L,36689L,36690L,36691L,36692L, -36693L,36694L,36695L,36696L,36697L,36698L,36699L,36700L,36701L,36702L, -36703L,36704L,36705L,36706L,36707L,36708L,36709L,36710L,36711L,36712L, -36713L,36714L,36715L,36716L,36717L,36718L,36719L,36720L,36721L,36722L, -36723L,36724L,36725L,36726L,36727L,36728L,36729L,36730L,36731L,36732L, -36733L,36734L,36735L,36736L,36737L,36738L,36739L,36740L,36741L,36742L, -36743L,36744L,36745L,36746L,36747L,36748L,36749L,36750L,36751L,36752L, -36753L,36754L,36755L,36756L,36757L,36758L,36759L,36760L,36761L,36762L, -36763L,36764L,36765L,36766L,36767L,36768L,36769L,36770L,36771L,36772L, -36773L,36774L,36775L,36776L,36777L,36778L,36779L,36780L,36781L,36782L, -36783L,36784L,36785L,36786L,36787L,36788L,36789L,36790L,36791L,36792L, -36793L,36794L,36795L,36796L,36797L,36798L,36799L,36800L,36801L,36802L, -36803L,36804L,36805L,36806L,36807L,36808L,36809L,36810L,36811L,36812L, -36813L,36814L,36815L,36816L,36817L,36818L,36819L,36820L,36821L,36822L, -36823L,36824L,36825L,36826L,36827L,36828L,36829L,36830L,36831L,36832L, -36833L,36834L,36835L,36836L,36837L,36838L,36839L,36840L,36841L,36842L, -36843L,36844L,36845L,36846L,36847L,36848L,36849L,36850L,36851L,36852L, -36853L,36854L,36855L,36856L,36857L,36858L,36859L,36860L,36861L,36862L, -36863L,36864L,36865L,36866L,36867L,36868L,36869L,36870L,36871L,36872L, -36873L,36874L,36875L,36876L,36877L,36878L,36879L,36880L,36881L,36882L, -36883L,36884L,36885L,36886L,36887L,36888L,36889L,36890L,36891L,36892L, -36893L,36894L,36895L,36896L,36897L,36898L,36899L,36900L,36901L,36902L, -36903L,36904L,36905L,36906L,36907L,36908L,36909L,36910L,36911L,36912L, -36913L,36914L,36915L,36916L,36917L,36918L,36919L,36920L,36921L,36922L, -36923L,36924L,36925L,36926L,36927L,36928L,36929L,36930L,36931L,36932L, -36933L,36934L,36935L,36936L,36937L,36938L,36939L,36940L,36941L,36942L, -36943L,36944L,36945L,36946L,36947L,36948L,36949L,36950L,36951L,36952L, -36953L,36954L,36955L,36956L,36957L,36958L,36959L,36960L,36961L,36962L, -36963L,36964L,36965L,36966L,36967L,36968L,36969L,36970L,36971L,36972L, -36973L,36974L,36975L,36976L,36977L,36978L,36979L,36980L,36981L,36982L, -36983L,36984L,36985L,36986L,36987L,36988L,36989L,36990L,36991L,36992L, -36993L,36994L,36995L,36996L,36997L,36998L,36999L,37000L,37001L,37002L, -37003L,37004L,37005L,37006L,37007L,37008L,37009L,37010L,37011L,37012L, -37013L,37014L,37015L,37016L,37017L,37018L,37019L,37020L,37021L,37022L, -37023L,37024L,37025L,37026L,37027L,37028L,37029L,37030L,37031L,37032L, -37033L,37034L,37035L,37036L,37037L,37038L,37039L,37040L,37041L,37042L, -37043L,37044L,37045L,37046L,37047L,37048L,37049L,37050L,37051L,37052L, -37053L,37054L,37055L,37056L,37057L,37058L,37059L,37060L,37061L,37062L, -37063L,37064L,37065L,37066L,37067L,37068L,37069L,37070L,37071L,37072L, -37073L,37074L,37075L,37076L,37077L,37078L,37079L,37080L,37081L,37082L, -37083L,37084L,37085L,37086L,37087L,37088L,37089L,37090L,37091L,37092L, -37093L,37094L,37095L,37096L,37097L,37098L,37099L,37100L,37101L,37102L, -37103L,37104L,37105L,37106L,37107L,37108L,37109L,37110L,37111L,37112L, -37113L,37114L,37115L,37116L,37117L,37118L,37119L,37120L,37121L,37122L, -37123L,37124L,37125L,37126L,37127L,37128L,37129L,37130L,37131L,37132L, -37133L,37134L,37135L,37136L,37137L,37138L,37139L,37140L,37141L,37142L, -37143L,37144L,37145L,37146L,37147L,37148L,37149L,37150L,37151L,37152L, -37153L,37154L,37155L,37156L,37157L,37158L,37159L,37160L,37161L,37162L, -37163L,37164L,37165L,37166L,37167L,37168L,37169L,37170L,37171L,37172L, -37173L,37174L,37175L,37176L,37177L,37178L,37179L,37180L,37181L,37182L, -37183L,37184L,37185L,37186L,37187L,37188L,37189L,37190L,37191L,37192L, -37193L,37194L,37195L,37196L,37197L,37198L,37199L,37200L,37201L,37202L, -37203L,37204L,37205L,37206L,37207L,37208L,37209L,37210L,37211L,37212L, -37213L,37214L,37215L,37216L,37217L,37218L,37219L,37220L,37221L,37222L, -37223L,37224L,37225L,37226L,37227L,37228L,37229L,37230L,37231L,37232L, -37233L,37234L,37235L,37236L,37237L,37238L,37239L,37240L,37241L,37242L, -37243L,37244L,37245L,37246L,37247L,37248L,37249L,37250L,37251L,37252L, -37253L,37254L,37255L,37256L,37257L,37258L,37259L,37260L,37261L,37262L, -37263L,37264L,37265L,37266L,37267L,37268L,37269L,37270L,37271L,37272L, -37273L,37274L,37275L,37276L,37277L,37278L,37279L,37280L,37281L,37282L, -37283L,37284L,37285L,37286L,37287L,37288L,37289L,37290L,37291L,37292L, -37293L,37294L,37295L,37296L,37297L,37298L,37299L,37300L,37301L,37302L, -37303L,37304L,37305L,37306L,37307L,37308L,37309L,37310L,37311L,37312L, -37313L,37314L,37315L,37316L,37317L,37318L,37319L,37320L,37321L,37322L, -37323L,37324L,37325L,37326L,37327L,37328L,37329L,37330L,37331L,37332L, -37333L,37334L,37335L,37336L,37337L,37338L,37339L,37340L,37341L,37342L, -37343L,37344L,37345L,37346L,37347L,37348L,37349L,37350L,37351L,37352L, -37353L,37354L,37355L,37356L,37357L,37358L,37359L,37360L,37361L,37362L, -37363L,37364L,37365L,37366L,37367L,37368L,37369L,37370L,37371L,37372L, -37373L,37374L,37375L,37376L,37377L,37378L,37379L,37380L,37381L,37382L, -37383L,37384L,37385L,37386L,37387L,37388L,37389L,37390L,37391L,37392L, -37393L,37394L,37395L,37396L,37397L,37398L,37399L,37400L,37401L,37402L, -37403L,37404L,37405L,37406L,37407L,37408L,37409L,37410L,37411L,37412L, -37413L,37414L,37415L,37416L,37417L,37418L,37419L,37420L,37421L,37422L, -37423L,37424L,37425L,37426L,37427L,37428L,37429L,37430L,37431L,37432L, -37433L,37434L,37435L,37436L,37437L,37438L,37439L,37440L,37441L,37442L, -37443L,37444L,37445L,37446L,37447L,37448L,37449L,37450L,37451L,37452L, -37453L,37454L,37455L,37456L,37457L,37458L,37459L,37460L,37461L,37462L, -37463L,37464L,37465L,37466L,37467L,37468L,37469L,37470L,37471L,37472L, -37473L,37474L,37475L,37476L,37477L,37478L,37479L,37480L,37481L,37482L, -37483L,37484L,37485L,37486L,37487L,37488L,37489L,37490L,37491L,37492L, -37493L,37494L,37495L,37496L,37497L,37498L,37499L,37500L,37501L,37502L, -37503L,37504L,37505L,37506L,37507L,37508L,37509L,37510L,37511L,37512L, -37513L,37514L,37515L,37516L,37517L,37518L,37519L,37520L,37521L,37522L, -37523L,37524L,37525L,37526L,37527L,37528L,37529L,37530L,37531L,37532L, -37533L,37534L,37535L,37536L,37537L,37538L,37539L,37540L,37541L,37542L, -37543L,37544L,37545L,37546L,37547L,37548L,37549L,37550L,37551L,37552L, -37553L,37554L,37555L,37556L,37557L,37558L,37559L,37560L,37561L,37562L, -37563L,37564L,37565L,37566L,37567L,37568L,37569L,37570L,37571L,37572L, -37573L,37574L,37575L,37576L,37577L,37578L,37579L,37580L,37581L,37582L, -37583L,37584L,37585L,37586L,37587L,37588L,37589L,37590L,37591L,37592L, -37593L,37594L,37595L,37596L,37597L,37598L,37599L,37600L,37601L,37602L, -37603L,37604L,37605L,37606L,37607L,37608L,37609L,37610L,37611L,37612L, -37613L,37614L,37615L,37616L,37617L,37618L,37619L,37620L,37621L,37622L, -37623L,37624L,37625L,37626L,37627L,37628L,37629L,37630L,37631L,37632L, -37633L,37634L,37635L,37636L,37637L,37638L,37639L,37640L,37641L,37642L, -37643L,37644L,37645L,37646L,37647L,37648L,37649L,37650L,37651L,37652L, -37653L,37654L,37655L,37656L,37657L,37658L,37659L,37660L,37661L,37662L, -37663L,37664L,37665L,37666L,37667L,37668L,37669L,37670L,37671L,37672L, -37673L,37674L,37675L,37676L,37677L,37678L,37679L,37680L,37681L,37682L, -37683L,37684L,37685L,37686L,37687L,37688L,37689L,37690L,37691L,37692L, -37693L,37694L,37695L,37696L,37697L,37698L,37699L,37700L,37701L,37702L, -37703L,37704L,37705L,37706L,37707L,37708L,37709L,37710L,37711L,37712L, -37713L,37714L,37715L,37716L,37717L,37718L,37719L,37720L,37721L,37722L, -37723L,37724L,37725L,37726L,37727L,37728L,37729L,37730L,37731L,37732L, -37733L,37734L,37735L,37736L,37737L,37738L,37739L,37740L,37741L,37742L, -37743L,37744L,37745L,37746L,37747L,37748L,37749L,37750L,37751L,37752L, -37753L,37754L,37755L,37756L,37757L,37758L,37759L,37760L,37761L,37762L, -37763L,37764L,37765L,37766L,37767L,37768L,37769L,37770L,37771L,37772L, -37773L,37774L,37775L,37776L,37777L,37778L,37779L,37780L,37781L,37782L, -37783L,37784L,37785L,37786L,37787L,37788L,37789L,37790L,37791L,37792L, -37793L,37794L,37795L,37796L,37797L,37798L,37799L,37800L,37801L,37802L, -37803L,37804L,37805L,37806L,37807L,37808L,37809L,37810L,37811L,37812L, -37813L,37814L,37815L,37816L,37817L,37818L,37819L,37820L,37821L,37822L, -37823L,37824L,37825L,37826L,37827L,37828L,37829L,37830L,37831L,37832L, -37833L,37834L,37835L,37836L,37837L,37838L,37839L,37840L,37841L,37842L, -37843L,37844L,37845L,37846L,37847L,37848L,37849L,37850L,37851L,37852L, -37853L,37854L,37855L,37856L,37857L,37858L,37859L,37860L,37861L,37862L, -37863L,37864L,37865L,37866L,37867L,37868L,37869L,37870L,37871L,37872L, -37873L,37874L,37875L,37876L,37877L,37878L,37879L,37880L,37881L,37882L, -37883L,37884L,37885L,37886L,37887L,37888L,37889L,37890L,37891L,37892L, -37893L,37894L,37895L,37896L,37897L,37898L,37899L,37900L,37901L,37902L, -37903L,37904L,37905L,37906L,37907L,37908L,37909L,37910L,37911L,37912L, -37913L,37914L,37915L,37916L,37917L,37918L,37919L,37920L,37921L,37922L, -37923L,37924L,37925L,37926L,37927L,37928L,37929L,37930L,37931L,37932L, -37933L,37934L,37935L,37936L,37937L,37938L,37939L,37940L,37941L,37942L, -37943L,37944L,37945L,37946L,37947L,37948L,37949L,37950L,37951L,37952L, -37953L,37954L,37955L,37956L,37957L,37958L,37959L,37960L,37961L,37962L, -37963L,37964L,37965L,37966L,37967L,37968L,37969L,37970L,37971L,37972L, -37973L,37974L,37975L,37976L,37977L,37978L,37979L,37980L,37981L,37982L, -37983L,37984L,37985L,37986L,37987L,37988L,37989L,37990L,37991L,37992L, -37993L,37994L,37995L,37996L,37997L,37998L,37999L,38000L,38001L,38002L, -38003L,38004L,38005L,38006L,38007L,38008L,38009L,38010L,38011L,38012L, -38013L,38014L,38015L,38016L,38017L,38018L,38019L,38020L,38021L,38022L, -38023L,38024L,38025L,38026L,38027L,38028L,38029L,38030L,38031L,38032L, -38033L,38034L,38035L,38036L,38037L,38038L,38039L,38040L,38041L,38042L, -38043L,38044L,38045L,38046L,38047L,38048L,38049L,38050L,38051L,38052L, -38053L,38054L,38055L,38056L,38057L,38058L,38059L,38060L,38061L,38062L, -38063L,38064L,38065L,38066L,38067L,38068L,38069L,38070L,38071L,38072L, -38073L,38074L,38075L,38076L,38077L,38078L,38079L,38080L,38081L,38082L, -38083L,38084L,38085L,38086L,38087L,38088L,38089L,38090L,38091L,38092L, -38093L,38094L,38095L,38096L,38097L,38098L,38099L,38100L,38101L,38102L, -38103L,38104L,38105L,38106L,38107L,38108L,38109L,38110L,38111L,38112L, -38113L,38114L,38115L,38116L,38117L,38118L,38119L,38120L,38121L,38122L, -38123L,38124L,38125L,38126L,38127L,38128L,38129L,38130L,38131L,38132L, -38133L,38134L,38135L,38136L,38137L,38138L,38139L,38140L,38141L,38142L, -38143L,38144L,38145L,38146L,38147L,38148L,38149L,38150L,38151L,38152L, -38153L,38154L,38155L,38156L,38157L,38158L,38159L,38160L,38161L,38162L, -38163L,38164L,38165L,38166L,38167L,38168L,38169L,38170L,38171L,38172L, -38173L,38174L,38175L,38176L,38177L,38178L,38179L,38180L,38181L,38182L, -38183L,38184L,38185L,38186L,38187L,38188L,38189L,38190L,38191L,38192L, -38193L,38194L,38195L,38196L,38197L,38198L,38199L,38200L,38201L,38202L, -38203L,38204L,38205L,38206L,38207L,38208L,38209L,38210L,38211L,38212L, -38213L,38214L,38215L,38216L,38217L,38218L,38219L,38220L,38221L,38222L, -38223L,38224L,38225L,38226L,38227L,38228L,38229L,38230L,38231L,38232L, -38233L,38234L,38235L,38236L,38237L,38238L,38239L,38240L,38241L,38242L, -38243L,38244L,38245L,38246L,38247L,38248L,38249L,38250L,38251L,38252L, -38253L,38254L,38255L,38256L,38257L,38258L,38259L,38260L,38261L,38262L, -38263L,38264L,38265L,38266L,38267L,38268L,38269L,38270L,38271L,38272L, -38273L,38274L,38275L,38276L,38277L,38278L,38279L,38280L,38281L,38282L, -38283L,38284L,38285L,38286L,38287L,38288L,38289L,38290L,38291L,38292L, -38293L,38294L,38295L,38296L,38297L,38298L,38299L,38300L,38301L,38302L, -38303L,38304L,38305L,38306L,38307L,38308L,38309L,38310L,38311L,38312L, -38313L,38314L,38315L,38316L,38317L,38318L,38319L,38320L,38321L,38322L, -38323L,38324L,38325L,38326L,38327L,38328L,38329L,38330L,38331L,38332L, -38333L,38334L,38335L,38336L,38337L,38338L,38339L,38340L,38341L,38342L, -38343L,38344L,38345L,38346L,38347L,38348L,38349L,38350L,38351L,38352L, -38353L,38354L,38355L,38356L,38357L,38358L,38359L,38360L,38361L,38362L, -38363L,38364L,38365L,38366L,38367L,38368L,38369L,38370L,38371L,38372L, -38373L,38374L,38375L,38376L,38377L,38378L,38379L,38380L,38381L,38382L, -38383L,38384L,38385L,38386L,38387L,38388L,38389L,38390L,38391L,38392L, -38393L,38394L,38395L,38396L,38397L,38398L,38399L,38400L,38401L,38402L, -38403L,38404L,38405L,38406L,38407L,38408L,38409L,38410L,38411L,38412L, -38413L,38414L,38415L,38416L,38417L,38418L,38419L,38420L,38421L,38422L, -38423L,38424L,38425L,38426L,38427L,38428L,38429L,38430L,38431L,38432L, -38433L,38434L,38435L,38436L,38437L,38438L,38439L,38440L,38441L,38442L, -38443L,38444L,38445L,38446L,38447L,38448L,38449L,38450L,38451L,38452L, -38453L,38454L,38455L,38456L,38457L,38458L,38459L,38460L,38461L,38462L, -38463L,38464L,38465L,38466L,38467L,38468L,38469L,38470L,38471L,38472L, -38473L,38474L,38475L,38476L,38477L,38478L,38479L,38480L,38481L,38482L, -38483L,38484L,38485L,38486L,38487L,38488L,38489L,38490L,38491L,38492L, -38493L,38494L,38495L,38496L,38497L,38498L,38499L,38500L,38501L,38502L, -38503L,38504L,38505L,38506L,38507L,38508L,38509L,38510L,38511L,38512L, -38513L,38514L,38515L,38516L,38517L,38518L,38519L,38520L,38521L,38522L, -38523L,38524L,38525L,38526L,38527L,38528L,38529L,38530L,38531L,38532L, -38533L,38534L,38535L,38536L,38537L,38538L,38539L,38540L,38541L,38542L, -38543L,38544L,38545L,38546L,38547L,38548L,38549L,38550L,38551L,38552L, -38553L,38554L,38555L,38556L,38557L,38558L,38559L,38560L,38561L,38562L, -38563L,38564L,38565L,38566L,38567L,38568L,38569L,38570L,38571L,38572L, -38573L,38574L,38575L,38576L,38577L,38578L,38579L,38580L,38581L,38582L, -38583L,38584L,38585L,38586L,38587L,38588L,38589L,38590L,38591L,38592L, -38593L,38594L,38595L,38596L,38597L,38598L,38599L,38600L,38601L,38602L, -38603L,38604L,38605L,38606L,38607L,38608L,38609L,38610L,38611L,38612L, -38613L,38614L,38615L,38616L,38617L,38618L,38619L,38620L,38621L,38622L, -38623L,38624L,38625L,38626L,38627L,38628L,38629L,38630L,38631L,38632L, -38633L,38634L,38635L,38636L,38637L,38638L,38639L,38640L,38641L,38642L, -38643L,38644L,38645L,38646L,38647L,38648L,38649L,38650L,38651L,38652L, -38653L,38654L,38655L,38656L,38657L,38658L,38659L,38660L,38661L,38662L, -38663L,38664L,38665L,38666L,38667L,38668L,38669L,38670L,38671L,38672L, -38673L,38674L,38675L,38676L,38677L,38678L,38679L,38680L,38681L,38682L, -38683L,38684L,38685L,38686L,38687L,38688L,38689L,38690L,38691L,38692L, -38693L,38694L,38695L,38696L,38697L,38698L,38699L,38700L,38701L,38702L, -38703L,38704L,38705L,38706L,38707L,38708L,38709L,38710L,38711L,38712L, -38713L,38714L,38715L,38716L,38717L,38718L,38719L,38720L,38721L,38722L, -38723L,38724L,38725L,38726L,38727L,38728L,38729L,38730L,38731L,38732L, -38733L,38734L,38735L,38736L,38737L,38738L,38739L,38740L,38741L,38742L, -38743L,38744L,38745L,38746L,38747L,38748L,38749L,38750L,38751L,38752L, -38753L,38754L,38755L,38756L,38757L,38758L,38759L,38760L,38761L,38762L, -38763L,38764L,38765L,38766L,38767L,38768L,38769L,38770L,38771L,38772L, -38773L,38774L,38775L,38776L,38777L,38778L,38779L,38780L,38781L,38782L, -38783L,38784L,38785L,38786L,38787L,38788L,38789L,38790L,38791L,38792L, -38793L,38794L,38795L,38796L,38797L,38798L,38799L,38800L,38801L,38802L, -38803L,38804L,38805L,38806L,38807L,38808L,38809L,38810L,38811L,38812L, -38813L,38814L,38815L,38816L,38817L,38818L,38819L,38820L,38821L,38822L, -38823L,38824L,38825L,38826L,38827L,38828L,38829L,38830L,38831L,38832L, -38833L,38834L,38835L,38836L,38837L,38838L,38839L,38840L,38841L,38842L, -38843L,38844L,38845L,38846L,38847L,38848L,38849L,38850L,38851L,38852L, -38853L,38854L,38855L,38856L,38857L,38858L,38859L,38860L,38861L,38862L, -38863L,38864L,38865L,38866L,38867L,38868L,38869L,38870L,38871L,38872L, -38873L,38874L,38875L,38876L,38877L,38878L,38879L,38880L,38881L,38882L, -38883L,38884L,38885L,38886L,38887L,38888L,38889L,38890L,38891L,38892L, -38893L,38894L,38895L,38896L,38897L,38898L,38899L,38900L,38901L,38902L, -38903L,38904L,38905L,38906L,38907L,38908L,38909L,38910L,38911L,38912L, -38913L,38914L,38915L,38916L,38917L,38918L,38919L,38920L,38921L,38922L, -38923L,38924L,38925L,38926L,38927L,38928L,38929L,38930L,38931L,38932L, -38933L,38934L,38935L,38936L,38937L,38938L,38939L,38940L,38941L,38942L, -38943L,38944L,38945L,38946L,38947L,38948L,38949L,38950L,38951L,38952L, -38953L,38954L,38955L,38956L,38957L,38958L,38959L,38960L,38961L,38962L, -38963L,38964L,38965L,38966L,38967L,38968L,38969L,38970L,38971L,38972L, -38973L,38974L,38975L,38976L,38977L,38978L,38979L,38980L,38981L,38982L, -38983L,38984L,38985L,38986L,38987L,38988L,38989L,38990L,38991L,38992L, -38993L,38994L,38995L,38996L,38997L,38998L,38999L,39000L,39001L,39002L, -39003L,39004L,39005L,39006L,39007L,39008L,39009L,39010L,39011L,39012L, -39013L,39014L,39015L,39016L,39017L,39018L,39019L,39020L,39021L,39022L, -39023L,39024L,39025L,39026L,39027L,39028L,39029L,39030L,39031L,39032L, -39033L,39034L,39035L,39036L,39037L,39038L,39039L,39040L,39041L,39042L, -39043L,39044L,39045L,39046L,39047L,39048L,39049L,39050L,39051L,39052L, -39053L,39054L,39055L,39056L,39057L,39058L,39059L,39060L,39061L,39062L, -39063L,39064L,39065L,39066L,39067L,39068L,39069L,39070L,39071L,39072L, -39073L,39074L,39075L,39076L,39077L,39078L,39079L,39080L,39081L,39082L, -39083L,39084L,39085L,39086L,39087L,39088L,39089L,39090L,39091L,39092L, -39093L,39094L,39095L,39096L,39097L,39098L,39099L,39100L,39101L,39102L, -39103L,39104L,39105L,39106L,39107L,39108L,39109L,39110L,39111L,39112L, -39113L,39114L,39115L,39116L,39117L,39118L,39119L,39120L,39121L,39122L, -39123L,39124L,39125L,39126L,39127L,39128L,39129L,39130L,39131L,39132L, -39133L,39134L,39135L,39136L,39137L,39138L,39139L,39140L,39141L,39142L, -39143L,39144L,39145L,39146L,39147L,39148L,39149L,39150L,39151L,39152L, -39153L,39154L,39155L,39156L,39157L,39158L,39159L,39160L,39161L,39162L, -39163L,39164L,39165L,39166L,39167L,39168L,39169L,39170L,39171L,39172L, -39173L,39174L,39175L,39176L,39177L,39178L,39179L,39180L,39181L,39182L, -39183L,39184L,39185L,39186L,39187L,39188L,39189L,39190L,39191L,39192L, -39193L,39194L,39195L,39196L,39197L,39198L,39199L,39200L,39201L,39202L, -39203L,39204L,39205L,39206L,39207L,39208L,39209L,39210L,39211L,39212L, -39213L,39214L,39215L,39216L,39217L,39218L,39219L,39220L,39221L,39222L, -39223L,39224L,39225L,39226L,39227L,39228L,39229L,39230L,39231L,39232L, -39233L,39234L,39235L,39236L,39237L,39238L,39239L,39240L,39241L,39242L, -39243L,39244L,39245L,39246L,39247L,39248L,39249L,39250L,39251L,39252L, -39253L,39254L,39255L,39256L,39257L,39258L,39259L,39260L,39261L,39262L, -39263L,39264L,39265L,39266L,39267L,39268L,39269L,39270L,39271L,39272L, -39273L,39274L,39275L,39276L,39277L,39278L,39279L,39280L,39281L,39282L, -39283L,39284L,39285L,39286L,39287L,39288L,39289L,39290L,39291L,39292L, -39293L,39294L,39295L,39296L,39297L,39298L,39299L,39300L,39301L,39302L, -39303L,39304L,39305L,39306L,39307L,39308L,39309L,39310L,39311L,39312L, -39313L,39314L,39315L,39316L,39317L,39318L,39319L,39320L,39321L,39322L, -39323L,39324L,39325L,39326L,39327L,39328L,39329L,39330L,39331L,39332L, -39333L,39334L,39335L,39336L,39337L,39338L,39339L,39340L,39341L,39342L, -39343L,39344L,39345L,39346L,39347L,39348L,39349L,39350L,39351L,39352L, -39353L,39354L,39355L,39356L,39357L,39358L,39359L,39360L,39361L,39362L, -39363L,39364L,39365L,39366L,39367L,39368L,39369L,39370L,39371L,39372L, -39373L,39374L,39375L,39376L,39377L,39378L,39379L,39380L,39381L,39382L, -39383L,39384L,39385L,39386L,39387L,39388L,39389L,39390L,39391L,39392L, -39393L,39394L,39395L,39396L,39397L,39398L,39399L,39400L,39401L,39402L, -39403L,39404L,39405L,39406L,39407L,39408L,39409L,39410L,39411L,39412L, -39413L,39414L,39415L,39416L,39417L,39418L,39419L,39420L,39421L,39422L, -39423L,39424L,39425L,39426L,39427L,39428L,39429L,39430L,39431L,39432L, -39433L,39434L,39435L,39436L,39437L,39438L,39439L,39440L,39441L,39442L, -39443L,39444L,39445L,39446L,39447L,39448L,39449L,39450L,39451L,39452L, -39453L,39454L,39455L,39456L,39457L,39458L,39459L,39460L,39461L,39462L, -39463L,39464L,39465L,39466L,39467L,39468L,39469L,39470L,39471L,39472L, -39473L,39474L,39475L,39476L,39477L,39478L,39479L,39480L,39481L,39482L, -39483L,39484L,39485L,39486L,39487L,39488L,39489L,39490L,39491L,39492L, -39493L,39494L,39495L,39496L,39497L,39498L,39499L,39500L,39501L,39502L, -39503L,39504L,39505L,39506L,39507L,39508L,39509L,39510L,39511L,39512L, -39513L,39514L,39515L,39516L,39517L,39518L,39519L,39520L,39521L,39522L, -39523L,39524L,39525L,39526L,39527L,39528L,39529L,39530L,39531L,39532L, -39533L,39534L,39535L,39536L,39537L,39538L,39539L,39540L,39541L,39542L, -39543L,39544L,39545L,39546L,39547L,39548L,39549L,39550L,39551L,39552L, -39553L,39554L,39555L,39556L,39557L,39558L,39559L,39560L,39561L,39562L, -39563L,39564L,39565L,39566L,39567L,39568L,39569L,39570L,39571L,39572L, -39573L,39574L,39575L,39576L,39577L,39578L,39579L,39580L,39581L,39582L, -39583L,39584L,39585L,39586L,39587L,39588L,39589L,39590L,39591L,39592L, -39593L,39594L,39595L,39596L,39597L,39598L,39599L,39600L,39601L,39602L, -39603L,39604L,39605L,39606L,39607L,39608L,39609L,39610L,39611L,39612L, -39613L,39614L,39615L,39616L,39617L,39618L,39619L,39620L,39621L,39622L, -39623L,39624L,39625L,39626L,39627L,39628L,39629L,39630L,39631L,39632L, -39633L,39634L,39635L,39636L,39637L,39638L,39639L,39640L,39641L,39642L, -39643L,39644L,39645L,39646L,39647L,39648L,39649L,39650L,39651L,39652L, -39653L,39654L,39655L,39656L,39657L,39658L,39659L,39660L,39661L,39662L, -39663L,39664L,39665L,39666L,39667L,39668L,39669L,39670L,39671L,39672L, -39673L,39674L,39675L,39676L,39677L,39678L,39679L,39680L,39681L,39682L, -39683L,39684L,39685L,39686L,39687L,39688L,39689L,39690L,39691L,39692L, -39693L,39694L,39695L,39696L,39697L,39698L,39699L,39700L,39701L,39702L, -39703L,39704L,39705L,39706L,39707L,39708L,39709L,39710L,39711L,39712L, -39713L,39714L,39715L,39716L,39717L,39718L,39719L,39720L,39721L,39722L, -39723L,39724L,39725L,39726L,39727L,39728L,39729L,39730L,39731L,39732L, -39733L,39734L,39735L,39736L,39737L,39738L,39739L,39740L,39741L,39742L, -39743L,39744L,39745L,39746L,39747L,39748L,39749L,39750L,39751L,39752L, -39753L,39754L,39755L,39756L,39757L,39758L,39759L,39760L,39761L,39762L, -39763L,39764L,39765L,39766L,39767L,39768L,39769L,39770L,39771L,39772L, -39773L,39774L,39775L,39776L,39777L,39778L,39779L,39780L,39781L,39782L, -39783L,39784L,39785L,39786L,39787L,39788L,39789L,39790L,39791L,39792L, -39793L,39794L,39795L,39796L,39797L,39798L,39799L,39800L,39801L,39802L, -39803L,39804L,39805L,39806L,39807L,39808L,39809L,39810L,39811L,39812L, -39813L,39814L,39815L,39816L,39817L,39818L,39819L,39820L,39821L,39822L, -39823L,39824L,39825L,39826L,39827L,39828L,39829L,39830L,39831L,39832L, -39833L,39834L,39835L,39836L,39837L,39838L,39839L,39840L,39841L,39842L, -39843L,39844L,39845L,39846L,39847L,39848L,39849L,39850L,39851L,39852L, -39853L,39854L,39855L,39856L,39857L,39858L,39859L,39860L,39861L,39862L, -39863L,39864L,39865L,39866L,39867L,39868L,39869L,39870L,39871L,39872L, -39873L,39874L,39875L,39876L,39877L,39878L,39879L,39880L,39881L,39882L, -39883L,39884L,39885L,39886L,39887L,39888L,39889L,39890L,39891L,39892L, -39893L,39894L,39895L,39896L,39897L,39898L,39899L,39900L,39901L,39902L, -39903L,39904L,39905L,39906L,39907L,39908L,39909L,39910L,39911L,39912L, -39913L,39914L,39915L,39916L,39917L,39918L,39919L,39920L,39921L,39922L, -39923L,39924L,39925L,39926L,39927L,39928L,39929L,39930L,39931L,39932L, -39933L,39934L,39935L,39936L,39937L,39938L,39939L,39940L,39941L,39942L, -39943L,39944L,39945L,39946L,39947L,39948L,39949L,39950L,39951L,39952L, -39953L,39954L,39955L,39956L,39957L,39958L,39959L,39960L,39961L,39962L, -39963L,39964L,39965L,39966L,39967L,39968L,39969L,39970L,39971L,39972L, -39973L,39974L,39975L,39976L,39977L,39978L,39979L,39980L,39981L,39982L, -39983L,39984L,39985L,39986L,39987L,39988L,39989L,39990L,39991L,39992L, -39993L,39994L,39995L,39996L,39997L,39998L,39999L,40000L,40001L,40002L, -40003L,40004L,40005L,40006L,40007L,40008L,40009L,40010L,40011L,40012L, -40013L,40014L,40015L,40016L,40017L,40018L,40019L,40020L,40021L,40022L, -40023L,40024L,40025L,40026L,40027L,40028L,40029L,40030L,40031L,40032L, -40033L,40034L,40035L,40036L,40037L,40038L,40039L,40040L,40041L,40042L, -40043L,40044L,40045L,40046L,40047L,40048L,40049L,40050L,40051L,40052L, -40053L,40054L,40055L,40056L,40057L,40058L,40059L,40060L,40061L,40062L, -40063L,40064L,40065L,40066L,40067L,40068L,40069L,40070L,40071L,40072L, -40073L,40074L,40075L,40076L,40077L,40078L,40079L,40080L,40081L,40082L, -40083L,40084L,40085L,40086L,40087L,40088L,40089L,40090L,40091L,40092L, -40093L,40094L,40095L,40096L,40097L,40098L,40099L,40100L,40101L,40102L, -40103L,40104L,40105L,40106L,40107L,40108L,40109L,40110L,40111L,40112L, -40113L,40114L,40115L,40116L,40117L,40118L,40119L,40120L,40121L,40122L, -40123L,40124L,40125L,40126L,40127L,40128L,40129L,40130L,40131L,40132L, -40133L,40134L,40135L,40136L,40137L,40138L,40139L,40140L,40141L,40142L, -40143L,40144L,40145L,40146L,40147L,40148L,40149L,40150L,40151L,40152L, -40153L,40154L,40155L,40156L,40157L,40158L,40159L,40160L,40161L,40162L, -40163L,40164L,40165L,40166L,40167L,40168L,40169L,40170L,40171L,40172L, -40173L,40174L,40175L,40176L,40177L,40178L,40179L,40180L,40181L,40182L, -40183L,40184L,40185L,40186L,40187L,40188L,40189L,40190L,40191L,40192L, -40193L,40194L,40195L,40196L,40197L,40198L,40199L,40200L,40201L,40202L, -40203L,40204L,40205L,40206L,40207L,40208L,40209L,40210L,40211L,40212L, -40213L,40214L,40215L,40216L,40217L,40218L,40219L,40220L,40221L,40222L, -40223L,40224L,40225L,40226L,40227L,40228L,40229L,40230L,40231L,40232L, -40233L,40234L,40235L,40236L,40237L,40238L,40239L,40240L,40241L,40242L, -40243L,40244L,40245L,40246L,40247L,40248L,40249L,40250L,40251L,40252L, -40253L,40254L,40255L,40256L,40257L,40258L,40259L,40260L,40261L,40262L, -40263L,40264L,40265L,40266L,40267L,40268L,40269L,40270L,40271L,40272L, -40273L,40274L,40275L,40276L,40277L,40278L,40279L,40280L,40281L,40282L, -40283L,40284L,40285L,40286L,40287L,40288L,40289L,40290L,40291L,40292L, -40293L,40294L,40295L,40296L,40297L,40298L,40299L,40300L,40301L,40302L, -40303L,40304L,40305L,40306L,40307L,40308L,40309L,40310L,40311L,40312L, -40313L,40314L,40315L,40316L,40317L,40318L,40319L,40320L,40321L,40322L, -40323L,40324L,40325L,40326L,40327L,40328L,40329L,40330L,40331L,40332L, -40333L,40334L,40335L,40336L,40337L,40338L,40339L,40340L,40341L,40342L, -40343L,40344L,40345L,40346L,40347L,40348L,40349L,40350L,40351L,40352L, -40353L,40354L,40355L,40356L,40357L,40358L,40359L,40360L,40361L,40362L, -40363L,40364L,40365L,40366L,40367L,40368L,40369L,40370L,40371L,40372L, -40373L,40374L,40375L,40376L,40377L,40378L,40379L,40380L,40381L,40382L, -40383L,40384L,40385L,40386L,40387L,40388L,40389L,40390L,40391L,40392L, -40393L,40394L,40395L,40396L,40397L,40398L,40399L,40400L,40401L,40402L, -40403L,40404L,40405L,40406L,40407L,40408L,40409L,40410L,40411L,40412L, -40413L,40414L,40415L,40416L,40417L,40418L,40419L,40420L,40421L,40422L, -40423L,40424L,40425L,40426L,40427L,40428L,40429L,40430L,40431L,40432L, -40433L,40434L,40435L,40436L,40437L,40438L,40439L,40440L,40441L,40442L, -40443L,40444L,40445L,40446L,40447L,40448L,40449L,40450L,40451L,40452L, -40453L,40454L,40455L,40456L,40457L,40458L,40459L,40460L,40461L,40462L, -40463L,40464L,40465L,40466L,40467L,40468L,40469L,40470L,40471L,40472L, -40473L,40474L,40475L,40476L,40477L,40478L,40479L,40480L,40481L,40482L, -40483L,40484L,40485L,40486L,40487L,40488L,40489L,40490L,40491L,40492L, -40493L,40494L,40495L,40496L,40497L,40498L,40499L,40500L,40501L,40502L, -40503L,40504L,40505L,40506L,40507L,40508L,40509L,40510L,40511L,40512L, -40513L,40514L,40515L,40516L,40517L,40518L,40519L,40520L,40521L,40522L, -40523L,40524L,40525L,40526L,40527L,40528L,40529L,40530L,40531L,40532L, -40533L,40534L,40535L,40536L,40537L,40538L,40539L,40540L,40541L,40542L, -40543L,40544L,40545L,40546L,40547L,40548L,40549L,40550L,40551L,40552L, -40553L,40554L,40555L,40556L,40557L,40558L,40559L,40560L,40561L,40562L, -40563L,40564L,40565L,40566L,40567L,40568L,40569L,40570L,40571L,40572L, -40573L,40574L,40575L,40576L,40577L,40578L,40579L,40580L,40581L,40582L, -40583L,40584L,40585L,40586L,40587L,40588L,40589L,40590L,40591L,40592L, -40593L,40594L,40595L,40596L,40597L,40598L,40599L,40600L,40601L,40602L, -40603L,40604L,40605L,40606L,40607L,40608L,40609L,40610L,40611L,40612L, -40613L,40614L,40615L,40616L,40617L,40618L,40619L,40620L,40621L,40622L, -40623L,40624L,40625L,40626L,40627L,40628L,40629L,40630L,40631L,40632L, -40633L,40634L,40635L,40636L,40637L,40638L,40639L,40640L,40641L,40642L, -40643L,40644L,40645L,40646L,40647L,40648L,40649L,40650L,40651L,40652L, -40653L,40654L,40655L,40656L,40657L,40658L,40659L,40660L,40661L,40662L, -40663L,40664L,40665L,40666L,40667L,40668L,40669L,40670L,40671L,40672L, -40673L,40674L,40675L,40676L,40677L,40678L,40679L,40680L,40681L,40682L, -40683L,40684L,40685L,40686L,40687L,40688L,40689L,40690L,40691L,40692L, -40693L,40694L,40695L,40696L,40697L,40698L,40699L,40700L,40701L,40702L, -40703L,40704L,40705L,40706L,40707L,40708L,40709L,40710L,40711L,40712L, -40713L,40714L,40715L,40716L,40717L,40718L,40719L,40720L,40721L,40722L, -40723L,40724L,40725L,40726L,40727L,40728L,40729L,40730L,40731L,40732L, -40733L,40734L,40735L,40736L,40737L,40738L,40739L,40740L,40741L,40742L, -40743L,40744L,40745L,40746L,40747L,40748L,40749L,40750L,40751L,40752L, -40753L,40754L,40755L,40756L,40757L,40758L,40759L,40760L,40761L,40762L, -40763L,40764L,40765L,40766L,40767L,40768L,40769L,40770L,40771L,40772L, -40773L,40774L,40775L,40776L,40777L,40778L,40779L,40780L,40781L,40782L, -40783L,40784L,40785L,40786L,40787L,40788L,40789L,40790L,40791L,40792L, -40793L,40794L,40795L,40796L,40797L,40798L,40799L,40800L,40801L,40802L, -40803L,40804L,40805L,40806L,40807L,40808L,40809L,40810L,40811L,40812L, -40813L,40814L,40815L,40816L,40817L,40818L,40819L,40820L,40821L,40822L, -40823L,40824L,40825L,40826L,40827L,40828L,40829L,40830L,40831L,40832L, -40833L,40834L,40835L,40836L,40837L,40838L,40839L,40840L,40841L,40842L, -40843L,40844L,40845L,40846L,40847L,40848L,40849L,40850L,40851L,40852L, -40853L,40854L,40855L,40856L,40857L,40858L,40859L,40860L,40861L,40862L, -40863L,40864L,40865L,40866L,40867L,40868L,40869L,40870L,40871L,40872L, -40873L,40874L,40875L,40876L,40877L,40878L,40879L,40880L,40881L,40882L, -40883L,40884L,40885L,40886L,40887L,40888L,40889L,40890L,40891L,40892L, -40893L,40894L,40895L,40896L,40897L,40898L,40899L,40900L,40901L,40902L, -40903L,40904L,40905L,40906L,40907L,40908L,40909L,40910L,40911L,40912L, -40913L,40914L,40915L,40916L,40917L,40918L,40919L,40920L,40921L,40922L, -40923L,40924L,40925L,40926L,40927L,40928L,40929L,40930L,40931L,40932L, -40933L,40934L,40935L,40936L,40937L,40938L,40939L,40940L,40941L,40942L, -40943L,40944L,40945L,40946L,40947L,40948L,40949L,40950L,40951L,40952L, -40953L,40954L,40955L,40956L,40957L,40958L,40959L,40960L,40961L,40962L, -40963L,40964L,40965L,40966L,40967L,40968L,40969L,40970L,40971L,40972L, -40973L,40974L,40975L,40976L,40977L,40978L,40979L,40980L,40981L,40982L, -40983L,40984L,40985L,40986L,40987L,40988L,40989L,40990L,40991L,40992L, -40993L,40994L,40995L,40996L,40997L,40998L,40999L,41000L,41001L,41002L, -41003L,41004L,41005L,41006L,41007L,41008L,41009L,41010L,41011L,41012L, -41013L,41014L,41015L,41016L,41017L,41018L,41019L,41020L,41021L,41022L, -41023L,41024L,41025L,41026L,41027L,41028L,41029L,41030L,41031L,41032L, -41033L,41034L,41035L,41036L,41037L,41038L,41039L,41040L,41041L,41042L, -41043L,41044L,41045L,41046L,41047L,41048L,41049L,41050L,41051L,41052L, -41053L,41054L,41055L,41056L,41057L,41058L,41059L,41060L,41061L,41062L, -41063L,41064L,41065L,41066L,41067L,41068L,41069L,41070L,41071L,41072L, -41073L,41074L,41075L,41076L,41077L,41078L,41079L,41080L,41081L,41082L, -41083L,41084L,41085L,41086L,41087L,41088L,41089L,41090L,41091L,41092L, -41093L,41094L,41095L,41096L,41097L,41098L,41099L,41100L,41101L,41102L, -41103L,41104L,41105L,41106L,41107L,41108L,41109L,41110L,41111L,41112L, -41113L,41114L,41115L,41116L,41117L,41118L,41119L,41120L,41121L,41122L, -41123L,41124L,41125L,41126L,41127L,41128L,41129L,41130L,41131L,41132L, -41133L,41134L,41135L,41136L,41137L,41138L,41139L,41140L,41141L,41142L, -41143L,41144L,41145L,41146L,41147L,41148L,41149L,41150L,41151L,41152L, -41153L,41154L,41155L,41156L,41157L,41158L,41159L,41160L,41161L,41162L, -41163L,41164L,41165L,41166L,41167L,41168L,41169L,41170L,41171L,41172L, -41173L,41174L,41175L,41176L,41177L,41178L,41179L,41180L,41181L,41182L, -41183L,41184L,41185L,41186L,41187L,41188L,41189L,41190L,41191L,41192L, -41193L,41194L,41195L,41196L,41197L,41198L,41199L,41200L,41201L,41202L, -41203L,41204L,41205L,41206L,41207L,41208L,41209L,41210L,41211L,41212L, -41213L,41214L,41215L,41216L,41217L,41218L,41219L,41220L,41221L,41222L, -41223L,41224L,41225L,41226L,41227L,41228L,41229L,41230L,41231L,41232L, -41233L,41234L,41235L,41236L,41237L,41238L,41239L,41240L,41241L,41242L, -41243L,41244L,41245L,41246L,41247L,41248L,41249L,41250L,41251L,41252L, -41253L,41254L,41255L,41256L,41257L,41258L,41259L,41260L,41261L,41262L, -41263L,41264L,41265L,41266L,41267L,41268L,41269L,41270L,41271L,41272L, -41273L,41274L,41275L,41276L,41277L,41278L,41279L,41280L,41281L,41282L, -41283L,41284L,41285L,41286L,41287L,41288L,41289L,41290L,41291L,41292L, -41293L,41294L,41295L,41296L,41297L,41298L,41299L,41300L,41301L,41302L, -41303L,41304L,41305L,41306L,41307L,41308L,41309L,41310L,41311L,41312L, -41313L,41314L,41315L,41316L,41317L,41318L,41319L,41320L,41321L,41322L, -41323L,41324L,41325L,41326L,41327L,41328L,41329L,41330L,41331L,41332L, -41333L,41334L,41335L,41336L,41337L,41338L,41339L,41340L,41341L,41342L, -41343L,41344L,41345L,41346L,41347L,41348L,41349L,41350L,41351L,41352L, -41353L,41354L,41355L,41356L,41357L,41358L,41359L,41360L,41361L,41362L, -41363L,41364L,41365L,41366L,41367L,41368L,41369L,41370L,41371L,41372L, -41373L,41374L,41375L,41376L,41377L,41378L,41379L,41380L,41381L,41382L, -41383L,41384L,41385L,41386L,41387L,41388L,41389L,41390L,41391L,41392L, -41393L,41394L,41395L,41396L,41397L,41398L,41399L,41400L,41401L,41402L, -41403L,41404L,41405L,41406L,41407L,41408L,41409L,41410L,41411L,41412L, -41413L,41414L,41415L,41416L,41417L,41418L,41419L,41420L,41421L,41422L, -41423L,41424L,41425L,41426L,41427L,41428L,41429L,41430L,41431L,41432L, -41433L,41434L,41435L,41436L,41437L,41438L,41439L,41440L,41441L,41442L, -41443L,41444L,41445L,41446L,41447L,41448L,41449L,41450L,41451L,41452L, -41453L,41454L,41455L,41456L,41457L,41458L,41459L,41460L,41461L,41462L, -41463L,41464L,41465L,41466L,41467L,41468L,41469L,41470L,41471L,41472L, -41473L,41474L,41475L,41476L,41477L,41478L,41479L,41480L,41481L,41482L, -41483L,41484L,41485L,41486L,41487L,41488L,41489L,41490L,41491L,41492L, -41493L,41494L,41495L,41496L,41497L,41498L,41499L,41500L,41501L,41502L, -41503L,41504L,41505L,41506L,41507L,41508L,41509L,41510L,41511L,41512L, -41513L,41514L,41515L,41516L,41517L,41518L,41519L,41520L,41521L,41522L, -41523L,41524L,41525L,41526L,41527L,41528L,41529L,41530L,41531L,41532L, -41533L,41534L,41535L,41536L,41537L,41538L,41539L,41540L,41541L,41542L, -41543L,41544L,41545L,41546L,41547L,41548L,41549L,41550L,41551L,41552L, -41553L,41554L,41555L,41556L,41557L,41558L,41559L,41560L,41561L,41562L, -41563L,41564L,41565L,41566L,41567L,41568L,41569L,41570L,41571L,41572L, -41573L,41574L,41575L,41576L,41577L,41578L,41579L,41580L,41581L,41582L, -41583L,41584L,41585L,41586L,41587L,41588L,41589L,41590L,41591L,41592L, -41593L,41594L,41595L,41596L,41597L,41598L,41599L,41600L,41601L,41602L, -41603L,41604L,41605L,41606L,41607L,41608L,41609L,41610L,41611L,41612L, -41613L,41614L,41615L,41616L,41617L,41618L,41619L,41620L,41621L,41622L, -41623L,41624L,41625L,41626L,41627L,41628L,41629L,41630L,41631L,41632L, -41633L,41634L,41635L,41636L,41637L,41638L,41639L,41640L,41641L,41642L, -41643L,41644L,41645L,41646L,41647L,41648L,41649L,41650L,41651L,41652L, -41653L,41654L,41655L,41656L,41657L,41658L,41659L,41660L,41661L,41662L, -41663L,41664L,41665L,41666L,41667L,41668L,41669L,41670L,41671L,41672L, -41673L,41674L,41675L,41676L,41677L,41678L,41679L,41680L,41681L,41682L, -41683L,41684L,41685L,41686L,41687L,41688L,41689L,41690L,41691L,41692L, -41693L,41694L,41695L,41696L,41697L,41698L,41699L,41700L,41701L,41702L, -41703L,41704L,41705L,41706L,41707L,41708L,41709L,41710L,41711L,41712L, -41713L,41714L,41715L,41716L,41717L,41718L,41719L,41720L,41721L,41722L, -41723L,41724L,41725L,41726L,41727L,41728L,41729L,41730L,41731L,41732L, -41733L,41734L,41735L,41736L,41737L,41738L,41739L,41740L,41741L,41742L, -41743L,41744L,41745L,41746L,41747L,41748L,41749L,41750L,41751L,41752L, -41753L,41754L,41755L,41756L,41757L,41758L,41759L,41760L,41761L,41762L, -41763L,41764L,41765L,41766L,41767L,41768L,41769L,41770L,41771L,41772L, -41773L,41774L,41775L,41776L,41777L,41778L,41779L,41780L,41781L,41782L, -41783L,41784L,41785L,41786L,41787L,41788L,41789L,41790L,41791L,41792L, -41793L,41794L,41795L,41796L,41797L,41798L,41799L,41800L,41801L,41802L, -41803L,41804L,41805L,41806L,41807L,41808L,41809L,41810L,41811L,41812L, -41813L,41814L,41815L,41816L,41817L,41818L,41819L,41820L,41821L,41822L, -41823L,41824L,41825L,41826L,41827L,41828L,41829L,41830L,41831L,41832L, -41833L,41834L,41835L,41836L,41837L,41838L,41839L,41840L,41841L,41842L, -41843L,41844L,41845L,41846L,41847L,41848L,41849L,41850L,41851L,41852L, -41853L,41854L,41855L,41856L,41857L,41858L,41859L,41860L,41861L,41862L, -41863L,41864L,41865L,41866L,41867L,41868L,41869L,41870L,41871L,41872L, -41873L,41874L,41875L,41876L,41877L,41878L,41879L,41880L,41881L,41882L, -41883L,41884L,41885L,41886L,41887L,41888L,41889L,41890L,41891L,41892L, -41893L,41894L,41895L,41896L,41897L,41898L,41899L,41900L,41901L,41902L, -41903L,41904L,41905L,41906L,41907L,41908L,41909L,41910L,41911L,41912L, -41913L,41914L,41915L,41916L,41917L,41918L,41919L,41920L,41921L,41922L, -41923L,41924L,41925L,41926L,41927L,41928L,41929L,41930L,41931L,41932L, -41933L,41934L,41935L,41936L,41937L,41938L,41939L,41940L,41941L,41942L, -41943L,41944L,41945L,41946L,41947L,41948L,41949L,41950L,41951L,41952L, -41953L,41954L,41955L,41956L,41957L,41958L,41959L,41960L,41961L,41962L, -41963L,41964L,41965L,41966L,41967L,41968L,41969L,41970L,41971L,41972L, -41973L,41974L,41975L,41976L,41977L,41978L,41979L,41980L,41981L,41982L, -41983L,41984L,41985L,41986L,41987L,41988L,41989L,41990L,41991L,41992L, -41993L,41994L,41995L,41996L,41997L,41998L,41999L,42000L,42001L,42002L, -42003L,42004L,42005L,42006L,42007L,42008L,42009L,42010L,42011L,42012L, -42013L,42014L,42015L,42016L,42017L,42018L,42019L,42020L,42021L,42022L, -42023L,42024L,42025L,42026L,42027L,42028L,42029L,42030L,42031L,42032L, -42033L,42034L,42035L,42036L,42037L,42038L,42039L,42040L,42041L,42042L, -42043L,42044L,42045L,42046L,42047L,42048L,42049L,42050L,42051L,42052L, -42053L,42054L,42055L,42056L,42057L,42058L,42059L,42060L,42061L,42062L, -42063L,42064L,42065L,42066L,42067L,42068L,42069L,42070L,42071L,42072L, -42073L,42074L,42075L,42076L,42077L,42078L,42079L,42080L,42081L,42082L, -42083L,42084L,42085L,42086L,42087L,42088L,42089L,42090L,42091L,42092L, -42093L,42094L,42095L,42096L,42097L,42098L,42099L,42100L,42101L,42102L, -42103L,42104L,42105L,42106L,42107L,42108L,42109L,42110L,42111L,42112L, -42113L,42114L,42115L,42116L,42117L,42118L,42119L,42120L,42121L,42122L, -42123L,42124L,42125L,42126L,42127L,42128L,42129L,42130L,42131L,42132L, -42133L,42134L,42135L,42136L,42137L,42138L,42139L,42140L,42141L,42142L, -42143L,42144L,42145L,42146L,42147L,42148L,42149L,42150L,42151L,42152L, -42153L,42154L,42155L,42156L,42157L,42158L,42159L,42160L,42161L,42162L, -42163L,42164L,42165L,42166L,42167L,42168L,42169L,42170L,42171L,42172L, -42173L,42174L,42175L,42176L,42177L,42178L,42179L,42180L,42181L,42182L, -42183L,42184L,42185L,42186L,42187L,42188L,42189L,42190L,42191L,42192L, -42193L,42194L,42195L,42196L,42197L,42198L,42199L,42200L,42201L,42202L, -42203L,42204L,42205L,42206L,42207L,42208L,42209L,42210L,42211L,42212L, -42213L,42214L,42215L,42216L,42217L,42218L,42219L,42220L,42221L,42222L, -42223L,42224L,42225L,42226L,42227L,42228L,42229L,42230L,42231L,42232L, -42233L,42234L,42235L,42236L,42237L,42238L,42239L,42240L,42241L,42242L, -42243L,42244L,42245L,42246L,42247L,42248L,42249L,42250L,42251L,42252L, -42253L,42254L,42255L,42256L,42257L,42258L,42259L,42260L,42261L,42262L, -42263L,42264L,42265L,42266L,42267L,42268L,42269L,42270L,42271L,42272L, -42273L,42274L,42275L,42276L,42277L,42278L,42279L,42280L,42281L,42282L, -42283L,42284L,42285L,42286L,42287L,42288L,42289L,42290L,42291L,42292L, -42293L,42294L,42295L,42296L,42297L,42298L,42299L,42300L,42301L,42302L, -42303L,42304L,42305L,42306L,42307L,42308L,42309L,42310L,42311L,42312L, -42313L,42314L,42315L,42316L,42317L,42318L,42319L,42320L,42321L,42322L, -42323L,42324L,42325L,42326L,42327L,42328L,42329L,42330L,42331L,42332L, -42333L,42334L,42335L,42336L,42337L,42338L,42339L,42340L,42341L,42342L, -42343L,42344L,42345L,42346L,42347L,42348L,42349L,42350L,42351L,42352L, -42353L,42354L,42355L,42356L,42357L,42358L,42359L,42360L,42361L,42362L, -42363L,42364L,42365L,42366L,42367L,42368L,42369L,42370L,42371L,42372L, -42373L,42374L,42375L,42376L,42377L,42378L,42379L,42380L,42381L,42382L, -42383L,42384L,42385L,42386L,42387L,42388L,42389L,42390L,42391L,42392L, -42393L,42394L,42395L,42396L,42397L,42398L,42399L,42400L,42401L,42402L, -42403L,42404L,42405L,42406L,42407L,42408L,42409L,42410L,42411L,42412L, -42413L,42414L,42415L,42416L,42417L,42418L,42419L,42420L,42421L,42422L, -42423L,42424L,42425L,42426L,42427L,42428L,42429L,42430L,42431L,42432L, -42433L,42434L,42435L,42436L,42437L,42438L,42439L,42440L,42441L,42442L, -42443L,42444L,42445L,42446L,42447L,42448L,42449L,42450L,42451L,42452L, -42453L,42454L,42455L,42456L,42457L,42458L,42459L,42460L,42461L,42462L, -42463L,42464L,42465L,42466L,42467L,42468L,42469L,42470L,42471L,42472L, -42473L,42474L,42475L,42476L,42477L,42478L,42479L,42480L,42481L,42482L, -42483L,42484L,42485L,42486L,42487L,42488L,42489L,42490L,42491L,42492L, -42493L,42494L,42495L,42496L,42497L,42498L,42499L,42500L,42501L,42502L, -42503L,42504L,42505L,42506L,42507L,42508L,42509L,42510L,42511L,42512L, -42513L,42514L,42515L,42516L,42517L,42518L,42519L,42520L,42521L,42522L, -42523L,42524L,42525L,42526L,42527L,42528L,42529L,42530L,42531L,42532L, -42533L,42534L,42535L,42536L,42537L,42538L,42539L,42540L,42541L,42542L, -42543L,42544L,42545L,42546L,42547L,42548L,42549L,42550L,42551L,42552L, -42553L,42554L,42555L,42556L,42557L,42558L,42559L,42560L,42560L,42562L, -42562L,42564L,42564L,42566L,42566L,42568L,42568L,42570L,42570L,42572L, -42572L,42574L,42574L,42576L,42576L,42578L,42578L,42580L,42580L,42582L, -42582L,42584L,42584L,42586L,42586L,42588L,42588L,42590L,42590L,42592L, -42592L,42594L,42594L,42596L,42596L,42598L,42598L,42600L,42600L,42602L, -42602L,42604L,42604L,42606L,42607L,42608L,42609L,42610L,42611L,42612L, -42613L,42614L,42615L,42616L,42617L,42618L,42619L,42620L,42621L,42622L, -42623L,42624L,42624L,42626L,42626L,42628L,42628L,42630L,42630L,42632L, -42632L,42634L,42634L,42636L,42636L,42638L,42638L,42640L,42640L,42642L, -42642L,42644L,42644L,42646L,42646L,42648L,42649L,42650L,42651L,42652L, -42653L,42654L,42655L,42656L,42657L,42658L,42659L,42660L,42661L,42662L, -42663L,42664L,42665L,42666L,42667L,42668L,42669L,42670L,42671L,42672L, -42673L,42674L,42675L,42676L,42677L,42678L,42679L,42680L,42681L,42682L, -42683L,42684L,42685L,42686L,42687L,42688L,42689L,42690L,42691L,42692L, -42693L,42694L,42695L,42696L,42697L,42698L,42699L,42700L,42701L,42702L, -42703L,42704L,42705L,42706L,42707L,42708L,42709L,42710L,42711L,42712L, -42713L,42714L,42715L,42716L,42717L,42718L,42719L,42720L,42721L,42722L, -42723L,42724L,42725L,42726L,42727L,42728L,42729L,42730L,42731L,42732L, -42733L,42734L,42735L,42736L,42737L,42738L,42739L,42740L,42741L,42742L, -42743L,42744L,42745L,42746L,42747L,42748L,42749L,42750L,42751L,42752L, -42753L,42754L,42755L,42756L,42757L,42758L,42759L,42760L,42761L,42762L, -42763L,42764L,42765L,42766L,42767L,42768L,42769L,42770L,42771L,42772L, -42773L,42774L,42775L,42776L,42777L,42778L,42779L,42780L,42781L,42782L, -42783L,42784L,42785L,42786L,42786L,42788L,42788L,42790L,42790L,42792L, -42792L,42794L,42794L,42796L,42796L,42798L,42798L,42800L,42801L,42802L, -42802L,42804L,42804L,42806L,42806L,42808L,42808L,42810L,42810L,42812L, -42812L,42814L,42814L,42816L,42816L,42818L,42818L,42820L,42820L,42822L, -42822L,42824L,42824L,42826L,42826L,42828L,42828L,42830L,42830L,42832L, -42832L,42834L,42834L,42836L,42836L,42838L,42838L,42840L,42840L,42842L, -42842L,42844L,42844L,42846L,42846L,42848L,42848L,42850L,42850L,42852L, -42852L,42854L,42854L,42856L,42856L,42858L,42858L,42860L,42860L,42862L, -42862L,42864L,42865L,42866L,42867L,42868L,42869L,42870L,42871L,42872L, -42873L,42873L,42875L,42875L,42877L,42878L,42878L,42880L,42880L,42882L, -42882L,42884L,42884L,42886L,42886L,42888L,42889L,42890L,42891L,42891L, -42893L,42894L,42895L,42896L,42896L,42898L,42899L,42900L,42901L,42902L, -42903L,42904L,42905L,42906L,42907L,42908L,42909L,42910L,42911L,42912L, -42912L,42914L,42914L,42916L,42916L,42918L,42918L,42920L,42920L,42922L, -42923L,42924L,42925L,42926L,42927L,42928L,42929L,42930L,42931L,42932L, -42933L,42934L,42935L,42936L,42937L,42938L,42939L,42940L,42941L,42942L, -42943L,42944L,42945L,42946L,42947L,42948L,42949L,42950L,42951L,42952L, -42953L,42954L,42955L,42956L,42957L,42958L,42959L,42960L,42961L,42962L, -42963L,42964L,42965L,42966L,42967L,42968L,42969L,42970L,42971L,42972L, -42973L,42974L,42975L,42976L,42977L,42978L,42979L,42980L,42981L,42982L, -42983L,42984L,42985L,42986L,42987L,42988L,42989L,42990L,42991L,42992L, -42993L,42994L,42995L,42996L,42997L,42998L,42999L,43000L,43001L,43002L, -43003L,43004L,43005L,43006L,43007L,43008L,43009L,43010L,43011L,43012L, -43013L,43014L,43015L,43016L,43017L,43018L,43019L,43020L,43021L,43022L, -43023L,43024L,43025L,43026L,43027L,43028L,43029L,43030L,43031L,43032L, -43033L,43034L,43035L,43036L,43037L,43038L,43039L,43040L,43041L,43042L, -43043L,43044L,43045L,43046L,43047L,43048L,43049L,43050L,43051L,43052L, -43053L,43054L,43055L,43056L,43057L,43058L,43059L,43060L,43061L,43062L, -43063L,43064L,43065L,43066L,43067L,43068L,43069L,43070L,43071L,43072L, -43073L,43074L,43075L,43076L,43077L,43078L,43079L,43080L,43081L,43082L, -43083L,43084L,43085L,43086L,43087L,43088L,43089L,43090L,43091L,43092L, -43093L,43094L,43095L,43096L,43097L,43098L,43099L,43100L,43101L,43102L, -43103L,43104L,43105L,43106L,43107L,43108L,43109L,43110L,43111L,43112L, -43113L,43114L,43115L,43116L,43117L,43118L,43119L,43120L,43121L,43122L, -43123L,43124L,43125L,43126L,43127L,43128L,43129L,43130L,43131L,43132L, -43133L,43134L,43135L,43136L,43137L,43138L,43139L,43140L,43141L,43142L, -43143L,43144L,43145L,43146L,43147L,43148L,43149L,43150L,43151L,43152L, -43153L,43154L,43155L,43156L,43157L,43158L,43159L,43160L,43161L,43162L, -43163L,43164L,43165L,43166L,43167L,43168L,43169L,43170L,43171L,43172L, -43173L,43174L,43175L,43176L,43177L,43178L,43179L,43180L,43181L,43182L, -43183L,43184L,43185L,43186L,43187L,43188L,43189L,43190L,43191L,43192L, -43193L,43194L,43195L,43196L,43197L,43198L,43199L,43200L,43201L,43202L, -43203L,43204L,43205L,43206L,43207L,43208L,43209L,43210L,43211L,43212L, -43213L,43214L,43215L,43216L,43217L,43218L,43219L,43220L,43221L,43222L, -43223L,43224L,43225L,43226L,43227L,43228L,43229L,43230L,43231L,43232L, -43233L,43234L,43235L,43236L,43237L,43238L,43239L,43240L,43241L,43242L, -43243L,43244L,43245L,43246L,43247L,43248L,43249L,43250L,43251L,43252L, -43253L,43254L,43255L,43256L,43257L,43258L,43259L,43260L,43261L,43262L, -43263L,43264L,43265L,43266L,43267L,43268L,43269L,43270L,43271L,43272L, -43273L,43274L,43275L,43276L,43277L,43278L,43279L,43280L,43281L,43282L, -43283L,43284L,43285L,43286L,43287L,43288L,43289L,43290L,43291L,43292L, -43293L,43294L,43295L,43296L,43297L,43298L,43299L,43300L,43301L,43302L, -43303L,43304L,43305L,43306L,43307L,43308L,43309L,43310L,43311L,43312L, -43313L,43314L,43315L,43316L,43317L,43318L,43319L,43320L,43321L,43322L, -43323L,43324L,43325L,43326L,43327L,43328L,43329L,43330L,43331L,43332L, -43333L,43334L,43335L,43336L,43337L,43338L,43339L,43340L,43341L,43342L, -43343L,43344L,43345L,43346L,43347L,43348L,43349L,43350L,43351L,43352L, -43353L,43354L,43355L,43356L,43357L,43358L,43359L,43360L,43361L,43362L, -43363L,43364L,43365L,43366L,43367L,43368L,43369L,43370L,43371L,43372L, -43373L,43374L,43375L,43376L,43377L,43378L,43379L,43380L,43381L,43382L, -43383L,43384L,43385L,43386L,43387L,43388L,43389L,43390L,43391L,43392L, -43393L,43394L,43395L,43396L,43397L,43398L,43399L,43400L,43401L,43402L, -43403L,43404L,43405L,43406L,43407L,43408L,43409L,43410L,43411L,43412L, -43413L,43414L,43415L,43416L,43417L,43418L,43419L,43420L,43421L,43422L, -43423L,43424L,43425L,43426L,43427L,43428L,43429L,43430L,43431L,43432L, -43433L,43434L,43435L,43436L,43437L,43438L,43439L,43440L,43441L,43442L, -43443L,43444L,43445L,43446L,43447L,43448L,43449L,43450L,43451L,43452L, -43453L,43454L,43455L,43456L,43457L,43458L,43459L,43460L,43461L,43462L, -43463L,43464L,43465L,43466L,43467L,43468L,43469L,43470L,43471L,43472L, -43473L,43474L,43475L,43476L,43477L,43478L,43479L,43480L,43481L,43482L, -43483L,43484L,43485L,43486L,43487L,43488L,43489L,43490L,43491L,43492L, -43493L,43494L,43495L,43496L,43497L,43498L,43499L,43500L,43501L,43502L, -43503L,43504L,43505L,43506L,43507L,43508L,43509L,43510L,43511L,43512L, -43513L,43514L,43515L,43516L,43517L,43518L,43519L,43520L,43521L,43522L, -43523L,43524L,43525L,43526L,43527L,43528L,43529L,43530L,43531L,43532L, -43533L,43534L,43535L,43536L,43537L,43538L,43539L,43540L,43541L,43542L, -43543L,43544L,43545L,43546L,43547L,43548L,43549L,43550L,43551L,43552L, -43553L,43554L,43555L,43556L,43557L,43558L,43559L,43560L,43561L,43562L, -43563L,43564L,43565L,43566L,43567L,43568L,43569L,43570L,43571L,43572L, -43573L,43574L,43575L,43576L,43577L,43578L,43579L,43580L,43581L,43582L, -43583L,43584L,43585L,43586L,43587L,43588L,43589L,43590L,43591L,43592L, -43593L,43594L,43595L,43596L,43597L,43598L,43599L,43600L,43601L,43602L, -43603L,43604L,43605L,43606L,43607L,43608L,43609L,43610L,43611L,43612L, -43613L,43614L,43615L,43616L,43617L,43618L,43619L,43620L,43621L,43622L, -43623L,43624L,43625L,43626L,43627L,43628L,43629L,43630L,43631L,43632L, -43633L,43634L,43635L,43636L,43637L,43638L,43639L,43640L,43641L,43642L, -43643L,43644L,43645L,43646L,43647L,43648L,43649L,43650L,43651L,43652L, -43653L,43654L,43655L,43656L,43657L,43658L,43659L,43660L,43661L,43662L, -43663L,43664L,43665L,43666L,43667L,43668L,43669L,43670L,43671L,43672L, -43673L,43674L,43675L,43676L,43677L,43678L,43679L,43680L,43681L,43682L, -43683L,43684L,43685L,43686L,43687L,43688L,43689L,43690L,43691L,43692L, -43693L,43694L,43695L,43696L,43697L,43698L,43699L,43700L,43701L,43702L, -43703L,43704L,43705L,43706L,43707L,43708L,43709L,43710L,43711L,43712L, -43713L,43714L,43715L,43716L,43717L,43718L,43719L,43720L,43721L,43722L, -43723L,43724L,43725L,43726L,43727L,43728L,43729L,43730L,43731L,43732L, -43733L,43734L,43735L,43736L,43737L,43738L,43739L,43740L,43741L,43742L, -43743L,43744L,43745L,43746L,43747L,43748L,43749L,43750L,43751L,43752L, -43753L,43754L,43755L,43756L,43757L,43758L,43759L,43760L,43761L,43762L, -43763L,43764L,43765L,43766L,43767L,43768L,43769L,43770L,43771L,43772L, -43773L,43774L,43775L,43776L,43777L,43778L,43779L,43780L,43781L,43782L, -43783L,43784L,43785L,43786L,43787L,43788L,43789L,43790L,43791L,43792L, -43793L,43794L,43795L,43796L,43797L,43798L,43799L,43800L,43801L,43802L, -43803L,43804L,43805L,43806L,43807L,43808L,43809L,43810L,43811L,43812L, -43813L,43814L,43815L,43816L,43817L,43818L,43819L,43820L,43821L,43822L, -43823L,43824L,43825L,43826L,43827L,43828L,43829L,43830L,43831L,43832L, -43833L,43834L,43835L,43836L,43837L,43838L,43839L,43840L,43841L,43842L, -43843L,43844L,43845L,43846L,43847L,43848L,43849L,43850L,43851L,43852L, -43853L,43854L,43855L,43856L,43857L,43858L,43859L,43860L,43861L,43862L, -43863L,43864L,43865L,43866L,43867L,43868L,43869L,43870L,43871L,43872L, -43873L,43874L,43875L,43876L,43877L,43878L,43879L,43880L,43881L,43882L, -43883L,43884L,43885L,43886L,43887L,43888L,43889L,43890L,43891L,43892L, -43893L,43894L,43895L,43896L,43897L,43898L,43899L,43900L,43901L,43902L, -43903L,43904L,43905L,43906L,43907L,43908L,43909L,43910L,43911L,43912L, -43913L,43914L,43915L,43916L,43917L,43918L,43919L,43920L,43921L,43922L, -43923L,43924L,43925L,43926L,43927L,43928L,43929L,43930L,43931L,43932L, -43933L,43934L,43935L,43936L,43937L,43938L,43939L,43940L,43941L,43942L, -43943L,43944L,43945L,43946L,43947L,43948L,43949L,43950L,43951L,43952L, -43953L,43954L,43955L,43956L,43957L,43958L,43959L,43960L,43961L,43962L, -43963L,43964L,43965L,43966L,43967L,43968L,43969L,43970L,43971L,43972L, -43973L,43974L,43975L,43976L,43977L,43978L,43979L,43980L,43981L,43982L, -43983L,43984L,43985L,43986L,43987L,43988L,43989L,43990L,43991L,43992L, -43993L,43994L,43995L,43996L,43997L,43998L,43999L,44000L,44001L,44002L, -44003L,44004L,44005L,44006L,44007L,44008L,44009L,44010L,44011L,44012L, -44013L,44014L,44015L,44016L,44017L,44018L,44019L,44020L,44021L,44022L, -44023L,44024L,44025L,44026L,44027L,44028L,44029L,44030L,44031L,44032L, -44033L,44034L,44035L,44036L,44037L,44038L,44039L,44040L,44041L,44042L, -44043L,44044L,44045L,44046L,44047L,44048L,44049L,44050L,44051L,44052L, -44053L,44054L,44055L,44056L,44057L,44058L,44059L,44060L,44061L,44062L, -44063L,44064L,44065L,44066L,44067L,44068L,44069L,44070L,44071L,44072L, -44073L,44074L,44075L,44076L,44077L,44078L,44079L,44080L,44081L,44082L, -44083L,44084L,44085L,44086L,44087L,44088L,44089L,44090L,44091L,44092L, -44093L,44094L,44095L,44096L,44097L,44098L,44099L,44100L,44101L,44102L, -44103L,44104L,44105L,44106L,44107L,44108L,44109L,44110L,44111L,44112L, -44113L,44114L,44115L,44116L,44117L,44118L,44119L,44120L,44121L,44122L, -44123L,44124L,44125L,44126L,44127L,44128L,44129L,44130L,44131L,44132L, -44133L,44134L,44135L,44136L,44137L,44138L,44139L,44140L,44141L,44142L, -44143L,44144L,44145L,44146L,44147L,44148L,44149L,44150L,44151L,44152L, -44153L,44154L,44155L,44156L,44157L,44158L,44159L,44160L,44161L,44162L, -44163L,44164L,44165L,44166L,44167L,44168L,44169L,44170L,44171L,44172L, -44173L,44174L,44175L,44176L,44177L,44178L,44179L,44180L,44181L,44182L, -44183L,44184L,44185L,44186L,44187L,44188L,44189L,44190L,44191L,44192L, -44193L,44194L,44195L,44196L,44197L,44198L,44199L,44200L,44201L,44202L, -44203L,44204L,44205L,44206L,44207L,44208L,44209L,44210L,44211L,44212L, -44213L,44214L,44215L,44216L,44217L,44218L,44219L,44220L,44221L,44222L, -44223L,44224L,44225L,44226L,44227L,44228L,44229L,44230L,44231L,44232L, -44233L,44234L,44235L,44236L,44237L,44238L,44239L,44240L,44241L,44242L, -44243L,44244L,44245L,44246L,44247L,44248L,44249L,44250L,44251L,44252L, -44253L,44254L,44255L,44256L,44257L,44258L,44259L,44260L,44261L,44262L, -44263L,44264L,44265L,44266L,44267L,44268L,44269L,44270L,44271L,44272L, -44273L,44274L,44275L,44276L,44277L,44278L,44279L,44280L,44281L,44282L, -44283L,44284L,44285L,44286L,44287L,44288L,44289L,44290L,44291L,44292L, -44293L,44294L,44295L,44296L,44297L,44298L,44299L,44300L,44301L,44302L, -44303L,44304L,44305L,44306L,44307L,44308L,44309L,44310L,44311L,44312L, -44313L,44314L,44315L,44316L,44317L,44318L,44319L,44320L,44321L,44322L, -44323L,44324L,44325L,44326L,44327L,44328L,44329L,44330L,44331L,44332L, -44333L,44334L,44335L,44336L,44337L,44338L,44339L,44340L,44341L,44342L, -44343L,44344L,44345L,44346L,44347L,44348L,44349L,44350L,44351L,44352L, -44353L,44354L,44355L,44356L,44357L,44358L,44359L,44360L,44361L,44362L, -44363L,44364L,44365L,44366L,44367L,44368L,44369L,44370L,44371L,44372L, -44373L,44374L,44375L,44376L,44377L,44378L,44379L,44380L,44381L,44382L, -44383L,44384L,44385L,44386L,44387L,44388L,44389L,44390L,44391L,44392L, -44393L,44394L,44395L,44396L,44397L,44398L,44399L,44400L,44401L,44402L, -44403L,44404L,44405L,44406L,44407L,44408L,44409L,44410L,44411L,44412L, -44413L,44414L,44415L,44416L,44417L,44418L,44419L,44420L,44421L,44422L, -44423L,44424L,44425L,44426L,44427L,44428L,44429L,44430L,44431L,44432L, -44433L,44434L,44435L,44436L,44437L,44438L,44439L,44440L,44441L,44442L, -44443L,44444L,44445L,44446L,44447L,44448L,44449L,44450L,44451L,44452L, -44453L,44454L,44455L,44456L,44457L,44458L,44459L,44460L,44461L,44462L, -44463L,44464L,44465L,44466L,44467L,44468L,44469L,44470L,44471L,44472L, -44473L,44474L,44475L,44476L,44477L,44478L,44479L,44480L,44481L,44482L, -44483L,44484L,44485L,44486L,44487L,44488L,44489L,44490L,44491L,44492L, -44493L,44494L,44495L,44496L,44497L,44498L,44499L,44500L,44501L,44502L, -44503L,44504L,44505L,44506L,44507L,44508L,44509L,44510L,44511L,44512L, -44513L,44514L,44515L,44516L,44517L,44518L,44519L,44520L,44521L,44522L, -44523L,44524L,44525L,44526L,44527L,44528L,44529L,44530L,44531L,44532L, -44533L,44534L,44535L,44536L,44537L,44538L,44539L,44540L,44541L,44542L, -44543L,44544L,44545L,44546L,44547L,44548L,44549L,44550L,44551L,44552L, -44553L,44554L,44555L,44556L,44557L,44558L,44559L,44560L,44561L,44562L, -44563L,44564L,44565L,44566L,44567L,44568L,44569L,44570L,44571L,44572L, -44573L,44574L,44575L,44576L,44577L,44578L,44579L,44580L,44581L,44582L, -44583L,44584L,44585L,44586L,44587L,44588L,44589L,44590L,44591L,44592L, -44593L,44594L,44595L,44596L,44597L,44598L,44599L,44600L,44601L,44602L, -44603L,44604L,44605L,44606L,44607L,44608L,44609L,44610L,44611L,44612L, -44613L,44614L,44615L,44616L,44617L,44618L,44619L,44620L,44621L,44622L, -44623L,44624L,44625L,44626L,44627L,44628L,44629L,44630L,44631L,44632L, -44633L,44634L,44635L,44636L,44637L,44638L,44639L,44640L,44641L,44642L, -44643L,44644L,44645L,44646L,44647L,44648L,44649L,44650L,44651L,44652L, -44653L,44654L,44655L,44656L,44657L,44658L,44659L,44660L,44661L,44662L, -44663L,44664L,44665L,44666L,44667L,44668L,44669L,44670L,44671L,44672L, -44673L,44674L,44675L,44676L,44677L,44678L,44679L,44680L,44681L,44682L, -44683L,44684L,44685L,44686L,44687L,44688L,44689L,44690L,44691L,44692L, -44693L,44694L,44695L,44696L,44697L,44698L,44699L,44700L,44701L,44702L, -44703L,44704L,44705L,44706L,44707L,44708L,44709L,44710L,44711L,44712L, -44713L,44714L,44715L,44716L,44717L,44718L,44719L,44720L,44721L,44722L, -44723L,44724L,44725L,44726L,44727L,44728L,44729L,44730L,44731L,44732L, -44733L,44734L,44735L,44736L,44737L,44738L,44739L,44740L,44741L,44742L, -44743L,44744L,44745L,44746L,44747L,44748L,44749L,44750L,44751L,44752L, -44753L,44754L,44755L,44756L,44757L,44758L,44759L,44760L,44761L,44762L, -44763L,44764L,44765L,44766L,44767L,44768L,44769L,44770L,44771L,44772L, -44773L,44774L,44775L,44776L,44777L,44778L,44779L,44780L,44781L,44782L, -44783L,44784L,44785L,44786L,44787L,44788L,44789L,44790L,44791L,44792L, -44793L,44794L,44795L,44796L,44797L,44798L,44799L,44800L,44801L,44802L, -44803L,44804L,44805L,44806L,44807L,44808L,44809L,44810L,44811L,44812L, -44813L,44814L,44815L,44816L,44817L,44818L,44819L,44820L,44821L,44822L, -44823L,44824L,44825L,44826L,44827L,44828L,44829L,44830L,44831L,44832L, -44833L,44834L,44835L,44836L,44837L,44838L,44839L,44840L,44841L,44842L, -44843L,44844L,44845L,44846L,44847L,44848L,44849L,44850L,44851L,44852L, -44853L,44854L,44855L,44856L,44857L,44858L,44859L,44860L,44861L,44862L, -44863L,44864L,44865L,44866L,44867L,44868L,44869L,44870L,44871L,44872L, -44873L,44874L,44875L,44876L,44877L,44878L,44879L,44880L,44881L,44882L, -44883L,44884L,44885L,44886L,44887L,44888L,44889L,44890L,44891L,44892L, -44893L,44894L,44895L,44896L,44897L,44898L,44899L,44900L,44901L,44902L, -44903L,44904L,44905L,44906L,44907L,44908L,44909L,44910L,44911L,44912L, -44913L,44914L,44915L,44916L,44917L,44918L,44919L,44920L,44921L,44922L, -44923L,44924L,44925L,44926L,44927L,44928L,44929L,44930L,44931L,44932L, -44933L,44934L,44935L,44936L,44937L,44938L,44939L,44940L,44941L,44942L, -44943L,44944L,44945L,44946L,44947L,44948L,44949L,44950L,44951L,44952L, -44953L,44954L,44955L,44956L,44957L,44958L,44959L,44960L,44961L,44962L, -44963L,44964L,44965L,44966L,44967L,44968L,44969L,44970L,44971L,44972L, -44973L,44974L,44975L,44976L,44977L,44978L,44979L,44980L,44981L,44982L, -44983L,44984L,44985L,44986L,44987L,44988L,44989L,44990L,44991L,44992L, -44993L,44994L,44995L,44996L,44997L,44998L,44999L,45000L,45001L,45002L, -45003L,45004L,45005L,45006L,45007L,45008L,45009L,45010L,45011L,45012L, -45013L,45014L,45015L,45016L,45017L,45018L,45019L,45020L,45021L,45022L, -45023L,45024L,45025L,45026L,45027L,45028L,45029L,45030L,45031L,45032L, -45033L,45034L,45035L,45036L,45037L,45038L,45039L,45040L,45041L,45042L, -45043L,45044L,45045L,45046L,45047L,45048L,45049L,45050L,45051L,45052L, -45053L,45054L,45055L,45056L,45057L,45058L,45059L,45060L,45061L,45062L, -45063L,45064L,45065L,45066L,45067L,45068L,45069L,45070L,45071L,45072L, -45073L,45074L,45075L,45076L,45077L,45078L,45079L,45080L,45081L,45082L, -45083L,45084L,45085L,45086L,45087L,45088L,45089L,45090L,45091L,45092L, -45093L,45094L,45095L,45096L,45097L,45098L,45099L,45100L,45101L,45102L, -45103L,45104L,45105L,45106L,45107L,45108L,45109L,45110L,45111L,45112L, -45113L,45114L,45115L,45116L,45117L,45118L,45119L,45120L,45121L,45122L, -45123L,45124L,45125L,45126L,45127L,45128L,45129L,45130L,45131L,45132L, -45133L,45134L,45135L,45136L,45137L,45138L,45139L,45140L,45141L,45142L, -45143L,45144L,45145L,45146L,45147L,45148L,45149L,45150L,45151L,45152L, -45153L,45154L,45155L,45156L,45157L,45158L,45159L,45160L,45161L,45162L, -45163L,45164L,45165L,45166L,45167L,45168L,45169L,45170L,45171L,45172L, -45173L,45174L,45175L,45176L,45177L,45178L,45179L,45180L,45181L,45182L, -45183L,45184L,45185L,45186L,45187L,45188L,45189L,45190L,45191L,45192L, -45193L,45194L,45195L,45196L,45197L,45198L,45199L,45200L,45201L,45202L, -45203L,45204L,45205L,45206L,45207L,45208L,45209L,45210L,45211L,45212L, -45213L,45214L,45215L,45216L,45217L,45218L,45219L,45220L,45221L,45222L, -45223L,45224L,45225L,45226L,45227L,45228L,45229L,45230L,45231L,45232L, -45233L,45234L,45235L,45236L,45237L,45238L,45239L,45240L,45241L,45242L, -45243L,45244L,45245L,45246L,45247L,45248L,45249L,45250L,45251L,45252L, -45253L,45254L,45255L,45256L,45257L,45258L,45259L,45260L,45261L,45262L, -45263L,45264L,45265L,45266L,45267L,45268L,45269L,45270L,45271L,45272L, -45273L,45274L,45275L,45276L,45277L,45278L,45279L,45280L,45281L,45282L, -45283L,45284L,45285L,45286L,45287L,45288L,45289L,45290L,45291L,45292L, -45293L,45294L,45295L,45296L,45297L,45298L,45299L,45300L,45301L,45302L, -45303L,45304L,45305L,45306L,45307L,45308L,45309L,45310L,45311L,45312L, -45313L,45314L,45315L,45316L,45317L,45318L,45319L,45320L,45321L,45322L, -45323L,45324L,45325L,45326L,45327L,45328L,45329L,45330L,45331L,45332L, -45333L,45334L,45335L,45336L,45337L,45338L,45339L,45340L,45341L,45342L, -45343L,45344L,45345L,45346L,45347L,45348L,45349L,45350L,45351L,45352L, -45353L,45354L,45355L,45356L,45357L,45358L,45359L,45360L,45361L,45362L, -45363L,45364L,45365L,45366L,45367L,45368L,45369L,45370L,45371L,45372L, -45373L,45374L,45375L,45376L,45377L,45378L,45379L,45380L,45381L,45382L, -45383L,45384L,45385L,45386L,45387L,45388L,45389L,45390L,45391L,45392L, -45393L,45394L,45395L,45396L,45397L,45398L,45399L,45400L,45401L,45402L, -45403L,45404L,45405L,45406L,45407L,45408L,45409L,45410L,45411L,45412L, -45413L,45414L,45415L,45416L,45417L,45418L,45419L,45420L,45421L,45422L, -45423L,45424L,45425L,45426L,45427L,45428L,45429L,45430L,45431L,45432L, -45433L,45434L,45435L,45436L,45437L,45438L,45439L,45440L,45441L,45442L, -45443L,45444L,45445L,45446L,45447L,45448L,45449L,45450L,45451L,45452L, -45453L,45454L,45455L,45456L,45457L,45458L,45459L,45460L,45461L,45462L, -45463L,45464L,45465L,45466L,45467L,45468L,45469L,45470L,45471L,45472L, -45473L,45474L,45475L,45476L,45477L,45478L,45479L,45480L,45481L,45482L, -45483L,45484L,45485L,45486L,45487L,45488L,45489L,45490L,45491L,45492L, -45493L,45494L,45495L,45496L,45497L,45498L,45499L,45500L,45501L,45502L, -45503L,45504L,45505L,45506L,45507L,45508L,45509L,45510L,45511L,45512L, -45513L,45514L,45515L,45516L,45517L,45518L,45519L,45520L,45521L,45522L, -45523L,45524L,45525L,45526L,45527L,45528L,45529L,45530L,45531L,45532L, -45533L,45534L,45535L,45536L,45537L,45538L,45539L,45540L,45541L,45542L, -45543L,45544L,45545L,45546L,45547L,45548L,45549L,45550L,45551L,45552L, -45553L,45554L,45555L,45556L,45557L,45558L,45559L,45560L,45561L,45562L, -45563L,45564L,45565L,45566L,45567L,45568L,45569L,45570L,45571L,45572L, -45573L,45574L,45575L,45576L,45577L,45578L,45579L,45580L,45581L,45582L, -45583L,45584L,45585L,45586L,45587L,45588L,45589L,45590L,45591L,45592L, -45593L,45594L,45595L,45596L,45597L,45598L,45599L,45600L,45601L,45602L, -45603L,45604L,45605L,45606L,45607L,45608L,45609L,45610L,45611L,45612L, -45613L,45614L,45615L,45616L,45617L,45618L,45619L,45620L,45621L,45622L, -45623L,45624L,45625L,45626L,45627L,45628L,45629L,45630L,45631L,45632L, -45633L,45634L,45635L,45636L,45637L,45638L,45639L,45640L,45641L,45642L, -45643L,45644L,45645L,45646L,45647L,45648L,45649L,45650L,45651L,45652L, -45653L,45654L,45655L,45656L,45657L,45658L,45659L,45660L,45661L,45662L, -45663L,45664L,45665L,45666L,45667L,45668L,45669L,45670L,45671L,45672L, -45673L,45674L,45675L,45676L,45677L,45678L,45679L,45680L,45681L,45682L, -45683L,45684L,45685L,45686L,45687L,45688L,45689L,45690L,45691L,45692L, -45693L,45694L,45695L,45696L,45697L,45698L,45699L,45700L,45701L,45702L, -45703L,45704L,45705L,45706L,45707L,45708L,45709L,45710L,45711L,45712L, -45713L,45714L,45715L,45716L,45717L,45718L,45719L,45720L,45721L,45722L, -45723L,45724L,45725L,45726L,45727L,45728L,45729L,45730L,45731L,45732L, -45733L,45734L,45735L,45736L,45737L,45738L,45739L,45740L,45741L,45742L, -45743L,45744L,45745L,45746L,45747L,45748L,45749L,45750L,45751L,45752L, -45753L,45754L,45755L,45756L,45757L,45758L,45759L,45760L,45761L,45762L, -45763L,45764L,45765L,45766L,45767L,45768L,45769L,45770L,45771L,45772L, -45773L,45774L,45775L,45776L,45777L,45778L,45779L,45780L,45781L,45782L, -45783L,45784L,45785L,45786L,45787L,45788L,45789L,45790L,45791L,45792L, -45793L,45794L,45795L,45796L,45797L,45798L,45799L,45800L,45801L,45802L, -45803L,45804L,45805L,45806L,45807L,45808L,45809L,45810L,45811L,45812L, -45813L,45814L,45815L,45816L,45817L,45818L,45819L,45820L,45821L,45822L, -45823L,45824L,45825L,45826L,45827L,45828L,45829L,45830L,45831L,45832L, -45833L,45834L,45835L,45836L,45837L,45838L,45839L,45840L,45841L,45842L, -45843L,45844L,45845L,45846L,45847L,45848L,45849L,45850L,45851L,45852L, -45853L,45854L,45855L,45856L,45857L,45858L,45859L,45860L,45861L,45862L, -45863L,45864L,45865L,45866L,45867L,45868L,45869L,45870L,45871L,45872L, -45873L,45874L,45875L,45876L,45877L,45878L,45879L,45880L,45881L,45882L, -45883L,45884L,45885L,45886L,45887L,45888L,45889L,45890L,45891L,45892L, -45893L,45894L,45895L,45896L,45897L,45898L,45899L,45900L,45901L,45902L, -45903L,45904L,45905L,45906L,45907L,45908L,45909L,45910L,45911L,45912L, -45913L,45914L,45915L,45916L,45917L,45918L,45919L,45920L,45921L,45922L, -45923L,45924L,45925L,45926L,45927L,45928L,45929L,45930L,45931L,45932L, -45933L,45934L,45935L,45936L,45937L,45938L,45939L,45940L,45941L,45942L, -45943L,45944L,45945L,45946L,45947L,45948L,45949L,45950L,45951L,45952L, -45953L,45954L,45955L,45956L,45957L,45958L,45959L,45960L,45961L,45962L, -45963L,45964L,45965L,45966L,45967L,45968L,45969L,45970L,45971L,45972L, -45973L,45974L,45975L,45976L,45977L,45978L,45979L,45980L,45981L,45982L, -45983L,45984L,45985L,45986L,45987L,45988L,45989L,45990L,45991L,45992L, -45993L,45994L,45995L,45996L,45997L,45998L,45999L,46000L,46001L,46002L, -46003L,46004L,46005L,46006L,46007L,46008L,46009L,46010L,46011L,46012L, -46013L,46014L,46015L,46016L,46017L,46018L,46019L,46020L,46021L,46022L, -46023L,46024L,46025L,46026L,46027L,46028L,46029L,46030L,46031L,46032L, -46033L,46034L,46035L,46036L,46037L,46038L,46039L,46040L,46041L,46042L, -46043L,46044L,46045L,46046L,46047L,46048L,46049L,46050L,46051L,46052L, -46053L,46054L,46055L,46056L,46057L,46058L,46059L,46060L,46061L,46062L, -46063L,46064L,46065L,46066L,46067L,46068L,46069L,46070L,46071L,46072L, -46073L,46074L,46075L,46076L,46077L,46078L,46079L,46080L,46081L,46082L, -46083L,46084L,46085L,46086L,46087L,46088L,46089L,46090L,46091L,46092L, -46093L,46094L,46095L,46096L,46097L,46098L,46099L,46100L,46101L,46102L, -46103L,46104L,46105L,46106L,46107L,46108L,46109L,46110L,46111L,46112L, -46113L,46114L,46115L,46116L,46117L,46118L,46119L,46120L,46121L,46122L, -46123L,46124L,46125L,46126L,46127L,46128L,46129L,46130L,46131L,46132L, -46133L,46134L,46135L,46136L,46137L,46138L,46139L,46140L,46141L,46142L, -46143L,46144L,46145L,46146L,46147L,46148L,46149L,46150L,46151L,46152L, -46153L,46154L,46155L,46156L,46157L,46158L,46159L,46160L,46161L,46162L, -46163L,46164L,46165L,46166L,46167L,46168L,46169L,46170L,46171L,46172L, -46173L,46174L,46175L,46176L,46177L,46178L,46179L,46180L,46181L,46182L, -46183L,46184L,46185L,46186L,46187L,46188L,46189L,46190L,46191L,46192L, -46193L,46194L,46195L,46196L,46197L,46198L,46199L,46200L,46201L,46202L, -46203L,46204L,46205L,46206L,46207L,46208L,46209L,46210L,46211L,46212L, -46213L,46214L,46215L,46216L,46217L,46218L,46219L,46220L,46221L,46222L, -46223L,46224L,46225L,46226L,46227L,46228L,46229L,46230L,46231L,46232L, -46233L,46234L,46235L,46236L,46237L,46238L,46239L,46240L,46241L,46242L, -46243L,46244L,46245L,46246L,46247L,46248L,46249L,46250L,46251L,46252L, -46253L,46254L,46255L,46256L,46257L,46258L,46259L,46260L,46261L,46262L, -46263L,46264L,46265L,46266L,46267L,46268L,46269L,46270L,46271L,46272L, -46273L,46274L,46275L,46276L,46277L,46278L,46279L,46280L,46281L,46282L, -46283L,46284L,46285L,46286L,46287L,46288L,46289L,46290L,46291L,46292L, -46293L,46294L,46295L,46296L,46297L,46298L,46299L,46300L,46301L,46302L, -46303L,46304L,46305L,46306L,46307L,46308L,46309L,46310L,46311L,46312L, -46313L,46314L,46315L,46316L,46317L,46318L,46319L,46320L,46321L,46322L, -46323L,46324L,46325L,46326L,46327L,46328L,46329L,46330L,46331L,46332L, -46333L,46334L,46335L,46336L,46337L,46338L,46339L,46340L,46341L,46342L, -46343L,46344L,46345L,46346L,46347L,46348L,46349L,46350L,46351L,46352L, -46353L,46354L,46355L,46356L,46357L,46358L,46359L,46360L,46361L,46362L, -46363L,46364L,46365L,46366L,46367L,46368L,46369L,46370L,46371L,46372L, -46373L,46374L,46375L,46376L,46377L,46378L,46379L,46380L,46381L,46382L, -46383L,46384L,46385L,46386L,46387L,46388L,46389L,46390L,46391L,46392L, -46393L,46394L,46395L,46396L,46397L,46398L,46399L,46400L,46401L,46402L, -46403L,46404L,46405L,46406L,46407L,46408L,46409L,46410L,46411L,46412L, -46413L,46414L,46415L,46416L,46417L,46418L,46419L,46420L,46421L,46422L, -46423L,46424L,46425L,46426L,46427L,46428L,46429L,46430L,46431L,46432L, -46433L,46434L,46435L,46436L,46437L,46438L,46439L,46440L,46441L,46442L, -46443L,46444L,46445L,46446L,46447L,46448L,46449L,46450L,46451L,46452L, -46453L,46454L,46455L,46456L,46457L,46458L,46459L,46460L,46461L,46462L, -46463L,46464L,46465L,46466L,46467L,46468L,46469L,46470L,46471L,46472L, -46473L,46474L,46475L,46476L,46477L,46478L,46479L,46480L,46481L,46482L, -46483L,46484L,46485L,46486L,46487L,46488L,46489L,46490L,46491L,46492L, -46493L,46494L,46495L,46496L,46497L,46498L,46499L,46500L,46501L,46502L, -46503L,46504L,46505L,46506L,46507L,46508L,46509L,46510L,46511L,46512L, -46513L,46514L,46515L,46516L,46517L,46518L,46519L,46520L,46521L,46522L, -46523L,46524L,46525L,46526L,46527L,46528L,46529L,46530L,46531L,46532L, -46533L,46534L,46535L,46536L,46537L,46538L,46539L,46540L,46541L,46542L, -46543L,46544L,46545L,46546L,46547L,46548L,46549L,46550L,46551L,46552L, -46553L,46554L,46555L,46556L,46557L,46558L,46559L,46560L,46561L,46562L, -46563L,46564L,46565L,46566L,46567L,46568L,46569L,46570L,46571L,46572L, -46573L,46574L,46575L,46576L,46577L,46578L,46579L,46580L,46581L,46582L, -46583L,46584L,46585L,46586L,46587L,46588L,46589L,46590L,46591L,46592L, -46593L,46594L,46595L,46596L,46597L,46598L,46599L,46600L,46601L,46602L, -46603L,46604L,46605L,46606L,46607L,46608L,46609L,46610L,46611L,46612L, -46613L,46614L,46615L,46616L,46617L,46618L,46619L,46620L,46621L,46622L, -46623L,46624L,46625L,46626L,46627L,46628L,46629L,46630L,46631L,46632L, -46633L,46634L,46635L,46636L,46637L,46638L,46639L,46640L,46641L,46642L, -46643L,46644L,46645L,46646L,46647L,46648L,46649L,46650L,46651L,46652L, -46653L,46654L,46655L,46656L,46657L,46658L,46659L,46660L,46661L,46662L, -46663L,46664L,46665L,46666L,46667L,46668L,46669L,46670L,46671L,46672L, -46673L,46674L,46675L,46676L,46677L,46678L,46679L,46680L,46681L,46682L, -46683L,46684L,46685L,46686L,46687L,46688L,46689L,46690L,46691L,46692L, -46693L,46694L,46695L,46696L,46697L,46698L,46699L,46700L,46701L,46702L, -46703L,46704L,46705L,46706L,46707L,46708L,46709L,46710L,46711L,46712L, -46713L,46714L,46715L,46716L,46717L,46718L,46719L,46720L,46721L,46722L, -46723L,46724L,46725L,46726L,46727L,46728L,46729L,46730L,46731L,46732L, -46733L,46734L,46735L,46736L,46737L,46738L,46739L,46740L,46741L,46742L, -46743L,46744L,46745L,46746L,46747L,46748L,46749L,46750L,46751L,46752L, -46753L,46754L,46755L,46756L,46757L,46758L,46759L,46760L,46761L,46762L, -46763L,46764L,46765L,46766L,46767L,46768L,46769L,46770L,46771L,46772L, -46773L,46774L,46775L,46776L,46777L,46778L,46779L,46780L,46781L,46782L, -46783L,46784L,46785L,46786L,46787L,46788L,46789L,46790L,46791L,46792L, -46793L,46794L,46795L,46796L,46797L,46798L,46799L,46800L,46801L,46802L, -46803L,46804L,46805L,46806L,46807L,46808L,46809L,46810L,46811L,46812L, -46813L,46814L,46815L,46816L,46817L,46818L,46819L,46820L,46821L,46822L, -46823L,46824L,46825L,46826L,46827L,46828L,46829L,46830L,46831L,46832L, -46833L,46834L,46835L,46836L,46837L,46838L,46839L,46840L,46841L,46842L, -46843L,46844L,46845L,46846L,46847L,46848L,46849L,46850L,46851L,46852L, -46853L,46854L,46855L,46856L,46857L,46858L,46859L,46860L,46861L,46862L, -46863L,46864L,46865L,46866L,46867L,46868L,46869L,46870L,46871L,46872L, -46873L,46874L,46875L,46876L,46877L,46878L,46879L,46880L,46881L,46882L, -46883L,46884L,46885L,46886L,46887L,46888L,46889L,46890L,46891L,46892L, -46893L,46894L,46895L,46896L,46897L,46898L,46899L,46900L,46901L,46902L, -46903L,46904L,46905L,46906L,46907L,46908L,46909L,46910L,46911L,46912L, -46913L,46914L,46915L,46916L,46917L,46918L,46919L,46920L,46921L,46922L, -46923L,46924L,46925L,46926L,46927L,46928L,46929L,46930L,46931L,46932L, -46933L,46934L,46935L,46936L,46937L,46938L,46939L,46940L,46941L,46942L, -46943L,46944L,46945L,46946L,46947L,46948L,46949L,46950L,46951L,46952L, -46953L,46954L,46955L,46956L,46957L,46958L,46959L,46960L,46961L,46962L, -46963L,46964L,46965L,46966L,46967L,46968L,46969L,46970L,46971L,46972L, -46973L,46974L,46975L,46976L,46977L,46978L,46979L,46980L,46981L,46982L, -46983L,46984L,46985L,46986L,46987L,46988L,46989L,46990L,46991L,46992L, -46993L,46994L,46995L,46996L,46997L,46998L,46999L,47000L,47001L,47002L, -47003L,47004L,47005L,47006L,47007L,47008L,47009L,47010L,47011L,47012L, -47013L,47014L,47015L,47016L,47017L,47018L,47019L,47020L,47021L,47022L, -47023L,47024L,47025L,47026L,47027L,47028L,47029L,47030L,47031L,47032L, -47033L,47034L,47035L,47036L,47037L,47038L,47039L,47040L,47041L,47042L, -47043L,47044L,47045L,47046L,47047L,47048L,47049L,47050L,47051L,47052L, -47053L,47054L,47055L,47056L,47057L,47058L,47059L,47060L,47061L,47062L, -47063L,47064L,47065L,47066L,47067L,47068L,47069L,47070L,47071L,47072L, -47073L,47074L,47075L,47076L,47077L,47078L,47079L,47080L,47081L,47082L, -47083L,47084L,47085L,47086L,47087L,47088L,47089L,47090L,47091L,47092L, -47093L,47094L,47095L,47096L,47097L,47098L,47099L,47100L,47101L,47102L, -47103L,47104L,47105L,47106L,47107L,47108L,47109L,47110L,47111L,47112L, -47113L,47114L,47115L,47116L,47117L,47118L,47119L,47120L,47121L,47122L, -47123L,47124L,47125L,47126L,47127L,47128L,47129L,47130L,47131L,47132L, -47133L,47134L,47135L,47136L,47137L,47138L,47139L,47140L,47141L,47142L, -47143L,47144L,47145L,47146L,47147L,47148L,47149L,47150L,47151L,47152L, -47153L,47154L,47155L,47156L,47157L,47158L,47159L,47160L,47161L,47162L, -47163L,47164L,47165L,47166L,47167L,47168L,47169L,47170L,47171L,47172L, -47173L,47174L,47175L,47176L,47177L,47178L,47179L,47180L,47181L,47182L, -47183L,47184L,47185L,47186L,47187L,47188L,47189L,47190L,47191L,47192L, -47193L,47194L,47195L,47196L,47197L,47198L,47199L,47200L,47201L,47202L, -47203L,47204L,47205L,47206L,47207L,47208L,47209L,47210L,47211L,47212L, -47213L,47214L,47215L,47216L,47217L,47218L,47219L,47220L,47221L,47222L, -47223L,47224L,47225L,47226L,47227L,47228L,47229L,47230L,47231L,47232L, -47233L,47234L,47235L,47236L,47237L,47238L,47239L,47240L,47241L,47242L, -47243L,47244L,47245L,47246L,47247L,47248L,47249L,47250L,47251L,47252L, -47253L,47254L,47255L,47256L,47257L,47258L,47259L,47260L,47261L,47262L, -47263L,47264L,47265L,47266L,47267L,47268L,47269L,47270L,47271L,47272L, -47273L,47274L,47275L,47276L,47277L,47278L,47279L,47280L,47281L,47282L, -47283L,47284L,47285L,47286L,47287L,47288L,47289L,47290L,47291L,47292L, -47293L,47294L,47295L,47296L,47297L,47298L,47299L,47300L,47301L,47302L, -47303L,47304L,47305L,47306L,47307L,47308L,47309L,47310L,47311L,47312L, -47313L,47314L,47315L,47316L,47317L,47318L,47319L,47320L,47321L,47322L, -47323L,47324L,47325L,47326L,47327L,47328L,47329L,47330L,47331L,47332L, -47333L,47334L,47335L,47336L,47337L,47338L,47339L,47340L,47341L,47342L, -47343L,47344L,47345L,47346L,47347L,47348L,47349L,47350L,47351L,47352L, -47353L,47354L,47355L,47356L,47357L,47358L,47359L,47360L,47361L,47362L, -47363L,47364L,47365L,47366L,47367L,47368L,47369L,47370L,47371L,47372L, -47373L,47374L,47375L,47376L,47377L,47378L,47379L,47380L,47381L,47382L, -47383L,47384L,47385L,47386L,47387L,47388L,47389L,47390L,47391L,47392L, -47393L,47394L,47395L,47396L,47397L,47398L,47399L,47400L,47401L,47402L, -47403L,47404L,47405L,47406L,47407L,47408L,47409L,47410L,47411L,47412L, -47413L,47414L,47415L,47416L,47417L,47418L,47419L,47420L,47421L,47422L, -47423L,47424L,47425L,47426L,47427L,47428L,47429L,47430L,47431L,47432L, -47433L,47434L,47435L,47436L,47437L,47438L,47439L,47440L,47441L,47442L, -47443L,47444L,47445L,47446L,47447L,47448L,47449L,47450L,47451L,47452L, -47453L,47454L,47455L,47456L,47457L,47458L,47459L,47460L,47461L,47462L, -47463L,47464L,47465L,47466L,47467L,47468L,47469L,47470L,47471L,47472L, -47473L,47474L,47475L,47476L,47477L,47478L,47479L,47480L,47481L,47482L, -47483L,47484L,47485L,47486L,47487L,47488L,47489L,47490L,47491L,47492L, -47493L,47494L,47495L,47496L,47497L,47498L,47499L,47500L,47501L,47502L, -47503L,47504L,47505L,47506L,47507L,47508L,47509L,47510L,47511L,47512L, -47513L,47514L,47515L,47516L,47517L,47518L,47519L,47520L,47521L,47522L, -47523L,47524L,47525L,47526L,47527L,47528L,47529L,47530L,47531L,47532L, -47533L,47534L,47535L,47536L,47537L,47538L,47539L,47540L,47541L,47542L, -47543L,47544L,47545L,47546L,47547L,47548L,47549L,47550L,47551L,47552L, -47553L,47554L,47555L,47556L,47557L,47558L,47559L,47560L,47561L,47562L, -47563L,47564L,47565L,47566L,47567L,47568L,47569L,47570L,47571L,47572L, -47573L,47574L,47575L,47576L,47577L,47578L,47579L,47580L,47581L,47582L, -47583L,47584L,47585L,47586L,47587L,47588L,47589L,47590L,47591L,47592L, -47593L,47594L,47595L,47596L,47597L,47598L,47599L,47600L,47601L,47602L, -47603L,47604L,47605L,47606L,47607L,47608L,47609L,47610L,47611L,47612L, -47613L,47614L,47615L,47616L,47617L,47618L,47619L,47620L,47621L,47622L, -47623L,47624L,47625L,47626L,47627L,47628L,47629L,47630L,47631L,47632L, -47633L,47634L,47635L,47636L,47637L,47638L,47639L,47640L,47641L,47642L, -47643L,47644L,47645L,47646L,47647L,47648L,47649L,47650L,47651L,47652L, -47653L,47654L,47655L,47656L,47657L,47658L,47659L,47660L,47661L,47662L, -47663L,47664L,47665L,47666L,47667L,47668L,47669L,47670L,47671L,47672L, -47673L,47674L,47675L,47676L,47677L,47678L,47679L,47680L,47681L,47682L, -47683L,47684L,47685L,47686L,47687L,47688L,47689L,47690L,47691L,47692L, -47693L,47694L,47695L,47696L,47697L,47698L,47699L,47700L,47701L,47702L, -47703L,47704L,47705L,47706L,47707L,47708L,47709L,47710L,47711L,47712L, -47713L,47714L,47715L,47716L,47717L,47718L,47719L,47720L,47721L,47722L, -47723L,47724L,47725L,47726L,47727L,47728L,47729L,47730L,47731L,47732L, -47733L,47734L,47735L,47736L,47737L,47738L,47739L,47740L,47741L,47742L, -47743L,47744L,47745L,47746L,47747L,47748L,47749L,47750L,47751L,47752L, -47753L,47754L,47755L,47756L,47757L,47758L,47759L,47760L,47761L,47762L, -47763L,47764L,47765L,47766L,47767L,47768L,47769L,47770L,47771L,47772L, -47773L,47774L,47775L,47776L,47777L,47778L,47779L,47780L,47781L,47782L, -47783L,47784L,47785L,47786L,47787L,47788L,47789L,47790L,47791L,47792L, -47793L,47794L,47795L,47796L,47797L,47798L,47799L,47800L,47801L,47802L, -47803L,47804L,47805L,47806L,47807L,47808L,47809L,47810L,47811L,47812L, -47813L,47814L,47815L,47816L,47817L,47818L,47819L,47820L,47821L,47822L, -47823L,47824L,47825L,47826L,47827L,47828L,47829L,47830L,47831L,47832L, -47833L,47834L,47835L,47836L,47837L,47838L,47839L,47840L,47841L,47842L, -47843L,47844L,47845L,47846L,47847L,47848L,47849L,47850L,47851L,47852L, -47853L,47854L,47855L,47856L,47857L,47858L,47859L,47860L,47861L,47862L, -47863L,47864L,47865L,47866L,47867L,47868L,47869L,47870L,47871L,47872L, -47873L,47874L,47875L,47876L,47877L,47878L,47879L,47880L,47881L,47882L, -47883L,47884L,47885L,47886L,47887L,47888L,47889L,47890L,47891L,47892L, -47893L,47894L,47895L,47896L,47897L,47898L,47899L,47900L,47901L,47902L, -47903L,47904L,47905L,47906L,47907L,47908L,47909L,47910L,47911L,47912L, -47913L,47914L,47915L,47916L,47917L,47918L,47919L,47920L,47921L,47922L, -47923L,47924L,47925L,47926L,47927L,47928L,47929L,47930L,47931L,47932L, -47933L,47934L,47935L,47936L,47937L,47938L,47939L,47940L,47941L,47942L, -47943L,47944L,47945L,47946L,47947L,47948L,47949L,47950L,47951L,47952L, -47953L,47954L,47955L,47956L,47957L,47958L,47959L,47960L,47961L,47962L, -47963L,47964L,47965L,47966L,47967L,47968L,47969L,47970L,47971L,47972L, -47973L,47974L,47975L,47976L,47977L,47978L,47979L,47980L,47981L,47982L, -47983L,47984L,47985L,47986L,47987L,47988L,47989L,47990L,47991L,47992L, -47993L,47994L,47995L,47996L,47997L,47998L,47999L,48000L,48001L,48002L, -48003L,48004L,48005L,48006L,48007L,48008L,48009L,48010L,48011L,48012L, -48013L,48014L,48015L,48016L,48017L,48018L,48019L,48020L,48021L,48022L, -48023L,48024L,48025L,48026L,48027L,48028L,48029L,48030L,48031L,48032L, -48033L,48034L,48035L,48036L,48037L,48038L,48039L,48040L,48041L,48042L, -48043L,48044L,48045L,48046L,48047L,48048L,48049L,48050L,48051L,48052L, -48053L,48054L,48055L,48056L,48057L,48058L,48059L,48060L,48061L,48062L, -48063L,48064L,48065L,48066L,48067L,48068L,48069L,48070L,48071L,48072L, -48073L,48074L,48075L,48076L,48077L,48078L,48079L,48080L,48081L,48082L, -48083L,48084L,48085L,48086L,48087L,48088L,48089L,48090L,48091L,48092L, -48093L,48094L,48095L,48096L,48097L,48098L,48099L,48100L,48101L,48102L, -48103L,48104L,48105L,48106L,48107L,48108L,48109L,48110L,48111L,48112L, -48113L,48114L,48115L,48116L,48117L,48118L,48119L,48120L,48121L,48122L, -48123L,48124L,48125L,48126L,48127L,48128L,48129L,48130L,48131L,48132L, -48133L,48134L,48135L,48136L,48137L,48138L,48139L,48140L,48141L,48142L, -48143L,48144L,48145L,48146L,48147L,48148L,48149L,48150L,48151L,48152L, -48153L,48154L,48155L,48156L,48157L,48158L,48159L,48160L,48161L,48162L, -48163L,48164L,48165L,48166L,48167L,48168L,48169L,48170L,48171L,48172L, -48173L,48174L,48175L,48176L,48177L,48178L,48179L,48180L,48181L,48182L, -48183L,48184L,48185L,48186L,48187L,48188L,48189L,48190L,48191L,48192L, -48193L,48194L,48195L,48196L,48197L,48198L,48199L,48200L,48201L,48202L, -48203L,48204L,48205L,48206L,48207L,48208L,48209L,48210L,48211L,48212L, -48213L,48214L,48215L,48216L,48217L,48218L,48219L,48220L,48221L,48222L, -48223L,48224L,48225L,48226L,48227L,48228L,48229L,48230L,48231L,48232L, -48233L,48234L,48235L,48236L,48237L,48238L,48239L,48240L,48241L,48242L, -48243L,48244L,48245L,48246L,48247L,48248L,48249L,48250L,48251L,48252L, -48253L,48254L,48255L,48256L,48257L,48258L,48259L,48260L,48261L,48262L, -48263L,48264L,48265L,48266L,48267L,48268L,48269L,48270L,48271L,48272L, -48273L,48274L,48275L,48276L,48277L,48278L,48279L,48280L,48281L,48282L, -48283L,48284L,48285L,48286L,48287L,48288L,48289L,48290L,48291L,48292L, -48293L,48294L,48295L,48296L,48297L,48298L,48299L,48300L,48301L,48302L, -48303L,48304L,48305L,48306L,48307L,48308L,48309L,48310L,48311L,48312L, -48313L,48314L,48315L,48316L,48317L,48318L,48319L,48320L,48321L,48322L, -48323L,48324L,48325L,48326L,48327L,48328L,48329L,48330L,48331L,48332L, -48333L,48334L,48335L,48336L,48337L,48338L,48339L,48340L,48341L,48342L, -48343L,48344L,48345L,48346L,48347L,48348L,48349L,48350L,48351L,48352L, -48353L,48354L,48355L,48356L,48357L,48358L,48359L,48360L,48361L,48362L, -48363L,48364L,48365L,48366L,48367L,48368L,48369L,48370L,48371L,48372L, -48373L,48374L,48375L,48376L,48377L,48378L,48379L,48380L,48381L,48382L, -48383L,48384L,48385L,48386L,48387L,48388L,48389L,48390L,48391L,48392L, -48393L,48394L,48395L,48396L,48397L,48398L,48399L,48400L,48401L,48402L, -48403L,48404L,48405L,48406L,48407L,48408L,48409L,48410L,48411L,48412L, -48413L,48414L,48415L,48416L,48417L,48418L,48419L,48420L,48421L,48422L, -48423L,48424L,48425L,48426L,48427L,48428L,48429L,48430L,48431L,48432L, -48433L,48434L,48435L,48436L,48437L,48438L,48439L,48440L,48441L,48442L, -48443L,48444L,48445L,48446L,48447L,48448L,48449L,48450L,48451L,48452L, -48453L,48454L,48455L,48456L,48457L,48458L,48459L,48460L,48461L,48462L, -48463L,48464L,48465L,48466L,48467L,48468L,48469L,48470L,48471L,48472L, -48473L,48474L,48475L,48476L,48477L,48478L,48479L,48480L,48481L,48482L, -48483L,48484L,48485L,48486L,48487L,48488L,48489L,48490L,48491L,48492L, -48493L,48494L,48495L,48496L,48497L,48498L,48499L,48500L,48501L,48502L, -48503L,48504L,48505L,48506L,48507L,48508L,48509L,48510L,48511L,48512L, -48513L,48514L,48515L,48516L,48517L,48518L,48519L,48520L,48521L,48522L, -48523L,48524L,48525L,48526L,48527L,48528L,48529L,48530L,48531L,48532L, -48533L,48534L,48535L,48536L,48537L,48538L,48539L,48540L,48541L,48542L, -48543L,48544L,48545L,48546L,48547L,48548L,48549L,48550L,48551L,48552L, -48553L,48554L,48555L,48556L,48557L,48558L,48559L,48560L,48561L,48562L, -48563L,48564L,48565L,48566L,48567L,48568L,48569L,48570L,48571L,48572L, -48573L,48574L,48575L,48576L,48577L,48578L,48579L,48580L,48581L,48582L, -48583L,48584L,48585L,48586L,48587L,48588L,48589L,48590L,48591L,48592L, -48593L,48594L,48595L,48596L,48597L,48598L,48599L,48600L,48601L,48602L, -48603L,48604L,48605L,48606L,48607L,48608L,48609L,48610L,48611L,48612L, -48613L,48614L,48615L,48616L,48617L,48618L,48619L,48620L,48621L,48622L, -48623L,48624L,48625L,48626L,48627L,48628L,48629L,48630L,48631L,48632L, -48633L,48634L,48635L,48636L,48637L,48638L,48639L,48640L,48641L,48642L, -48643L,48644L,48645L,48646L,48647L,48648L,48649L,48650L,48651L,48652L, -48653L,48654L,48655L,48656L,48657L,48658L,48659L,48660L,48661L,48662L, -48663L,48664L,48665L,48666L,48667L,48668L,48669L,48670L,48671L,48672L, -48673L,48674L,48675L,48676L,48677L,48678L,48679L,48680L,48681L,48682L, -48683L,48684L,48685L,48686L,48687L,48688L,48689L,48690L,48691L,48692L, -48693L,48694L,48695L,48696L,48697L,48698L,48699L,48700L,48701L,48702L, -48703L,48704L,48705L,48706L,48707L,48708L,48709L,48710L,48711L,48712L, -48713L,48714L,48715L,48716L,48717L,48718L,48719L,48720L,48721L,48722L, -48723L,48724L,48725L,48726L,48727L,48728L,48729L,48730L,48731L,48732L, -48733L,48734L,48735L,48736L,48737L,48738L,48739L,48740L,48741L,48742L, -48743L,48744L,48745L,48746L,48747L,48748L,48749L,48750L,48751L,48752L, -48753L,48754L,48755L,48756L,48757L,48758L,48759L,48760L,48761L,48762L, -48763L,48764L,48765L,48766L,48767L,48768L,48769L,48770L,48771L,48772L, -48773L,48774L,48775L,48776L,48777L,48778L,48779L,48780L,48781L,48782L, -48783L,48784L,48785L,48786L,48787L,48788L,48789L,48790L,48791L,48792L, -48793L,48794L,48795L,48796L,48797L,48798L,48799L,48800L,48801L,48802L, -48803L,48804L,48805L,48806L,48807L,48808L,48809L,48810L,48811L,48812L, -48813L,48814L,48815L,48816L,48817L,48818L,48819L,48820L,48821L,48822L, -48823L,48824L,48825L,48826L,48827L,48828L,48829L,48830L,48831L,48832L, -48833L,48834L,48835L,48836L,48837L,48838L,48839L,48840L,48841L,48842L, -48843L,48844L,48845L,48846L,48847L,48848L,48849L,48850L,48851L,48852L, -48853L,48854L,48855L,48856L,48857L,48858L,48859L,48860L,48861L,48862L, -48863L,48864L,48865L,48866L,48867L,48868L,48869L,48870L,48871L,48872L, -48873L,48874L,48875L,48876L,48877L,48878L,48879L,48880L,48881L,48882L, -48883L,48884L,48885L,48886L,48887L,48888L,48889L,48890L,48891L,48892L, -48893L,48894L,48895L,48896L,48897L,48898L,48899L,48900L,48901L,48902L, -48903L,48904L,48905L,48906L,48907L,48908L,48909L,48910L,48911L,48912L, -48913L,48914L,48915L,48916L,48917L,48918L,48919L,48920L,48921L,48922L, -48923L,48924L,48925L,48926L,48927L,48928L,48929L,48930L,48931L,48932L, -48933L,48934L,48935L,48936L,48937L,48938L,48939L,48940L,48941L,48942L, -48943L,48944L,48945L,48946L,48947L,48948L,48949L,48950L,48951L,48952L, -48953L,48954L,48955L,48956L,48957L,48958L,48959L,48960L,48961L,48962L, -48963L,48964L,48965L,48966L,48967L,48968L,48969L,48970L,48971L,48972L, -48973L,48974L,48975L,48976L,48977L,48978L,48979L,48980L,48981L,48982L, -48983L,48984L,48985L,48986L,48987L,48988L,48989L,48990L,48991L,48992L, -48993L,48994L,48995L,48996L,48997L,48998L,48999L,49000L,49001L,49002L, -49003L,49004L,49005L,49006L,49007L,49008L,49009L,49010L,49011L,49012L, -49013L,49014L,49015L,49016L,49017L,49018L,49019L,49020L,49021L,49022L, -49023L,49024L,49025L,49026L,49027L,49028L,49029L,49030L,49031L,49032L, -49033L,49034L,49035L,49036L,49037L,49038L,49039L,49040L,49041L,49042L, -49043L,49044L,49045L,49046L,49047L,49048L,49049L,49050L,49051L,49052L, -49053L,49054L,49055L,49056L,49057L,49058L,49059L,49060L,49061L,49062L, -49063L,49064L,49065L,49066L,49067L,49068L,49069L,49070L,49071L,49072L, -49073L,49074L,49075L,49076L,49077L,49078L,49079L,49080L,49081L,49082L, -49083L,49084L,49085L,49086L,49087L,49088L,49089L,49090L,49091L,49092L, -49093L,49094L,49095L,49096L,49097L,49098L,49099L,49100L,49101L,49102L, -49103L,49104L,49105L,49106L,49107L,49108L,49109L,49110L,49111L,49112L, -49113L,49114L,49115L,49116L,49117L,49118L,49119L,49120L,49121L,49122L, -49123L,49124L,49125L,49126L,49127L,49128L,49129L,49130L,49131L,49132L, -49133L,49134L,49135L,49136L,49137L,49138L,49139L,49140L,49141L,49142L, -49143L,49144L,49145L,49146L,49147L,49148L,49149L,49150L,49151L,49152L, -49153L,49154L,49155L,49156L,49157L,49158L,49159L,49160L,49161L,49162L, -49163L,49164L,49165L,49166L,49167L,49168L,49169L,49170L,49171L,49172L, -49173L,49174L,49175L,49176L,49177L,49178L,49179L,49180L,49181L,49182L, -49183L,49184L,49185L,49186L,49187L,49188L,49189L,49190L,49191L,49192L, -49193L,49194L,49195L,49196L,49197L,49198L,49199L,49200L,49201L,49202L, -49203L,49204L,49205L,49206L,49207L,49208L,49209L,49210L,49211L,49212L, -49213L,49214L,49215L,49216L,49217L,49218L,49219L,49220L,49221L,49222L, -49223L,49224L,49225L,49226L,49227L,49228L,49229L,49230L,49231L,49232L, -49233L,49234L,49235L,49236L,49237L,49238L,49239L,49240L,49241L,49242L, -49243L,49244L,49245L,49246L,49247L,49248L,49249L,49250L,49251L,49252L, -49253L,49254L,49255L,49256L,49257L,49258L,49259L,49260L,49261L,49262L, -49263L,49264L,49265L,49266L,49267L,49268L,49269L,49270L,49271L,49272L, -49273L,49274L,49275L,49276L,49277L,49278L,49279L,49280L,49281L,49282L, -49283L,49284L,49285L,49286L,49287L,49288L,49289L,49290L,49291L,49292L, -49293L,49294L,49295L,49296L,49297L,49298L,49299L,49300L,49301L,49302L, -49303L,49304L,49305L,49306L,49307L,49308L,49309L,49310L,49311L,49312L, -49313L,49314L,49315L,49316L,49317L,49318L,49319L,49320L,49321L,49322L, -49323L,49324L,49325L,49326L,49327L,49328L,49329L,49330L,49331L,49332L, -49333L,49334L,49335L,49336L,49337L,49338L,49339L,49340L,49341L,49342L, -49343L,49344L,49345L,49346L,49347L,49348L,49349L,49350L,49351L,49352L, -49353L,49354L,49355L,49356L,49357L,49358L,49359L,49360L,49361L,49362L, -49363L,49364L,49365L,49366L,49367L,49368L,49369L,49370L,49371L,49372L, -49373L,49374L,49375L,49376L,49377L,49378L,49379L,49380L,49381L,49382L, -49383L,49384L,49385L,49386L,49387L,49388L,49389L,49390L,49391L,49392L, -49393L,49394L,49395L,49396L,49397L,49398L,49399L,49400L,49401L,49402L, -49403L,49404L,49405L,49406L,49407L,49408L,49409L,49410L,49411L,49412L, -49413L,49414L,49415L,49416L,49417L,49418L,49419L,49420L,49421L,49422L, -49423L,49424L,49425L,49426L,49427L,49428L,49429L,49430L,49431L,49432L, -49433L,49434L,49435L,49436L,49437L,49438L,49439L,49440L,49441L,49442L, -49443L,49444L,49445L,49446L,49447L,49448L,49449L,49450L,49451L,49452L, -49453L,49454L,49455L,49456L,49457L,49458L,49459L,49460L,49461L,49462L, -49463L,49464L,49465L,49466L,49467L,49468L,49469L,49470L,49471L,49472L, -49473L,49474L,49475L,49476L,49477L,49478L,49479L,49480L,49481L,49482L, -49483L,49484L,49485L,49486L,49487L,49488L,49489L,49490L,49491L,49492L, -49493L,49494L,49495L,49496L,49497L,49498L,49499L,49500L,49501L,49502L, -49503L,49504L,49505L,49506L,49507L,49508L,49509L,49510L,49511L,49512L, -49513L,49514L,49515L,49516L,49517L,49518L,49519L,49520L,49521L,49522L, -49523L,49524L,49525L,49526L,49527L,49528L,49529L,49530L,49531L,49532L, -49533L,49534L,49535L,49536L,49537L,49538L,49539L,49540L,49541L,49542L, -49543L,49544L,49545L,49546L,49547L,49548L,49549L,49550L,49551L,49552L, -49553L,49554L,49555L,49556L,49557L,49558L,49559L,49560L,49561L,49562L, -49563L,49564L,49565L,49566L,49567L,49568L,49569L,49570L,49571L,49572L, -49573L,49574L,49575L,49576L,49577L,49578L,49579L,49580L,49581L,49582L, -49583L,49584L,49585L,49586L,49587L,49588L,49589L,49590L,49591L,49592L, -49593L,49594L,49595L,49596L,49597L,49598L,49599L,49600L,49601L,49602L, -49603L,49604L,49605L,49606L,49607L,49608L,49609L,49610L,49611L,49612L, -49613L,49614L,49615L,49616L,49617L,49618L,49619L,49620L,49621L,49622L, -49623L,49624L,49625L,49626L,49627L,49628L,49629L,49630L,49631L,49632L, -49633L,49634L,49635L,49636L,49637L,49638L,49639L,49640L,49641L,49642L, -49643L,49644L,49645L,49646L,49647L,49648L,49649L,49650L,49651L,49652L, -49653L,49654L,49655L,49656L,49657L,49658L,49659L,49660L,49661L,49662L, -49663L,49664L,49665L,49666L,49667L,49668L,49669L,49670L,49671L,49672L, -49673L,49674L,49675L,49676L,49677L,49678L,49679L,49680L,49681L,49682L, -49683L,49684L,49685L,49686L,49687L,49688L,49689L,49690L,49691L,49692L, -49693L,49694L,49695L,49696L,49697L,49698L,49699L,49700L,49701L,49702L, -49703L,49704L,49705L,49706L,49707L,49708L,49709L,49710L,49711L,49712L, -49713L,49714L,49715L,49716L,49717L,49718L,49719L,49720L,49721L,49722L, -49723L,49724L,49725L,49726L,49727L,49728L,49729L,49730L,49731L,49732L, -49733L,49734L,49735L,49736L,49737L,49738L,49739L,49740L,49741L,49742L, -49743L,49744L,49745L,49746L,49747L,49748L,49749L,49750L,49751L,49752L, -49753L,49754L,49755L,49756L,49757L,49758L,49759L,49760L,49761L,49762L, -49763L,49764L,49765L,49766L,49767L,49768L,49769L,49770L,49771L,49772L, -49773L,49774L,49775L,49776L,49777L,49778L,49779L,49780L,49781L,49782L, -49783L,49784L,49785L,49786L,49787L,49788L,49789L,49790L,49791L,49792L, -49793L,49794L,49795L,49796L,49797L,49798L,49799L,49800L,49801L,49802L, -49803L,49804L,49805L,49806L,49807L,49808L,49809L,49810L,49811L,49812L, -49813L,49814L,49815L,49816L,49817L,49818L,49819L,49820L,49821L,49822L, -49823L,49824L,49825L,49826L,49827L,49828L,49829L,49830L,49831L,49832L, -49833L,49834L,49835L,49836L,49837L,49838L,49839L,49840L,49841L,49842L, -49843L,49844L,49845L,49846L,49847L,49848L,49849L,49850L,49851L,49852L, -49853L,49854L,49855L,49856L,49857L,49858L,49859L,49860L,49861L,49862L, -49863L,49864L,49865L,49866L,49867L,49868L,49869L,49870L,49871L,49872L, -49873L,49874L,49875L,49876L,49877L,49878L,49879L,49880L,49881L,49882L, -49883L,49884L,49885L,49886L,49887L,49888L,49889L,49890L,49891L,49892L, -49893L,49894L,49895L,49896L,49897L,49898L,49899L,49900L,49901L,49902L, -49903L,49904L,49905L,49906L,49907L,49908L,49909L,49910L,49911L,49912L, -49913L,49914L,49915L,49916L,49917L,49918L,49919L,49920L,49921L,49922L, -49923L,49924L,49925L,49926L,49927L,49928L,49929L,49930L,49931L,49932L, -49933L,49934L,49935L,49936L,49937L,49938L,49939L,49940L,49941L,49942L, -49943L,49944L,49945L,49946L,49947L,49948L,49949L,49950L,49951L,49952L, -49953L,49954L,49955L,49956L,49957L,49958L,49959L,49960L,49961L,49962L, -49963L,49964L,49965L,49966L,49967L,49968L,49969L,49970L,49971L,49972L, -49973L,49974L,49975L,49976L,49977L,49978L,49979L,49980L,49981L,49982L, -49983L,49984L,49985L,49986L,49987L,49988L,49989L,49990L,49991L,49992L, -49993L,49994L,49995L,49996L,49997L,49998L,49999L,50000L,50001L,50002L, -50003L,50004L,50005L,50006L,50007L,50008L,50009L,50010L,50011L,50012L, -50013L,50014L,50015L,50016L,50017L,50018L,50019L,50020L,50021L,50022L, -50023L,50024L,50025L,50026L,50027L,50028L,50029L,50030L,50031L,50032L, -50033L,50034L,50035L,50036L,50037L,50038L,50039L,50040L,50041L,50042L, -50043L,50044L,50045L,50046L,50047L,50048L,50049L,50050L,50051L,50052L, -50053L,50054L,50055L,50056L,50057L,50058L,50059L,50060L,50061L,50062L, -50063L,50064L,50065L,50066L,50067L,50068L,50069L,50070L,50071L,50072L, -50073L,50074L,50075L,50076L,50077L,50078L,50079L,50080L,50081L,50082L, -50083L,50084L,50085L,50086L,50087L,50088L,50089L,50090L,50091L,50092L, -50093L,50094L,50095L,50096L,50097L,50098L,50099L,50100L,50101L,50102L, -50103L,50104L,50105L,50106L,50107L,50108L,50109L,50110L,50111L,50112L, -50113L,50114L,50115L,50116L,50117L,50118L,50119L,50120L,50121L,50122L, -50123L,50124L,50125L,50126L,50127L,50128L,50129L,50130L,50131L,50132L, -50133L,50134L,50135L,50136L,50137L,50138L,50139L,50140L,50141L,50142L, -50143L,50144L,50145L,50146L,50147L,50148L,50149L,50150L,50151L,50152L, -50153L,50154L,50155L,50156L,50157L,50158L,50159L,50160L,50161L,50162L, -50163L,50164L,50165L,50166L,50167L,50168L,50169L,50170L,50171L,50172L, -50173L,50174L,50175L,50176L,50177L,50178L,50179L,50180L,50181L,50182L, -50183L,50184L,50185L,50186L,50187L,50188L,50189L,50190L,50191L,50192L, -50193L,50194L,50195L,50196L,50197L,50198L,50199L,50200L,50201L,50202L, -50203L,50204L,50205L,50206L,50207L,50208L,50209L,50210L,50211L,50212L, -50213L,50214L,50215L,50216L,50217L,50218L,50219L,50220L,50221L,50222L, -50223L,50224L,50225L,50226L,50227L,50228L,50229L,50230L,50231L,50232L, -50233L,50234L,50235L,50236L,50237L,50238L,50239L,50240L,50241L,50242L, -50243L,50244L,50245L,50246L,50247L,50248L,50249L,50250L,50251L,50252L, -50253L,50254L,50255L,50256L,50257L,50258L,50259L,50260L,50261L,50262L, -50263L,50264L,50265L,50266L,50267L,50268L,50269L,50270L,50271L,50272L, -50273L,50274L,50275L,50276L,50277L,50278L,50279L,50280L,50281L,50282L, -50283L,50284L,50285L,50286L,50287L,50288L,50289L,50290L,50291L,50292L, -50293L,50294L,50295L,50296L,50297L,50298L,50299L,50300L,50301L,50302L, -50303L,50304L,50305L,50306L,50307L,50308L,50309L,50310L,50311L,50312L, -50313L,50314L,50315L,50316L,50317L,50318L,50319L,50320L,50321L,50322L, -50323L,50324L,50325L,50326L,50327L,50328L,50329L,50330L,50331L,50332L, -50333L,50334L,50335L,50336L,50337L,50338L,50339L,50340L,50341L,50342L, -50343L,50344L,50345L,50346L,50347L,50348L,50349L,50350L,50351L,50352L, -50353L,50354L,50355L,50356L,50357L,50358L,50359L,50360L,50361L,50362L, -50363L,50364L,50365L,50366L,50367L,50368L,50369L,50370L,50371L,50372L, -50373L,50374L,50375L,50376L,50377L,50378L,50379L,50380L,50381L,50382L, -50383L,50384L,50385L,50386L,50387L,50388L,50389L,50390L,50391L,50392L, -50393L,50394L,50395L,50396L,50397L,50398L,50399L,50400L,50401L,50402L, -50403L,50404L,50405L,50406L,50407L,50408L,50409L,50410L,50411L,50412L, -50413L,50414L,50415L,50416L,50417L,50418L,50419L,50420L,50421L,50422L, -50423L,50424L,50425L,50426L,50427L,50428L,50429L,50430L,50431L,50432L, -50433L,50434L,50435L,50436L,50437L,50438L,50439L,50440L,50441L,50442L, -50443L,50444L,50445L,50446L,50447L,50448L,50449L,50450L,50451L,50452L, -50453L,50454L,50455L,50456L,50457L,50458L,50459L,50460L,50461L,50462L, -50463L,50464L,50465L,50466L,50467L,50468L,50469L,50470L,50471L,50472L, -50473L,50474L,50475L,50476L,50477L,50478L,50479L,50480L,50481L,50482L, -50483L,50484L,50485L,50486L,50487L,50488L,50489L,50490L,50491L,50492L, -50493L,50494L,50495L,50496L,50497L,50498L,50499L,50500L,50501L,50502L, -50503L,50504L,50505L,50506L,50507L,50508L,50509L,50510L,50511L,50512L, -50513L,50514L,50515L,50516L,50517L,50518L,50519L,50520L,50521L,50522L, -50523L,50524L,50525L,50526L,50527L,50528L,50529L,50530L,50531L,50532L, -50533L,50534L,50535L,50536L,50537L,50538L,50539L,50540L,50541L,50542L, -50543L,50544L,50545L,50546L,50547L,50548L,50549L,50550L,50551L,50552L, -50553L,50554L,50555L,50556L,50557L,50558L,50559L,50560L,50561L,50562L, -50563L,50564L,50565L,50566L,50567L,50568L,50569L,50570L,50571L,50572L, -50573L,50574L,50575L,50576L,50577L,50578L,50579L,50580L,50581L,50582L, -50583L,50584L,50585L,50586L,50587L,50588L,50589L,50590L,50591L,50592L, -50593L,50594L,50595L,50596L,50597L,50598L,50599L,50600L,50601L,50602L, -50603L,50604L,50605L,50606L,50607L,50608L,50609L,50610L,50611L,50612L, -50613L,50614L,50615L,50616L,50617L,50618L,50619L,50620L,50621L,50622L, -50623L,50624L,50625L,50626L,50627L,50628L,50629L,50630L,50631L,50632L, -50633L,50634L,50635L,50636L,50637L,50638L,50639L,50640L,50641L,50642L, -50643L,50644L,50645L,50646L,50647L,50648L,50649L,50650L,50651L,50652L, -50653L,50654L,50655L,50656L,50657L,50658L,50659L,50660L,50661L,50662L, -50663L,50664L,50665L,50666L,50667L,50668L,50669L,50670L,50671L,50672L, -50673L,50674L,50675L,50676L,50677L,50678L,50679L,50680L,50681L,50682L, -50683L,50684L,50685L,50686L,50687L,50688L,50689L,50690L,50691L,50692L, -50693L,50694L,50695L,50696L,50697L,50698L,50699L,50700L,50701L,50702L, -50703L,50704L,50705L,50706L,50707L,50708L,50709L,50710L,50711L,50712L, -50713L,50714L,50715L,50716L,50717L,50718L,50719L,50720L,50721L,50722L, -50723L,50724L,50725L,50726L,50727L,50728L,50729L,50730L,50731L,50732L, -50733L,50734L,50735L,50736L,50737L,50738L,50739L,50740L,50741L,50742L, -50743L,50744L,50745L,50746L,50747L,50748L,50749L,50750L,50751L,50752L, -50753L,50754L,50755L,50756L,50757L,50758L,50759L,50760L,50761L,50762L, -50763L,50764L,50765L,50766L,50767L,50768L,50769L,50770L,50771L,50772L, -50773L,50774L,50775L,50776L,50777L,50778L,50779L,50780L,50781L,50782L, -50783L,50784L,50785L,50786L,50787L,50788L,50789L,50790L,50791L,50792L, -50793L,50794L,50795L,50796L,50797L,50798L,50799L,50800L,50801L,50802L, -50803L,50804L,50805L,50806L,50807L,50808L,50809L,50810L,50811L,50812L, -50813L,50814L,50815L,50816L,50817L,50818L,50819L,50820L,50821L,50822L, -50823L,50824L,50825L,50826L,50827L,50828L,50829L,50830L,50831L,50832L, -50833L,50834L,50835L,50836L,50837L,50838L,50839L,50840L,50841L,50842L, -50843L,50844L,50845L,50846L,50847L,50848L,50849L,50850L,50851L,50852L, -50853L,50854L,50855L,50856L,50857L,50858L,50859L,50860L,50861L,50862L, -50863L,50864L,50865L,50866L,50867L,50868L,50869L,50870L,50871L,50872L, -50873L,50874L,50875L,50876L,50877L,50878L,50879L,50880L,50881L,50882L, -50883L,50884L,50885L,50886L,50887L,50888L,50889L,50890L,50891L,50892L, -50893L,50894L,50895L,50896L,50897L,50898L,50899L,50900L,50901L,50902L, -50903L,50904L,50905L,50906L,50907L,50908L,50909L,50910L,50911L,50912L, -50913L,50914L,50915L,50916L,50917L,50918L,50919L,50920L,50921L,50922L, -50923L,50924L,50925L,50926L,50927L,50928L,50929L,50930L,50931L,50932L, -50933L,50934L,50935L,50936L,50937L,50938L,50939L,50940L,50941L,50942L, -50943L,50944L,50945L,50946L,50947L,50948L,50949L,50950L,50951L,50952L, -50953L,50954L,50955L,50956L,50957L,50958L,50959L,50960L,50961L,50962L, -50963L,50964L,50965L,50966L,50967L,50968L,50969L,50970L,50971L,50972L, -50973L,50974L,50975L,50976L,50977L,50978L,50979L,50980L,50981L,50982L, -50983L,50984L,50985L,50986L,50987L,50988L,50989L,50990L,50991L,50992L, -50993L,50994L,50995L,50996L,50997L,50998L,50999L,51000L,51001L,51002L, -51003L,51004L,51005L,51006L,51007L,51008L,51009L,51010L,51011L,51012L, -51013L,51014L,51015L,51016L,51017L,51018L,51019L,51020L,51021L,51022L, -51023L,51024L,51025L,51026L,51027L,51028L,51029L,51030L,51031L,51032L, -51033L,51034L,51035L,51036L,51037L,51038L,51039L,51040L,51041L,51042L, -51043L,51044L,51045L,51046L,51047L,51048L,51049L,51050L,51051L,51052L, -51053L,51054L,51055L,51056L,51057L,51058L,51059L,51060L,51061L,51062L, -51063L,51064L,51065L,51066L,51067L,51068L,51069L,51070L,51071L,51072L, -51073L,51074L,51075L,51076L,51077L,51078L,51079L,51080L,51081L,51082L, -51083L,51084L,51085L,51086L,51087L,51088L,51089L,51090L,51091L,51092L, -51093L,51094L,51095L,51096L,51097L,51098L,51099L,51100L,51101L,51102L, -51103L,51104L,51105L,51106L,51107L,51108L,51109L,51110L,51111L,51112L, -51113L,51114L,51115L,51116L,51117L,51118L,51119L,51120L,51121L,51122L, -51123L,51124L,51125L,51126L,51127L,51128L,51129L,51130L,51131L,51132L, -51133L,51134L,51135L,51136L,51137L,51138L,51139L,51140L,51141L,51142L, -51143L,51144L,51145L,51146L,51147L,51148L,51149L,51150L,51151L,51152L, -51153L,51154L,51155L,51156L,51157L,51158L,51159L,51160L,51161L,51162L, -51163L,51164L,51165L,51166L,51167L,51168L,51169L,51170L,51171L,51172L, -51173L,51174L,51175L,51176L,51177L,51178L,51179L,51180L,51181L,51182L, -51183L,51184L,51185L,51186L,51187L,51188L,51189L,51190L,51191L,51192L, -51193L,51194L,51195L,51196L,51197L,51198L,51199L,51200L,51201L,51202L, -51203L,51204L,51205L,51206L,51207L,51208L,51209L,51210L,51211L,51212L, -51213L,51214L,51215L,51216L,51217L,51218L,51219L,51220L,51221L,51222L, -51223L,51224L,51225L,51226L,51227L,51228L,51229L,51230L,51231L,51232L, -51233L,51234L,51235L,51236L,51237L,51238L,51239L,51240L,51241L,51242L, -51243L,51244L,51245L,51246L,51247L,51248L,51249L,51250L,51251L,51252L, -51253L,51254L,51255L,51256L,51257L,51258L,51259L,51260L,51261L,51262L, -51263L,51264L,51265L,51266L,51267L,51268L,51269L,51270L,51271L,51272L, -51273L,51274L,51275L,51276L,51277L,51278L,51279L,51280L,51281L,51282L, -51283L,51284L,51285L,51286L,51287L,51288L,51289L,51290L,51291L,51292L, -51293L,51294L,51295L,51296L,51297L,51298L,51299L,51300L,51301L,51302L, -51303L,51304L,51305L,51306L,51307L,51308L,51309L,51310L,51311L,51312L, -51313L,51314L,51315L,51316L,51317L,51318L,51319L,51320L,51321L,51322L, -51323L,51324L,51325L,51326L,51327L,51328L,51329L,51330L,51331L,51332L, -51333L,51334L,51335L,51336L,51337L,51338L,51339L,51340L,51341L,51342L, -51343L,51344L,51345L,51346L,51347L,51348L,51349L,51350L,51351L,51352L, -51353L,51354L,51355L,51356L,51357L,51358L,51359L,51360L,51361L,51362L, -51363L,51364L,51365L,51366L,51367L,51368L,51369L,51370L,51371L,51372L, -51373L,51374L,51375L,51376L,51377L,51378L,51379L,51380L,51381L,51382L, -51383L,51384L,51385L,51386L,51387L,51388L,51389L,51390L,51391L,51392L, -51393L,51394L,51395L,51396L,51397L,51398L,51399L,51400L,51401L,51402L, -51403L,51404L,51405L,51406L,51407L,51408L,51409L,51410L,51411L,51412L, -51413L,51414L,51415L,51416L,51417L,51418L,51419L,51420L,51421L,51422L, -51423L,51424L,51425L,51426L,51427L,51428L,51429L,51430L,51431L,51432L, -51433L,51434L,51435L,51436L,51437L,51438L,51439L,51440L,51441L,51442L, -51443L,51444L,51445L,51446L,51447L,51448L,51449L,51450L,51451L,51452L, -51453L,51454L,51455L,51456L,51457L,51458L,51459L,51460L,51461L,51462L, -51463L,51464L,51465L,51466L,51467L,51468L,51469L,51470L,51471L,51472L, -51473L,51474L,51475L,51476L,51477L,51478L,51479L,51480L,51481L,51482L, -51483L,51484L,51485L,51486L,51487L,51488L,51489L,51490L,51491L,51492L, -51493L,51494L,51495L,51496L,51497L,51498L,51499L,51500L,51501L,51502L, -51503L,51504L,51505L,51506L,51507L,51508L,51509L,51510L,51511L,51512L, -51513L,51514L,51515L,51516L,51517L,51518L,51519L,51520L,51521L,51522L, -51523L,51524L,51525L,51526L,51527L,51528L,51529L,51530L,51531L,51532L, -51533L,51534L,51535L,51536L,51537L,51538L,51539L,51540L,51541L,51542L, -51543L,51544L,51545L,51546L,51547L,51548L,51549L,51550L,51551L,51552L, -51553L,51554L,51555L,51556L,51557L,51558L,51559L,51560L,51561L,51562L, -51563L,51564L,51565L,51566L,51567L,51568L,51569L,51570L,51571L,51572L, -51573L,51574L,51575L,51576L,51577L,51578L,51579L,51580L,51581L,51582L, -51583L,51584L,51585L,51586L,51587L,51588L,51589L,51590L,51591L,51592L, -51593L,51594L,51595L,51596L,51597L,51598L,51599L,51600L,51601L,51602L, -51603L,51604L,51605L,51606L,51607L,51608L,51609L,51610L,51611L,51612L, -51613L,51614L,51615L,51616L,51617L,51618L,51619L,51620L,51621L,51622L, -51623L,51624L,51625L,51626L,51627L,51628L,51629L,51630L,51631L,51632L, -51633L,51634L,51635L,51636L,51637L,51638L,51639L,51640L,51641L,51642L, -51643L,51644L,51645L,51646L,51647L,51648L,51649L,51650L,51651L,51652L, -51653L,51654L,51655L,51656L,51657L,51658L,51659L,51660L,51661L,51662L, -51663L,51664L,51665L,51666L,51667L,51668L,51669L,51670L,51671L,51672L, -51673L,51674L,51675L,51676L,51677L,51678L,51679L,51680L,51681L,51682L, -51683L,51684L,51685L,51686L,51687L,51688L,51689L,51690L,51691L,51692L, -51693L,51694L,51695L,51696L,51697L,51698L,51699L,51700L,51701L,51702L, -51703L,51704L,51705L,51706L,51707L,51708L,51709L,51710L,51711L,51712L, -51713L,51714L,51715L,51716L,51717L,51718L,51719L,51720L,51721L,51722L, -51723L,51724L,51725L,51726L,51727L,51728L,51729L,51730L,51731L,51732L, -51733L,51734L,51735L,51736L,51737L,51738L,51739L,51740L,51741L,51742L, -51743L,51744L,51745L,51746L,51747L,51748L,51749L,51750L,51751L,51752L, -51753L,51754L,51755L,51756L,51757L,51758L,51759L,51760L,51761L,51762L, -51763L,51764L,51765L,51766L,51767L,51768L,51769L,51770L,51771L,51772L, -51773L,51774L,51775L,51776L,51777L,51778L,51779L,51780L,51781L,51782L, -51783L,51784L,51785L,51786L,51787L,51788L,51789L,51790L,51791L,51792L, -51793L,51794L,51795L,51796L,51797L,51798L,51799L,51800L,51801L,51802L, -51803L,51804L,51805L,51806L,51807L,51808L,51809L,51810L,51811L,51812L, -51813L,51814L,51815L,51816L,51817L,51818L,51819L,51820L,51821L,51822L, -51823L,51824L,51825L,51826L,51827L,51828L,51829L,51830L,51831L,51832L, -51833L,51834L,51835L,51836L,51837L,51838L,51839L,51840L,51841L,51842L, -51843L,51844L,51845L,51846L,51847L,51848L,51849L,51850L,51851L,51852L, -51853L,51854L,51855L,51856L,51857L,51858L,51859L,51860L,51861L,51862L, -51863L,51864L,51865L,51866L,51867L,51868L,51869L,51870L,51871L,51872L, -51873L,51874L,51875L,51876L,51877L,51878L,51879L,51880L,51881L,51882L, -51883L,51884L,51885L,51886L,51887L,51888L,51889L,51890L,51891L,51892L, -51893L,51894L,51895L,51896L,51897L,51898L,51899L,51900L,51901L,51902L, -51903L,51904L,51905L,51906L,51907L,51908L,51909L,51910L,51911L,51912L, -51913L,51914L,51915L,51916L,51917L,51918L,51919L,51920L,51921L,51922L, -51923L,51924L,51925L,51926L,51927L,51928L,51929L,51930L,51931L,51932L, -51933L,51934L,51935L,51936L,51937L,51938L,51939L,51940L,51941L,51942L, -51943L,51944L,51945L,51946L,51947L,51948L,51949L,51950L,51951L,51952L, -51953L,51954L,51955L,51956L,51957L,51958L,51959L,51960L,51961L,51962L, -51963L,51964L,51965L,51966L,51967L,51968L,51969L,51970L,51971L,51972L, -51973L,51974L,51975L,51976L,51977L,51978L,51979L,51980L,51981L,51982L, -51983L,51984L,51985L,51986L,51987L,51988L,51989L,51990L,51991L,51992L, -51993L,51994L,51995L,51996L,51997L,51998L,51999L,52000L,52001L,52002L, -52003L,52004L,52005L,52006L,52007L,52008L,52009L,52010L,52011L,52012L, -52013L,52014L,52015L,52016L,52017L,52018L,52019L,52020L,52021L,52022L, -52023L,52024L,52025L,52026L,52027L,52028L,52029L,52030L,52031L,52032L, -52033L,52034L,52035L,52036L,52037L,52038L,52039L,52040L,52041L,52042L, -52043L,52044L,52045L,52046L,52047L,52048L,52049L,52050L,52051L,52052L, -52053L,52054L,52055L,52056L,52057L,52058L,52059L,52060L,52061L,52062L, -52063L,52064L,52065L,52066L,52067L,52068L,52069L,52070L,52071L,52072L, -52073L,52074L,52075L,52076L,52077L,52078L,52079L,52080L,52081L,52082L, -52083L,52084L,52085L,52086L,52087L,52088L,52089L,52090L,52091L,52092L, -52093L,52094L,52095L,52096L,52097L,52098L,52099L,52100L,52101L,52102L, -52103L,52104L,52105L,52106L,52107L,52108L,52109L,52110L,52111L,52112L, -52113L,52114L,52115L,52116L,52117L,52118L,52119L,52120L,52121L,52122L, -52123L,52124L,52125L,52126L,52127L,52128L,52129L,52130L,52131L,52132L, -52133L,52134L,52135L,52136L,52137L,52138L,52139L,52140L,52141L,52142L, -52143L,52144L,52145L,52146L,52147L,52148L,52149L,52150L,52151L,52152L, -52153L,52154L,52155L,52156L,52157L,52158L,52159L,52160L,52161L,52162L, -52163L,52164L,52165L,52166L,52167L,52168L,52169L,52170L,52171L,52172L, -52173L,52174L,52175L,52176L,52177L,52178L,52179L,52180L,52181L,52182L, -52183L,52184L,52185L,52186L,52187L,52188L,52189L,52190L,52191L,52192L, -52193L,52194L,52195L,52196L,52197L,52198L,52199L,52200L,52201L,52202L, -52203L,52204L,52205L,52206L,52207L,52208L,52209L,52210L,52211L,52212L, -52213L,52214L,52215L,52216L,52217L,52218L,52219L,52220L,52221L,52222L, -52223L,52224L,52225L,52226L,52227L,52228L,52229L,52230L,52231L,52232L, -52233L,52234L,52235L,52236L,52237L,52238L,52239L,52240L,52241L,52242L, -52243L,52244L,52245L,52246L,52247L,52248L,52249L,52250L,52251L,52252L, -52253L,52254L,52255L,52256L,52257L,52258L,52259L,52260L,52261L,52262L, -52263L,52264L,52265L,52266L,52267L,52268L,52269L,52270L,52271L,52272L, -52273L,52274L,52275L,52276L,52277L,52278L,52279L,52280L,52281L,52282L, -52283L,52284L,52285L,52286L,52287L,52288L,52289L,52290L,52291L,52292L, -52293L,52294L,52295L,52296L,52297L,52298L,52299L,52300L,52301L,52302L, -52303L,52304L,52305L,52306L,52307L,52308L,52309L,52310L,52311L,52312L, -52313L,52314L,52315L,52316L,52317L,52318L,52319L,52320L,52321L,52322L, -52323L,52324L,52325L,52326L,52327L,52328L,52329L,52330L,52331L,52332L, -52333L,52334L,52335L,52336L,52337L,52338L,52339L,52340L,52341L,52342L, -52343L,52344L,52345L,52346L,52347L,52348L,52349L,52350L,52351L,52352L, -52353L,52354L,52355L,52356L,52357L,52358L,52359L,52360L,52361L,52362L, -52363L,52364L,52365L,52366L,52367L,52368L,52369L,52370L,52371L,52372L, -52373L,52374L,52375L,52376L,52377L,52378L,52379L,52380L,52381L,52382L, -52383L,52384L,52385L,52386L,52387L,52388L,52389L,52390L,52391L,52392L, -52393L,52394L,52395L,52396L,52397L,52398L,52399L,52400L,52401L,52402L, -52403L,52404L,52405L,52406L,52407L,52408L,52409L,52410L,52411L,52412L, -52413L,52414L,52415L,52416L,52417L,52418L,52419L,52420L,52421L,52422L, -52423L,52424L,52425L,52426L,52427L,52428L,52429L,52430L,52431L,52432L, -52433L,52434L,52435L,52436L,52437L,52438L,52439L,52440L,52441L,52442L, -52443L,52444L,52445L,52446L,52447L,52448L,52449L,52450L,52451L,52452L, -52453L,52454L,52455L,52456L,52457L,52458L,52459L,52460L,52461L,52462L, -52463L,52464L,52465L,52466L,52467L,52468L,52469L,52470L,52471L,52472L, -52473L,52474L,52475L,52476L,52477L,52478L,52479L,52480L,52481L,52482L, -52483L,52484L,52485L,52486L,52487L,52488L,52489L,52490L,52491L,52492L, -52493L,52494L,52495L,52496L,52497L,52498L,52499L,52500L,52501L,52502L, -52503L,52504L,52505L,52506L,52507L,52508L,52509L,52510L,52511L,52512L, -52513L,52514L,52515L,52516L,52517L,52518L,52519L,52520L,52521L,52522L, -52523L,52524L,52525L,52526L,52527L,52528L,52529L,52530L,52531L,52532L, -52533L,52534L,52535L,52536L,52537L,52538L,52539L,52540L,52541L,52542L, -52543L,52544L,52545L,52546L,52547L,52548L,52549L,52550L,52551L,52552L, -52553L,52554L,52555L,52556L,52557L,52558L,52559L,52560L,52561L,52562L, -52563L,52564L,52565L,52566L,52567L,52568L,52569L,52570L,52571L,52572L, -52573L,52574L,52575L,52576L,52577L,52578L,52579L,52580L,52581L,52582L, -52583L,52584L,52585L,52586L,52587L,52588L,52589L,52590L,52591L,52592L, -52593L,52594L,52595L,52596L,52597L,52598L,52599L,52600L,52601L,52602L, -52603L,52604L,52605L,52606L,52607L,52608L,52609L,52610L,52611L,52612L, -52613L,52614L,52615L,52616L,52617L,52618L,52619L,52620L,52621L,52622L, -52623L,52624L,52625L,52626L,52627L,52628L,52629L,52630L,52631L,52632L, -52633L,52634L,52635L,52636L,52637L,52638L,52639L,52640L,52641L,52642L, -52643L,52644L,52645L,52646L,52647L,52648L,52649L,52650L,52651L,52652L, -52653L,52654L,52655L,52656L,52657L,52658L,52659L,52660L,52661L,52662L, -52663L,52664L,52665L,52666L,52667L,52668L,52669L,52670L,52671L,52672L, -52673L,52674L,52675L,52676L,52677L,52678L,52679L,52680L,52681L,52682L, -52683L,52684L,52685L,52686L,52687L,52688L,52689L,52690L,52691L,52692L, -52693L,52694L,52695L,52696L,52697L,52698L,52699L,52700L,52701L,52702L, -52703L,52704L,52705L,52706L,52707L,52708L,52709L,52710L,52711L,52712L, -52713L,52714L,52715L,52716L,52717L,52718L,52719L,52720L,52721L,52722L, -52723L,52724L,52725L,52726L,52727L,52728L,52729L,52730L,52731L,52732L, -52733L,52734L,52735L,52736L,52737L,52738L,52739L,52740L,52741L,52742L, -52743L,52744L,52745L,52746L,52747L,52748L,52749L,52750L,52751L,52752L, -52753L,52754L,52755L,52756L,52757L,52758L,52759L,52760L,52761L,52762L, -52763L,52764L,52765L,52766L,52767L,52768L,52769L,52770L,52771L,52772L, -52773L,52774L,52775L,52776L,52777L,52778L,52779L,52780L,52781L,52782L, -52783L,52784L,52785L,52786L,52787L,52788L,52789L,52790L,52791L,52792L, -52793L,52794L,52795L,52796L,52797L,52798L,52799L,52800L,52801L,52802L, -52803L,52804L,52805L,52806L,52807L,52808L,52809L,52810L,52811L,52812L, -52813L,52814L,52815L,52816L,52817L,52818L,52819L,52820L,52821L,52822L, -52823L,52824L,52825L,52826L,52827L,52828L,52829L,52830L,52831L,52832L, -52833L,52834L,52835L,52836L,52837L,52838L,52839L,52840L,52841L,52842L, -52843L,52844L,52845L,52846L,52847L,52848L,52849L,52850L,52851L,52852L, -52853L,52854L,52855L,52856L,52857L,52858L,52859L,52860L,52861L,52862L, -52863L,52864L,52865L,52866L,52867L,52868L,52869L,52870L,52871L,52872L, -52873L,52874L,52875L,52876L,52877L,52878L,52879L,52880L,52881L,52882L, -52883L,52884L,52885L,52886L,52887L,52888L,52889L,52890L,52891L,52892L, -52893L,52894L,52895L,52896L,52897L,52898L,52899L,52900L,52901L,52902L, -52903L,52904L,52905L,52906L,52907L,52908L,52909L,52910L,52911L,52912L, -52913L,52914L,52915L,52916L,52917L,52918L,52919L,52920L,52921L,52922L, -52923L,52924L,52925L,52926L,52927L,52928L,52929L,52930L,52931L,52932L, -52933L,52934L,52935L,52936L,52937L,52938L,52939L,52940L,52941L,52942L, -52943L,52944L,52945L,52946L,52947L,52948L,52949L,52950L,52951L,52952L, -52953L,52954L,52955L,52956L,52957L,52958L,52959L,52960L,52961L,52962L, -52963L,52964L,52965L,52966L,52967L,52968L,52969L,52970L,52971L,52972L, -52973L,52974L,52975L,52976L,52977L,52978L,52979L,52980L,52981L,52982L, -52983L,52984L,52985L,52986L,52987L,52988L,52989L,52990L,52991L,52992L, -52993L,52994L,52995L,52996L,52997L,52998L,52999L,53000L,53001L,53002L, -53003L,53004L,53005L,53006L,53007L,53008L,53009L,53010L,53011L,53012L, -53013L,53014L,53015L,53016L,53017L,53018L,53019L,53020L,53021L,53022L, -53023L,53024L,53025L,53026L,53027L,53028L,53029L,53030L,53031L,53032L, -53033L,53034L,53035L,53036L,53037L,53038L,53039L,53040L,53041L,53042L, -53043L,53044L,53045L,53046L,53047L,53048L,53049L,53050L,53051L,53052L, -53053L,53054L,53055L,53056L,53057L,53058L,53059L,53060L,53061L,53062L, -53063L,53064L,53065L,53066L,53067L,53068L,53069L,53070L,53071L,53072L, -53073L,53074L,53075L,53076L,53077L,53078L,53079L,53080L,53081L,53082L, -53083L,53084L,53085L,53086L,53087L,53088L,53089L,53090L,53091L,53092L, -53093L,53094L,53095L,53096L,53097L,53098L,53099L,53100L,53101L,53102L, -53103L,53104L,53105L,53106L,53107L,53108L,53109L,53110L,53111L,53112L, -53113L,53114L,53115L,53116L,53117L,53118L,53119L,53120L,53121L,53122L, -53123L,53124L,53125L,53126L,53127L,53128L,53129L,53130L,53131L,53132L, -53133L,53134L,53135L,53136L,53137L,53138L,53139L,53140L,53141L,53142L, -53143L,53144L,53145L,53146L,53147L,53148L,53149L,53150L,53151L,53152L, -53153L,53154L,53155L,53156L,53157L,53158L,53159L,53160L,53161L,53162L, -53163L,53164L,53165L,53166L,53167L,53168L,53169L,53170L,53171L,53172L, -53173L,53174L,53175L,53176L,53177L,53178L,53179L,53180L,53181L,53182L, -53183L,53184L,53185L,53186L,53187L,53188L,53189L,53190L,53191L,53192L, -53193L,53194L,53195L,53196L,53197L,53198L,53199L,53200L,53201L,53202L, -53203L,53204L,53205L,53206L,53207L,53208L,53209L,53210L,53211L,53212L, -53213L,53214L,53215L,53216L,53217L,53218L,53219L,53220L,53221L,53222L, -53223L,53224L,53225L,53226L,53227L,53228L,53229L,53230L,53231L,53232L, -53233L,53234L,53235L,53236L,53237L,53238L,53239L,53240L,53241L,53242L, -53243L,53244L,53245L,53246L,53247L,53248L,53249L,53250L,53251L,53252L, -53253L,53254L,53255L,53256L,53257L,53258L,53259L,53260L,53261L,53262L, -53263L,53264L,53265L,53266L,53267L,53268L,53269L,53270L,53271L,53272L, -53273L,53274L,53275L,53276L,53277L,53278L,53279L,53280L,53281L,53282L, -53283L,53284L,53285L,53286L,53287L,53288L,53289L,53290L,53291L,53292L, -53293L,53294L,53295L,53296L,53297L,53298L,53299L,53300L,53301L,53302L, -53303L,53304L,53305L,53306L,53307L,53308L,53309L,53310L,53311L,53312L, -53313L,53314L,53315L,53316L,53317L,53318L,53319L,53320L,53321L,53322L, -53323L,53324L,53325L,53326L,53327L,53328L,53329L,53330L,53331L,53332L, -53333L,53334L,53335L,53336L,53337L,53338L,53339L,53340L,53341L,53342L, -53343L,53344L,53345L,53346L,53347L,53348L,53349L,53350L,53351L,53352L, -53353L,53354L,53355L,53356L,53357L,53358L,53359L,53360L,53361L,53362L, -53363L,53364L,53365L,53366L,53367L,53368L,53369L,53370L,53371L,53372L, -53373L,53374L,53375L,53376L,53377L,53378L,53379L,53380L,53381L,53382L, -53383L,53384L,53385L,53386L,53387L,53388L,53389L,53390L,53391L,53392L, -53393L,53394L,53395L,53396L,53397L,53398L,53399L,53400L,53401L,53402L, -53403L,53404L,53405L,53406L,53407L,53408L,53409L,53410L,53411L,53412L, -53413L,53414L,53415L,53416L,53417L,53418L,53419L,53420L,53421L,53422L, -53423L,53424L,53425L,53426L,53427L,53428L,53429L,53430L,53431L,53432L, -53433L,53434L,53435L,53436L,53437L,53438L,53439L,53440L,53441L,53442L, -53443L,53444L,53445L,53446L,53447L,53448L,53449L,53450L,53451L,53452L, -53453L,53454L,53455L,53456L,53457L,53458L,53459L,53460L,53461L,53462L, -53463L,53464L,53465L,53466L,53467L,53468L,53469L,53470L,53471L,53472L, -53473L,53474L,53475L,53476L,53477L,53478L,53479L,53480L,53481L,53482L, -53483L,53484L,53485L,53486L,53487L,53488L,53489L,53490L,53491L,53492L, -53493L,53494L,53495L,53496L,53497L,53498L,53499L,53500L,53501L,53502L, -53503L,53504L,53505L,53506L,53507L,53508L,53509L,53510L,53511L,53512L, -53513L,53514L,53515L,53516L,53517L,53518L,53519L,53520L,53521L,53522L, -53523L,53524L,53525L,53526L,53527L,53528L,53529L,53530L,53531L,53532L, -53533L,53534L,53535L,53536L,53537L,53538L,53539L,53540L,53541L,53542L, -53543L,53544L,53545L,53546L,53547L,53548L,53549L,53550L,53551L,53552L, -53553L,53554L,53555L,53556L,53557L,53558L,53559L,53560L,53561L,53562L, -53563L,53564L,53565L,53566L,53567L,53568L,53569L,53570L,53571L,53572L, -53573L,53574L,53575L,53576L,53577L,53578L,53579L,53580L,53581L,53582L, -53583L,53584L,53585L,53586L,53587L,53588L,53589L,53590L,53591L,53592L, -53593L,53594L,53595L,53596L,53597L,53598L,53599L,53600L,53601L,53602L, -53603L,53604L,53605L,53606L,53607L,53608L,53609L,53610L,53611L,53612L, -53613L,53614L,53615L,53616L,53617L,53618L,53619L,53620L,53621L,53622L, -53623L,53624L,53625L,53626L,53627L,53628L,53629L,53630L,53631L,53632L, -53633L,53634L,53635L,53636L,53637L,53638L,53639L,53640L,53641L,53642L, -53643L,53644L,53645L,53646L,53647L,53648L,53649L,53650L,53651L,53652L, -53653L,53654L,53655L,53656L,53657L,53658L,53659L,53660L,53661L,53662L, -53663L,53664L,53665L,53666L,53667L,53668L,53669L,53670L,53671L,53672L, -53673L,53674L,53675L,53676L,53677L,53678L,53679L,53680L,53681L,53682L, -53683L,53684L,53685L,53686L,53687L,53688L,53689L,53690L,53691L,53692L, -53693L,53694L,53695L,53696L,53697L,53698L,53699L,53700L,53701L,53702L, -53703L,53704L,53705L,53706L,53707L,53708L,53709L,53710L,53711L,53712L, -53713L,53714L,53715L,53716L,53717L,53718L,53719L,53720L,53721L,53722L, -53723L,53724L,53725L,53726L,53727L,53728L,53729L,53730L,53731L,53732L, -53733L,53734L,53735L,53736L,53737L,53738L,53739L,53740L,53741L,53742L, -53743L,53744L,53745L,53746L,53747L,53748L,53749L,53750L,53751L,53752L, -53753L,53754L,53755L,53756L,53757L,53758L,53759L,53760L,53761L,53762L, -53763L,53764L,53765L,53766L,53767L,53768L,53769L,53770L,53771L,53772L, -53773L,53774L,53775L,53776L,53777L,53778L,53779L,53780L,53781L,53782L, -53783L,53784L,53785L,53786L,53787L,53788L,53789L,53790L,53791L,53792L, -53793L,53794L,53795L,53796L,53797L,53798L,53799L,53800L,53801L,53802L, -53803L,53804L,53805L,53806L,53807L,53808L,53809L,53810L,53811L,53812L, -53813L,53814L,53815L,53816L,53817L,53818L,53819L,53820L,53821L,53822L, -53823L,53824L,53825L,53826L,53827L,53828L,53829L,53830L,53831L,53832L, -53833L,53834L,53835L,53836L,53837L,53838L,53839L,53840L,53841L,53842L, -53843L,53844L,53845L,53846L,53847L,53848L,53849L,53850L,53851L,53852L, -53853L,53854L,53855L,53856L,53857L,53858L,53859L,53860L,53861L,53862L, -53863L,53864L,53865L,53866L,53867L,53868L,53869L,53870L,53871L,53872L, -53873L,53874L,53875L,53876L,53877L,53878L,53879L,53880L,53881L,53882L, -53883L,53884L,53885L,53886L,53887L,53888L,53889L,53890L,53891L,53892L, -53893L,53894L,53895L,53896L,53897L,53898L,53899L,53900L,53901L,53902L, -53903L,53904L,53905L,53906L,53907L,53908L,53909L,53910L,53911L,53912L, -53913L,53914L,53915L,53916L,53917L,53918L,53919L,53920L,53921L,53922L, -53923L,53924L,53925L,53926L,53927L,53928L,53929L,53930L,53931L,53932L, -53933L,53934L,53935L,53936L,53937L,53938L,53939L,53940L,53941L,53942L, -53943L,53944L,53945L,53946L,53947L,53948L,53949L,53950L,53951L,53952L, -53953L,53954L,53955L,53956L,53957L,53958L,53959L,53960L,53961L,53962L, -53963L,53964L,53965L,53966L,53967L,53968L,53969L,53970L,53971L,53972L, -53973L,53974L,53975L,53976L,53977L,53978L,53979L,53980L,53981L,53982L, -53983L,53984L,53985L,53986L,53987L,53988L,53989L,53990L,53991L,53992L, -53993L,53994L,53995L,53996L,53997L,53998L,53999L,54000L,54001L,54002L, -54003L,54004L,54005L,54006L,54007L,54008L,54009L,54010L,54011L,54012L, -54013L,54014L,54015L,54016L,54017L,54018L,54019L,54020L,54021L,54022L, -54023L,54024L,54025L,54026L,54027L,54028L,54029L,54030L,54031L,54032L, -54033L,54034L,54035L,54036L,54037L,54038L,54039L,54040L,54041L,54042L, -54043L,54044L,54045L,54046L,54047L,54048L,54049L,54050L,54051L,54052L, -54053L,54054L,54055L,54056L,54057L,54058L,54059L,54060L,54061L,54062L, -54063L,54064L,54065L,54066L,54067L,54068L,54069L,54070L,54071L,54072L, -54073L,54074L,54075L,54076L,54077L,54078L,54079L,54080L,54081L,54082L, -54083L,54084L,54085L,54086L,54087L,54088L,54089L,54090L,54091L,54092L, -54093L,54094L,54095L,54096L,54097L,54098L,54099L,54100L,54101L,54102L, -54103L,54104L,54105L,54106L,54107L,54108L,54109L,54110L,54111L,54112L, -54113L,54114L,54115L,54116L,54117L,54118L,54119L,54120L,54121L,54122L, -54123L,54124L,54125L,54126L,54127L,54128L,54129L,54130L,54131L,54132L, -54133L,54134L,54135L,54136L,54137L,54138L,54139L,54140L,54141L,54142L, -54143L,54144L,54145L,54146L,54147L,54148L,54149L,54150L,54151L,54152L, -54153L,54154L,54155L,54156L,54157L,54158L,54159L,54160L,54161L,54162L, -54163L,54164L,54165L,54166L,54167L,54168L,54169L,54170L,54171L,54172L, -54173L,54174L,54175L,54176L,54177L,54178L,54179L,54180L,54181L,54182L, -54183L,54184L,54185L,54186L,54187L,54188L,54189L,54190L,54191L,54192L, -54193L,54194L,54195L,54196L,54197L,54198L,54199L,54200L,54201L,54202L, -54203L,54204L,54205L,54206L,54207L,54208L,54209L,54210L,54211L,54212L, -54213L,54214L,54215L,54216L,54217L,54218L,54219L,54220L,54221L,54222L, -54223L,54224L,54225L,54226L,54227L,54228L,54229L,54230L,54231L,54232L, -54233L,54234L,54235L,54236L,54237L,54238L,54239L,54240L,54241L,54242L, -54243L,54244L,54245L,54246L,54247L,54248L,54249L,54250L,54251L,54252L, -54253L,54254L,54255L,54256L,54257L,54258L,54259L,54260L,54261L,54262L, -54263L,54264L,54265L,54266L,54267L,54268L,54269L,54270L,54271L,54272L, -54273L,54274L,54275L,54276L,54277L,54278L,54279L,54280L,54281L,54282L, -54283L,54284L,54285L,54286L,54287L,54288L,54289L,54290L,54291L,54292L, -54293L,54294L,54295L,54296L,54297L,54298L,54299L,54300L,54301L,54302L, -54303L,54304L,54305L,54306L,54307L,54308L,54309L,54310L,54311L,54312L, -54313L,54314L,54315L,54316L,54317L,54318L,54319L,54320L,54321L,54322L, -54323L,54324L,54325L,54326L,54327L,54328L,54329L,54330L,54331L,54332L, -54333L,54334L,54335L,54336L,54337L,54338L,54339L,54340L,54341L,54342L, -54343L,54344L,54345L,54346L,54347L,54348L,54349L,54350L,54351L,54352L, -54353L,54354L,54355L,54356L,54357L,54358L,54359L,54360L,54361L,54362L, -54363L,54364L,54365L,54366L,54367L,54368L,54369L,54370L,54371L,54372L, -54373L,54374L,54375L,54376L,54377L,54378L,54379L,54380L,54381L,54382L, -54383L,54384L,54385L,54386L,54387L,54388L,54389L,54390L,54391L,54392L, -54393L,54394L,54395L,54396L,54397L,54398L,54399L,54400L,54401L,54402L, -54403L,54404L,54405L,54406L,54407L,54408L,54409L,54410L,54411L,54412L, -54413L,54414L,54415L,54416L,54417L,54418L,54419L,54420L,54421L,54422L, -54423L,54424L,54425L,54426L,54427L,54428L,54429L,54430L,54431L,54432L, -54433L,54434L,54435L,54436L,54437L,54438L,54439L,54440L,54441L,54442L, -54443L,54444L,54445L,54446L,54447L,54448L,54449L,54450L,54451L,54452L, -54453L,54454L,54455L,54456L,54457L,54458L,54459L,54460L,54461L,54462L, -54463L,54464L,54465L,54466L,54467L,54468L,54469L,54470L,54471L,54472L, -54473L,54474L,54475L,54476L,54477L,54478L,54479L,54480L,54481L,54482L, -54483L,54484L,54485L,54486L,54487L,54488L,54489L,54490L,54491L,54492L, -54493L,54494L,54495L,54496L,54497L,54498L,54499L,54500L,54501L,54502L, -54503L,54504L,54505L,54506L,54507L,54508L,54509L,54510L,54511L,54512L, -54513L,54514L,54515L,54516L,54517L,54518L,54519L,54520L,54521L,54522L, -54523L,54524L,54525L,54526L,54527L,54528L,54529L,54530L,54531L,54532L, -54533L,54534L,54535L,54536L,54537L,54538L,54539L,54540L,54541L,54542L, -54543L,54544L,54545L,54546L,54547L,54548L,54549L,54550L,54551L,54552L, -54553L,54554L,54555L,54556L,54557L,54558L,54559L,54560L,54561L,54562L, -54563L,54564L,54565L,54566L,54567L,54568L,54569L,54570L,54571L,54572L, -54573L,54574L,54575L,54576L,54577L,54578L,54579L,54580L,54581L,54582L, -54583L,54584L,54585L,54586L,54587L,54588L,54589L,54590L,54591L,54592L, -54593L,54594L,54595L,54596L,54597L,54598L,54599L,54600L,54601L,54602L, -54603L,54604L,54605L,54606L,54607L,54608L,54609L,54610L,54611L,54612L, -54613L,54614L,54615L,54616L,54617L,54618L,54619L,54620L,54621L,54622L, -54623L,54624L,54625L,54626L,54627L,54628L,54629L,54630L,54631L,54632L, -54633L,54634L,54635L,54636L,54637L,54638L,54639L,54640L,54641L,54642L, -54643L,54644L,54645L,54646L,54647L,54648L,54649L,54650L,54651L,54652L, -54653L,54654L,54655L,54656L,54657L,54658L,54659L,54660L,54661L,54662L, -54663L,54664L,54665L,54666L,54667L,54668L,54669L,54670L,54671L,54672L, -54673L,54674L,54675L,54676L,54677L,54678L,54679L,54680L,54681L,54682L, -54683L,54684L,54685L,54686L,54687L,54688L,54689L,54690L,54691L,54692L, -54693L,54694L,54695L,54696L,54697L,54698L,54699L,54700L,54701L,54702L, -54703L,54704L,54705L,54706L,54707L,54708L,54709L,54710L,54711L,54712L, -54713L,54714L,54715L,54716L,54717L,54718L,54719L,54720L,54721L,54722L, -54723L,54724L,54725L,54726L,54727L,54728L,54729L,54730L,54731L,54732L, -54733L,54734L,54735L,54736L,54737L,54738L,54739L,54740L,54741L,54742L, -54743L,54744L,54745L,54746L,54747L,54748L,54749L,54750L,54751L,54752L, -54753L,54754L,54755L,54756L,54757L,54758L,54759L,54760L,54761L,54762L, -54763L,54764L,54765L,54766L,54767L,54768L,54769L,54770L,54771L,54772L, -54773L,54774L,54775L,54776L,54777L,54778L,54779L,54780L,54781L,54782L, -54783L,54784L,54785L,54786L,54787L,54788L,54789L,54790L,54791L,54792L, -54793L,54794L,54795L,54796L,54797L,54798L,54799L,54800L,54801L,54802L, -54803L,54804L,54805L,54806L,54807L,54808L,54809L,54810L,54811L,54812L, -54813L,54814L,54815L,54816L,54817L,54818L,54819L,54820L,54821L,54822L, -54823L,54824L,54825L,54826L,54827L,54828L,54829L,54830L,54831L,54832L, -54833L,54834L,54835L,54836L,54837L,54838L,54839L,54840L,54841L,54842L, -54843L,54844L,54845L,54846L,54847L,54848L,54849L,54850L,54851L,54852L, -54853L,54854L,54855L,54856L,54857L,54858L,54859L,54860L,54861L,54862L, -54863L,54864L,54865L,54866L,54867L,54868L,54869L,54870L,54871L,54872L, -54873L,54874L,54875L,54876L,54877L,54878L,54879L,54880L,54881L,54882L, -54883L,54884L,54885L,54886L,54887L,54888L,54889L,54890L,54891L,54892L, -54893L,54894L,54895L,54896L,54897L,54898L,54899L,54900L,54901L,54902L, -54903L,54904L,54905L,54906L,54907L,54908L,54909L,54910L,54911L,54912L, -54913L,54914L,54915L,54916L,54917L,54918L,54919L,54920L,54921L,54922L, -54923L,54924L,54925L,54926L,54927L,54928L,54929L,54930L,54931L,54932L, -54933L,54934L,54935L,54936L,54937L,54938L,54939L,54940L,54941L,54942L, -54943L,54944L,54945L,54946L,54947L,54948L,54949L,54950L,54951L,54952L, -54953L,54954L,54955L,54956L,54957L,54958L,54959L,54960L,54961L,54962L, -54963L,54964L,54965L,54966L,54967L,54968L,54969L,54970L,54971L,54972L, -54973L,54974L,54975L,54976L,54977L,54978L,54979L,54980L,54981L,54982L, -54983L,54984L,54985L,54986L,54987L,54988L,54989L,54990L,54991L,54992L, -54993L,54994L,54995L,54996L,54997L,54998L,54999L,55000L,55001L,55002L, -55003L,55004L,55005L,55006L,55007L,55008L,55009L,55010L,55011L,55012L, -55013L,55014L,55015L,55016L,55017L,55018L,55019L,55020L,55021L,55022L, -55023L,55024L,55025L,55026L,55027L,55028L,55029L,55030L,55031L,55032L, -55033L,55034L,55035L,55036L,55037L,55038L,55039L,55040L,55041L,55042L, -55043L,55044L,55045L,55046L,55047L,55048L,55049L,55050L,55051L,55052L, -55053L,55054L,55055L,55056L,55057L,55058L,55059L,55060L,55061L,55062L, -55063L,55064L,55065L,55066L,55067L,55068L,55069L,55070L,55071L,55072L, -55073L,55074L,55075L,55076L,55077L,55078L,55079L,55080L,55081L,55082L, -55083L,55084L,55085L,55086L,55087L,55088L,55089L,55090L,55091L,55092L, -55093L,55094L,55095L,55096L,55097L,55098L,55099L,55100L,55101L,55102L, -55103L,55104L,55105L,55106L,55107L,55108L,55109L,55110L,55111L,55112L, -55113L,55114L,55115L,55116L,55117L,55118L,55119L,55120L,55121L,55122L, -55123L,55124L,55125L,55126L,55127L,55128L,55129L,55130L,55131L,55132L, -55133L,55134L,55135L,55136L,55137L,55138L,55139L,55140L,55141L,55142L, -55143L,55144L,55145L,55146L,55147L,55148L,55149L,55150L,55151L,55152L, -55153L,55154L,55155L,55156L,55157L,55158L,55159L,55160L,55161L,55162L, -55163L,55164L,55165L,55166L,55167L,55168L,55169L,55170L,55171L,55172L, -55173L,55174L,55175L,55176L,55177L,55178L,55179L,55180L,55181L,55182L, -55183L,55184L,55185L,55186L,55187L,55188L,55189L,55190L,55191L,55192L, -55193L,55194L,55195L,55196L,55197L,55198L,55199L,55200L,55201L,55202L, -55203L,55204L,55205L,55206L,55207L,55208L,55209L,55210L,55211L,55212L, -55213L,55214L,55215L,55216L,55217L,55218L,55219L,55220L,55221L,55222L, -55223L,55224L,55225L,55226L,55227L,55228L,55229L,55230L,55231L,55232L, -55233L,55234L,55235L,55236L,55237L,55238L,55239L,55240L,55241L,55242L, -55243L,55244L,55245L,55246L,55247L,55248L,55249L,55250L,55251L,55252L, -55253L,55254L,55255L,55256L,55257L,55258L,55259L,55260L,55261L,55262L, -55263L,55264L,55265L,55266L,55267L,55268L,55269L,55270L,55271L,55272L, -55273L,55274L,55275L,55276L,55277L,55278L,55279L,55280L,55281L,55282L, -55283L,55284L,55285L,55286L,55287L,55288L,55289L,55290L,55291L,55292L, -55293L,55294L,55295L,55296L,55297L,55298L,55299L,55300L,55301L,55302L, -55303L,55304L,55305L,55306L,55307L,55308L,55309L,55310L,55311L,55312L, -55313L,55314L,55315L,55316L,55317L,55318L,55319L,55320L,55321L,55322L, -55323L,55324L,55325L,55326L,55327L,55328L,55329L,55330L,55331L,55332L, -55333L,55334L,55335L,55336L,55337L,55338L,55339L,55340L,55341L,55342L, -55343L,55344L,55345L,55346L,55347L,55348L,55349L,55350L,55351L,55352L, -55353L,55354L,55355L,55356L,55357L,55358L,55359L,55360L,55361L,55362L, -55363L,55364L,55365L,55366L,55367L,55368L,55369L,55370L,55371L,55372L, -55373L,55374L,55375L,55376L,55377L,55378L,55379L,55380L,55381L,55382L, -55383L,55384L,55385L,55386L,55387L,55388L,55389L,55390L,55391L,55392L, -55393L,55394L,55395L,55396L,55397L,55398L,55399L,55400L,55401L,55402L, -55403L,55404L,55405L,55406L,55407L,55408L,55409L,55410L,55411L,55412L, -55413L,55414L,55415L,55416L,55417L,55418L,55419L,55420L,55421L,55422L, -55423L,55424L,55425L,55426L,55427L,55428L,55429L,55430L,55431L,55432L, -55433L,55434L,55435L,55436L,55437L,55438L,55439L,55440L,55441L,55442L, -55443L,55444L,55445L,55446L,55447L,55448L,55449L,55450L,55451L,55452L, -55453L,55454L,55455L,55456L,55457L,55458L,55459L,55460L,55461L,55462L, -55463L,55464L,55465L,55466L,55467L,55468L,55469L,55470L,55471L,55472L, -55473L,55474L,55475L,55476L,55477L,55478L,55479L,55480L,55481L,55482L, -55483L,55484L,55485L,55486L,55487L,55488L,55489L,55490L,55491L,55492L, -55493L,55494L,55495L,55496L,55497L,55498L,55499L,55500L,55501L,55502L, -55503L,55504L,55505L,55506L,55507L,55508L,55509L,55510L,55511L,55512L, -55513L,55514L,55515L,55516L,55517L,55518L,55519L,55520L,55521L,55522L, -55523L,55524L,55525L,55526L,55527L,55528L,55529L,55530L,55531L,55532L, -55533L,55534L,55535L,55536L,55537L,55538L,55539L,55540L,55541L,55542L, -55543L,55544L,55545L,55546L,55547L,55548L,55549L,55550L,55551L,55552L, -55553L,55554L,55555L,55556L,55557L,55558L,55559L,55560L,55561L,55562L, -55563L,55564L,55565L,55566L,55567L,55568L,55569L,55570L,55571L,55572L, -55573L,55574L,55575L,55576L,55577L,55578L,55579L,55580L,55581L,55582L, -55583L,55584L,55585L,55586L,55587L,55588L,55589L,55590L,55591L,55592L, -55593L,55594L,55595L,55596L,55597L,55598L,55599L,55600L,55601L,55602L, -55603L,55604L,55605L,55606L,55607L,55608L,55609L,55610L,55611L,55612L, -55613L,55614L,55615L,55616L,55617L,55618L,55619L,55620L,55621L,55622L, -55623L,55624L,55625L,55626L,55627L,55628L,55629L,55630L,55631L,55632L, -55633L,55634L,55635L,55636L,55637L,55638L,55639L,55640L,55641L,55642L, -55643L,55644L,55645L,55646L,55647L,55648L,55649L,55650L,55651L,55652L, -55653L,55654L,55655L,55656L,55657L,55658L,55659L,55660L,55661L,55662L, -55663L,55664L,55665L,55666L,55667L,55668L,55669L,55670L,55671L,55672L, -55673L,55674L,55675L,55676L,55677L,55678L,55679L,55680L,55681L,55682L, -55683L,55684L,55685L,55686L,55687L,55688L,55689L,55690L,55691L,55692L, -55693L,55694L,55695L,55696L,55697L,55698L,55699L,55700L,55701L,55702L, -55703L,55704L,55705L,55706L,55707L,55708L,55709L,55710L,55711L,55712L, -55713L,55714L,55715L,55716L,55717L,55718L,55719L,55720L,55721L,55722L, -55723L,55724L,55725L,55726L,55727L,55728L,55729L,55730L,55731L,55732L, -55733L,55734L,55735L,55736L,55737L,55738L,55739L,55740L,55741L,55742L, -55743L,55744L,55745L,55746L,55747L,55748L,55749L,55750L,55751L,55752L, -55753L,55754L,55755L,55756L,55757L,55758L,55759L,55760L,55761L,55762L, -55763L,55764L,55765L,55766L,55767L,55768L,55769L,55770L,55771L,55772L, -55773L,55774L,55775L,55776L,55777L,55778L,55779L,55780L,55781L,55782L, -55783L,55784L,55785L,55786L,55787L,55788L,55789L,55790L,55791L,55792L, -55793L,55794L,55795L,55796L,55797L,55798L,55799L,55800L,55801L,55802L, -55803L,55804L,55805L,55806L,55807L,55808L,55809L,55810L,55811L,55812L, -55813L,55814L,55815L,55816L,55817L,55818L,55819L,55820L,55821L,55822L, -55823L,55824L,55825L,55826L,55827L,55828L,55829L,55830L,55831L,55832L, -55833L,55834L,55835L,55836L,55837L,55838L,55839L,55840L,55841L,55842L, -55843L,55844L,55845L,55846L,55847L,55848L,55849L,55850L,55851L,55852L, -55853L,55854L,55855L,55856L,55857L,55858L,55859L,55860L,55861L,55862L, -55863L,55864L,55865L,55866L,55867L,55868L,55869L,55870L,55871L,55872L, -55873L,55874L,55875L,55876L,55877L,55878L,55879L,55880L,55881L,55882L, -55883L,55884L,55885L,55886L,55887L,55888L,55889L,55890L,55891L,55892L, -55893L,55894L,55895L,55896L,55897L,55898L,55899L,55900L,55901L,55902L, -55903L,55904L,55905L,55906L,55907L,55908L,55909L,55910L,55911L,55912L, -55913L,55914L,55915L,55916L,55917L,55918L,55919L,55920L,55921L,55922L, -55923L,55924L,55925L,55926L,55927L,55928L,55929L,55930L,55931L,55932L, -55933L,55934L,55935L,55936L,55937L,55938L,55939L,55940L,55941L,55942L, -55943L,55944L,55945L,55946L,55947L,55948L,55949L,55950L,55951L,55952L, -55953L,55954L,55955L,55956L,55957L,55958L,55959L,55960L,55961L,55962L, -55963L,55964L,55965L,55966L,55967L,55968L,55969L,55970L,55971L,55972L, -55973L,55974L,55975L,55976L,55977L,55978L,55979L,55980L,55981L,55982L, -55983L,55984L,55985L,55986L,55987L,55988L,55989L,55990L,55991L,55992L, -55993L,55994L,55995L,55996L,55997L,55998L,55999L,56000L,56001L,56002L, -56003L,56004L,56005L,56006L,56007L,56008L,56009L,56010L,56011L,56012L, -56013L,56014L,56015L,56016L,56017L,56018L,56019L,56020L,56021L,56022L, -56023L,56024L,56025L,56026L,56027L,56028L,56029L,56030L,56031L,56032L, -56033L,56034L,56035L,56036L,56037L,56038L,56039L,56040L,56041L,56042L, -56043L,56044L,56045L,56046L,56047L,56048L,56049L,56050L,56051L,56052L, -56053L,56054L,56055L,56056L,56057L,56058L,56059L,56060L,56061L,56062L, -56063L,56064L,56065L,56066L,56067L,56068L,56069L,56070L,56071L,56072L, -56073L,56074L,56075L,56076L,56077L,56078L,56079L,56080L,56081L,56082L, -56083L,56084L,56085L,56086L,56087L,56088L,56089L,56090L,56091L,56092L, -56093L,56094L,56095L,56096L,56097L,56098L,56099L,56100L,56101L,56102L, -56103L,56104L,56105L,56106L,56107L,56108L,56109L,56110L,56111L,56112L, -56113L,56114L,56115L,56116L,56117L,56118L,56119L,56120L,56121L,56122L, -56123L,56124L,56125L,56126L,56127L,56128L,56129L,56130L,56131L,56132L, -56133L,56134L,56135L,56136L,56137L,56138L,56139L,56140L,56141L,56142L, -56143L,56144L,56145L,56146L,56147L,56148L,56149L,56150L,56151L,56152L, -56153L,56154L,56155L,56156L,56157L,56158L,56159L,56160L,56161L,56162L, -56163L,56164L,56165L,56166L,56167L,56168L,56169L,56170L,56171L,56172L, -56173L,56174L,56175L,56176L,56177L,56178L,56179L,56180L,56181L,56182L, -56183L,56184L,56185L,56186L,56187L,56188L,56189L,56190L,56191L,56192L, -56193L,56194L,56195L,56196L,56197L,56198L,56199L,56200L,56201L,56202L, -56203L,56204L,56205L,56206L,56207L,56208L,56209L,56210L,56211L,56212L, -56213L,56214L,56215L,56216L,56217L,56218L,56219L,56220L,56221L,56222L, -56223L,56224L,56225L,56226L,56227L,56228L,56229L,56230L,56231L,56232L, -56233L,56234L,56235L,56236L,56237L,56238L,56239L,56240L,56241L,56242L, -56243L,56244L,56245L,56246L,56247L,56248L,56249L,56250L,56251L,56252L, -56253L,56254L,56255L,56256L,56257L,56258L,56259L,56260L,56261L,56262L, -56263L,56264L,56265L,56266L,56267L,56268L,56269L,56270L,56271L,56272L, -56273L,56274L,56275L,56276L,56277L,56278L,56279L,56280L,56281L,56282L, -56283L,56284L,56285L,56286L,56287L,56288L,56289L,56290L,56291L,56292L, -56293L,56294L,56295L,56296L,56297L,56298L,56299L,56300L,56301L,56302L, -56303L,56304L,56305L,56306L,56307L,56308L,56309L,56310L,56311L,56312L, -56313L,56314L,56315L,56316L,56317L,56318L,56319L,56320L,56321L,56322L, -56323L,56324L,56325L,56326L,56327L,56328L,56329L,56330L,56331L,56332L, -56333L,56334L,56335L,56336L,56337L,56338L,56339L,56340L,56341L,56342L, -56343L,56344L,56345L,56346L,56347L,56348L,56349L,56350L,56351L,56352L, -56353L,56354L,56355L,56356L,56357L,56358L,56359L,56360L,56361L,56362L, -56363L,56364L,56365L,56366L,56367L,56368L,56369L,56370L,56371L,56372L, -56373L,56374L,56375L,56376L,56377L,56378L,56379L,56380L,56381L,56382L, -56383L,56384L,56385L,56386L,56387L,56388L,56389L,56390L,56391L,56392L, -56393L,56394L,56395L,56396L,56397L,56398L,56399L,56400L,56401L,56402L, -56403L,56404L,56405L,56406L,56407L,56408L,56409L,56410L,56411L,56412L, -56413L,56414L,56415L,56416L,56417L,56418L,56419L,56420L,56421L,56422L, -56423L,56424L,56425L,56426L,56427L,56428L,56429L,56430L,56431L,56432L, -56433L,56434L,56435L,56436L,56437L,56438L,56439L,56440L,56441L,56442L, -56443L,56444L,56445L,56446L,56447L,56448L,56449L,56450L,56451L,56452L, -56453L,56454L,56455L,56456L,56457L,56458L,56459L,56460L,56461L,56462L, -56463L,56464L,56465L,56466L,56467L,56468L,56469L,56470L,56471L,56472L, -56473L,56474L,56475L,56476L,56477L,56478L,56479L,56480L,56481L,56482L, -56483L,56484L,56485L,56486L,56487L,56488L,56489L,56490L,56491L,56492L, -56493L,56494L,56495L,56496L,56497L,56498L,56499L,56500L,56501L,56502L, -56503L,56504L,56505L,56506L,56507L,56508L,56509L,56510L,56511L,56512L, -56513L,56514L,56515L,56516L,56517L,56518L,56519L,56520L,56521L,56522L, -56523L,56524L,56525L,56526L,56527L,56528L,56529L,56530L,56531L,56532L, -56533L,56534L,56535L,56536L,56537L,56538L,56539L,56540L,56541L,56542L, -56543L,56544L,56545L,56546L,56547L,56548L,56549L,56550L,56551L,56552L, -56553L,56554L,56555L,56556L,56557L,56558L,56559L,56560L,56561L,56562L, -56563L,56564L,56565L,56566L,56567L,56568L,56569L,56570L,56571L,56572L, -56573L,56574L,56575L,56576L,56577L,56578L,56579L,56580L,56581L,56582L, -56583L,56584L,56585L,56586L,56587L,56588L,56589L,56590L,56591L,56592L, -56593L,56594L,56595L,56596L,56597L,56598L,56599L,56600L,56601L,56602L, -56603L,56604L,56605L,56606L,56607L,56608L,56609L,56610L,56611L,56612L, -56613L,56614L,56615L,56616L,56617L,56618L,56619L,56620L,56621L,56622L, -56623L,56624L,56625L,56626L,56627L,56628L,56629L,56630L,56631L,56632L, -56633L,56634L,56635L,56636L,56637L,56638L,56639L,56640L,56641L,56642L, -56643L,56644L,56645L,56646L,56647L,56648L,56649L,56650L,56651L,56652L, -56653L,56654L,56655L,56656L,56657L,56658L,56659L,56660L,56661L,56662L, -56663L,56664L,56665L,56666L,56667L,56668L,56669L,56670L,56671L,56672L, -56673L,56674L,56675L,56676L,56677L,56678L,56679L,56680L,56681L,56682L, -56683L,56684L,56685L,56686L,56687L,56688L,56689L,56690L,56691L,56692L, -56693L,56694L,56695L,56696L,56697L,56698L,56699L,56700L,56701L,56702L, -56703L,56704L,56705L,56706L,56707L,56708L,56709L,56710L,56711L,56712L, -56713L,56714L,56715L,56716L,56717L,56718L,56719L,56720L,56721L,56722L, -56723L,56724L,56725L,56726L,56727L,56728L,56729L,56730L,56731L,56732L, -56733L,56734L,56735L,56736L,56737L,56738L,56739L,56740L,56741L,56742L, -56743L,56744L,56745L,56746L,56747L,56748L,56749L,56750L,56751L,56752L, -56753L,56754L,56755L,56756L,56757L,56758L,56759L,56760L,56761L,56762L, -56763L,56764L,56765L,56766L,56767L,56768L,56769L,56770L,56771L,56772L, -56773L,56774L,56775L,56776L,56777L,56778L,56779L,56780L,56781L,56782L, -56783L,56784L,56785L,56786L,56787L,56788L,56789L,56790L,56791L,56792L, -56793L,56794L,56795L,56796L,56797L,56798L,56799L,56800L,56801L,56802L, -56803L,56804L,56805L,56806L,56807L,56808L,56809L,56810L,56811L,56812L, -56813L,56814L,56815L,56816L,56817L,56818L,56819L,56820L,56821L,56822L, -56823L,56824L,56825L,56826L,56827L,56828L,56829L,56830L,56831L,56832L, -56833L,56834L,56835L,56836L,56837L,56838L,56839L,56840L,56841L,56842L, -56843L,56844L,56845L,56846L,56847L,56848L,56849L,56850L,56851L,56852L, -56853L,56854L,56855L,56856L,56857L,56858L,56859L,56860L,56861L,56862L, -56863L,56864L,56865L,56866L,56867L,56868L,56869L,56870L,56871L,56872L, -56873L,56874L,56875L,56876L,56877L,56878L,56879L,56880L,56881L,56882L, -56883L,56884L,56885L,56886L,56887L,56888L,56889L,56890L,56891L,56892L, -56893L,56894L,56895L,56896L,56897L,56898L,56899L,56900L,56901L,56902L, -56903L,56904L,56905L,56906L,56907L,56908L,56909L,56910L,56911L,56912L, -56913L,56914L,56915L,56916L,56917L,56918L,56919L,56920L,56921L,56922L, -56923L,56924L,56925L,56926L,56927L,56928L,56929L,56930L,56931L,56932L, -56933L,56934L,56935L,56936L,56937L,56938L,56939L,56940L,56941L,56942L, -56943L,56944L,56945L,56946L,56947L,56948L,56949L,56950L,56951L,56952L, -56953L,56954L,56955L,56956L,56957L,56958L,56959L,56960L,56961L,56962L, -56963L,56964L,56965L,56966L,56967L,56968L,56969L,56970L,56971L,56972L, -56973L,56974L,56975L,56976L,56977L,56978L,56979L,56980L,56981L,56982L, -56983L,56984L,56985L,56986L,56987L,56988L,56989L,56990L,56991L,56992L, -56993L,56994L,56995L,56996L,56997L,56998L,56999L,57000L,57001L,57002L, -57003L,57004L,57005L,57006L,57007L,57008L,57009L,57010L,57011L,57012L, -57013L,57014L,57015L,57016L,57017L,57018L,57019L,57020L,57021L,57022L, -57023L,57024L,57025L,57026L,57027L,57028L,57029L,57030L,57031L,57032L, -57033L,57034L,57035L,57036L,57037L,57038L,57039L,57040L,57041L,57042L, -57043L,57044L,57045L,57046L,57047L,57048L,57049L,57050L,57051L,57052L, -57053L,57054L,57055L,57056L,57057L,57058L,57059L,57060L,57061L,57062L, -57063L,57064L,57065L,57066L,57067L,57068L,57069L,57070L,57071L,57072L, -57073L,57074L,57075L,57076L,57077L,57078L,57079L,57080L,57081L,57082L, -57083L,57084L,57085L,57086L,57087L,57088L,57089L,57090L,57091L,57092L, -57093L,57094L,57095L,57096L,57097L,57098L,57099L,57100L,57101L,57102L, -57103L,57104L,57105L,57106L,57107L,57108L,57109L,57110L,57111L,57112L, -57113L,57114L,57115L,57116L,57117L,57118L,57119L,57120L,57121L,57122L, -57123L,57124L,57125L,57126L,57127L,57128L,57129L,57130L,57131L,57132L, -57133L,57134L,57135L,57136L,57137L,57138L,57139L,57140L,57141L,57142L, -57143L,57144L,57145L,57146L,57147L,57148L,57149L,57150L,57151L,57152L, -57153L,57154L,57155L,57156L,57157L,57158L,57159L,57160L,57161L,57162L, -57163L,57164L,57165L,57166L,57167L,57168L,57169L,57170L,57171L,57172L, -57173L,57174L,57175L,57176L,57177L,57178L,57179L,57180L,57181L,57182L, -57183L,57184L,57185L,57186L,57187L,57188L,57189L,57190L,57191L,57192L, -57193L,57194L,57195L,57196L,57197L,57198L,57199L,57200L,57201L,57202L, -57203L,57204L,57205L,57206L,57207L,57208L,57209L,57210L,57211L,57212L, -57213L,57214L,57215L,57216L,57217L,57218L,57219L,57220L,57221L,57222L, -57223L,57224L,57225L,57226L,57227L,57228L,57229L,57230L,57231L,57232L, -57233L,57234L,57235L,57236L,57237L,57238L,57239L,57240L,57241L,57242L, -57243L,57244L,57245L,57246L,57247L,57248L,57249L,57250L,57251L,57252L, -57253L,57254L,57255L,57256L,57257L,57258L,57259L,57260L,57261L,57262L, -57263L,57264L,57265L,57266L,57267L,57268L,57269L,57270L,57271L,57272L, -57273L,57274L,57275L,57276L,57277L,57278L,57279L,57280L,57281L,57282L, -57283L,57284L,57285L,57286L,57287L,57288L,57289L,57290L,57291L,57292L, -57293L,57294L,57295L,57296L,57297L,57298L,57299L,57300L,57301L,57302L, -57303L,57304L,57305L,57306L,57307L,57308L,57309L,57310L,57311L,57312L, -57313L,57314L,57315L,57316L,57317L,57318L,57319L,57320L,57321L,57322L, -57323L,57324L,57325L,57326L,57327L,57328L,57329L,57330L,57331L,57332L, -57333L,57334L,57335L,57336L,57337L,57338L,57339L,57340L,57341L,57342L, -57343L,57344L,57345L,57346L,57347L,57348L,57349L,57350L,57351L,57352L, -57353L,57354L,57355L,57356L,57357L,57358L,57359L,57360L,57361L,57362L, -57363L,57364L,57365L,57366L,57367L,57368L,57369L,57370L,57371L,57372L, -57373L,57374L,57375L,57376L,57377L,57378L,57379L,57380L,57381L,57382L, -57383L,57384L,57385L,57386L,57387L,57388L,57389L,57390L,57391L,57392L, -57393L,57394L,57395L,57396L,57397L,57398L,57399L,57400L,57401L,57402L, -57403L,57404L,57405L,57406L,57407L,57408L,57409L,57410L,57411L,57412L, -57413L,57414L,57415L,57416L,57417L,57418L,57419L,57420L,57421L,57422L, -57423L,57424L,57425L,57426L,57427L,57428L,57429L,57430L,57431L,57432L, -57433L,57434L,57435L,57436L,57437L,57438L,57439L,57440L,57441L,57442L, -57443L,57444L,57445L,57446L,57447L,57448L,57449L,57450L,57451L,57452L, -57453L,57454L,57455L,57456L,57457L,57458L,57459L,57460L,57461L,57462L, -57463L,57464L,57465L,57466L,57467L,57468L,57469L,57470L,57471L,57472L, -57473L,57474L,57475L,57476L,57477L,57478L,57479L,57480L,57481L,57482L, -57483L,57484L,57485L,57486L,57487L,57488L,57489L,57490L,57491L,57492L, -57493L,57494L,57495L,57496L,57497L,57498L,57499L,57500L,57501L,57502L, -57503L,57504L,57505L,57506L,57507L,57508L,57509L,57510L,57511L,57512L, -57513L,57514L,57515L,57516L,57517L,57518L,57519L,57520L,57521L,57522L, -57523L,57524L,57525L,57526L,57527L,57528L,57529L,57530L,57531L,57532L, -57533L,57534L,57535L,57536L,57537L,57538L,57539L,57540L,57541L,57542L, -57543L,57544L,57545L,57546L,57547L,57548L,57549L,57550L,57551L,57552L, -57553L,57554L,57555L,57556L,57557L,57558L,57559L,57560L,57561L,57562L, -57563L,57564L,57565L,57566L,57567L,57568L,57569L,57570L,57571L,57572L, -57573L,57574L,57575L,57576L,57577L,57578L,57579L,57580L,57581L,57582L, -57583L,57584L,57585L,57586L,57587L,57588L,57589L,57590L,57591L,57592L, -57593L,57594L,57595L,57596L,57597L,57598L,57599L,57600L,57601L,57602L, -57603L,57604L,57605L,57606L,57607L,57608L,57609L,57610L,57611L,57612L, -57613L,57614L,57615L,57616L,57617L,57618L,57619L,57620L,57621L,57622L, -57623L,57624L,57625L,57626L,57627L,57628L,57629L,57630L,57631L,57632L, -57633L,57634L,57635L,57636L,57637L,57638L,57639L,57640L,57641L,57642L, -57643L,57644L,57645L,57646L,57647L,57648L,57649L,57650L,57651L,57652L, -57653L,57654L,57655L,57656L,57657L,57658L,57659L,57660L,57661L,57662L, -57663L,57664L,57665L,57666L,57667L,57668L,57669L,57670L,57671L,57672L, -57673L,57674L,57675L,57676L,57677L,57678L,57679L,57680L,57681L,57682L, -57683L,57684L,57685L,57686L,57687L,57688L,57689L,57690L,57691L,57692L, -57693L,57694L,57695L,57696L,57697L,57698L,57699L,57700L,57701L,57702L, -57703L,57704L,57705L,57706L,57707L,57708L,57709L,57710L,57711L,57712L, -57713L,57714L,57715L,57716L,57717L,57718L,57719L,57720L,57721L,57722L, -57723L,57724L,57725L,57726L,57727L,57728L,57729L,57730L,57731L,57732L, -57733L,57734L,57735L,57736L,57737L,57738L,57739L,57740L,57741L,57742L, -57743L,57744L,57745L,57746L,57747L,57748L,57749L,57750L,57751L,57752L, -57753L,57754L,57755L,57756L,57757L,57758L,57759L,57760L,57761L,57762L, -57763L,57764L,57765L,57766L,57767L,57768L,57769L,57770L,57771L,57772L, -57773L,57774L,57775L,57776L,57777L,57778L,57779L,57780L,57781L,57782L, -57783L,57784L,57785L,57786L,57787L,57788L,57789L,57790L,57791L,57792L, -57793L,57794L,57795L,57796L,57797L,57798L,57799L,57800L,57801L,57802L, -57803L,57804L,57805L,57806L,57807L,57808L,57809L,57810L,57811L,57812L, -57813L,57814L,57815L,57816L,57817L,57818L,57819L,57820L,57821L,57822L, -57823L,57824L,57825L,57826L,57827L,57828L,57829L,57830L,57831L,57832L, -57833L,57834L,57835L,57836L,57837L,57838L,57839L,57840L,57841L,57842L, -57843L,57844L,57845L,57846L,57847L,57848L,57849L,57850L,57851L,57852L, -57853L,57854L,57855L,57856L,57857L,57858L,57859L,57860L,57861L,57862L, -57863L,57864L,57865L,57866L,57867L,57868L,57869L,57870L,57871L,57872L, -57873L,57874L,57875L,57876L,57877L,57878L,57879L,57880L,57881L,57882L, -57883L,57884L,57885L,57886L,57887L,57888L,57889L,57890L,57891L,57892L, -57893L,57894L,57895L,57896L,57897L,57898L,57899L,57900L,57901L,57902L, -57903L,57904L,57905L,57906L,57907L,57908L,57909L,57910L,57911L,57912L, -57913L,57914L,57915L,57916L,57917L,57918L,57919L,57920L,57921L,57922L, -57923L,57924L,57925L,57926L,57927L,57928L,57929L,57930L,57931L,57932L, -57933L,57934L,57935L,57936L,57937L,57938L,57939L,57940L,57941L,57942L, -57943L,57944L,57945L,57946L,57947L,57948L,57949L,57950L,57951L,57952L, -57953L,57954L,57955L,57956L,57957L,57958L,57959L,57960L,57961L,57962L, -57963L,57964L,57965L,57966L,57967L,57968L,57969L,57970L,57971L,57972L, -57973L,57974L,57975L,57976L,57977L,57978L,57979L,57980L,57981L,57982L, -57983L,57984L,57985L,57986L,57987L,57988L,57989L,57990L,57991L,57992L, -57993L,57994L,57995L,57996L,57997L,57998L,57999L,58000L,58001L,58002L, -58003L,58004L,58005L,58006L,58007L,58008L,58009L,58010L,58011L,58012L, -58013L,58014L,58015L,58016L,58017L,58018L,58019L,58020L,58021L,58022L, -58023L,58024L,58025L,58026L,58027L,58028L,58029L,58030L,58031L,58032L, -58033L,58034L,58035L,58036L,58037L,58038L,58039L,58040L,58041L,58042L, -58043L,58044L,58045L,58046L,58047L,58048L,58049L,58050L,58051L,58052L, -58053L,58054L,58055L,58056L,58057L,58058L,58059L,58060L,58061L,58062L, -58063L,58064L,58065L,58066L,58067L,58068L,58069L,58070L,58071L,58072L, -58073L,58074L,58075L,58076L,58077L,58078L,58079L,58080L,58081L,58082L, -58083L,58084L,58085L,58086L,58087L,58088L,58089L,58090L,58091L,58092L, -58093L,58094L,58095L,58096L,58097L,58098L,58099L,58100L,58101L,58102L, -58103L,58104L,58105L,58106L,58107L,58108L,58109L,58110L,58111L,58112L, -58113L,58114L,58115L,58116L,58117L,58118L,58119L,58120L,58121L,58122L, -58123L,58124L,58125L,58126L,58127L,58128L,58129L,58130L,58131L,58132L, -58133L,58134L,58135L,58136L,58137L,58138L,58139L,58140L,58141L,58142L, -58143L,58144L,58145L,58146L,58147L,58148L,58149L,58150L,58151L,58152L, -58153L,58154L,58155L,58156L,58157L,58158L,58159L,58160L,58161L,58162L, -58163L,58164L,58165L,58166L,58167L,58168L,58169L,58170L,58171L,58172L, -58173L,58174L,58175L,58176L,58177L,58178L,58179L,58180L,58181L,58182L, -58183L,58184L,58185L,58186L,58187L,58188L,58189L,58190L,58191L,58192L, -58193L,58194L,58195L,58196L,58197L,58198L,58199L,58200L,58201L,58202L, -58203L,58204L,58205L,58206L,58207L,58208L,58209L,58210L,58211L,58212L, -58213L,58214L,58215L,58216L,58217L,58218L,58219L,58220L,58221L,58222L, -58223L,58224L,58225L,58226L,58227L,58228L,58229L,58230L,58231L,58232L, -58233L,58234L,58235L,58236L,58237L,58238L,58239L,58240L,58241L,58242L, -58243L,58244L,58245L,58246L,58247L,58248L,58249L,58250L,58251L,58252L, -58253L,58254L,58255L,58256L,58257L,58258L,58259L,58260L,58261L,58262L, -58263L,58264L,58265L,58266L,58267L,58268L,58269L,58270L,58271L,58272L, -58273L,58274L,58275L,58276L,58277L,58278L,58279L,58280L,58281L,58282L, -58283L,58284L,58285L,58286L,58287L,58288L,58289L,58290L,58291L,58292L, -58293L,58294L,58295L,58296L,58297L,58298L,58299L,58300L,58301L,58302L, -58303L,58304L,58305L,58306L,58307L,58308L,58309L,58310L,58311L,58312L, -58313L,58314L,58315L,58316L,58317L,58318L,58319L,58320L,58321L,58322L, -58323L,58324L,58325L,58326L,58327L,58328L,58329L,58330L,58331L,58332L, -58333L,58334L,58335L,58336L,58337L,58338L,58339L,58340L,58341L,58342L, -58343L,58344L,58345L,58346L,58347L,58348L,58349L,58350L,58351L,58352L, -58353L,58354L,58355L,58356L,58357L,58358L,58359L,58360L,58361L,58362L, -58363L,58364L,58365L,58366L,58367L,58368L,58369L,58370L,58371L,58372L, -58373L,58374L,58375L,58376L,58377L,58378L,58379L,58380L,58381L,58382L, -58383L,58384L,58385L,58386L,58387L,58388L,58389L,58390L,58391L,58392L, -58393L,58394L,58395L,58396L,58397L,58398L,58399L,58400L,58401L,58402L, -58403L,58404L,58405L,58406L,58407L,58408L,58409L,58410L,58411L,58412L, -58413L,58414L,58415L,58416L,58417L,58418L,58419L,58420L,58421L,58422L, -58423L,58424L,58425L,58426L,58427L,58428L,58429L,58430L,58431L,58432L, -58433L,58434L,58435L,58436L,58437L,58438L,58439L,58440L,58441L,58442L, -58443L,58444L,58445L,58446L,58447L,58448L,58449L,58450L,58451L,58452L, -58453L,58454L,58455L,58456L,58457L,58458L,58459L,58460L,58461L,58462L, -58463L,58464L,58465L,58466L,58467L,58468L,58469L,58470L,58471L,58472L, -58473L,58474L,58475L,58476L,58477L,58478L,58479L,58480L,58481L,58482L, -58483L,58484L,58485L,58486L,58487L,58488L,58489L,58490L,58491L,58492L, -58493L,58494L,58495L,58496L,58497L,58498L,58499L,58500L,58501L,58502L, -58503L,58504L,58505L,58506L,58507L,58508L,58509L,58510L,58511L,58512L, -58513L,58514L,58515L,58516L,58517L,58518L,58519L,58520L,58521L,58522L, -58523L,58524L,58525L,58526L,58527L,58528L,58529L,58530L,58531L,58532L, -58533L,58534L,58535L,58536L,58537L,58538L,58539L,58540L,58541L,58542L, -58543L,58544L,58545L,58546L,58547L,58548L,58549L,58550L,58551L,58552L, -58553L,58554L,58555L,58556L,58557L,58558L,58559L,58560L,58561L,58562L, -58563L,58564L,58565L,58566L,58567L,58568L,58569L,58570L,58571L,58572L, -58573L,58574L,58575L,58576L,58577L,58578L,58579L,58580L,58581L,58582L, -58583L,58584L,58585L,58586L,58587L,58588L,58589L,58590L,58591L,58592L, -58593L,58594L,58595L,58596L,58597L,58598L,58599L,58600L,58601L,58602L, -58603L,58604L,58605L,58606L,58607L,58608L,58609L,58610L,58611L,58612L, -58613L,58614L,58615L,58616L,58617L,58618L,58619L,58620L,58621L,58622L, -58623L,58624L,58625L,58626L,58627L,58628L,58629L,58630L,58631L,58632L, -58633L,58634L,58635L,58636L,58637L,58638L,58639L,58640L,58641L,58642L, -58643L,58644L,58645L,58646L,58647L,58648L,58649L,58650L,58651L,58652L, -58653L,58654L,58655L,58656L,58657L,58658L,58659L,58660L,58661L,58662L, -58663L,58664L,58665L,58666L,58667L,58668L,58669L,58670L,58671L,58672L, -58673L,58674L,58675L,58676L,58677L,58678L,58679L,58680L,58681L,58682L, -58683L,58684L,58685L,58686L,58687L,58688L,58689L,58690L,58691L,58692L, -58693L,58694L,58695L,58696L,58697L,58698L,58699L,58700L,58701L,58702L, -58703L,58704L,58705L,58706L,58707L,58708L,58709L,58710L,58711L,58712L, -58713L,58714L,58715L,58716L,58717L,58718L,58719L,58720L,58721L,58722L, -58723L,58724L,58725L,58726L,58727L,58728L,58729L,58730L,58731L,58732L, -58733L,58734L,58735L,58736L,58737L,58738L,58739L,58740L,58741L,58742L, -58743L,58744L,58745L,58746L,58747L,58748L,58749L,58750L,58751L,58752L, -58753L,58754L,58755L,58756L,58757L,58758L,58759L,58760L,58761L,58762L, -58763L,58764L,58765L,58766L,58767L,58768L,58769L,58770L,58771L,58772L, -58773L,58774L,58775L,58776L,58777L,58778L,58779L,58780L,58781L,58782L, -58783L,58784L,58785L,58786L,58787L,58788L,58789L,58790L,58791L,58792L, -58793L,58794L,58795L,58796L,58797L,58798L,58799L,58800L,58801L,58802L, -58803L,58804L,58805L,58806L,58807L,58808L,58809L,58810L,58811L,58812L, -58813L,58814L,58815L,58816L,58817L,58818L,58819L,58820L,58821L,58822L, -58823L,58824L,58825L,58826L,58827L,58828L,58829L,58830L,58831L,58832L, -58833L,58834L,58835L,58836L,58837L,58838L,58839L,58840L,58841L,58842L, -58843L,58844L,58845L,58846L,58847L,58848L,58849L,58850L,58851L,58852L, -58853L,58854L,58855L,58856L,58857L,58858L,58859L,58860L,58861L,58862L, -58863L,58864L,58865L,58866L,58867L,58868L,58869L,58870L,58871L,58872L, -58873L,58874L,58875L,58876L,58877L,58878L,58879L,58880L,58881L,58882L, -58883L,58884L,58885L,58886L,58887L,58888L,58889L,58890L,58891L,58892L, -58893L,58894L,58895L,58896L,58897L,58898L,58899L,58900L,58901L,58902L, -58903L,58904L,58905L,58906L,58907L,58908L,58909L,58910L,58911L,58912L, -58913L,58914L,58915L,58916L,58917L,58918L,58919L,58920L,58921L,58922L, -58923L,58924L,58925L,58926L,58927L,58928L,58929L,58930L,58931L,58932L, -58933L,58934L,58935L,58936L,58937L,58938L,58939L,58940L,58941L,58942L, -58943L,58944L,58945L,58946L,58947L,58948L,58949L,58950L,58951L,58952L, -58953L,58954L,58955L,58956L,58957L,58958L,58959L,58960L,58961L,58962L, -58963L,58964L,58965L,58966L,58967L,58968L,58969L,58970L,58971L,58972L, -58973L,58974L,58975L,58976L,58977L,58978L,58979L,58980L,58981L,58982L, -58983L,58984L,58985L,58986L,58987L,58988L,58989L,58990L,58991L,58992L, -58993L,58994L,58995L,58996L,58997L,58998L,58999L,59000L,59001L,59002L, -59003L,59004L,59005L,59006L,59007L,59008L,59009L,59010L,59011L,59012L, -59013L,59014L,59015L,59016L,59017L,59018L,59019L,59020L,59021L,59022L, -59023L,59024L,59025L,59026L,59027L,59028L,59029L,59030L,59031L,59032L, -59033L,59034L,59035L,59036L,59037L,59038L,59039L,59040L,59041L,59042L, -59043L,59044L,59045L,59046L,59047L,59048L,59049L,59050L,59051L,59052L, -59053L,59054L,59055L,59056L,59057L,59058L,59059L,59060L,59061L,59062L, -59063L,59064L,59065L,59066L,59067L,59068L,59069L,59070L,59071L,59072L, -59073L,59074L,59075L,59076L,59077L,59078L,59079L,59080L,59081L,59082L, -59083L,59084L,59085L,59086L,59087L,59088L,59089L,59090L,59091L,59092L, -59093L,59094L,59095L,59096L,59097L,59098L,59099L,59100L,59101L,59102L, -59103L,59104L,59105L,59106L,59107L,59108L,59109L,59110L,59111L,59112L, -59113L,59114L,59115L,59116L,59117L,59118L,59119L,59120L,59121L,59122L, -59123L,59124L,59125L,59126L,59127L,59128L,59129L,59130L,59131L,59132L, -59133L,59134L,59135L,59136L,59137L,59138L,59139L,59140L,59141L,59142L, -59143L,59144L,59145L,59146L,59147L,59148L,59149L,59150L,59151L,59152L, -59153L,59154L,59155L,59156L,59157L,59158L,59159L,59160L,59161L,59162L, -59163L,59164L,59165L,59166L,59167L,59168L,59169L,59170L,59171L,59172L, -59173L,59174L,59175L,59176L,59177L,59178L,59179L,59180L,59181L,59182L, -59183L,59184L,59185L,59186L,59187L,59188L,59189L,59190L,59191L,59192L, -59193L,59194L,59195L,59196L,59197L,59198L,59199L,59200L,59201L,59202L, -59203L,59204L,59205L,59206L,59207L,59208L,59209L,59210L,59211L,59212L, -59213L,59214L,59215L,59216L,59217L,59218L,59219L,59220L,59221L,59222L, -59223L,59224L,59225L,59226L,59227L,59228L,59229L,59230L,59231L,59232L, -59233L,59234L,59235L,59236L,59237L,59238L,59239L,59240L,59241L,59242L, -59243L,59244L,59245L,59246L,59247L,59248L,59249L,59250L,59251L,59252L, -59253L,59254L,59255L,59256L,59257L,59258L,59259L,59260L,59261L,59262L, -59263L,59264L,59265L,59266L,59267L,59268L,59269L,59270L,59271L,59272L, -59273L,59274L,59275L,59276L,59277L,59278L,59279L,59280L,59281L,59282L, -59283L,59284L,59285L,59286L,59287L,59288L,59289L,59290L,59291L,59292L, -59293L,59294L,59295L,59296L,59297L,59298L,59299L,59300L,59301L,59302L, -59303L,59304L,59305L,59306L,59307L,59308L,59309L,59310L,59311L,59312L, -59313L,59314L,59315L,59316L,59317L,59318L,59319L,59320L,59321L,59322L, -59323L,59324L,59325L,59326L,59327L,59328L,59329L,59330L,59331L,59332L, -59333L,59334L,59335L,59336L,59337L,59338L,59339L,59340L,59341L,59342L, -59343L,59344L,59345L,59346L,59347L,59348L,59349L,59350L,59351L,59352L, -59353L,59354L,59355L,59356L,59357L,59358L,59359L,59360L,59361L,59362L, -59363L,59364L,59365L,59366L,59367L,59368L,59369L,59370L,59371L,59372L, -59373L,59374L,59375L,59376L,59377L,59378L,59379L,59380L,59381L,59382L, -59383L,59384L,59385L,59386L,59387L,59388L,59389L,59390L,59391L,59392L, -59393L,59394L,59395L,59396L,59397L,59398L,59399L,59400L,59401L,59402L, -59403L,59404L,59405L,59406L,59407L,59408L,59409L,59410L,59411L,59412L, -59413L,59414L,59415L,59416L,59417L,59418L,59419L,59420L,59421L,59422L, -59423L,59424L,59425L,59426L,59427L,59428L,59429L,59430L,59431L,59432L, -59433L,59434L,59435L,59436L,59437L,59438L,59439L,59440L,59441L,59442L, -59443L,59444L,59445L,59446L,59447L,59448L,59449L,59450L,59451L,59452L, -59453L,59454L,59455L,59456L,59457L,59458L,59459L,59460L,59461L,59462L, -59463L,59464L,59465L,59466L,59467L,59468L,59469L,59470L,59471L,59472L, -59473L,59474L,59475L,59476L,59477L,59478L,59479L,59480L,59481L,59482L, -59483L,59484L,59485L,59486L,59487L,59488L,59489L,59490L,59491L,59492L, -59493L,59494L,59495L,59496L,59497L,59498L,59499L,59500L,59501L,59502L, -59503L,59504L,59505L,59506L,59507L,59508L,59509L,59510L,59511L,59512L, -59513L,59514L,59515L,59516L,59517L,59518L,59519L,59520L,59521L,59522L, -59523L,59524L,59525L,59526L,59527L,59528L,59529L,59530L,59531L,59532L, -59533L,59534L,59535L,59536L,59537L,59538L,59539L,59540L,59541L,59542L, -59543L,59544L,59545L,59546L,59547L,59548L,59549L,59550L,59551L,59552L, -59553L,59554L,59555L,59556L,59557L,59558L,59559L,59560L,59561L,59562L, -59563L,59564L,59565L,59566L,59567L,59568L,59569L,59570L,59571L,59572L, -59573L,59574L,59575L,59576L,59577L,59578L,59579L,59580L,59581L,59582L, -59583L,59584L,59585L,59586L,59587L,59588L,59589L,59590L,59591L,59592L, -59593L,59594L,59595L,59596L,59597L,59598L,59599L,59600L,59601L,59602L, -59603L,59604L,59605L,59606L,59607L,59608L,59609L,59610L,59611L,59612L, -59613L,59614L,59615L,59616L,59617L,59618L,59619L,59620L,59621L,59622L, -59623L,59624L,59625L,59626L,59627L,59628L,59629L,59630L,59631L,59632L, -59633L,59634L,59635L,59636L,59637L,59638L,59639L,59640L,59641L,59642L, -59643L,59644L,59645L,59646L,59647L,59648L,59649L,59650L,59651L,59652L, -59653L,59654L,59655L,59656L,59657L,59658L,59659L,59660L,59661L,59662L, -59663L,59664L,59665L,59666L,59667L,59668L,59669L,59670L,59671L,59672L, -59673L,59674L,59675L,59676L,59677L,59678L,59679L,59680L,59681L,59682L, -59683L,59684L,59685L,59686L,59687L,59688L,59689L,59690L,59691L,59692L, -59693L,59694L,59695L,59696L,59697L,59698L,59699L,59700L,59701L,59702L, -59703L,59704L,59705L,59706L,59707L,59708L,59709L,59710L,59711L,59712L, -59713L,59714L,59715L,59716L,59717L,59718L,59719L,59720L,59721L,59722L, -59723L,59724L,59725L,59726L,59727L,59728L,59729L,59730L,59731L,59732L, -59733L,59734L,59735L,59736L,59737L,59738L,59739L,59740L,59741L,59742L, -59743L,59744L,59745L,59746L,59747L,59748L,59749L,59750L,59751L,59752L, -59753L,59754L,59755L,59756L,59757L,59758L,59759L,59760L,59761L,59762L, -59763L,59764L,59765L,59766L,59767L,59768L,59769L,59770L,59771L,59772L, -59773L,59774L,59775L,59776L,59777L,59778L,59779L,59780L,59781L,59782L, -59783L,59784L,59785L,59786L,59787L,59788L,59789L,59790L,59791L,59792L, -59793L,59794L,59795L,59796L,59797L,59798L,59799L,59800L,59801L,59802L, -59803L,59804L,59805L,59806L,59807L,59808L,59809L,59810L,59811L,59812L, -59813L,59814L,59815L,59816L,59817L,59818L,59819L,59820L,59821L,59822L, -59823L,59824L,59825L,59826L,59827L,59828L,59829L,59830L,59831L,59832L, -59833L,59834L,59835L,59836L,59837L,59838L,59839L,59840L,59841L,59842L, -59843L,59844L,59845L,59846L,59847L,59848L,59849L,59850L,59851L,59852L, -59853L,59854L,59855L,59856L,59857L,59858L,59859L,59860L,59861L,59862L, -59863L,59864L,59865L,59866L,59867L,59868L,59869L,59870L,59871L,59872L, -59873L,59874L,59875L,59876L,59877L,59878L,59879L,59880L,59881L,59882L, -59883L,59884L,59885L,59886L,59887L,59888L,59889L,59890L,59891L,59892L, -59893L,59894L,59895L,59896L,59897L,59898L,59899L,59900L,59901L,59902L, -59903L,59904L,59905L,59906L,59907L,59908L,59909L,59910L,59911L,59912L, -59913L,59914L,59915L,59916L,59917L,59918L,59919L,59920L,59921L,59922L, -59923L,59924L,59925L,59926L,59927L,59928L,59929L,59930L,59931L,59932L, -59933L,59934L,59935L,59936L,59937L,59938L,59939L,59940L,59941L,59942L, -59943L,59944L,59945L,59946L,59947L,59948L,59949L,59950L,59951L,59952L, -59953L,59954L,59955L,59956L,59957L,59958L,59959L,59960L,59961L,59962L, -59963L,59964L,59965L,59966L,59967L,59968L,59969L,59970L,59971L,59972L, -59973L,59974L,59975L,59976L,59977L,59978L,59979L,59980L,59981L,59982L, -59983L,59984L,59985L,59986L,59987L,59988L,59989L,59990L,59991L,59992L, -59993L,59994L,59995L,59996L,59997L,59998L,59999L,60000L,60001L,60002L, -60003L,60004L,60005L,60006L,60007L,60008L,60009L,60010L,60011L,60012L, -60013L,60014L,60015L,60016L,60017L,60018L,60019L,60020L,60021L,60022L, -60023L,60024L,60025L,60026L,60027L,60028L,60029L,60030L,60031L,60032L, -60033L,60034L,60035L,60036L,60037L,60038L,60039L,60040L,60041L,60042L, -60043L,60044L,60045L,60046L,60047L,60048L,60049L,60050L,60051L,60052L, -60053L,60054L,60055L,60056L,60057L,60058L,60059L,60060L,60061L,60062L, -60063L,60064L,60065L,60066L,60067L,60068L,60069L,60070L,60071L,60072L, -60073L,60074L,60075L,60076L,60077L,60078L,60079L,60080L,60081L,60082L, -60083L,60084L,60085L,60086L,60087L,60088L,60089L,60090L,60091L,60092L, -60093L,60094L,60095L,60096L,60097L,60098L,60099L,60100L,60101L,60102L, -60103L,60104L,60105L,60106L,60107L,60108L,60109L,60110L,60111L,60112L, -60113L,60114L,60115L,60116L,60117L,60118L,60119L,60120L,60121L,60122L, -60123L,60124L,60125L,60126L,60127L,60128L,60129L,60130L,60131L,60132L, -60133L,60134L,60135L,60136L,60137L,60138L,60139L,60140L,60141L,60142L, -60143L,60144L,60145L,60146L,60147L,60148L,60149L,60150L,60151L,60152L, -60153L,60154L,60155L,60156L,60157L,60158L,60159L,60160L,60161L,60162L, -60163L,60164L,60165L,60166L,60167L,60168L,60169L,60170L,60171L,60172L, -60173L,60174L,60175L,60176L,60177L,60178L,60179L,60180L,60181L,60182L, -60183L,60184L,60185L,60186L,60187L,60188L,60189L,60190L,60191L,60192L, -60193L,60194L,60195L,60196L,60197L,60198L,60199L,60200L,60201L,60202L, -60203L,60204L,60205L,60206L,60207L,60208L,60209L,60210L,60211L,60212L, -60213L,60214L,60215L,60216L,60217L,60218L,60219L,60220L,60221L,60222L, -60223L,60224L,60225L,60226L,60227L,60228L,60229L,60230L,60231L,60232L, -60233L,60234L,60235L,60236L,60237L,60238L,60239L,60240L,60241L,60242L, -60243L,60244L,60245L,60246L,60247L,60248L,60249L,60250L,60251L,60252L, -60253L,60254L,60255L,60256L,60257L,60258L,60259L,60260L,60261L,60262L, -60263L,60264L,60265L,60266L,60267L,60268L,60269L,60270L,60271L,60272L, -60273L,60274L,60275L,60276L,60277L,60278L,60279L,60280L,60281L,60282L, -60283L,60284L,60285L,60286L,60287L,60288L,60289L,60290L,60291L,60292L, -60293L,60294L,60295L,60296L,60297L,60298L,60299L,60300L,60301L,60302L, -60303L,60304L,60305L,60306L,60307L,60308L,60309L,60310L,60311L,60312L, -60313L,60314L,60315L,60316L,60317L,60318L,60319L,60320L,60321L,60322L, -60323L,60324L,60325L,60326L,60327L,60328L,60329L,60330L,60331L,60332L, -60333L,60334L,60335L,60336L,60337L,60338L,60339L,60340L,60341L,60342L, -60343L,60344L,60345L,60346L,60347L,60348L,60349L,60350L,60351L,60352L, -60353L,60354L,60355L,60356L,60357L,60358L,60359L,60360L,60361L,60362L, -60363L,60364L,60365L,60366L,60367L,60368L,60369L,60370L,60371L,60372L, -60373L,60374L,60375L,60376L,60377L,60378L,60379L,60380L,60381L,60382L, -60383L,60384L,60385L,60386L,60387L,60388L,60389L,60390L,60391L,60392L, -60393L,60394L,60395L,60396L,60397L,60398L,60399L,60400L,60401L,60402L, -60403L,60404L,60405L,60406L,60407L,60408L,60409L,60410L,60411L,60412L, -60413L,60414L,60415L,60416L,60417L,60418L,60419L,60420L,60421L,60422L, -60423L,60424L,60425L,60426L,60427L,60428L,60429L,60430L,60431L,60432L, -60433L,60434L,60435L,60436L,60437L,60438L,60439L,60440L,60441L,60442L, -60443L,60444L,60445L,60446L,60447L,60448L,60449L,60450L,60451L,60452L, -60453L,60454L,60455L,60456L,60457L,60458L,60459L,60460L,60461L,60462L, -60463L,60464L,60465L,60466L,60467L,60468L,60469L,60470L,60471L,60472L, -60473L,60474L,60475L,60476L,60477L,60478L,60479L,60480L,60481L,60482L, -60483L,60484L,60485L,60486L,60487L,60488L,60489L,60490L,60491L,60492L, -60493L,60494L,60495L,60496L,60497L,60498L,60499L,60500L,60501L,60502L, -60503L,60504L,60505L,60506L,60507L,60508L,60509L,60510L,60511L,60512L, -60513L,60514L,60515L,60516L,60517L,60518L,60519L,60520L,60521L,60522L, -60523L,60524L,60525L,60526L,60527L,60528L,60529L,60530L,60531L,60532L, -60533L,60534L,60535L,60536L,60537L,60538L,60539L,60540L,60541L,60542L, -60543L,60544L,60545L,60546L,60547L,60548L,60549L,60550L,60551L,60552L, -60553L,60554L,60555L,60556L,60557L,60558L,60559L,60560L,60561L,60562L, -60563L,60564L,60565L,60566L,60567L,60568L,60569L,60570L,60571L,60572L, -60573L,60574L,60575L,60576L,60577L,60578L,60579L,60580L,60581L,60582L, -60583L,60584L,60585L,60586L,60587L,60588L,60589L,60590L,60591L,60592L, -60593L,60594L,60595L,60596L,60597L,60598L,60599L,60600L,60601L,60602L, -60603L,60604L,60605L,60606L,60607L,60608L,60609L,60610L,60611L,60612L, -60613L,60614L,60615L,60616L,60617L,60618L,60619L,60620L,60621L,60622L, -60623L,60624L,60625L,60626L,60627L,60628L,60629L,60630L,60631L,60632L, -60633L,60634L,60635L,60636L,60637L,60638L,60639L,60640L,60641L,60642L, -60643L,60644L,60645L,60646L,60647L,60648L,60649L,60650L,60651L,60652L, -60653L,60654L,60655L,60656L,60657L,60658L,60659L,60660L,60661L,60662L, -60663L,60664L,60665L,60666L,60667L,60668L,60669L,60670L,60671L,60672L, -60673L,60674L,60675L,60676L,60677L,60678L,60679L,60680L,60681L,60682L, -60683L,60684L,60685L,60686L,60687L,60688L,60689L,60690L,60691L,60692L, -60693L,60694L,60695L,60696L,60697L,60698L,60699L,60700L,60701L,60702L, -60703L,60704L,60705L,60706L,60707L,60708L,60709L,60710L,60711L,60712L, -60713L,60714L,60715L,60716L,60717L,60718L,60719L,60720L,60721L,60722L, -60723L,60724L,60725L,60726L,60727L,60728L,60729L,60730L,60731L,60732L, -60733L,60734L,60735L,60736L,60737L,60738L,60739L,60740L,60741L,60742L, -60743L,60744L,60745L,60746L,60747L,60748L,60749L,60750L,60751L,60752L, -60753L,60754L,60755L,60756L,60757L,60758L,60759L,60760L,60761L,60762L, -60763L,60764L,60765L,60766L,60767L,60768L,60769L,60770L,60771L,60772L, -60773L,60774L,60775L,60776L,60777L,60778L,60779L,60780L,60781L,60782L, -60783L,60784L,60785L,60786L,60787L,60788L,60789L,60790L,60791L,60792L, -60793L,60794L,60795L,60796L,60797L,60798L,60799L,60800L,60801L,60802L, -60803L,60804L,60805L,60806L,60807L,60808L,60809L,60810L,60811L,60812L, -60813L,60814L,60815L,60816L,60817L,60818L,60819L,60820L,60821L,60822L, -60823L,60824L,60825L,60826L,60827L,60828L,60829L,60830L,60831L,60832L, -60833L,60834L,60835L,60836L,60837L,60838L,60839L,60840L,60841L,60842L, -60843L,60844L,60845L,60846L,60847L,60848L,60849L,60850L,60851L,60852L, -60853L,60854L,60855L,60856L,60857L,60858L,60859L,60860L,60861L,60862L, -60863L,60864L,60865L,60866L,60867L,60868L,60869L,60870L,60871L,60872L, -60873L,60874L,60875L,60876L,60877L,60878L,60879L,60880L,60881L,60882L, -60883L,60884L,60885L,60886L,60887L,60888L,60889L,60890L,60891L,60892L, -60893L,60894L,60895L,60896L,60897L,60898L,60899L,60900L,60901L,60902L, -60903L,60904L,60905L,60906L,60907L,60908L,60909L,60910L,60911L,60912L, -60913L,60914L,60915L,60916L,60917L,60918L,60919L,60920L,60921L,60922L, -60923L,60924L,60925L,60926L,60927L,60928L,60929L,60930L,60931L,60932L, -60933L,60934L,60935L,60936L,60937L,60938L,60939L,60940L,60941L,60942L, -60943L,60944L,60945L,60946L,60947L,60948L,60949L,60950L,60951L,60952L, -60953L,60954L,60955L,60956L,60957L,60958L,60959L,60960L,60961L,60962L, -60963L,60964L,60965L,60966L,60967L,60968L,60969L,60970L,60971L,60972L, -60973L,60974L,60975L,60976L,60977L,60978L,60979L,60980L,60981L,60982L, -60983L,60984L,60985L,60986L,60987L,60988L,60989L,60990L,60991L,60992L, -60993L,60994L,60995L,60996L,60997L,60998L,60999L,61000L,61001L,61002L, -61003L,61004L,61005L,61006L,61007L,61008L,61009L,61010L,61011L,61012L, -61013L,61014L,61015L,61016L,61017L,61018L,61019L,61020L,61021L,61022L, -61023L,61024L,61025L,61026L,61027L,61028L,61029L,61030L,61031L,61032L, -61033L,61034L,61035L,61036L,61037L,61038L,61039L,61040L,61041L,61042L, -61043L,61044L,61045L,61046L,61047L,61048L,61049L,61050L,61051L,61052L, -61053L,61054L,61055L,61056L,61057L,61058L,61059L,61060L,61061L,61062L, -61063L,61064L,61065L,61066L,61067L,61068L,61069L,61070L,61071L,61072L, -61073L,61074L,61075L,61076L,61077L,61078L,61079L,61080L,61081L,61082L, -61083L,61084L,61085L,61086L,61087L,61088L,61089L,61090L,61091L,61092L, -61093L,61094L,61095L,61096L,61097L,61098L,61099L,61100L,61101L,61102L, -61103L,61104L,61105L,61106L,61107L,61108L,61109L,61110L,61111L,61112L, -61113L,61114L,61115L,61116L,61117L,61118L,61119L,61120L,61121L,61122L, -61123L,61124L,61125L,61126L,61127L,61128L,61129L,61130L,61131L,61132L, -61133L,61134L,61135L,61136L,61137L,61138L,61139L,61140L,61141L,61142L, -61143L,61144L,61145L,61146L,61147L,61148L,61149L,61150L,61151L,61152L, -61153L,61154L,61155L,61156L,61157L,61158L,61159L,61160L,61161L,61162L, -61163L,61164L,61165L,61166L,61167L,61168L,61169L,61170L,61171L,61172L, -61173L,61174L,61175L,61176L,61177L,61178L,61179L,61180L,61181L,61182L, -61183L,61184L,61185L,61186L,61187L,61188L,61189L,61190L,61191L,61192L, -61193L,61194L,61195L,61196L,61197L,61198L,61199L,61200L,61201L,61202L, -61203L,61204L,61205L,61206L,61207L,61208L,61209L,61210L,61211L,61212L, -61213L,61214L,61215L,61216L,61217L,61218L,61219L,61220L,61221L,61222L, -61223L,61224L,61225L,61226L,61227L,61228L,61229L,61230L,61231L,61232L, -61233L,61234L,61235L,61236L,61237L,61238L,61239L,61240L,61241L,61242L, -61243L,61244L,61245L,61246L,61247L,61248L,61249L,61250L,61251L,61252L, -61253L,61254L,61255L,61256L,61257L,61258L,61259L,61260L,61261L,61262L, -61263L,61264L,61265L,61266L,61267L,61268L,61269L,61270L,61271L,61272L, -61273L,61274L,61275L,61276L,61277L,61278L,61279L,61280L,61281L,61282L, -61283L,61284L,61285L,61286L,61287L,61288L,61289L,61290L,61291L,61292L, -61293L,61294L,61295L,61296L,61297L,61298L,61299L,61300L,61301L,61302L, -61303L,61304L,61305L,61306L,61307L,61308L,61309L,61310L,61311L,61312L, -61313L,61314L,61315L,61316L,61317L,61318L,61319L,61320L,61321L,61322L, -61323L,61324L,61325L,61326L,61327L,61328L,61329L,61330L,61331L,61332L, -61333L,61334L,61335L,61336L,61337L,61338L,61339L,61340L,61341L,61342L, -61343L,61344L,61345L,61346L,61347L,61348L,61349L,61350L,61351L,61352L, -61353L,61354L,61355L,61356L,61357L,61358L,61359L,61360L,61361L,61362L, -61363L,61364L,61365L,61366L,61367L,61368L,61369L,61370L,61371L,61372L, -61373L,61374L,61375L,61376L,61377L,61378L,61379L,61380L,61381L,61382L, -61383L,61384L,61385L,61386L,61387L,61388L,61389L,61390L,61391L,61392L, -61393L,61394L,61395L,61396L,61397L,61398L,61399L,61400L,61401L,61402L, -61403L,61404L,61405L,61406L,61407L,61408L,61409L,61410L,61411L,61412L, -61413L,61414L,61415L,61416L,61417L,61418L,61419L,61420L,61421L,61422L, -61423L,61424L,61425L,61426L,61427L,61428L,61429L,61430L,61431L,61432L, -61433L,61434L,61435L,61436L,61437L,61438L,61439L,61440L,61441L,61442L, -61443L,61444L,61445L,61446L,61447L,61448L,61449L,61450L,61451L,61452L, -61453L,61454L,61455L,61456L,61457L,61458L,61459L,61460L,61461L,61462L, -61463L,61464L,61465L,61466L,61467L,61468L,61469L,61470L,61471L,61472L, -61473L,61474L,61475L,61476L,61477L,61478L,61479L,61480L,61481L,61482L, -61483L,61484L,61485L,61486L,61487L,61488L,61489L,61490L,61491L,61492L, -61493L,61494L,61495L,61496L,61497L,61498L,61499L,61500L,61501L,61502L, -61503L,61504L,61505L,61506L,61507L,61508L,61509L,61510L,61511L,61512L, -61513L,61514L,61515L,61516L,61517L,61518L,61519L,61520L,61521L,61522L, -61523L,61524L,61525L,61526L,61527L,61528L,61529L,61530L,61531L,61532L, -61533L,61534L,61535L,61536L,61537L,61538L,61539L,61540L,61541L,61542L, -61543L,61544L,61545L,61546L,61547L,61548L,61549L,61550L,61551L,61552L, -61553L,61554L,61555L,61556L,61557L,61558L,61559L,61560L,61561L,61562L, -61563L,61564L,61565L,61566L,61567L,61568L,61569L,61570L,61571L,61572L, -61573L,61574L,61575L,61576L,61577L,61578L,61579L,61580L,61581L,61582L, -61583L,61584L,61585L,61586L,61587L,61588L,61589L,61590L,61591L,61592L, -61593L,61594L,61595L,61596L,61597L,61598L,61599L,61600L,61601L,61602L, -61603L,61604L,61605L,61606L,61607L,61608L,61609L,61610L,61611L,61612L, -61613L,61614L,61615L,61616L,61617L,61618L,61619L,61620L,61621L,61622L, -61623L,61624L,61625L,61626L,61627L,61628L,61629L,61630L,61631L,61632L, -61633L,61634L,61635L,61636L,61637L,61638L,61639L,61640L,61641L,61642L, -61643L,61644L,61645L,61646L,61647L,61648L,61649L,61650L,61651L,61652L, -61653L,61654L,61655L,61656L,61657L,61658L,61659L,61660L,61661L,61662L, -61663L,61664L,61665L,61666L,61667L,61668L,61669L,61670L,61671L,61672L, -61673L,61674L,61675L,61676L,61677L,61678L,61679L,61680L,61681L,61682L, -61683L,61684L,61685L,61686L,61687L,61688L,61689L,61690L,61691L,61692L, -61693L,61694L,61695L,61696L,61697L,61698L,61699L,61700L,61701L,61702L, -61703L,61704L,61705L,61706L,61707L,61708L,61709L,61710L,61711L,61712L, -61713L,61714L,61715L,61716L,61717L,61718L,61719L,61720L,61721L,61722L, -61723L,61724L,61725L,61726L,61727L,61728L,61729L,61730L,61731L,61732L, -61733L,61734L,61735L,61736L,61737L,61738L,61739L,61740L,61741L,61742L, -61743L,61744L,61745L,61746L,61747L,61748L,61749L,61750L,61751L,61752L, -61753L,61754L,61755L,61756L,61757L,61758L,61759L,61760L,61761L,61762L, -61763L,61764L,61765L,61766L,61767L,61768L,61769L,61770L,61771L,61772L, -61773L,61774L,61775L,61776L,61777L,61778L,61779L,61780L,61781L,61782L, -61783L,61784L,61785L,61786L,61787L,61788L,61789L,61790L,61791L,61792L, -61793L,61794L,61795L,61796L,61797L,61798L,61799L,61800L,61801L,61802L, -61803L,61804L,61805L,61806L,61807L,61808L,61809L,61810L,61811L,61812L, -61813L,61814L,61815L,61816L,61817L,61818L,61819L,61820L,61821L,61822L, -61823L,61824L,61825L,61826L,61827L,61828L,61829L,61830L,61831L,61832L, -61833L,61834L,61835L,61836L,61837L,61838L,61839L,61840L,61841L,61842L, -61843L,61844L,61845L,61846L,61847L,61848L,61849L,61850L,61851L,61852L, -61853L,61854L,61855L,61856L,61857L,61858L,61859L,61860L,61861L,61862L, -61863L,61864L,61865L,61866L,61867L,61868L,61869L,61870L,61871L,61872L, -61873L,61874L,61875L,61876L,61877L,61878L,61879L,61880L,61881L,61882L, -61883L,61884L,61885L,61886L,61887L,61888L,61889L,61890L,61891L,61892L, -61893L,61894L,61895L,61896L,61897L,61898L,61899L,61900L,61901L,61902L, -61903L,61904L,61905L,61906L,61907L,61908L,61909L,61910L,61911L,61912L, -61913L,61914L,61915L,61916L,61917L,61918L,61919L,61920L,61921L,61922L, -61923L,61924L,61925L,61926L,61927L,61928L,61929L,61930L,61931L,61932L, -61933L,61934L,61935L,61936L,61937L,61938L,61939L,61940L,61941L,61942L, -61943L,61944L,61945L,61946L,61947L,61948L,61949L,61950L,61951L,61952L, -61953L,61954L,61955L,61956L,61957L,61958L,61959L,61960L,61961L,61962L, -61963L,61964L,61965L,61966L,61967L,61968L,61969L,61970L,61971L,61972L, -61973L,61974L,61975L,61976L,61977L,61978L,61979L,61980L,61981L,61982L, -61983L,61984L,61985L,61986L,61987L,61988L,61989L,61990L,61991L,61992L, -61993L,61994L,61995L,61996L,61997L,61998L,61999L,62000L,62001L,62002L, -62003L,62004L,62005L,62006L,62007L,62008L,62009L,62010L,62011L,62012L, -62013L,62014L,62015L,62016L,62017L,62018L,62019L,62020L,62021L,62022L, -62023L,62024L,62025L,62026L,62027L,62028L,62029L,62030L,62031L,62032L, -62033L,62034L,62035L,62036L,62037L,62038L,62039L,62040L,62041L,62042L, -62043L,62044L,62045L,62046L,62047L,62048L,62049L,62050L,62051L,62052L, -62053L,62054L,62055L,62056L,62057L,62058L,62059L,62060L,62061L,62062L, -62063L,62064L,62065L,62066L,62067L,62068L,62069L,62070L,62071L,62072L, -62073L,62074L,62075L,62076L,62077L,62078L,62079L,62080L,62081L,62082L, -62083L,62084L,62085L,62086L,62087L,62088L,62089L,62090L,62091L,62092L, -62093L,62094L,62095L,62096L,62097L,62098L,62099L,62100L,62101L,62102L, -62103L,62104L,62105L,62106L,62107L,62108L,62109L,62110L,62111L,62112L, -62113L,62114L,62115L,62116L,62117L,62118L,62119L,62120L,62121L,62122L, -62123L,62124L,62125L,62126L,62127L,62128L,62129L,62130L,62131L,62132L, -62133L,62134L,62135L,62136L,62137L,62138L,62139L,62140L,62141L,62142L, -62143L,62144L,62145L,62146L,62147L,62148L,62149L,62150L,62151L,62152L, -62153L,62154L,62155L,62156L,62157L,62158L,62159L,62160L,62161L,62162L, -62163L,62164L,62165L,62166L,62167L,62168L,62169L,62170L,62171L,62172L, -62173L,62174L,62175L,62176L,62177L,62178L,62179L,62180L,62181L,62182L, -62183L,62184L,62185L,62186L,62187L,62188L,62189L,62190L,62191L,62192L, -62193L,62194L,62195L,62196L,62197L,62198L,62199L,62200L,62201L,62202L, -62203L,62204L,62205L,62206L,62207L,62208L,62209L,62210L,62211L,62212L, -62213L,62214L,62215L,62216L,62217L,62218L,62219L,62220L,62221L,62222L, -62223L,62224L,62225L,62226L,62227L,62228L,62229L,62230L,62231L,62232L, -62233L,62234L,62235L,62236L,62237L,62238L,62239L,62240L,62241L,62242L, -62243L,62244L,62245L,62246L,62247L,62248L,62249L,62250L,62251L,62252L, -62253L,62254L,62255L,62256L,62257L,62258L,62259L,62260L,62261L,62262L, -62263L,62264L,62265L,62266L,62267L,62268L,62269L,62270L,62271L,62272L, -62273L,62274L,62275L,62276L,62277L,62278L,62279L,62280L,62281L,62282L, -62283L,62284L,62285L,62286L,62287L,62288L,62289L,62290L,62291L,62292L, -62293L,62294L,62295L,62296L,62297L,62298L,62299L,62300L,62301L,62302L, -62303L,62304L,62305L,62306L,62307L,62308L,62309L,62310L,62311L,62312L, -62313L,62314L,62315L,62316L,62317L,62318L,62319L,62320L,62321L,62322L, -62323L,62324L,62325L,62326L,62327L,62328L,62329L,62330L,62331L,62332L, -62333L,62334L,62335L,62336L,62337L,62338L,62339L,62340L,62341L,62342L, -62343L,62344L,62345L,62346L,62347L,62348L,62349L,62350L,62351L,62352L, -62353L,62354L,62355L,62356L,62357L,62358L,62359L,62360L,62361L,62362L, -62363L,62364L,62365L,62366L,62367L,62368L,62369L,62370L,62371L,62372L, -62373L,62374L,62375L,62376L,62377L,62378L,62379L,62380L,62381L,62382L, -62383L,62384L,62385L,62386L,62387L,62388L,62389L,62390L,62391L,62392L, -62393L,62394L,62395L,62396L,62397L,62398L,62399L,62400L,62401L,62402L, -62403L,62404L,62405L,62406L,62407L,62408L,62409L,62410L,62411L,62412L, -62413L,62414L,62415L,62416L,62417L,62418L,62419L,62420L,62421L,62422L, -62423L,62424L,62425L,62426L,62427L,62428L,62429L,62430L,62431L,62432L, -62433L,62434L,62435L,62436L,62437L,62438L,62439L,62440L,62441L,62442L, -62443L,62444L,62445L,62446L,62447L,62448L,62449L,62450L,62451L,62452L, -62453L,62454L,62455L,62456L,62457L,62458L,62459L,62460L,62461L,62462L, -62463L,62464L,62465L,62466L,62467L,62468L,62469L,62470L,62471L,62472L, -62473L,62474L,62475L,62476L,62477L,62478L,62479L,62480L,62481L,62482L, -62483L,62484L,62485L,62486L,62487L,62488L,62489L,62490L,62491L,62492L, -62493L,62494L,62495L,62496L,62497L,62498L,62499L,62500L,62501L,62502L, -62503L,62504L,62505L,62506L,62507L,62508L,62509L,62510L,62511L,62512L, -62513L,62514L,62515L,62516L,62517L,62518L,62519L,62520L,62521L,62522L, -62523L,62524L,62525L,62526L,62527L,62528L,62529L,62530L,62531L,62532L, -62533L,62534L,62535L,62536L,62537L,62538L,62539L,62540L,62541L,62542L, -62543L,62544L,62545L,62546L,62547L,62548L,62549L,62550L,62551L,62552L, -62553L,62554L,62555L,62556L,62557L,62558L,62559L,62560L,62561L,62562L, -62563L,62564L,62565L,62566L,62567L,62568L,62569L,62570L,62571L,62572L, -62573L,62574L,62575L,62576L,62577L,62578L,62579L,62580L,62581L,62582L, -62583L,62584L,62585L,62586L,62587L,62588L,62589L,62590L,62591L,62592L, -62593L,62594L,62595L,62596L,62597L,62598L,62599L,62600L,62601L,62602L, -62603L,62604L,62605L,62606L,62607L,62608L,62609L,62610L,62611L,62612L, -62613L,62614L,62615L,62616L,62617L,62618L,62619L,62620L,62621L,62622L, -62623L,62624L,62625L,62626L,62627L,62628L,62629L,62630L,62631L,62632L, -62633L,62634L,62635L,62636L,62637L,62638L,62639L,62640L,62641L,62642L, -62643L,62644L,62645L,62646L,62647L,62648L,62649L,62650L,62651L,62652L, -62653L,62654L,62655L,62656L,62657L,62658L,62659L,62660L,62661L,62662L, -62663L,62664L,62665L,62666L,62667L,62668L,62669L,62670L,62671L,62672L, -62673L,62674L,62675L,62676L,62677L,62678L,62679L,62680L,62681L,62682L, -62683L,62684L,62685L,62686L,62687L,62688L,62689L,62690L,62691L,62692L, -62693L,62694L,62695L,62696L,62697L,62698L,62699L,62700L,62701L,62702L, -62703L,62704L,62705L,62706L,62707L,62708L,62709L,62710L,62711L,62712L, -62713L,62714L,62715L,62716L,62717L,62718L,62719L,62720L,62721L,62722L, -62723L,62724L,62725L,62726L,62727L,62728L,62729L,62730L,62731L,62732L, -62733L,62734L,62735L,62736L,62737L,62738L,62739L,62740L,62741L,62742L, -62743L,62744L,62745L,62746L,62747L,62748L,62749L,62750L,62751L,62752L, -62753L,62754L,62755L,62756L,62757L,62758L,62759L,62760L,62761L,62762L, -62763L,62764L,62765L,62766L,62767L,62768L,62769L,62770L,62771L,62772L, -62773L,62774L,62775L,62776L,62777L,62778L,62779L,62780L,62781L,62782L, -62783L,62784L,62785L,62786L,62787L,62788L,62789L,62790L,62791L,62792L, -62793L,62794L,62795L,62796L,62797L,62798L,62799L,62800L,62801L,62802L, -62803L,62804L,62805L,62806L,62807L,62808L,62809L,62810L,62811L,62812L, -62813L,62814L,62815L,62816L,62817L,62818L,62819L,62820L,62821L,62822L, -62823L,62824L,62825L,62826L,62827L,62828L,62829L,62830L,62831L,62832L, -62833L,62834L,62835L,62836L,62837L,62838L,62839L,62840L,62841L,62842L, -62843L,62844L,62845L,62846L,62847L,62848L,62849L,62850L,62851L,62852L, -62853L,62854L,62855L,62856L,62857L,62858L,62859L,62860L,62861L,62862L, -62863L,62864L,62865L,62866L,62867L,62868L,62869L,62870L,62871L,62872L, -62873L,62874L,62875L,62876L,62877L,62878L,62879L,62880L,62881L,62882L, -62883L,62884L,62885L,62886L,62887L,62888L,62889L,62890L,62891L,62892L, -62893L,62894L,62895L,62896L,62897L,62898L,62899L,62900L,62901L,62902L, -62903L,62904L,62905L,62906L,62907L,62908L,62909L,62910L,62911L,62912L, -62913L,62914L,62915L,62916L,62917L,62918L,62919L,62920L,62921L,62922L, -62923L,62924L,62925L,62926L,62927L,62928L,62929L,62930L,62931L,62932L, -62933L,62934L,62935L,62936L,62937L,62938L,62939L,62940L,62941L,62942L, -62943L,62944L,62945L,62946L,62947L,62948L,62949L,62950L,62951L,62952L, -62953L,62954L,62955L,62956L,62957L,62958L,62959L,62960L,62961L,62962L, -62963L,62964L,62965L,62966L,62967L,62968L,62969L,62970L,62971L,62972L, -62973L,62974L,62975L,62976L,62977L,62978L,62979L,62980L,62981L,62982L, -62983L,62984L,62985L,62986L,62987L,62988L,62989L,62990L,62991L,62992L, -62993L,62994L,62995L,62996L,62997L,62998L,62999L,63000L,63001L,63002L, -63003L,63004L,63005L,63006L,63007L,63008L,63009L,63010L,63011L,63012L, -63013L,63014L,63015L,63016L,63017L,63018L,63019L,63020L,63021L,63022L, -63023L,63024L,63025L,63026L,63027L,63028L,63029L,63030L,63031L,63032L, -63033L,63034L,63035L,63036L,63037L,63038L,63039L,63040L,63041L,63042L, -63043L,63044L,63045L,63046L,63047L,63048L,63049L,63050L,63051L,63052L, -63053L,63054L,63055L,63056L,63057L,63058L,63059L,63060L,63061L,63062L, -63063L,63064L,63065L,63066L,63067L,63068L,63069L,63070L,63071L,63072L, -63073L,63074L,63075L,63076L,63077L,63078L,63079L,63080L,63081L,63082L, -63083L,63084L,63085L,63086L,63087L,63088L,63089L,63090L,63091L,63092L, -63093L,63094L,63095L,63096L,63097L,63098L,63099L,63100L,63101L,63102L, -63103L,63104L,63105L,63106L,63107L,63108L,63109L,63110L,63111L,63112L, -63113L,63114L,63115L,63116L,63117L,63118L,63119L,63120L,63121L,63122L, -63123L,63124L,63125L,63126L,63127L,63128L,63129L,63130L,63131L,63132L, -63133L,63134L,63135L,63136L,63137L,63138L,63139L,63140L,63141L,63142L, -63143L,63144L,63145L,63146L,63147L,63148L,63149L,63150L,63151L,63152L, -63153L,63154L,63155L,63156L,63157L,63158L,63159L,63160L,63161L,63162L, -63163L,63164L,63165L,63166L,63167L,63168L,63169L,63170L,63171L,63172L, -63173L,63174L,63175L,63176L,63177L,63178L,63179L,63180L,63181L,63182L, -63183L,63184L,63185L,63186L,63187L,63188L,63189L,63190L,63191L,63192L, -63193L,63194L,63195L,63196L,63197L,63198L,63199L,63200L,63201L,63202L, -63203L,63204L,63205L,63206L,63207L,63208L,63209L,63210L,63211L,63212L, -63213L,63214L,63215L,63216L,63217L,63218L,63219L,63220L,63221L,63222L, -63223L,63224L,63225L,63226L,63227L,63228L,63229L,63230L,63231L,63232L, -63233L,63234L,63235L,63236L,63237L,63238L,63239L,63240L,63241L,63242L, -63243L,63244L,63245L,63246L,63247L,63248L,63249L,63250L,63251L,63252L, -63253L,63254L,63255L,63256L,63257L,63258L,63259L,63260L,63261L,63262L, -63263L,63264L,63265L,63266L,63267L,63268L,63269L,63270L,63271L,63272L, -63273L,63274L,63275L,63276L,63277L,63278L,63279L,63280L,63281L,63282L, -63283L,63284L,63285L,63286L,63287L,63288L,63289L,63290L,63291L,63292L, -63293L,63294L,63295L,63296L,63297L,63298L,63299L,63300L,63301L,63302L, -63303L,63304L,63305L,63306L,63307L,63308L,63309L,63310L,63311L,63312L, -63313L,63314L,63315L,63316L,63317L,63318L,63319L,63320L,63321L,63322L, -63323L,63324L,63325L,63326L,63327L,63328L,63329L,63330L,63331L,63332L, -63333L,63334L,63335L,63336L,63337L,63338L,63339L,63340L,63341L,63342L, -63343L,63344L,63345L,63346L,63347L,63348L,63349L,63350L,63351L,63352L, -63353L,63354L,63355L,63356L,63357L,63358L,63359L,63360L,63361L,63362L, -63363L,63364L,63365L,63366L,63367L,63368L,63369L,63370L,63371L,63372L, -63373L,63374L,63375L,63376L,63377L,63378L,63379L,63380L,63381L,63382L, -63383L,63384L,63385L,63386L,63387L,63388L,63389L,63390L,63391L,63392L, -63393L,63394L,63395L,63396L,63397L,63398L,63399L,63400L,63401L,63402L, -63403L,63404L,63405L,63406L,63407L,63408L,63409L,63410L,63411L,63412L, -63413L,63414L,63415L,63416L,63417L,63418L,63419L,63420L,63421L,63422L, -63423L,63424L,63425L,63426L,63427L,63428L,63429L,63430L,63431L,63432L, -63433L,63434L,63435L,63436L,63437L,63438L,63439L,63440L,63441L,63442L, -63443L,63444L,63445L,63446L,63447L,63448L,63449L,63450L,63451L,63452L, -63453L,63454L,63455L,63456L,63457L,63458L,63459L,63460L,63461L,63462L, -63463L,63464L,63465L,63466L,63467L,63468L,63469L,63470L,63471L,63472L, -63473L,63474L,63475L,63476L,63477L,63478L,63479L,63480L,63481L,63482L, -63483L,63484L,63485L,63486L,63487L,63488L,63489L,63490L,63491L,63492L, -63493L,63494L,63495L,63496L,63497L,63498L,63499L,63500L,63501L,63502L, -63503L,63504L,63505L,63506L,63507L,63508L,63509L,63510L,63511L,63512L, -63513L,63514L,63515L,63516L,63517L,63518L,63519L,63520L,63521L,63522L, -63523L,63524L,63525L,63526L,63527L,63528L,63529L,63530L,63531L,63532L, -63533L,63534L,63535L,63536L,63537L,63538L,63539L,63540L,63541L,63542L, -63543L,63544L,63545L,63546L,63547L,63548L,63549L,63550L,63551L,63552L, -63553L,63554L,63555L,63556L,63557L,63558L,63559L,63560L,63561L,63562L, -63563L,63564L,63565L,63566L,63567L,63568L,63569L,63570L,63571L,63572L, -63573L,63574L,63575L,63576L,63577L,63578L,63579L,63580L,63581L,63582L, -63583L,63584L,63585L,63586L,63587L,63588L,63589L,63590L,63591L,63592L, -63593L,63594L,63595L,63596L,63597L,63598L,63599L,63600L,63601L,63602L, -63603L,63604L,63605L,63606L,63607L,63608L,63609L,63610L,63611L,63612L, -63613L,63614L,63615L,63616L,63617L,63618L,63619L,63620L,63621L,63622L, -63623L,63624L,63625L,63626L,63627L,63628L,63629L,63630L,63631L,63632L, -63633L,63634L,63635L,63636L,63637L,63638L,63639L,63640L,63641L,63642L, -63643L,63644L,63645L,63646L,63647L,63648L,63649L,63650L,63651L,63652L, -63653L,63654L,63655L,63656L,63657L,63658L,63659L,63660L,63661L,63662L, -63663L,63664L,63665L,63666L,63667L,63668L,63669L,63670L,63671L,63672L, -63673L,63674L,63675L,63676L,63677L,63678L,63679L,63680L,63681L,63682L, -63683L,63684L,63685L,63686L,63687L,63688L,63689L,63690L,63691L,63692L, -63693L,63694L,63695L,63696L,63697L,63698L,63699L,63700L,63701L,63702L, -63703L,63704L,63705L,63706L,63707L,63708L,63709L,63710L,63711L,63712L, -63713L,63714L,63715L,63716L,63717L,63718L,63719L,63720L,63721L,63722L, -63723L,63724L,63725L,63726L,63727L,63728L,63729L,63730L,63731L,63732L, -63733L,63734L,63735L,63736L,63737L,63738L,63739L,63740L,63741L,63742L, -63743L,63744L,63745L,63746L,63747L,63748L,63749L,63750L,63751L,63752L, -63753L,63754L,63755L,63756L,63757L,63758L,63759L,63760L,63761L,63762L, -63763L,63764L,63765L,63766L,63767L,63768L,63769L,63770L,63771L,63772L, -63773L,63774L,63775L,63776L,63777L,63778L,63779L,63780L,63781L,63782L, -63783L,63784L,63785L,63786L,63787L,63788L,63789L,63790L,63791L,63792L, -63793L,63794L,63795L,63796L,63797L,63798L,63799L,63800L,63801L,63802L, -63803L,63804L,63805L,63806L,63807L,63808L,63809L,63810L,63811L,63812L, -63813L,63814L,63815L,63816L,63817L,63818L,63819L,63820L,63821L,63822L, -63823L,63824L,63825L,63826L,63827L,63828L,63829L,63830L,63831L,63832L, -63833L,63834L,63835L,63836L,63837L,63838L,63839L,63840L,63841L,63842L, -63843L,63844L,63845L,63846L,63847L,63848L,63849L,63850L,63851L,63852L, -63853L,63854L,63855L,63856L,63857L,63858L,63859L,63860L,63861L,63862L, -63863L,63864L,63865L,63866L,63867L,63868L,63869L,63870L,63871L,63872L, -63873L,63874L,63875L,63876L,63877L,63878L,63879L,63880L,63881L,63882L, -63883L,63884L,63885L,63886L,63887L,63888L,63889L,63890L,63891L,63892L, -63893L,63894L,63895L,63896L,63897L,63898L,63899L,63900L,63901L,63902L, -63903L,63904L,63905L,63906L,63907L,63908L,63909L,63910L,63911L,63912L, -63913L,63914L,63915L,63916L,63917L,63918L,63919L,63920L,63921L,63922L, -63923L,63924L,63925L,63926L,63927L,63928L,63929L,63930L,63931L,63932L, -63933L,63934L,63935L,63936L,63937L,63938L,63939L,63940L,63941L,63942L, -63943L,63944L,63945L,63946L,63947L,63948L,63949L,63950L,63951L,63952L, -63953L,63954L,63955L,63956L,63957L,63958L,63959L,63960L,63961L,63962L, -63963L,63964L,63965L,63966L,63967L,63968L,63969L,63970L,63971L,63972L, -63973L,63974L,63975L,63976L,63977L,63978L,63979L,63980L,63981L,63982L, -63983L,63984L,63985L,63986L,63987L,63988L,63989L,63990L,63991L,63992L, -63993L,63994L,63995L,63996L,63997L,63998L,63999L,64000L,64001L,64002L, -64003L,64004L,64005L,64006L,64007L,64008L,64009L,64010L,64011L,64012L, -64013L,64014L,64015L,64016L,64017L,64018L,64019L,64020L,64021L,64022L, -64023L,64024L,64025L,64026L,64027L,64028L,64029L,64030L,64031L,64032L, -64033L,64034L,64035L,64036L,64037L,64038L,64039L,64040L,64041L,64042L, -64043L,64044L,64045L,64046L,64047L,64048L,64049L,64050L,64051L,64052L, -64053L,64054L,64055L,64056L,64057L,64058L,64059L,64060L,64061L,64062L, -64063L,64064L,64065L,64066L,64067L,64068L,64069L,64070L,64071L,64072L, -64073L,64074L,64075L,64076L,64077L,64078L,64079L,64080L,64081L,64082L, -64083L,64084L,64085L,64086L,64087L,64088L,64089L,64090L,64091L,64092L, -64093L,64094L,64095L,64096L,64097L,64098L,64099L,64100L,64101L,64102L, -64103L,64104L,64105L,64106L,64107L,64108L,64109L,64110L,64111L,64112L, -64113L,64114L,64115L,64116L,64117L,64118L,64119L,64120L,64121L,64122L, -64123L,64124L,64125L,64126L,64127L,64128L,64129L,64130L,64131L,64132L, -64133L,64134L,64135L,64136L,64137L,64138L,64139L,64140L,64141L,64142L, -64143L,64144L,64145L,64146L,64147L,64148L,64149L,64150L,64151L,64152L, -64153L,64154L,64155L,64156L,64157L,64158L,64159L,64160L,64161L,64162L, -64163L,64164L,64165L,64166L,64167L,64168L,64169L,64170L,64171L,64172L, -64173L,64174L,64175L,64176L,64177L,64178L,64179L,64180L,64181L,64182L, -64183L,64184L,64185L,64186L,64187L,64188L,64189L,64190L,64191L,64192L, -64193L,64194L,64195L,64196L,64197L,64198L,64199L,64200L,64201L,64202L, -64203L,64204L,64205L,64206L,64207L,64208L,64209L,64210L,64211L,64212L, -64213L,64214L,64215L,64216L,64217L,64218L,64219L,64220L,64221L,64222L, -64223L,64224L,64225L,64226L,64227L,64228L,64229L,64230L,64231L,64232L, -64233L,64234L,64235L,64236L,64237L,64238L,64239L,64240L,64241L,64242L, -64243L,64244L,64245L,64246L,64247L,64248L,64249L,64250L,64251L,64252L, -64253L,64254L,64255L,64256L,64257L,64258L,64259L,64260L,64261L,64262L, -64263L,64264L,64265L,64266L,64267L,64268L,64269L,64270L,64271L,64272L, -64273L,64274L,64275L,64276L,64277L,64278L,64279L,64280L,64281L,64282L, -64283L,64284L,64285L,64286L,64287L,64288L,64289L,64290L,64291L,64292L, -64293L,64294L,64295L,64296L,64297L,64298L,64299L,64300L,64301L,64302L, -64303L,64304L,64305L,64306L,64307L,64308L,64309L,64310L,64311L,64312L, -64313L,64314L,64315L,64316L,64317L,64318L,64319L,64320L,64321L,64322L, -64323L,64324L,64325L,64326L,64327L,64328L,64329L,64330L,64331L,64332L, -64333L,64334L,64335L,64336L,64337L,64338L,64339L,64340L,64341L,64342L, -64343L,64344L,64345L,64346L,64347L,64348L,64349L,64350L,64351L,64352L, -64353L,64354L,64355L,64356L,64357L,64358L,64359L,64360L,64361L,64362L, -64363L,64364L,64365L,64366L,64367L,64368L,64369L,64370L,64371L,64372L, -64373L,64374L,64375L,64376L,64377L,64378L,64379L,64380L,64381L,64382L, -64383L,64384L,64385L,64386L,64387L,64388L,64389L,64390L,64391L,64392L, -64393L,64394L,64395L,64396L,64397L,64398L,64399L,64400L,64401L,64402L, -64403L,64404L,64405L,64406L,64407L,64408L,64409L,64410L,64411L,64412L, -64413L,64414L,64415L,64416L,64417L,64418L,64419L,64420L,64421L,64422L, -64423L,64424L,64425L,64426L,64427L,64428L,64429L,64430L,64431L,64432L, -64433L,64434L,64435L,64436L,64437L,64438L,64439L,64440L,64441L,64442L, -64443L,64444L,64445L,64446L,64447L,64448L,64449L,64450L,64451L,64452L, -64453L,64454L,64455L,64456L,64457L,64458L,64459L,64460L,64461L,64462L, -64463L,64464L,64465L,64466L,64467L,64468L,64469L,64470L,64471L,64472L, -64473L,64474L,64475L,64476L,64477L,64478L,64479L,64480L,64481L,64482L, -64483L,64484L,64485L,64486L,64487L,64488L,64489L,64490L,64491L,64492L, -64493L,64494L,64495L,64496L,64497L,64498L,64499L,64500L,64501L,64502L, -64503L,64504L,64505L,64506L,64507L,64508L,64509L,64510L,64511L,64512L, -64513L,64514L,64515L,64516L,64517L,64518L,64519L,64520L,64521L,64522L, -64523L,64524L,64525L,64526L,64527L,64528L,64529L,64530L,64531L,64532L, -64533L,64534L,64535L,64536L,64537L,64538L,64539L,64540L,64541L,64542L, -64543L,64544L,64545L,64546L,64547L,64548L,64549L,64550L,64551L,64552L, -64553L,64554L,64555L,64556L,64557L,64558L,64559L,64560L,64561L,64562L, -64563L,64564L,64565L,64566L,64567L,64568L,64569L,64570L,64571L,64572L, -64573L,64574L,64575L,64576L,64577L,64578L,64579L,64580L,64581L,64582L, -64583L,64584L,64585L,64586L,64587L,64588L,64589L,64590L,64591L,64592L, -64593L,64594L,64595L,64596L,64597L,64598L,64599L,64600L,64601L,64602L, -64603L,64604L,64605L,64606L,64607L,64608L,64609L,64610L,64611L,64612L, -64613L,64614L,64615L,64616L,64617L,64618L,64619L,64620L,64621L,64622L, -64623L,64624L,64625L,64626L,64627L,64628L,64629L,64630L,64631L,64632L, -64633L,64634L,64635L,64636L,64637L,64638L,64639L,64640L,64641L,64642L, -64643L,64644L,64645L,64646L,64647L,64648L,64649L,64650L,64651L,64652L, -64653L,64654L,64655L,64656L,64657L,64658L,64659L,64660L,64661L,64662L, -64663L,64664L,64665L,64666L,64667L,64668L,64669L,64670L,64671L,64672L, -64673L,64674L,64675L,64676L,64677L,64678L,64679L,64680L,64681L,64682L, -64683L,64684L,64685L,64686L,64687L,64688L,64689L,64690L,64691L,64692L, -64693L,64694L,64695L,64696L,64697L,64698L,64699L,64700L,64701L,64702L, -64703L,64704L,64705L,64706L,64707L,64708L,64709L,64710L,64711L,64712L, -64713L,64714L,64715L,64716L,64717L,64718L,64719L,64720L,64721L,64722L, -64723L,64724L,64725L,64726L,64727L,64728L,64729L,64730L,64731L,64732L, -64733L,64734L,64735L,64736L,64737L,64738L,64739L,64740L,64741L,64742L, -64743L,64744L,64745L,64746L,64747L,64748L,64749L,64750L,64751L,64752L, -64753L,64754L,64755L,64756L,64757L,64758L,64759L,64760L,64761L,64762L, -64763L,64764L,64765L,64766L,64767L,64768L,64769L,64770L,64771L,64772L, -64773L,64774L,64775L,64776L,64777L,64778L,64779L,64780L,64781L,64782L, -64783L,64784L,64785L,64786L,64787L,64788L,64789L,64790L,64791L,64792L, -64793L,64794L,64795L,64796L,64797L,64798L,64799L,64800L,64801L,64802L, -64803L,64804L,64805L,64806L,64807L,64808L,64809L,64810L,64811L,64812L, -64813L,64814L,64815L,64816L,64817L,64818L,64819L,64820L,64821L,64822L, -64823L,64824L,64825L,64826L,64827L,64828L,64829L,64830L,64831L,64832L, -64833L,64834L,64835L,64836L,64837L,64838L,64839L,64840L,64841L,64842L, -64843L,64844L,64845L,64846L,64847L,64848L,64849L,64850L,64851L,64852L, -64853L,64854L,64855L,64856L,64857L,64858L,64859L,64860L,64861L,64862L, -64863L,64864L,64865L,64866L,64867L,64868L,64869L,64870L,64871L,64872L, -64873L,64874L,64875L,64876L,64877L,64878L,64879L,64880L,64881L,64882L, -64883L,64884L,64885L,64886L,64887L,64888L,64889L,64890L,64891L,64892L, -64893L,64894L,64895L,64896L,64897L,64898L,64899L,64900L,64901L,64902L, -64903L,64904L,64905L,64906L,64907L,64908L,64909L,64910L,64911L,64912L, -64913L,64914L,64915L,64916L,64917L,64918L,64919L,64920L,64921L,64922L, -64923L,64924L,64925L,64926L,64927L,64928L,64929L,64930L,64931L,64932L, -64933L,64934L,64935L,64936L,64937L,64938L,64939L,64940L,64941L,64942L, -64943L,64944L,64945L,64946L,64947L,64948L,64949L,64950L,64951L,64952L, -64953L,64954L,64955L,64956L,64957L,64958L,64959L,64960L,64961L,64962L, -64963L,64964L,64965L,64966L,64967L,64968L,64969L,64970L,64971L,64972L, -64973L,64974L,64975L,64976L,64977L,64978L,64979L,64980L,64981L,64982L, -64983L,64984L,64985L,64986L,64987L,64988L,64989L,64990L,64991L,64992L, -64993L,64994L,64995L,64996L,64997L,64998L,64999L,65000L,65001L,65002L, -65003L,65004L,65005L,65006L,65007L,65008L,65009L,65010L,65011L,65012L, -65013L,65014L,65015L,65016L,65017L,65018L,65019L,65020L,65021L,65022L, -65023L,65024L,65025L,65026L,65027L,65028L,65029L,65030L,65031L,65032L, -65033L,65034L,65035L,65036L,65037L,65038L,65039L,65040L,65041L,65042L, -65043L,65044L,65045L,65046L,65047L,65048L,65049L,65050L,65051L,65052L, -65053L,65054L,65055L,65056L,65057L,65058L,65059L,65060L,65061L,65062L, -65063L,65064L,65065L,65066L,65067L,65068L,65069L,65070L,65071L,65072L, -65073L,65074L,65075L,65076L,65077L,65078L,65079L,65080L,65081L,65082L, -65083L,65084L,65085L,65086L,65087L,65088L,65089L,65090L,65091L,65092L, -65093L,65094L,65095L,65096L,65097L,65098L,65099L,65100L,65101L,65102L, -65103L,65104L,65105L,65106L,65107L,65108L,65109L,65110L,65111L,65112L, -65113L,65114L,65115L,65116L,65117L,65118L,65119L,65120L,65121L,65122L, -65123L,65124L,65125L,65126L,65127L,65128L,65129L,65130L,65131L,65132L, -65133L,65134L,65135L,65136L,65137L,65138L,65139L,65140L,65141L,65142L, -65143L,65144L,65145L,65146L,65147L,65148L,65149L,65150L,65151L,65152L, -65153L,65154L,65155L,65156L,65157L,65158L,65159L,65160L,65161L,65162L, -65163L,65164L,65165L,65166L,65167L,65168L,65169L,65170L,65171L,65172L, -65173L,65174L,65175L,65176L,65177L,65178L,65179L,65180L,65181L,65182L, -65183L,65184L,65185L,65186L,65187L,65188L,65189L,65190L,65191L,65192L, -65193L,65194L,65195L,65196L,65197L,65198L,65199L,65200L,65201L,65202L, -65203L,65204L,65205L,65206L,65207L,65208L,65209L,65210L,65211L,65212L, -65213L,65214L,65215L,65216L,65217L,65218L,65219L,65220L,65221L,65222L, -65223L,65224L,65225L,65226L,65227L,65228L,65229L,65230L,65231L,65232L, -65233L,65234L,65235L,65236L,65237L,65238L,65239L,65240L,65241L,65242L, -65243L,65244L,65245L,65246L,65247L,65248L,65249L,65250L,65251L,65252L, -65253L,65254L,65255L,65256L,65257L,65258L,65259L,65260L,65261L,65262L, -65263L,65264L,65265L,65266L,65267L,65268L,65269L,65270L,65271L,65272L, -65273L,65274L,65275L,65276L,65277L,65278L,65279L,65280L,65281L,65282L, -65283L,65284L,65285L,65286L,65287L,65288L,65289L,65290L,65291L,65292L, -65293L,65294L,65295L,65296L,65297L,65298L,65299L,65300L,65301L,65302L, -65303L,65304L,65305L,65306L,65307L,65308L,65309L,65310L,65311L,65312L, -65313L,65314L,65315L,65316L,65317L,65318L,65319L,65320L,65321L,65322L, -65323L,65324L,65325L,65326L,65327L,65328L,65329L,65330L,65331L,65332L, -65333L,65334L,65335L,65336L,65337L,65338L,65339L,65340L,65341L,65342L, -65343L,65344L,65313L,65314L,65315L,65316L,65317L,65318L,65319L,65320L, -65321L,65322L,65323L,65324L,65325L,65326L,65327L,65328L,65329L,65330L, -65331L,65332L,65333L,65334L,65335L,65336L,65337L,65338L,65371L,65372L, -65373L,65374L,65375L,65376L,65377L,65378L,65379L,65380L,65381L,65382L, -65383L,65384L,65385L,65386L,65387L,65388L,65389L,65390L,65391L,65392L, -65393L,65394L,65395L,65396L,65397L,65398L,65399L,65400L,65401L,65402L, -65403L,65404L,65405L,65406L,65407L,65408L,65409L,65410L,65411L,65412L, -65413L,65414L,65415L,65416L,65417L,65418L,65419L,65420L,65421L,65422L, -65423L,65424L,65425L,65426L,65427L,65428L,65429L,65430L,65431L,65432L, -65433L,65434L,65435L,65436L,65437L,65438L,65439L,65440L,65441L,65442L, -65443L,65444L,65445L,65446L,65447L,65448L,65449L,65450L,65451L,65452L, -65453L,65454L,65455L,65456L,65457L,65458L,65459L,65460L,65461L,65462L, -65463L,65464L,65465L,65466L,65467L,65468L,65469L,65470L,65471L,65472L, -65473L,65474L,65475L,65476L,65477L,65478L,65479L,65480L,65481L,65482L, -65483L,65484L,65485L,65486L,65487L,65488L,65489L,65490L,65491L,65492L, -65493L,65494L,65495L,65496L,65497L,65498L,65499L,65500L,65501L,65502L, -65503L,65504L,65505L,65506L,65507L,65508L,65509L,65510L,65511L,65512L, -65513L,65514L,65515L,65516L,65517L,65518L,65519L,65520L,65521L,65522L, -65523L,65524L,65525L,65526L,65527L,65528L,65529L,65530L,65531L,65532L, -65533L,65534L,65535L, +11373,11376,385,390,597,393,394,600,399,602,400,42923L,605,606,607,403, +42924L,610,404,612,42893L,42922L,615,407,406,42926L,11362,42925L,621,622, +412,624,11374,413,627,628,415,630,631,632,633,634,635,636,11364,638,639, +422,641,642,425,644,645,646,42929L,430,580,433,434,581,653,654,655,656,657, +439,659,660,661,662,663,664,665,666,667,668,42930L,42928L,671,672,673,674, +675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692, +693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710, +711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728, +729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746, +747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764, +765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782, +783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800, +801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818, +819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836, +921,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854, +855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872, +873,874,875,876,877,878,879,880,880,882,882,884,885,886,886,888,889,890, +1021,1022,1023,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908, +909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926, +927,928,929,930,931,932,933,934,935,936,937,938,939,902,904,905,906,944, +913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931, +931,932,933,934,935,936,937,938,939,908,910,911,975,914,920,978,979,980, +934,928,975,984,984,986,986,988,988,990,990,992,992,994,994,996,996,998, +998,1000,1000,1002,1002,1004,1004,1006,1006,922,929,1017,895,1012,917,1014, +1015,1015,1017,1018,1018,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029, +1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044, +1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059, +1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1040,1041,1042, +1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057, +1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1024, +1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039, +1120,1120,1122,1122,1124,1124,1126,1126,1128,1128,1130,1130,1132,1132,1134, +1134,1136,1136,1138,1138,1140,1140,1142,1142,1144,1144,1146,1146,1148,1148, +1150,1150,1152,1152,1154,1155,1156,1157,1158,1159,1160,1161,1162,1162,1164, +1164,1166,1166,1168,1168,1170,1170,1172,1172,1174,1174,1176,1176,1178,1178, +1180,1180,1182,1182,1184,1184,1186,1186,1188,1188,1190,1190,1192,1192,1194, +1194,1196,1196,1198,1198,1200,1200,1202,1202,1204,1204,1206,1206,1208,1208, +1210,1210,1212,1212,1214,1214,1216,1217,1217,1219,1219,1221,1221,1223,1223, +1225,1225,1227,1227,1229,1229,1216,1232,1232,1234,1234,1236,1236,1238,1238, +1240,1240,1242,1242,1244,1244,1246,1246,1248,1248,1250,1250,1252,1252,1254, +1254,1256,1256,1258,1258,1260,1260,1262,1262,1264,1264,1266,1266,1268,1268, +1270,1270,1272,1272,1274,1274,1276,1276,1278,1278,1280,1280,1282,1282,1284, +1284,1286,1286,1288,1288,1290,1290,1292,1292,1294,1294,1296,1296,1298,1298, +1300,1300,1302,1302,1304,1304,1306,1306,1308,1308,1310,1310,1312,1312,1314, +1314,1316,1316,1318,1318,1320,1320,1322,1322,1324,1324,1326,1326,1328,1329, +1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344, +1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359, +1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374, +1375,1376,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341, +1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356, +1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1415,1416,1417,1418,1419, +1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434, +1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449, +1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464, +1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479, +1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494, +1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509, +1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524, +1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539, +1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554, +1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569, +1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584, +1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599, +1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614, +1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629, +1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644, +1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659, +1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674, +1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689, +1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704, +1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719, +1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734, +1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749, +1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764, +1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779, +1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794, +1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809, +1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824, +1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839, +1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854, +1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869, +1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884, +1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899, +1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914, +1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929, +1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944, +1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959, +1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974, +1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989, +1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004, +2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, +2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034, +2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049, +2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064, +2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079, +2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094, +2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109, +2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124, +2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139, +2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154, +2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169, +2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184, +2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199, +2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214, +2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229, +2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244, +2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259, +2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274, +2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289, +2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304, +2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319, +2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334, +2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349, +2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364, +2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379, +2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394, +2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409, +2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424, +2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439, +2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454, +2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469, +2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484, +2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499, +2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514, +2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529, +2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544, +2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559, +2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574, +2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589, +2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604, +2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619, +2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634, +2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649, +2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664, +2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679, +2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694, +2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709, +2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724, +2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739, +2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754, +2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769, +2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784, +2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799, +2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814, +2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829, +2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844, +2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859, +2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874, +2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889, +2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904, +2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919, +2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934, +2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949, +2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964, +2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979, +2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994, +2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009, +3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024, +3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039, +3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054, +3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069, +3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084, +3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099, +3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114, +3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129, +3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144, +3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159, +3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174, +3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189, +3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204, +3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219, +3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234, +3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249, +3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, +3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279, +3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294, +3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309, +3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324, +3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339, +3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354, +3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369, +3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384, +3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399, +3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414, +3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429, +3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444, +3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459, +3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474, +3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489, +3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504, +3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519, +3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534, +3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549, +3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564, +3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579, +3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594, +3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609, +3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624, +3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639, +3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654, +3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669, +3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684, +3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699, +3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714, +3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729, +3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744, +3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759, +3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774, +3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789, +3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804, +3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819, +3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834, +3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849, +3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864, +3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879, +3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894, +3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909, +3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924, +3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939, +3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954, +3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969, +3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984, +3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999, +4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014, +4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029, +4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044, +4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059, +4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074, +4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089, +4090,4091,4092,4093,4094,4095,4096,4097,4098,4099,4100,4101,4102,4103,4104, +4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119, +4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134, +4135,4136,4137,4138,4139,4140,4141,4142,4143,4144,4145,4146,4147,4148,4149, +4150,4151,4152,4153,4154,4155,4156,4157,4158,4159,4160,4161,4162,4163,4164, +4165,4166,4167,4168,4169,4170,4171,4172,4173,4174,4175,4176,4177,4178,4179, +4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,4190,4191,4192,4193,4194, +4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,4206,4207,4208,4209, +4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224, +4225,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235,4236,4237,4238,4239, +4240,4241,4242,4243,4244,4245,4246,4247,4248,4249,4250,4251,4252,4253,4254, +4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269, +4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284, +4285,4286,4287,4288,4289,4290,4291,4292,4293,4294,4295,4296,4297,4298,4299, +4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314, +4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329, +4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344, +4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359, +4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374, +4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389, +4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404, +4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419, +4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434, +4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449, +4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464, +4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479, +4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494, +4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509, +4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524, +4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539, +4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554, +4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569, +4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584, +4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599, +4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614, +4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629, +4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644, +4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659, +4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674, +4675,4676,4677,4678,4679,4680,4681,4682,4683,4684,4685,4686,4687,4688,4689, +4690,4691,4692,4693,4694,4695,4696,4697,4698,4699,4700,4701,4702,4703,4704, +4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719, +4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734, +4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4745,4746,4747,4748,4749, +4750,4751,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764, +4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779, +4780,4781,4782,4783,4784,4785,4786,4787,4788,4789,4790,4791,4792,4793,4794, +4795,4796,4797,4798,4799,4800,4801,4802,4803,4804,4805,4806,4807,4808,4809, +4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4823,4824, +4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839, +4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854, +4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869, +4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4881,4882,4883,4884, +4885,4886,4887,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899, +4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914, +4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929, +4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944, +4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4955,4956,4957,4958,4959, +4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,4971,4972,4973,4974, +4975,4976,4977,4978,4979,4980,4981,4982,4983,4984,4985,4986,4987,4988,4989, +4990,4991,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004, +5005,5006,5007,5008,5009,5010,5011,5012,5013,5014,5015,5016,5017,5018,5019, +5020,5021,5022,5023,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034, +5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049, +5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064, +5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079, +5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094, +5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109, +5110,5111,5104,5105,5106,5107,5108,5109,5118,5119,5120,5121,5122,5123,5124, +5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139, +5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154, +5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169, +5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184, +5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199, +5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214, +5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229, +5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244, +5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259, +5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274, +5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289, +5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304, +5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319, +5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334, +5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349, +5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364, +5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, +5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394, +5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409, +5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439, +5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454, +5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469, +5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484, +5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499, +5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514, +5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529, +5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544, +5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559, +5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574, +5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589, +5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604, +5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619, +5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634, +5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649, +5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679, +5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694, +5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709, +5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724, +5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739, +5740,5741,5742,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754, +5755,5756,5757,5758,5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,5769, +5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784, +5785,5786,5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799, +5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814, +5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829, +5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, +5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859, +5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874, +5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889, +5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919, +5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934, +5935,5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949, +5950,5951,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964, +5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, +5980,5981,5982,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994, +5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, +6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024, +6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, +6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054, +6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069, +6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, +6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099, +6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114, +6115,6116,6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129, +6130,6131,6132,6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144, +6145,6146,6147,6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159, +6160,6161,6162,6163,6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174, +6175,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189, +6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204, +6205,6206,6207,6208,6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219, +6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234, +6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249, +6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264, +6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275,6276,6277,6278,6279, +6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294, +6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309, +6310,6311,6312,6313,6314,6315,6316,6317,6318,6319,6320,6321,6322,6323,6324, +6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339, +6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354, +6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369, +6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384, +6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397,6398,6399, +6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414, +6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429, +6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6444, +6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456,6457,6458,6459, +6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, +6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489, +6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504, +6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, +6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534, +6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549, +6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564, +6565,6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579, +6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594, +6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609, +6610,6611,6612,6613,6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624, +6625,6626,6627,6628,6629,6630,6631,6632,6633,6634,6635,6636,6637,6638,6639, +6640,6641,6642,6643,6644,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654, +6655,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669, +6670,6671,6672,6673,6674,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684, +6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699, +6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714, +6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729, +6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744, +6745,6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759, +6760,6761,6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774, +6775,6776,6777,6778,6779,6780,6781,6782,6783,6784,6785,6786,6787,6788,6789, +6790,6791,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804, +6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6815,6816,6817,6818,6819, +6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834, +6835,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,6847,6848,6849, +6850,6851,6852,6853,6854,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, +6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,6878,6879, +6880,6881,6882,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, +6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,6905,6906,6907,6908,6909, +6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924, +6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939, +6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954, +6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968,6969, +6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, +6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,6998,6999, +7000,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013,7014, +7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, +7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042,7043,7044, +7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, +7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, +7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089, +7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104, +7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119, +7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134, +7135,7136,7137,7138,7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149, +7150,7151,7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164, +7165,7166,7167,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179, +7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194, +7195,7196,7197,7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209, +7210,7211,7212,7213,7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224, +7225,7226,7227,7228,7229,7230,7231,7232,7233,7234,7235,7236,7237,7238,7239, +7240,7241,7242,7243,7244,7245,7246,7247,7248,7249,7250,7251,7252,7253,7254, +7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269, +7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284, +7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,1042,1044,1054,1057, +1058,1058,1066,1122,42570L,7305,7306,7307,7308,7309,7310,7311,7312,7313, +7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328, +7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, +7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358, +7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373, +7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388, +7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403, +7404,7405,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418, +7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433, +7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448, +7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463, +7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478, +7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493, +7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508, +7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523, +7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538, +7539,7540,7541,7542,7543,7544,42877L,7546,7547,7548,11363,7550,7551,7552, +7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, +7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, +7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597, +7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612, +7613,7614,7615,7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627, +7628,7629,7630,7631,7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642, +7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657, +7658,7659,7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,7671,7672, +7673,7674,7675,7676,7677,7678,7679,7680,7680,7682,7682,7684,7684,7686,7686, +7688,7688,7690,7690,7692,7692,7694,7694,7696,7696,7698,7698,7700,7700,7702, +7702,7704,7704,7706,7706,7708,7708,7710,7710,7712,7712,7714,7714,7716,7716, +7718,7718,7720,7720,7722,7722,7724,7724,7726,7726,7728,7728,7730,7730,7732, +7732,7734,7734,7736,7736,7738,7738,7740,7740,7742,7742,7744,7744,7746,7746, +7748,7748,7750,7750,7752,7752,7754,7754,7756,7756,7758,7758,7760,7760,7762, +7762,7764,7764,7766,7766,7768,7768,7770,7770,7772,7772,7774,7774,7776,7776, +7778,7778,7780,7780,7782,7782,7784,7784,7786,7786,7788,7788,7790,7790,7792, +7792,7794,7794,7796,7796,7798,7798,7800,7800,7802,7802,7804,7804,7806,7806, +7808,7808,7810,7810,7812,7812,7814,7814,7816,7816,7818,7818,7820,7820,7822, +7822,7824,7824,7826,7826,7828,7828,7830,7831,7832,7833,7834,7776,7836,7837, +7838,7839,7840,7840,7842,7842,7844,7844,7846,7846,7848,7848,7850,7850,7852, +7852,7854,7854,7856,7856,7858,7858,7860,7860,7862,7862,7864,7864,7866,7866, +7868,7868,7870,7870,7872,7872,7874,7874,7876,7876,7878,7878,7880,7880,7882, +7882,7884,7884,7886,7886,7888,7888,7890,7890,7892,7892,7894,7894,7896,7896, +7898,7898,7900,7900,7902,7902,7904,7904,7906,7906,7908,7908,7910,7910,7912, +7912,7914,7914,7916,7916,7918,7918,7920,7920,7922,7922,7924,7924,7926,7926, +7928,7928,7930,7930,7932,7932,7934,7934,7944,7945,7946,7947,7948,7949,7950, +7951,7944,7945,7946,7947,7948,7949,7950,7951,7960,7961,7962,7963,7964,7965, +7958,7959,7960,7961,7962,7963,7964,7965,7966,7967,7976,7977,7978,7979,7980, +7981,7982,7983,7976,7977,7978,7979,7980,7981,7982,7983,7992,7993,7994,7995, +7996,7997,7998,7999,7992,7993,7994,7995,7996,7997,7998,7999,8008,8009,8010, +8011,8012,8013,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,8025, +8018,8027,8020,8029,8022,8031,8024,8025,8026,8027,8028,8029,8030,8031,8040, +8041,8042,8043,8044,8045,8046,8047,8040,8041,8042,8043,8044,8045,8046,8047, +8122,8123,8136,8137,8138,8139,8154,8155,8184,8185,8170,8171,8186,8187,8062, +8063,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077, +8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092, +8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107, +8108,8109,8110,8111,8120,8121,8114,8115,8116,8117,8118,8119,8120,8121,8122, +8123,8124,8125,921,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137, +8138,8139,8140,8141,8142,8143,8152,8153,8146,8147,8148,8149,8150,8151,8152, +8153,8154,8155,8156,8157,8158,8159,8168,8169,8162,8163,8164,8172,8166,8167, +8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,8182, +8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, +8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212, +8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227, +8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242, +8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257, +8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272, +8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, +8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302, +8303,8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317, +8318,8319,8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332, +8333,8334,8335,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347, +8348,8349,8350,8351,8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362, +8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373,8374,8375,8376,8377, +8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389,8390,8391,8392, +8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405,8406,8407, +8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421,8422, +8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, +8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452, +8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467, +8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482, +8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497, +8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512, +8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8498,8527, +8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542, +8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557, +8558,8559,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556, +8557,8558,8559,8576,8577,8578,8579,8579,8581,8582,8583,8584,8585,8586,8587, +8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602, +8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613,8614,8615,8616,8617, +8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629,8630,8631,8632, +8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645,8646,8647, +8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661,8662, +8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, +8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692, +8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707, +8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722, +8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737, +8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749,8750,8751,8752, +8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,8764,8765,8766,8767, +8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780,8781,8782, +8783,8784,8785,8786,8787,8788,8789,8790,8791,8792,8793,8794,8795,8796,8797, +8798,8799,8800,8801,8802,8803,8804,8805,8806,8807,8808,8809,8810,8811,8812, +8813,8814,8815,8816,8817,8818,8819,8820,8821,8822,8823,8824,8825,8826,8827, +8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839,8840,8841,8842, +8843,8844,8845,8846,8847,8848,8849,8850,8851,8852,8853,8854,8855,8856,8857, +8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870,8871,8872, +8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,8885,8886,8887, +8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901,8902, +8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, +8918,8919,8920,8921,8922,8923,8924,8925,8926,8927,8928,8929,8930,8931,8932, +8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,8944,8945,8946,8947, +8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, +8963,8964,8965,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, +8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992, +8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007, +9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022, +9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037, +9038,9039,9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052, +9053,9054,9055,9056,9057,9058,9059,9060,9061,9062,9063,9064,9065,9066,9067, +9068,9069,9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082, +9083,9084,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097, +9098,9099,9100,9101,9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112, +9113,9114,9115,9116,9117,9118,9119,9120,9121,9122,9123,9124,9125,9126,9127, +9128,9129,9130,9131,9132,9133,9134,9135,9136,9137,9138,9139,9140,9141,9142, +9143,9144,9145,9146,9147,9148,9149,9150,9151,9152,9153,9154,9155,9156,9157, +9158,9159,9160,9161,9162,9163,9164,9165,9166,9167,9168,9169,9170,9171,9172, +9173,9174,9175,9176,9177,9178,9179,9180,9181,9182,9183,9184,9185,9186,9187, +9188,9189,9190,9191,9192,9193,9194,9195,9196,9197,9198,9199,9200,9201,9202, +9203,9204,9205,9206,9207,9208,9209,9210,9211,9212,9213,9214,9215,9216,9217, +9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232, +9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247, +9248,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262, +9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,9273,9274,9275,9276,9277, +9278,9279,9280,9281,9282,9283,9284,9285,9286,9287,9288,9289,9290,9291,9292, +9293,9294,9295,9296,9297,9298,9299,9300,9301,9302,9303,9304,9305,9306,9307, +9308,9309,9310,9311,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322, +9323,9324,9325,9326,9327,9328,9329,9330,9331,9332,9333,9334,9335,9336,9337, +9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9352, +9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367, +9368,9369,9370,9371,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382, +9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397, +9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412, +9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,9398,9399,9400,9401, +9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416, +9417,9418,9419,9420,9421,9422,9423,9450,9451,9452,9453,9454,9455,9456,9457, +9458,9459,9460,9461,9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472, +9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487, +9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502, +9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517, +9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532, +9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547, +9548,9549,9550,9551,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562, +9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577, +9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9588,9589,9590,9591,9592, +9593,9594,9595,9596,9597,9598,9599,9600,9601,9602,9603,9604,9605,9606,9607, +9608,9609,9610,9611,9612,9613,9614,9615,9616,9617,9618,9619,9620,9621,9622, +9623,9624,9625,9626,9627,9628,9629,9630,9631,9632,9633,9634,9635,9636,9637, +9638,9639,9640,9641,9642,9643,9644,9645,9646,9647,9648,9649,9650,9651,9652, +9653,9654,9655,9656,9657,9658,9659,9660,9661,9662,9663,9664,9665,9666,9667, +9668,9669,9670,9671,9672,9673,9674,9675,9676,9677,9678,9679,9680,9681,9682, +9683,9684,9685,9686,9687,9688,9689,9690,9691,9692,9693,9694,9695,9696,9697, +9698,9699,9700,9701,9702,9703,9704,9705,9706,9707,9708,9709,9710,9711,9712, +9713,9714,9715,9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727, +9728,9729,9730,9731,9732,9733,9734,9735,9736,9737,9738,9739,9740,9741,9742, +9743,9744,9745,9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757, +9758,9759,9760,9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772, +9773,9774,9775,9776,9777,9778,9779,9780,9781,9782,9783,9784,9785,9786,9787, +9788,9789,9790,9791,9792,9793,9794,9795,9796,9797,9798,9799,9800,9801,9802, +9803,9804,9805,9806,9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817, +9818,9819,9820,9821,9822,9823,9824,9825,9826,9827,9828,9829,9830,9831,9832, +9833,9834,9835,9836,9837,9838,9839,9840,9841,9842,9843,9844,9845,9846,9847, +9848,9849,9850,9851,9852,9853,9854,9855,9856,9857,9858,9859,9860,9861,9862, +9863,9864,9865,9866,9867,9868,9869,9870,9871,9872,9873,9874,9875,9876,9877, +9878,9879,9880,9881,9882,9883,9884,9885,9886,9887,9888,9889,9890,9891,9892, +9893,9894,9895,9896,9897,9898,9899,9900,9901,9902,9903,9904,9905,9906,9907, +9908,9909,9910,9911,9912,9913,9914,9915,9916,9917,9918,9919,9920,9921,9922, +9923,9924,9925,9926,9927,9928,9929,9930,9931,9932,9933,9934,9935,9936,9937, +9938,9939,9940,9941,9942,9943,9944,9945,9946,9947,9948,9949,9950,9951,9952, +9953,9954,9955,9956,9957,9958,9959,9960,9961,9962,9963,9964,9965,9966,9967, +9968,9969,9970,9971,9972,9973,9974,9975,9976,9977,9978,9979,9980,9981,9982, +9983,9984,9985,9986,9987,9988,9989,9990,9991,9992,9993,9994,9995,9996,9997, +9998,9999,10000,10001,10002,10003,10004,10005,10006,10007,10008,10009, +10010,10011,10012,10013,10014,10015,10016,10017,10018,10019,10020,10021, +10022,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, +10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045, +10046,10047,10048,10049,10050,10051,10052,10053,10054,10055,10056,10057, +10058,10059,10060,10061,10062,10063,10064,10065,10066,10067,10068,10069, +10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080,10081, +10082,10083,10084,10085,10086,10087,10088,10089,10090,10091,10092,10093, +10094,10095,10096,10097,10098,10099,10100,10101,10102,10103,10104,10105, +10106,10107,10108,10109,10110,10111,10112,10113,10114,10115,10116,10117, +10118,10119,10120,10121,10122,10123,10124,10125,10126,10127,10128,10129, +10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,10141, +10142,10143,10144,10145,10146,10147,10148,10149,10150,10151,10152,10153, +10154,10155,10156,10157,10158,10159,10160,10161,10162,10163,10164,10165, +10166,10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177, +10178,10179,10180,10181,10182,10183,10184,10185,10186,10187,10188,10189, +10190,10191,10192,10193,10194,10195,10196,10197,10198,10199,10200,10201, +10202,10203,10204,10205,10206,10207,10208,10209,10210,10211,10212,10213, +10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225, +10226,10227,10228,10229,10230,10231,10232,10233,10234,10235,10236,10237, +10238,10239,10240,10241,10242,10243,10244,10245,10246,10247,10248,10249, +10250,10251,10252,10253,10254,10255,10256,10257,10258,10259,10260,10261, +10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273, +10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285, +10286,10287,10288,10289,10290,10291,10292,10293,10294,10295,10296,10297, +10298,10299,10300,10301,10302,10303,10304,10305,10306,10307,10308,10309, +10310,10311,10312,10313,10314,10315,10316,10317,10318,10319,10320,10321, +10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333, +10334,10335,10336,10337,10338,10339,10340,10341,10342,10343,10344,10345, +10346,10347,10348,10349,10350,10351,10352,10353,10354,10355,10356,10357, +10358,10359,10360,10361,10362,10363,10364,10365,10366,10367,10368,10369, +10370,10371,10372,10373,10374,10375,10376,10377,10378,10379,10380,10381, +10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,10393, +10394,10395,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405, +10406,10407,10408,10409,10410,10411,10412,10413,10414,10415,10416,10417, +10418,10419,10420,10421,10422,10423,10424,10425,10426,10427,10428,10429, +10430,10431,10432,10433,10434,10435,10436,10437,10438,10439,10440,10441, +10442,10443,10444,10445,10446,10447,10448,10449,10450,10451,10452,10453, +10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465, +10466,10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477, +10478,10479,10480,10481,10482,10483,10484,10485,10486,10487,10488,10489, +10490,10491,10492,10493,10494,10495,10496,10497,10498,10499,10500,10501, +10502,10503,10504,10505,10506,10507,10508,10509,10510,10511,10512,10513, +10514,10515,10516,10517,10518,10519,10520,10521,10522,10523,10524,10525, +10526,10527,10528,10529,10530,10531,10532,10533,10534,10535,10536,10537, +10538,10539,10540,10541,10542,10543,10544,10545,10546,10547,10548,10549, +10550,10551,10552,10553,10554,10555,10556,10557,10558,10559,10560,10561, +10562,10563,10564,10565,10566,10567,10568,10569,10570,10571,10572,10573, +10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585, +10586,10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597, +10598,10599,10600,10601,10602,10603,10604,10605,10606,10607,10608,10609, +10610,10611,10612,10613,10614,10615,10616,10617,10618,10619,10620,10621, +10622,10623,10624,10625,10626,10627,10628,10629,10630,10631,10632,10633, +10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645, +10646,10647,10648,10649,10650,10651,10652,10653,10654,10655,10656,10657, +10658,10659,10660,10661,10662,10663,10664,10665,10666,10667,10668,10669, +10670,10671,10672,10673,10674,10675,10676,10677,10678,10679,10680,10681, +10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692,10693, +10694,10695,10696,10697,10698,10699,10700,10701,10702,10703,10704,10705, +10706,10707,10708,10709,10710,10711,10712,10713,10714,10715,10716,10717, +10718,10719,10720,10721,10722,10723,10724,10725,10726,10727,10728,10729, +10730,10731,10732,10733,10734,10735,10736,10737,10738,10739,10740,10741, +10742,10743,10744,10745,10746,10747,10748,10749,10750,10751,10752,10753, +10754,10755,10756,10757,10758,10759,10760,10761,10762,10763,10764,10765, +10766,10767,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777, +10778,10779,10780,10781,10782,10783,10784,10785,10786,10787,10788,10789, +10790,10791,10792,10793,10794,10795,10796,10797,10798,10799,10800,10801, +10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812,10813, +10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825, +10826,10827,10828,10829,10830,10831,10832,10833,10834,10835,10836,10837, +10838,10839,10840,10841,10842,10843,10844,10845,10846,10847,10848,10849, +10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860,10861, +10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873, +10874,10875,10876,10877,10878,10879,10880,10881,10882,10883,10884,10885, +10886,10887,10888,10889,10890,10891,10892,10893,10894,10895,10896,10897, +10898,10899,10900,10901,10902,10903,10904,10905,10906,10907,10908,10909, +10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,10920,10921, +10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,10933, +10934,10935,10936,10937,10938,10939,10940,10941,10942,10943,10944,10945, +10946,10947,10948,10949,10950,10951,10952,10953,10954,10955,10956,10957, +10958,10959,10960,10961,10962,10963,10964,10965,10966,10967,10968,10969, +10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981, +10982,10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993, +10994,10995,10996,10997,10998,10999,11000,11001,11002,11003,11004,11005, +11006,11007,11008,11009,11010,11011,11012,11013,11014,11015,11016,11017, +11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, +11030,11031,11032,11033,11034,11035,11036,11037,11038,11039,11040,11041, +11042,11043,11044,11045,11046,11047,11048,11049,11050,11051,11052,11053, +11054,11055,11056,11057,11058,11059,11060,11061,11062,11063,11064,11065, +11066,11067,11068,11069,11070,11071,11072,11073,11074,11075,11076,11077, +11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088,11089, +11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101, +11102,11103,11104,11105,11106,11107,11108,11109,11110,11111,11112,11113, +11114,11115,11116,11117,11118,11119,11120,11121,11122,11123,11124,11125, +11126,11127,11128,11129,11130,11131,11132,11133,11134,11135,11136,11137, +11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149, +11150,11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161, +11162,11163,11164,11165,11166,11167,11168,11169,11170,11171,11172,11173, +11174,11175,11176,11177,11178,11179,11180,11181,11182,11183,11184,11185, +11186,11187,11188,11189,11190,11191,11192,11193,11194,11195,11196,11197, +11198,11199,11200,11201,11202,11203,11204,11205,11206,11207,11208,11209, +11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221, +11222,11223,11224,11225,11226,11227,11228,11229,11230,11231,11232,11233, +11234,11235,11236,11237,11238,11239,11240,11241,11242,11243,11244,11245, +11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257, +11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269, +11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281, +11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293, +11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305, +11306,11307,11308,11309,11310,11311,11264,11265,11266,11267,11268,11269, +11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281, +11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293, +11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305, +11306,11307,11308,11309,11310,11359,11360,11360,11362,11363,11364,570,574, +11367,11367,11369,11369,11371,11371,11373,11374,11375,11376,11377,11378, +11378,11380,11381,11381,11383,11384,11385,11386,11387,11388,11389,11390, +11391,11392,11392,11394,11394,11396,11396,11398,11398,11400,11400,11402, +11402,11404,11404,11406,11406,11408,11408,11410,11410,11412,11412,11414, +11414,11416,11416,11418,11418,11420,11420,11422,11422,11424,11424,11426, +11426,11428,11428,11430,11430,11432,11432,11434,11434,11436,11436,11438, +11438,11440,11440,11442,11442,11444,11444,11446,11446,11448,11448,11450, +11450,11452,11452,11454,11454,11456,11456,11458,11458,11460,11460,11462, +11462,11464,11464,11466,11466,11468,11468,11470,11470,11472,11472,11474, +11474,11476,11476,11478,11478,11480,11480,11482,11482,11484,11484,11486, +11486,11488,11488,11490,11490,11492,11493,11494,11495,11496,11497,11498, +11499,11499,11501,11501,11503,11504,11505,11506,11506,11508,11509,11510, +11511,11512,11513,11514,11515,11516,11517,11518,11519,4256,4257,4258,4259, +4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274, +4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289, +4290,4291,4292,4293,11558,4295,11560,11561,11562,11563,11564,4301,11566, +11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, +11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590, +11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602, +11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614, +11615,11616,11617,11618,11619,11620,11621,11622,11623,11624,11625,11626, +11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, +11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650, +11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662, +11663,11664,11665,11666,11667,11668,11669,11670,11671,11672,11673,11674, +11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685,11686, +11687,11688,11689,11690,11691,11692,11693,11694,11695,11696,11697,11698, +11699,11700,11701,11702,11703,11704,11705,11706,11707,11708,11709,11710, +11711,11712,11713,11714,11715,11716,11717,11718,11719,11720,11721,11722, +11723,11724,11725,11726,11727,11728,11729,11730,11731,11732,11733,11734, +11735,11736,11737,11738,11739,11740,11741,11742,11743,11744,11745,11746, +11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758, +11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770, +11771,11772,11773,11774,11775,11776,11777,11778,11779,11780,11781,11782, +11783,11784,11785,11786,11787,11788,11789,11790,11791,11792,11793,11794, +11795,11796,11797,11798,11799,11800,11801,11802,11803,11804,11805,11806, +11807,11808,11809,11810,11811,11812,11813,11814,11815,11816,11817,11818, +11819,11820,11821,11822,11823,11824,11825,11826,11827,11828,11829,11830, +11831,11832,11833,11834,11835,11836,11837,11838,11839,11840,11841,11842, +11843,11844,11845,11846,11847,11848,11849,11850,11851,11852,11853,11854, +11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, +11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878, +11879,11880,11881,11882,11883,11884,11885,11886,11887,11888,11889,11890, +11891,11892,11893,11894,11895,11896,11897,11898,11899,11900,11901,11902, +11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913,11914, +11915,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926, +11927,11928,11929,11930,11931,11932,11933,11934,11935,11936,11937,11938, +11939,11940,11941,11942,11943,11944,11945,11946,11947,11948,11949,11950, +11951,11952,11953,11954,11955,11956,11957,11958,11959,11960,11961,11962, +11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974, +11975,11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986, +11987,11988,11989,11990,11991,11992,11993,11994,11995,11996,11997,11998, +11999,12000,12001,12002,12003,12004,12005,12006,12007,12008,12009,12010, +12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021,12022, +12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034, +12035,12036,12037,12038,12039,12040,12041,12042,12043,12044,12045,12046, +12047,12048,12049,12050,12051,12052,12053,12054,12055,12056,12057,12058, +12059,12060,12061,12062,12063,12064,12065,12066,12067,12068,12069,12070, +12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082, +12083,12084,12085,12086,12087,12088,12089,12090,12091,12092,12093,12094, +12095,12096,12097,12098,12099,12100,12101,12102,12103,12104,12105,12106, +12107,12108,12109,12110,12111,12112,12113,12114,12115,12116,12117,12118, +12119,12120,12121,12122,12123,12124,12125,12126,12127,12128,12129,12130, +12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142, +12143,12144,12145,12146,12147,12148,12149,12150,12151,12152,12153,12154, +12155,12156,12157,12158,12159,12160,12161,12162,12163,12164,12165,12166, +12167,12168,12169,12170,12171,12172,12173,12174,12175,12176,12177,12178, +12179,12180,12181,12182,12183,12184,12185,12186,12187,12188,12189,12190, +12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202, +12203,12204,12205,12206,12207,12208,12209,12210,12211,12212,12213,12214, +12215,12216,12217,12218,12219,12220,12221,12222,12223,12224,12225,12226, +12227,12228,12229,12230,12231,12232,12233,12234,12235,12236,12237,12238, +12239,12240,12241,12242,12243,12244,12245,12246,12247,12248,12249,12250, +12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262, +12263,12264,12265,12266,12267,12268,12269,12270,12271,12272,12273,12274, +12275,12276,12277,12278,12279,12280,12281,12282,12283,12284,12285,12286, +12287,12288,12289,12290,12291,12292,12293,12294,12295,12296,12297,12298, +12299,12300,12301,12302,12303,12304,12305,12306,12307,12308,12309,12310, +12311,12312,12313,12314,12315,12316,12317,12318,12319,12320,12321,12322, +12323,12324,12325,12326,12327,12328,12329,12330,12331,12332,12333,12334, +12335,12336,12337,12338,12339,12340,12341,12342,12343,12344,12345,12346, +12347,12348,12349,12350,12351,12352,12353,12354,12355,12356,12357,12358, +12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370, +12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382, +12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394, +12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406, +12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418, +12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430, +12431,12432,12433,12434,12435,12436,12437,12438,12439,12440,12441,12442, +12443,12444,12445,12446,12447,12448,12449,12450,12451,12452,12453,12454, +12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466, +12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478, +12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490, +12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502, +12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514, +12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526, +12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538, +12539,12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550, +12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562, +12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574, +12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586, +12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598, +12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610, +12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622, +12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634, +12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646, +12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658, +12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670, +12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682, +12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694, +12695,12696,12697,12698,12699,12700,12701,12702,12703,12704,12705,12706, +12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718, +12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730, +12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, +12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754, +12755,12756,12757,12758,12759,12760,12761,12762,12763,12764,12765,12766, +12767,12768,12769,12770,12771,12772,12773,12774,12775,12776,12777,12778, +12779,12780,12781,12782,12783,12784,12785,12786,12787,12788,12789,12790, +12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802, +12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814, +12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826, +12827,12828,12829,12830,12831,12832,12833,12834,12835,12836,12837,12838, +12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849,12850, +12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,12862, +12863,12864,12865,12866,12867,12868,12869,12870,12871,12872,12873,12874, +12875,12876,12877,12878,12879,12880,12881,12882,12883,12884,12885,12886, +12887,12888,12889,12890,12891,12892,12893,12894,12895,12896,12897,12898, +12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910, +12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922, +12923,12924,12925,12926,12927,12928,12929,12930,12931,12932,12933,12934, +12935,12936,12937,12938,12939,12940,12941,12942,12943,12944,12945,12946, +12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,12957,12958, +12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970, +12971,12972,12973,12974,12975,12976,12977,12978,12979,12980,12981,12982, +12983,12984,12985,12986,12987,12988,12989,12990,12991,12992,12993,12994, +12995,12996,12997,12998,12999,13000,13001,13002,13003,13004,13005,13006, +13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, +13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,13030, +13031,13032,13033,13034,13035,13036,13037,13038,13039,13040,13041,13042, +13043,13044,13045,13046,13047,13048,13049,13050,13051,13052,13053,13054, +13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065,13066, +13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078, +13079,13080,13081,13082,13083,13084,13085,13086,13087,13088,13089,13090, +13091,13092,13093,13094,13095,13096,13097,13098,13099,13100,13101,13102, +13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113,13114, +13115,13116,13117,13118,13119,13120,13121,13122,13123,13124,13125,13126, +13127,13128,13129,13130,13131,13132,13133,13134,13135,13136,13137,13138, +13139,13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150, +13151,13152,13153,13154,13155,13156,13157,13158,13159,13160,13161,13162, +13163,13164,13165,13166,13167,13168,13169,13170,13171,13172,13173,13174, +13175,13176,13177,13178,13179,13180,13181,13182,13183,13184,13185,13186, +13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198, +13199,13200,13201,13202,13203,13204,13205,13206,13207,13208,13209,13210, +13211,13212,13213,13214,13215,13216,13217,13218,13219,13220,13221,13222, +13223,13224,13225,13226,13227,13228,13229,13230,13231,13232,13233,13234, +13235,13236,13237,13238,13239,13240,13241,13242,13243,13244,13245,13246, +13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258, +13259,13260,13261,13262,13263,13264,13265,13266,13267,13268,13269,13270, +13271,13272,13273,13274,13275,13276,13277,13278,13279,13280,13281,13282, +13283,13284,13285,13286,13287,13288,13289,13290,13291,13292,13293,13294, +13295,13296,13297,13298,13299,13300,13301,13302,13303,13304,13305,13306, +13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318, +13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330, +13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342, +13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354, +13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366, +13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378, +13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390, +13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402, +13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, +13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426, +13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438, +13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450, +13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462, +13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474, +13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486, +13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498, +13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510, +13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, +13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534, +13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546, +13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558, +13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, +13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582, +13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594, +13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606, +13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, +13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630, +13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642, +13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654, +13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666, +13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678, +13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690, +13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702, +13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714, +13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726, +13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738, +13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750, +13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762, +13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774, +13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786, +13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798, +13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810, +13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822, +13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834, +13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846, +13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858, +13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870, +13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882, +13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894, +13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906, +13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918, +13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930, +13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942, +13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954, +13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966, +13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978, +13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990, +13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002, +14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014, +14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026, +14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038, +14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050, +14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062, +14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074, +14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086, +14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098, +14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110, +14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122, +14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134, +14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146, +14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158, +14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170, +14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182, +14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194, +14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206, +14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218, +14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230, +14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242, +14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254, +14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266, +14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278, +14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290, +14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302, +14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314, +14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326, +14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338, +14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350, +14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362, +14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374, +14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386, +14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398, +14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410, +14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422, +14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434, +14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446, +14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458, +14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470, +14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482, +14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494, +14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506, +14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518, +14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530, +14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542, +14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554, +14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566, +14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578, +14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590, +14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602, +14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614, +14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626, +14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638, +14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650, +14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662, +14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674, +14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686, +14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698, +14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710, +14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722, +14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734, +14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746, +14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758, +14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770, +14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782, +14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794, +14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806, +14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818, +14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830, +14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842, +14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854, +14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866, +14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878, +14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890, +14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902, +14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914, +14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926, +14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938, +14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950, +14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962, +14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974, +14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986, +14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998, +14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010, +15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022, +15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034, +15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046, +15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058, +15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070, +15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082, +15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094, +15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106, +15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118, +15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130, +15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142, +15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154, +15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166, +15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178, +15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190, +15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202, +15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214, +15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226, +15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238, +15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250, +15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262, +15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274, +15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286, +15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298, +15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310, +15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322, +15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334, +15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346, +15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358, +15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370, +15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382, +15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394, +15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406, +15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418, +15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430, +15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442, +15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454, +15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466, +15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478, +15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490, +15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502, +15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514, +15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526, +15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538, +15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550, +15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562, +15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574, +15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586, +15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598, +15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610, +15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622, +15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634, +15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646, +15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658, +15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670, +15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682, +15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694, +15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706, +15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718, +15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730, +15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742, +15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754, +15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766, +15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778, +15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790, +15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802, +15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814, +15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826, +15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838, +15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850, +15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862, +15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874, +15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886, +15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898, +15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910, +15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922, +15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934, +15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946, +15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958, +15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970, +15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982, +15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994, +15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006, +16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018, +16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030, +16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042, +16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054, +16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066, +16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078, +16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090, +16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102, +16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114, +16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126, +16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138, +16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150, +16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162, +16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174, +16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186, +16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198, +16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210, +16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222, +16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234, +16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246, +16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258, +16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270, +16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282, +16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294, +16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306, +16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318, +16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330, +16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342, +16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354, +16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366, +16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378, +16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390, +16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402, +16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414, +16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426, +16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438, +16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450, +16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462, +16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474, +16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486, +16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498, +16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510, +16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522, +16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534, +16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546, +16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558, +16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570, +16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582, +16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594, +16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606, +16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618, +16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630, +16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642, +16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654, +16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666, +16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678, +16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690, +16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702, +16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714, +16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726, +16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738, +16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750, +16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762, +16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774, +16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786, +16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798, +16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810, +16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822, +16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834, +16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846, +16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858, +16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870, +16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882, +16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894, +16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906, +16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918, +16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930, +16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942, +16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954, +16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966, +16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978, +16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990, +16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002, +17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014, +17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026, +17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038, +17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050, +17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062, +17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074, +17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086, +17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098, +17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110, +17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122, +17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134, +17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146, +17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158, +17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170, +17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182, +17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194, +17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206, +17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218, +17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230, +17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242, +17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254, +17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266, +17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278, +17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290, +17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302, +17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314, +17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326, +17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338, +17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350, +17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362, +17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374, +17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386, +17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398, +17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410, +17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422, +17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434, +17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446, +17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458, +17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470, +17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482, +17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494, +17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506, +17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518, +17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530, +17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542, +17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554, +17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566, +17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578, +17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590, +17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602, +17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614, +17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626, +17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638, +17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650, +17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662, +17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674, +17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686, +17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698, +17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710, +17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722, +17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734, +17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746, +17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758, +17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770, +17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782, +17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794, +17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806, +17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818, +17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830, +17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842, +17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854, +17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866, +17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878, +17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890, +17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902, +17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914, +17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926, +17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938, +17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950, +17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962, +17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974, +17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986, +17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998, +17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010, +18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022, +18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034, +18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046, +18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058, +18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070, +18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082, +18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094, +18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106, +18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118, +18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130, +18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142, +18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154, +18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166, +18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178, +18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190, +18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202, +18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214, +18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226, +18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238, +18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250, +18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262, +18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274, +18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286, +18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298, +18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310, +18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322, +18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334, +18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346, +18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358, +18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370, +18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382, +18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394, +18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406, +18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418, +18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430, +18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442, +18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454, +18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466, +18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478, +18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490, +18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502, +18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514, +18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526, +18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538, +18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550, +18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562, +18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574, +18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586, +18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598, +18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610, +18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622, +18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634, +18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646, +18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658, +18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670, +18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682, +18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694, +18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706, +18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718, +18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730, +18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742, +18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754, +18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766, +18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778, +18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790, +18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802, +18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814, +18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826, +18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838, +18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850, +18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862, +18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874, +18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886, +18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898, +18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910, +18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922, +18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934, +18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946, +18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958, +18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970, +18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982, +18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994, +18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006, +19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018, +19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030, +19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042, +19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054, +19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066, +19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078, +19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090, +19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102, +19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114, +19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126, +19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138, +19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150, +19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162, +19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174, +19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186, +19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198, +19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210, +19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222, +19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234, +19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246, +19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258, +19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270, +19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282, +19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294, +19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306, +19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318, +19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330, +19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342, +19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354, +19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366, +19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378, +19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390, +19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402, +19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414, +19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426, +19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438, +19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450, +19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462, +19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474, +19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486, +19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498, +19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510, +19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522, +19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534, +19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546, +19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558, +19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570, +19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582, +19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594, +19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606, +19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618, +19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630, +19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642, +19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654, +19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666, +19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678, +19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690, +19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702, +19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714, +19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726, +19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738, +19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750, +19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762, +19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774, +19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786, +19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798, +19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810, +19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822, +19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834, +19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846, +19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858, +19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870, +19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882, +19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19894, +19895,19896,19897,19898,19899,19900,19901,19902,19903,19904,19905,19906, +19907,19908,19909,19910,19911,19912,19913,19914,19915,19916,19917,19918, +19919,19920,19921,19922,19923,19924,19925,19926,19927,19928,19929,19930, +19931,19932,19933,19934,19935,19936,19937,19938,19939,19940,19941,19942, +19943,19944,19945,19946,19947,19948,19949,19950,19951,19952,19953,19954, +19955,19956,19957,19958,19959,19960,19961,19962,19963,19964,19965,19966, +19967,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978, +19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990, +19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002, +20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014, +20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026, +20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038, +20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050, +20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062, +20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074, +20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086, +20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098, +20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110, +20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122, +20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134, +20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146, +20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158, +20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170, +20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182, +20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194, +20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206, +20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218, +20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230, +20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242, +20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254, +20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266, +20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278, +20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290, +20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302, +20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314, +20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326, +20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338, +20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350, +20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362, +20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374, +20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386, +20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398, +20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410, +20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422, +20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434, +20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446, +20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458, +20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470, +20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482, +20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494, +20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506, +20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518, +20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530, +20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542, +20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554, +20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566, +20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578, +20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590, +20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602, +20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614, +20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626, +20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638, +20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650, +20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662, +20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674, +20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686, +20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698, +20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710, +20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722, +20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734, +20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746, +20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758, +20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770, +20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782, +20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794, +20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806, +20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818, +20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830, +20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842, +20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854, +20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866, +20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878, +20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890, +20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902, +20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914, +20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926, +20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938, +20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950, +20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962, +20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974, +20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986, +20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998, +20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010, +21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022, +21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034, +21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046, +21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058, +21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070, +21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082, +21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094, +21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106, +21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118, +21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130, +21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142, +21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154, +21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166, +21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178, +21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190, +21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202, +21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214, +21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226, +21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238, +21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250, +21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262, +21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274, +21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286, +21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298, +21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310, +21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322, +21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334, +21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346, +21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358, +21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370, +21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382, +21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394, +21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406, +21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418, +21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430, +21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442, +21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454, +21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466, +21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478, +21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490, +21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502, +21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514, +21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526, +21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538, +21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550, +21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562, +21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574, +21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586, +21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598, +21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610, +21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622, +21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634, +21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646, +21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658, +21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670, +21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682, +21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694, +21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706, +21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718, +21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730, +21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742, +21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754, +21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766, +21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778, +21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790, +21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802, +21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814, +21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826, +21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838, +21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850, +21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862, +21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874, +21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886, +21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898, +21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910, +21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922, +21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934, +21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946, +21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958, +21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970, +21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982, +21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994, +21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006, +22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018, +22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030, +22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042, +22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054, +22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066, +22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078, +22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090, +22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102, +22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114, +22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126, +22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138, +22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150, +22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162, +22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174, +22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186, +22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198, +22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210, +22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222, +22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234, +22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246, +22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258, +22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270, +22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282, +22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294, +22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306, +22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318, +22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330, +22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342, +22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354, +22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366, +22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378, +22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390, +22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402, +22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414, +22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426, +22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438, +22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450, +22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462, +22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474, +22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486, +22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498, +22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510, +22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522, +22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534, +22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546, +22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558, +22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570, +22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582, +22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594, +22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606, +22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618, +22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630, +22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642, +22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654, +22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666, +22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678, +22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690, +22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702, +22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714, +22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726, +22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738, +22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750, +22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762, +22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774, +22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786, +22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798, +22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810, +22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822, +22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834, +22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846, +22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858, +22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870, +22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882, +22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894, +22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906, +22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918, +22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930, +22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942, +22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954, +22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966, +22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978, +22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990, +22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002, +23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014, +23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026, +23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038, +23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050, +23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062, +23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074, +23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086, +23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098, +23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110, +23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122, +23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134, +23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146, +23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158, +23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170, +23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182, +23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194, +23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206, +23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218, +23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230, +23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242, +23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254, +23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266, +23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278, +23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290, +23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302, +23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314, +23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326, +23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338, +23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350, +23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362, +23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374, +23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386, +23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398, +23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410, +23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422, +23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434, +23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446, +23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458, +23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470, +23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482, +23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494, +23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506, +23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518, +23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530, +23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542, +23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554, +23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566, +23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578, +23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590, +23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602, +23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614, +23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626, +23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638, +23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650, +23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662, +23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674, +23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686, +23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698, +23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710, +23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722, +23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734, +23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746, +23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758, +23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770, +23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782, +23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794, +23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806, +23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818, +23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830, +23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842, +23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854, +23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866, +23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878, +23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890, +23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902, +23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914, +23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926, +23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938, +23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950, +23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962, +23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974, +23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986, +23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998, +23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010, +24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022, +24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034, +24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046, +24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058, +24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070, +24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082, +24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094, +24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106, +24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118, +24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130, +24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142, +24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154, +24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166, +24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178, +24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190, +24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202, +24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214, +24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226, +24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238, +24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250, +24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262, +24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274, +24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286, +24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298, +24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310, +24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322, +24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334, +24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346, +24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358, +24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370, +24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382, +24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394, +24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406, +24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418, +24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430, +24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442, +24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454, +24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466, +24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478, +24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490, +24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502, +24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514, +24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526, +24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538, +24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550, +24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562, +24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574, +24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586, +24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598, +24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610, +24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622, +24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634, +24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646, +24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658, +24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670, +24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682, +24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694, +24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706, +24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718, +24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730, +24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742, +24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754, +24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766, +24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778, +24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790, +24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802, +24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814, +24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826, +24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838, +24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850, +24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862, +24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874, +24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886, +24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898, +24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910, +24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922, +24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934, +24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946, +24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958, +24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970, +24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982, +24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994, +24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006, +25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018, +25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030, +25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042, +25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054, +25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066, +25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078, +25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090, +25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102, +25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114, +25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126, +25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138, +25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150, +25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162, +25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174, +25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186, +25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198, +25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210, +25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222, +25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234, +25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246, +25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258, +25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270, +25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282, +25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294, +25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306, +25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318, +25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330, +25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342, +25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354, +25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366, +25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378, +25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390, +25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402, +25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414, +25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426, +25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438, +25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450, +25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462, +25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474, +25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486, +25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498, +25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510, +25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522, +25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534, +25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546, +25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558, +25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570, +25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582, +25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594, +25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606, +25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618, +25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630, +25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642, +25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654, +25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666, +25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678, +25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690, +25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702, +25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714, +25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726, +25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738, +25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750, +25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762, +25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774, +25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786, +25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798, +25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810, +25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822, +25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834, +25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846, +25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858, +25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870, +25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882, +25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894, +25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906, +25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918, +25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930, +25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942, +25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954, +25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966, +25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978, +25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990, +25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002, +26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014, +26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026, +26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038, +26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050, +26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062, +26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074, +26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086, +26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098, +26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110, +26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122, +26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134, +26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146, +26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158, +26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170, +26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182, +26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194, +26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206, +26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218, +26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230, +26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242, +26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254, +26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266, +26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278, +26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290, +26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302, +26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314, +26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326, +26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338, +26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350, +26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362, +26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374, +26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386, +26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398, +26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410, +26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422, +26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434, +26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446, +26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458, +26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470, +26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482, +26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494, +26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506, +26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518, +26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530, +26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542, +26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554, +26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566, +26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578, +26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590, +26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602, +26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614, +26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626, +26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638, +26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650, +26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662, +26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674, +26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686, +26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698, +26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710, +26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722, +26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734, +26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746, +26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758, +26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770, +26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782, +26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794, +26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806, +26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818, +26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830, +26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842, +26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854, +26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866, +26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878, +26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890, +26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902, +26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914, +26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926, +26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938, +26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950, +26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962, +26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974, +26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986, +26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998, +26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010, +27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022, +27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034, +27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046, +27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058, +27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070, +27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082, +27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094, +27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106, +27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118, +27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130, +27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142, +27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154, +27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166, +27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178, +27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190, +27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202, +27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214, +27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226, +27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238, +27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250, +27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262, +27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274, +27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286, +27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298, +27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310, +27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322, +27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334, +27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346, +27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358, +27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370, +27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382, +27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394, +27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406, +27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418, +27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430, +27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442, +27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454, +27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466, +27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478, +27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490, +27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502, +27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514, +27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526, +27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538, +27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550, +27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562, +27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574, +27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586, +27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598, +27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610, +27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622, +27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634, +27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646, +27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658, +27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670, +27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682, +27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694, +27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706, +27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718, +27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730, +27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742, +27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754, +27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766, +27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778, +27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790, +27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802, +27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814, +27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826, +27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838, +27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850, +27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862, +27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874, +27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886, +27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898, +27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910, +27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922, +27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934, +27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946, +27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958, +27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970, +27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982, +27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994, +27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006, +28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018, +28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030, +28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042, +28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054, +28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066, +28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078, +28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090, +28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102, +28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114, +28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126, +28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138, +28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150, +28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162, +28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174, +28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186, +28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198, +28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210, +28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222, +28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234, +28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246, +28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258, +28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270, +28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282, +28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294, +28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306, +28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318, +28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330, +28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342, +28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354, +28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366, +28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378, +28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390, +28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402, +28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414, +28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426, +28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438, +28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450, +28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462, +28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474, +28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486, +28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498, +28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510, +28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522, +28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534, +28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546, +28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558, +28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570, +28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582, +28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594, +28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606, +28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618, +28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630, +28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642, +28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654, +28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666, +28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678, +28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690, +28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702, +28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714, +28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726, +28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738, +28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750, +28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762, +28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774, +28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786, +28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798, +28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810, +28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822, +28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834, +28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846, +28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858, +28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870, +28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882, +28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894, +28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906, +28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918, +28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930, +28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942, +28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954, +28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966, +28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978, +28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990, +28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002, +29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014, +29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026, +29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038, +29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050, +29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062, +29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074, +29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086, +29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098, +29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110, +29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122, +29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134, +29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146, +29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158, +29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170, +29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182, +29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194, +29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206, +29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218, +29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230, +29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242, +29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254, +29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266, +29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278, +29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290, +29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302, +29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314, +29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326, +29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338, +29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350, +29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362, +29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374, +29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386, +29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398, +29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410, +29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422, +29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434, +29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446, +29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458, +29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470, +29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482, +29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494, +29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506, +29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518, +29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530, +29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542, +29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554, +29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566, +29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578, +29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590, +29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602, +29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614, +29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626, +29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638, +29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650, +29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662, +29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674, +29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686, +29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698, +29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710, +29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722, +29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734, +29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746, +29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758, +29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770, +29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782, +29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794, +29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806, +29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818, +29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830, +29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842, +29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854, +29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866, +29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878, +29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890, +29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902, +29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914, +29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926, +29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938, +29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950, +29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962, +29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974, +29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986, +29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998, +29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010, +30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022, +30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034, +30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046, +30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058, +30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070, +30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082, +30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094, +30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106, +30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118, +30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130, +30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142, +30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154, +30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166, +30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178, +30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190, +30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202, +30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214, +30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226, +30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238, +30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250, +30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262, +30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274, +30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286, +30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298, +30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310, +30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322, +30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334, +30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346, +30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358, +30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370, +30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382, +30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394, +30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406, +30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418, +30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430, +30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442, +30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454, +30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466, +30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478, +30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490, +30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502, +30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514, +30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526, +30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538, +30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550, +30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562, +30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574, +30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586, +30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598, +30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610, +30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622, +30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634, +30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646, +30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658, +30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670, +30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682, +30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694, +30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706, +30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718, +30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730, +30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742, +30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754, +30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766, +30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778, +30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790, +30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802, +30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814, +30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826, +30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838, +30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850, +30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862, +30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874, +30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886, +30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898, +30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910, +30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922, +30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934, +30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946, +30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958, +30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970, +30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982, +30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994, +30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006, +31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018, +31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030, +31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042, +31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054, +31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066, +31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078, +31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090, +31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102, +31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114, +31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126, +31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138, +31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150, +31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162, +31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174, +31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186, +31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198, +31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210, +31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222, +31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234, +31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246, +31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258, +31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270, +31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282, +31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294, +31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306, +31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318, +31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330, +31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342, +31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354, +31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366, +31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378, +31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390, +31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402, +31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414, +31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426, +31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438, +31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450, +31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462, +31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474, +31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486, +31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498, +31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510, +31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522, +31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534, +31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546, +31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558, +31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570, +31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582, +31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594, +31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606, +31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618, +31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630, +31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642, +31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654, +31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666, +31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678, +31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690, +31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702, +31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714, +31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726, +31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738, +31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750, +31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762, +31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774, +31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786, +31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798, +31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810, +31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822, +31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834, +31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846, +31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858, +31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870, +31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882, +31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894, +31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906, +31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918, +31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930, +31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942, +31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954, +31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966, +31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978, +31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990, +31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002, +32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014, +32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026, +32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038, +32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050, +32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062, +32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074, +32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086, +32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098, +32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110, +32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122, +32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134, +32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146, +32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158, +32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170, +32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182, +32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194, +32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206, +32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218, +32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230, +32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242, +32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254, +32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266, +32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278, +32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290, +32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302, +32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314, +32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326, +32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338, +32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350, +32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362, +32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374, +32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386, +32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398, +32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410, +32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422, +32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434, +32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446, +32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458, +32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470, +32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482, +32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494, +32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506, +32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518, +32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530, +32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542, +32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554, +32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566, +32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578, +32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590, +32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602, +32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614, +32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626, +32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638, +32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650, +32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662, +32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674, +32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686, +32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698, +32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710, +32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722, +32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734, +32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746, +32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758, +32759,32760,32761,32762,32763,32764,32765,32766,32767,32768L,32769L,32770L, +32771L,32772L,32773L,32774L,32775L,32776L,32777L,32778L,32779L,32780L, +32781L,32782L,32783L,32784L,32785L,32786L,32787L,32788L,32789L,32790L, +32791L,32792L,32793L,32794L,32795L,32796L,32797L,32798L,32799L,32800L, +32801L,32802L,32803L,32804L,32805L,32806L,32807L,32808L,32809L,32810L, +32811L,32812L,32813L,32814L,32815L,32816L,32817L,32818L,32819L,32820L, +32821L,32822L,32823L,32824L,32825L,32826L,32827L,32828L,32829L,32830L, +32831L,32832L,32833L,32834L,32835L,32836L,32837L,32838L,32839L,32840L, +32841L,32842L,32843L,32844L,32845L,32846L,32847L,32848L,32849L,32850L, +32851L,32852L,32853L,32854L,32855L,32856L,32857L,32858L,32859L,32860L, +32861L,32862L,32863L,32864L,32865L,32866L,32867L,32868L,32869L,32870L, +32871L,32872L,32873L,32874L,32875L,32876L,32877L,32878L,32879L,32880L, +32881L,32882L,32883L,32884L,32885L,32886L,32887L,32888L,32889L,32890L, +32891L,32892L,32893L,32894L,32895L,32896L,32897L,32898L,32899L,32900L, +32901L,32902L,32903L,32904L,32905L,32906L,32907L,32908L,32909L,32910L, +32911L,32912L,32913L,32914L,32915L,32916L,32917L,32918L,32919L,32920L, +32921L,32922L,32923L,32924L,32925L,32926L,32927L,32928L,32929L,32930L, +32931L,32932L,32933L,32934L,32935L,32936L,32937L,32938L,32939L,32940L, +32941L,32942L,32943L,32944L,32945L,32946L,32947L,32948L,32949L,32950L, +32951L,32952L,32953L,32954L,32955L,32956L,32957L,32958L,32959L,32960L, +32961L,32962L,32963L,32964L,32965L,32966L,32967L,32968L,32969L,32970L, +32971L,32972L,32973L,32974L,32975L,32976L,32977L,32978L,32979L,32980L, +32981L,32982L,32983L,32984L,32985L,32986L,32987L,32988L,32989L,32990L, +32991L,32992L,32993L,32994L,32995L,32996L,32997L,32998L,32999L,33000L, +33001L,33002L,33003L,33004L,33005L,33006L,33007L,33008L,33009L,33010L, +33011L,33012L,33013L,33014L,33015L,33016L,33017L,33018L,33019L,33020L, +33021L,33022L,33023L,33024L,33025L,33026L,33027L,33028L,33029L,33030L, +33031L,33032L,33033L,33034L,33035L,33036L,33037L,33038L,33039L,33040L, +33041L,33042L,33043L,33044L,33045L,33046L,33047L,33048L,33049L,33050L, +33051L,33052L,33053L,33054L,33055L,33056L,33057L,33058L,33059L,33060L, +33061L,33062L,33063L,33064L,33065L,33066L,33067L,33068L,33069L,33070L, +33071L,33072L,33073L,33074L,33075L,33076L,33077L,33078L,33079L,33080L, +33081L,33082L,33083L,33084L,33085L,33086L,33087L,33088L,33089L,33090L, +33091L,33092L,33093L,33094L,33095L,33096L,33097L,33098L,33099L,33100L, +33101L,33102L,33103L,33104L,33105L,33106L,33107L,33108L,33109L,33110L, +33111L,33112L,33113L,33114L,33115L,33116L,33117L,33118L,33119L,33120L, +33121L,33122L,33123L,33124L,33125L,33126L,33127L,33128L,33129L,33130L, +33131L,33132L,33133L,33134L,33135L,33136L,33137L,33138L,33139L,33140L, +33141L,33142L,33143L,33144L,33145L,33146L,33147L,33148L,33149L,33150L, +33151L,33152L,33153L,33154L,33155L,33156L,33157L,33158L,33159L,33160L, +33161L,33162L,33163L,33164L,33165L,33166L,33167L,33168L,33169L,33170L, +33171L,33172L,33173L,33174L,33175L,33176L,33177L,33178L,33179L,33180L, +33181L,33182L,33183L,33184L,33185L,33186L,33187L,33188L,33189L,33190L, +33191L,33192L,33193L,33194L,33195L,33196L,33197L,33198L,33199L,33200L, +33201L,33202L,33203L,33204L,33205L,33206L,33207L,33208L,33209L,33210L, +33211L,33212L,33213L,33214L,33215L,33216L,33217L,33218L,33219L,33220L, +33221L,33222L,33223L,33224L,33225L,33226L,33227L,33228L,33229L,33230L, +33231L,33232L,33233L,33234L,33235L,33236L,33237L,33238L,33239L,33240L, +33241L,33242L,33243L,33244L,33245L,33246L,33247L,33248L,33249L,33250L, +33251L,33252L,33253L,33254L,33255L,33256L,33257L,33258L,33259L,33260L, +33261L,33262L,33263L,33264L,33265L,33266L,33267L,33268L,33269L,33270L, +33271L,33272L,33273L,33274L,33275L,33276L,33277L,33278L,33279L,33280L, +33281L,33282L,33283L,33284L,33285L,33286L,33287L,33288L,33289L,33290L, +33291L,33292L,33293L,33294L,33295L,33296L,33297L,33298L,33299L,33300L, +33301L,33302L,33303L,33304L,33305L,33306L,33307L,33308L,33309L,33310L, +33311L,33312L,33313L,33314L,33315L,33316L,33317L,33318L,33319L,33320L, +33321L,33322L,33323L,33324L,33325L,33326L,33327L,33328L,33329L,33330L, +33331L,33332L,33333L,33334L,33335L,33336L,33337L,33338L,33339L,33340L, +33341L,33342L,33343L,33344L,33345L,33346L,33347L,33348L,33349L,33350L, +33351L,33352L,33353L,33354L,33355L,33356L,33357L,33358L,33359L,33360L, +33361L,33362L,33363L,33364L,33365L,33366L,33367L,33368L,33369L,33370L, +33371L,33372L,33373L,33374L,33375L,33376L,33377L,33378L,33379L,33380L, +33381L,33382L,33383L,33384L,33385L,33386L,33387L,33388L,33389L,33390L, +33391L,33392L,33393L,33394L,33395L,33396L,33397L,33398L,33399L,33400L, +33401L,33402L,33403L,33404L,33405L,33406L,33407L,33408L,33409L,33410L, +33411L,33412L,33413L,33414L,33415L,33416L,33417L,33418L,33419L,33420L, +33421L,33422L,33423L,33424L,33425L,33426L,33427L,33428L,33429L,33430L, +33431L,33432L,33433L,33434L,33435L,33436L,33437L,33438L,33439L,33440L, +33441L,33442L,33443L,33444L,33445L,33446L,33447L,33448L,33449L,33450L, +33451L,33452L,33453L,33454L,33455L,33456L,33457L,33458L,33459L,33460L, +33461L,33462L,33463L,33464L,33465L,33466L,33467L,33468L,33469L,33470L, +33471L,33472L,33473L,33474L,33475L,33476L,33477L,33478L,33479L,33480L, +33481L,33482L,33483L,33484L,33485L,33486L,33487L,33488L,33489L,33490L, +33491L,33492L,33493L,33494L,33495L,33496L,33497L,33498L,33499L,33500L, +33501L,33502L,33503L,33504L,33505L,33506L,33507L,33508L,33509L,33510L, +33511L,33512L,33513L,33514L,33515L,33516L,33517L,33518L,33519L,33520L, +33521L,33522L,33523L,33524L,33525L,33526L,33527L,33528L,33529L,33530L, +33531L,33532L,33533L,33534L,33535L,33536L,33537L,33538L,33539L,33540L, +33541L,33542L,33543L,33544L,33545L,33546L,33547L,33548L,33549L,33550L, +33551L,33552L,33553L,33554L,33555L,33556L,33557L,33558L,33559L,33560L, +33561L,33562L,33563L,33564L,33565L,33566L,33567L,33568L,33569L,33570L, +33571L,33572L,33573L,33574L,33575L,33576L,33577L,33578L,33579L,33580L, +33581L,33582L,33583L,33584L,33585L,33586L,33587L,33588L,33589L,33590L, +33591L,33592L,33593L,33594L,33595L,33596L,33597L,33598L,33599L,33600L, +33601L,33602L,33603L,33604L,33605L,33606L,33607L,33608L,33609L,33610L, +33611L,33612L,33613L,33614L,33615L,33616L,33617L,33618L,33619L,33620L, +33621L,33622L,33623L,33624L,33625L,33626L,33627L,33628L,33629L,33630L, +33631L,33632L,33633L,33634L,33635L,33636L,33637L,33638L,33639L,33640L, +33641L,33642L,33643L,33644L,33645L,33646L,33647L,33648L,33649L,33650L, +33651L,33652L,33653L,33654L,33655L,33656L,33657L,33658L,33659L,33660L, +33661L,33662L,33663L,33664L,33665L,33666L,33667L,33668L,33669L,33670L, +33671L,33672L,33673L,33674L,33675L,33676L,33677L,33678L,33679L,33680L, +33681L,33682L,33683L,33684L,33685L,33686L,33687L,33688L,33689L,33690L, +33691L,33692L,33693L,33694L,33695L,33696L,33697L,33698L,33699L,33700L, +33701L,33702L,33703L,33704L,33705L,33706L,33707L,33708L,33709L,33710L, +33711L,33712L,33713L,33714L,33715L,33716L,33717L,33718L,33719L,33720L, +33721L,33722L,33723L,33724L,33725L,33726L,33727L,33728L,33729L,33730L, +33731L,33732L,33733L,33734L,33735L,33736L,33737L,33738L,33739L,33740L, +33741L,33742L,33743L,33744L,33745L,33746L,33747L,33748L,33749L,33750L, +33751L,33752L,33753L,33754L,33755L,33756L,33757L,33758L,33759L,33760L, +33761L,33762L,33763L,33764L,33765L,33766L,33767L,33768L,33769L,33770L, +33771L,33772L,33773L,33774L,33775L,33776L,33777L,33778L,33779L,33780L, +33781L,33782L,33783L,33784L,33785L,33786L,33787L,33788L,33789L,33790L, +33791L,33792L,33793L,33794L,33795L,33796L,33797L,33798L,33799L,33800L, +33801L,33802L,33803L,33804L,33805L,33806L,33807L,33808L,33809L,33810L, +33811L,33812L,33813L,33814L,33815L,33816L,33817L,33818L,33819L,33820L, +33821L,33822L,33823L,33824L,33825L,33826L,33827L,33828L,33829L,33830L, +33831L,33832L,33833L,33834L,33835L,33836L,33837L,33838L,33839L,33840L, +33841L,33842L,33843L,33844L,33845L,33846L,33847L,33848L,33849L,33850L, +33851L,33852L,33853L,33854L,33855L,33856L,33857L,33858L,33859L,33860L, +33861L,33862L,33863L,33864L,33865L,33866L,33867L,33868L,33869L,33870L, +33871L,33872L,33873L,33874L,33875L,33876L,33877L,33878L,33879L,33880L, +33881L,33882L,33883L,33884L,33885L,33886L,33887L,33888L,33889L,33890L, +33891L,33892L,33893L,33894L,33895L,33896L,33897L,33898L,33899L,33900L, +33901L,33902L,33903L,33904L,33905L,33906L,33907L,33908L,33909L,33910L, +33911L,33912L,33913L,33914L,33915L,33916L,33917L,33918L,33919L,33920L, +33921L,33922L,33923L,33924L,33925L,33926L,33927L,33928L,33929L,33930L, +33931L,33932L,33933L,33934L,33935L,33936L,33937L,33938L,33939L,33940L, +33941L,33942L,33943L,33944L,33945L,33946L,33947L,33948L,33949L,33950L, +33951L,33952L,33953L,33954L,33955L,33956L,33957L,33958L,33959L,33960L, +33961L,33962L,33963L,33964L,33965L,33966L,33967L,33968L,33969L,33970L, +33971L,33972L,33973L,33974L,33975L,33976L,33977L,33978L,33979L,33980L, +33981L,33982L,33983L,33984L,33985L,33986L,33987L,33988L,33989L,33990L, +33991L,33992L,33993L,33994L,33995L,33996L,33997L,33998L,33999L,34000L, +34001L,34002L,34003L,34004L,34005L,34006L,34007L,34008L,34009L,34010L, +34011L,34012L,34013L,34014L,34015L,34016L,34017L,34018L,34019L,34020L, +34021L,34022L,34023L,34024L,34025L,34026L,34027L,34028L,34029L,34030L, +34031L,34032L,34033L,34034L,34035L,34036L,34037L,34038L,34039L,34040L, +34041L,34042L,34043L,34044L,34045L,34046L,34047L,34048L,34049L,34050L, +34051L,34052L,34053L,34054L,34055L,34056L,34057L,34058L,34059L,34060L, +34061L,34062L,34063L,34064L,34065L,34066L,34067L,34068L,34069L,34070L, +34071L,34072L,34073L,34074L,34075L,34076L,34077L,34078L,34079L,34080L, +34081L,34082L,34083L,34084L,34085L,34086L,34087L,34088L,34089L,34090L, +34091L,34092L,34093L,34094L,34095L,34096L,34097L,34098L,34099L,34100L, +34101L,34102L,34103L,34104L,34105L,34106L,34107L,34108L,34109L,34110L, +34111L,34112L,34113L,34114L,34115L,34116L,34117L,34118L,34119L,34120L, +34121L,34122L,34123L,34124L,34125L,34126L,34127L,34128L,34129L,34130L, +34131L,34132L,34133L,34134L,34135L,34136L,34137L,34138L,34139L,34140L, +34141L,34142L,34143L,34144L,34145L,34146L,34147L,34148L,34149L,34150L, +34151L,34152L,34153L,34154L,34155L,34156L,34157L,34158L,34159L,34160L, +34161L,34162L,34163L,34164L,34165L,34166L,34167L,34168L,34169L,34170L, +34171L,34172L,34173L,34174L,34175L,34176L,34177L,34178L,34179L,34180L, +34181L,34182L,34183L,34184L,34185L,34186L,34187L,34188L,34189L,34190L, +34191L,34192L,34193L,34194L,34195L,34196L,34197L,34198L,34199L,34200L, +34201L,34202L,34203L,34204L,34205L,34206L,34207L,34208L,34209L,34210L, +34211L,34212L,34213L,34214L,34215L,34216L,34217L,34218L,34219L,34220L, +34221L,34222L,34223L,34224L,34225L,34226L,34227L,34228L,34229L,34230L, +34231L,34232L,34233L,34234L,34235L,34236L,34237L,34238L,34239L,34240L, +34241L,34242L,34243L,34244L,34245L,34246L,34247L,34248L,34249L,34250L, +34251L,34252L,34253L,34254L,34255L,34256L,34257L,34258L,34259L,34260L, +34261L,34262L,34263L,34264L,34265L,34266L,34267L,34268L,34269L,34270L, +34271L,34272L,34273L,34274L,34275L,34276L,34277L,34278L,34279L,34280L, +34281L,34282L,34283L,34284L,34285L,34286L,34287L,34288L,34289L,34290L, +34291L,34292L,34293L,34294L,34295L,34296L,34297L,34298L,34299L,34300L, +34301L,34302L,34303L,34304L,34305L,34306L,34307L,34308L,34309L,34310L, +34311L,34312L,34313L,34314L,34315L,34316L,34317L,34318L,34319L,34320L, +34321L,34322L,34323L,34324L,34325L,34326L,34327L,34328L,34329L,34330L, +34331L,34332L,34333L,34334L,34335L,34336L,34337L,34338L,34339L,34340L, +34341L,34342L,34343L,34344L,34345L,34346L,34347L,34348L,34349L,34350L, +34351L,34352L,34353L,34354L,34355L,34356L,34357L,34358L,34359L,34360L, +34361L,34362L,34363L,34364L,34365L,34366L,34367L,34368L,34369L,34370L, +34371L,34372L,34373L,34374L,34375L,34376L,34377L,34378L,34379L,34380L, +34381L,34382L,34383L,34384L,34385L,34386L,34387L,34388L,34389L,34390L, +34391L,34392L,34393L,34394L,34395L,34396L,34397L,34398L,34399L,34400L, +34401L,34402L,34403L,34404L,34405L,34406L,34407L,34408L,34409L,34410L, +34411L,34412L,34413L,34414L,34415L,34416L,34417L,34418L,34419L,34420L, +34421L,34422L,34423L,34424L,34425L,34426L,34427L,34428L,34429L,34430L, +34431L,34432L,34433L,34434L,34435L,34436L,34437L,34438L,34439L,34440L, +34441L,34442L,34443L,34444L,34445L,34446L,34447L,34448L,34449L,34450L, +34451L,34452L,34453L,34454L,34455L,34456L,34457L,34458L,34459L,34460L, +34461L,34462L,34463L,34464L,34465L,34466L,34467L,34468L,34469L,34470L, +34471L,34472L,34473L,34474L,34475L,34476L,34477L,34478L,34479L,34480L, +34481L,34482L,34483L,34484L,34485L,34486L,34487L,34488L,34489L,34490L, +34491L,34492L,34493L,34494L,34495L,34496L,34497L,34498L,34499L,34500L, +34501L,34502L,34503L,34504L,34505L,34506L,34507L,34508L,34509L,34510L, +34511L,34512L,34513L,34514L,34515L,34516L,34517L,34518L,34519L,34520L, +34521L,34522L,34523L,34524L,34525L,34526L,34527L,34528L,34529L,34530L, +34531L,34532L,34533L,34534L,34535L,34536L,34537L,34538L,34539L,34540L, +34541L,34542L,34543L,34544L,34545L,34546L,34547L,34548L,34549L,34550L, +34551L,34552L,34553L,34554L,34555L,34556L,34557L,34558L,34559L,34560L, +34561L,34562L,34563L,34564L,34565L,34566L,34567L,34568L,34569L,34570L, +34571L,34572L,34573L,34574L,34575L,34576L,34577L,34578L,34579L,34580L, +34581L,34582L,34583L,34584L,34585L,34586L,34587L,34588L,34589L,34590L, +34591L,34592L,34593L,34594L,34595L,34596L,34597L,34598L,34599L,34600L, +34601L,34602L,34603L,34604L,34605L,34606L,34607L,34608L,34609L,34610L, +34611L,34612L,34613L,34614L,34615L,34616L,34617L,34618L,34619L,34620L, +34621L,34622L,34623L,34624L,34625L,34626L,34627L,34628L,34629L,34630L, +34631L,34632L,34633L,34634L,34635L,34636L,34637L,34638L,34639L,34640L, +34641L,34642L,34643L,34644L,34645L,34646L,34647L,34648L,34649L,34650L, +34651L,34652L,34653L,34654L,34655L,34656L,34657L,34658L,34659L,34660L, +34661L,34662L,34663L,34664L,34665L,34666L,34667L,34668L,34669L,34670L, +34671L,34672L,34673L,34674L,34675L,34676L,34677L,34678L,34679L,34680L, +34681L,34682L,34683L,34684L,34685L,34686L,34687L,34688L,34689L,34690L, +34691L,34692L,34693L,34694L,34695L,34696L,34697L,34698L,34699L,34700L, +34701L,34702L,34703L,34704L,34705L,34706L,34707L,34708L,34709L,34710L, +34711L,34712L,34713L,34714L,34715L,34716L,34717L,34718L,34719L,34720L, +34721L,34722L,34723L,34724L,34725L,34726L,34727L,34728L,34729L,34730L, +34731L,34732L,34733L,34734L,34735L,34736L,34737L,34738L,34739L,34740L, +34741L,34742L,34743L,34744L,34745L,34746L,34747L,34748L,34749L,34750L, +34751L,34752L,34753L,34754L,34755L,34756L,34757L,34758L,34759L,34760L, +34761L,34762L,34763L,34764L,34765L,34766L,34767L,34768L,34769L,34770L, +34771L,34772L,34773L,34774L,34775L,34776L,34777L,34778L,34779L,34780L, +34781L,34782L,34783L,34784L,34785L,34786L,34787L,34788L,34789L,34790L, +34791L,34792L,34793L,34794L,34795L,34796L,34797L,34798L,34799L,34800L, +34801L,34802L,34803L,34804L,34805L,34806L,34807L,34808L,34809L,34810L, +34811L,34812L,34813L,34814L,34815L,34816L,34817L,34818L,34819L,34820L, +34821L,34822L,34823L,34824L,34825L,34826L,34827L,34828L,34829L,34830L, +34831L,34832L,34833L,34834L,34835L,34836L,34837L,34838L,34839L,34840L, +34841L,34842L,34843L,34844L,34845L,34846L,34847L,34848L,34849L,34850L, +34851L,34852L,34853L,34854L,34855L,34856L,34857L,34858L,34859L,34860L, +34861L,34862L,34863L,34864L,34865L,34866L,34867L,34868L,34869L,34870L, +34871L,34872L,34873L,34874L,34875L,34876L,34877L,34878L,34879L,34880L, +34881L,34882L,34883L,34884L,34885L,34886L,34887L,34888L,34889L,34890L, +34891L,34892L,34893L,34894L,34895L,34896L,34897L,34898L,34899L,34900L, +34901L,34902L,34903L,34904L,34905L,34906L,34907L,34908L,34909L,34910L, +34911L,34912L,34913L,34914L,34915L,34916L,34917L,34918L,34919L,34920L, +34921L,34922L,34923L,34924L,34925L,34926L,34927L,34928L,34929L,34930L, +34931L,34932L,34933L,34934L,34935L,34936L,34937L,34938L,34939L,34940L, +34941L,34942L,34943L,34944L,34945L,34946L,34947L,34948L,34949L,34950L, +34951L,34952L,34953L,34954L,34955L,34956L,34957L,34958L,34959L,34960L, +34961L,34962L,34963L,34964L,34965L,34966L,34967L,34968L,34969L,34970L, +34971L,34972L,34973L,34974L,34975L,34976L,34977L,34978L,34979L,34980L, +34981L,34982L,34983L,34984L,34985L,34986L,34987L,34988L,34989L,34990L, +34991L,34992L,34993L,34994L,34995L,34996L,34997L,34998L,34999L,35000L, +35001L,35002L,35003L,35004L,35005L,35006L,35007L,35008L,35009L,35010L, +35011L,35012L,35013L,35014L,35015L,35016L,35017L,35018L,35019L,35020L, +35021L,35022L,35023L,35024L,35025L,35026L,35027L,35028L,35029L,35030L, +35031L,35032L,35033L,35034L,35035L,35036L,35037L,35038L,35039L,35040L, +35041L,35042L,35043L,35044L,35045L,35046L,35047L,35048L,35049L,35050L, +35051L,35052L,35053L,35054L,35055L,35056L,35057L,35058L,35059L,35060L, +35061L,35062L,35063L,35064L,35065L,35066L,35067L,35068L,35069L,35070L, +35071L,35072L,35073L,35074L,35075L,35076L,35077L,35078L,35079L,35080L, +35081L,35082L,35083L,35084L,35085L,35086L,35087L,35088L,35089L,35090L, +35091L,35092L,35093L,35094L,35095L,35096L,35097L,35098L,35099L,35100L, +35101L,35102L,35103L,35104L,35105L,35106L,35107L,35108L,35109L,35110L, +35111L,35112L,35113L,35114L,35115L,35116L,35117L,35118L,35119L,35120L, +35121L,35122L,35123L,35124L,35125L,35126L,35127L,35128L,35129L,35130L, +35131L,35132L,35133L,35134L,35135L,35136L,35137L,35138L,35139L,35140L, +35141L,35142L,35143L,35144L,35145L,35146L,35147L,35148L,35149L,35150L, +35151L,35152L,35153L,35154L,35155L,35156L,35157L,35158L,35159L,35160L, +35161L,35162L,35163L,35164L,35165L,35166L,35167L,35168L,35169L,35170L, +35171L,35172L,35173L,35174L,35175L,35176L,35177L,35178L,35179L,35180L, +35181L,35182L,35183L,35184L,35185L,35186L,35187L,35188L,35189L,35190L, +35191L,35192L,35193L,35194L,35195L,35196L,35197L,35198L,35199L,35200L, +35201L,35202L,35203L,35204L,35205L,35206L,35207L,35208L,35209L,35210L, +35211L,35212L,35213L,35214L,35215L,35216L,35217L,35218L,35219L,35220L, +35221L,35222L,35223L,35224L,35225L,35226L,35227L,35228L,35229L,35230L, +35231L,35232L,35233L,35234L,35235L,35236L,35237L,35238L,35239L,35240L, +35241L,35242L,35243L,35244L,35245L,35246L,35247L,35248L,35249L,35250L, +35251L,35252L,35253L,35254L,35255L,35256L,35257L,35258L,35259L,35260L, +35261L,35262L,35263L,35264L,35265L,35266L,35267L,35268L,35269L,35270L, +35271L,35272L,35273L,35274L,35275L,35276L,35277L,35278L,35279L,35280L, +35281L,35282L,35283L,35284L,35285L,35286L,35287L,35288L,35289L,35290L, +35291L,35292L,35293L,35294L,35295L,35296L,35297L,35298L,35299L,35300L, +35301L,35302L,35303L,35304L,35305L,35306L,35307L,35308L,35309L,35310L, +35311L,35312L,35313L,35314L,35315L,35316L,35317L,35318L,35319L,35320L, +35321L,35322L,35323L,35324L,35325L,35326L,35327L,35328L,35329L,35330L, +35331L,35332L,35333L,35334L,35335L,35336L,35337L,35338L,35339L,35340L, +35341L,35342L,35343L,35344L,35345L,35346L,35347L,35348L,35349L,35350L, +35351L,35352L,35353L,35354L,35355L,35356L,35357L,35358L,35359L,35360L, +35361L,35362L,35363L,35364L,35365L,35366L,35367L,35368L,35369L,35370L, +35371L,35372L,35373L,35374L,35375L,35376L,35377L,35378L,35379L,35380L, +35381L,35382L,35383L,35384L,35385L,35386L,35387L,35388L,35389L,35390L, +35391L,35392L,35393L,35394L,35395L,35396L,35397L,35398L,35399L,35400L, +35401L,35402L,35403L,35404L,35405L,35406L,35407L,35408L,35409L,35410L, +35411L,35412L,35413L,35414L,35415L,35416L,35417L,35418L,35419L,35420L, +35421L,35422L,35423L,35424L,35425L,35426L,35427L,35428L,35429L,35430L, +35431L,35432L,35433L,35434L,35435L,35436L,35437L,35438L,35439L,35440L, +35441L,35442L,35443L,35444L,35445L,35446L,35447L,35448L,35449L,35450L, +35451L,35452L,35453L,35454L,35455L,35456L,35457L,35458L,35459L,35460L, +35461L,35462L,35463L,35464L,35465L,35466L,35467L,35468L,35469L,35470L, +35471L,35472L,35473L,35474L,35475L,35476L,35477L,35478L,35479L,35480L, +35481L,35482L,35483L,35484L,35485L,35486L,35487L,35488L,35489L,35490L, +35491L,35492L,35493L,35494L,35495L,35496L,35497L,35498L,35499L,35500L, +35501L,35502L,35503L,35504L,35505L,35506L,35507L,35508L,35509L,35510L, +35511L,35512L,35513L,35514L,35515L,35516L,35517L,35518L,35519L,35520L, +35521L,35522L,35523L,35524L,35525L,35526L,35527L,35528L,35529L,35530L, +35531L,35532L,35533L,35534L,35535L,35536L,35537L,35538L,35539L,35540L, +35541L,35542L,35543L,35544L,35545L,35546L,35547L,35548L,35549L,35550L, +35551L,35552L,35553L,35554L,35555L,35556L,35557L,35558L,35559L,35560L, +35561L,35562L,35563L,35564L,35565L,35566L,35567L,35568L,35569L,35570L, +35571L,35572L,35573L,35574L,35575L,35576L,35577L,35578L,35579L,35580L, +35581L,35582L,35583L,35584L,35585L,35586L,35587L,35588L,35589L,35590L, +35591L,35592L,35593L,35594L,35595L,35596L,35597L,35598L,35599L,35600L, +35601L,35602L,35603L,35604L,35605L,35606L,35607L,35608L,35609L,35610L, +35611L,35612L,35613L,35614L,35615L,35616L,35617L,35618L,35619L,35620L, +35621L,35622L,35623L,35624L,35625L,35626L,35627L,35628L,35629L,35630L, +35631L,35632L,35633L,35634L,35635L,35636L,35637L,35638L,35639L,35640L, +35641L,35642L,35643L,35644L,35645L,35646L,35647L,35648L,35649L,35650L, +35651L,35652L,35653L,35654L,35655L,35656L,35657L,35658L,35659L,35660L, +35661L,35662L,35663L,35664L,35665L,35666L,35667L,35668L,35669L,35670L, +35671L,35672L,35673L,35674L,35675L,35676L,35677L,35678L,35679L,35680L, +35681L,35682L,35683L,35684L,35685L,35686L,35687L,35688L,35689L,35690L, +35691L,35692L,35693L,35694L,35695L,35696L,35697L,35698L,35699L,35700L, +35701L,35702L,35703L,35704L,35705L,35706L,35707L,35708L,35709L,35710L, +35711L,35712L,35713L,35714L,35715L,35716L,35717L,35718L,35719L,35720L, +35721L,35722L,35723L,35724L,35725L,35726L,35727L,35728L,35729L,35730L, +35731L,35732L,35733L,35734L,35735L,35736L,35737L,35738L,35739L,35740L, +35741L,35742L,35743L,35744L,35745L,35746L,35747L,35748L,35749L,35750L, +35751L,35752L,35753L,35754L,35755L,35756L,35757L,35758L,35759L,35760L, +35761L,35762L,35763L,35764L,35765L,35766L,35767L,35768L,35769L,35770L, +35771L,35772L,35773L,35774L,35775L,35776L,35777L,35778L,35779L,35780L, +35781L,35782L,35783L,35784L,35785L,35786L,35787L,35788L,35789L,35790L, +35791L,35792L,35793L,35794L,35795L,35796L,35797L,35798L,35799L,35800L, +35801L,35802L,35803L,35804L,35805L,35806L,35807L,35808L,35809L,35810L, +35811L,35812L,35813L,35814L,35815L,35816L,35817L,35818L,35819L,35820L, +35821L,35822L,35823L,35824L,35825L,35826L,35827L,35828L,35829L,35830L, +35831L,35832L,35833L,35834L,35835L,35836L,35837L,35838L,35839L,35840L, +35841L,35842L,35843L,35844L,35845L,35846L,35847L,35848L,35849L,35850L, +35851L,35852L,35853L,35854L,35855L,35856L,35857L,35858L,35859L,35860L, +35861L,35862L,35863L,35864L,35865L,35866L,35867L,35868L,35869L,35870L, +35871L,35872L,35873L,35874L,35875L,35876L,35877L,35878L,35879L,35880L, +35881L,35882L,35883L,35884L,35885L,35886L,35887L,35888L,35889L,35890L, +35891L,35892L,35893L,35894L,35895L,35896L,35897L,35898L,35899L,35900L, +35901L,35902L,35903L,35904L,35905L,35906L,35907L,35908L,35909L,35910L, +35911L,35912L,35913L,35914L,35915L,35916L,35917L,35918L,35919L,35920L, +35921L,35922L,35923L,35924L,35925L,35926L,35927L,35928L,35929L,35930L, +35931L,35932L,35933L,35934L,35935L,35936L,35937L,35938L,35939L,35940L, +35941L,35942L,35943L,35944L,35945L,35946L,35947L,35948L,35949L,35950L, +35951L,35952L,35953L,35954L,35955L,35956L,35957L,35958L,35959L,35960L, +35961L,35962L,35963L,35964L,35965L,35966L,35967L,35968L,35969L,35970L, +35971L,35972L,35973L,35974L,35975L,35976L,35977L,35978L,35979L,35980L, +35981L,35982L,35983L,35984L,35985L,35986L,35987L,35988L,35989L,35990L, +35991L,35992L,35993L,35994L,35995L,35996L,35997L,35998L,35999L,36000L, +36001L,36002L,36003L,36004L,36005L,36006L,36007L,36008L,36009L,36010L, +36011L,36012L,36013L,36014L,36015L,36016L,36017L,36018L,36019L,36020L, +36021L,36022L,36023L,36024L,36025L,36026L,36027L,36028L,36029L,36030L, +36031L,36032L,36033L,36034L,36035L,36036L,36037L,36038L,36039L,36040L, +36041L,36042L,36043L,36044L,36045L,36046L,36047L,36048L,36049L,36050L, +36051L,36052L,36053L,36054L,36055L,36056L,36057L,36058L,36059L,36060L, +36061L,36062L,36063L,36064L,36065L,36066L,36067L,36068L,36069L,36070L, +36071L,36072L,36073L,36074L,36075L,36076L,36077L,36078L,36079L,36080L, +36081L,36082L,36083L,36084L,36085L,36086L,36087L,36088L,36089L,36090L, +36091L,36092L,36093L,36094L,36095L,36096L,36097L,36098L,36099L,36100L, +36101L,36102L,36103L,36104L,36105L,36106L,36107L,36108L,36109L,36110L, +36111L,36112L,36113L,36114L,36115L,36116L,36117L,36118L,36119L,36120L, +36121L,36122L,36123L,36124L,36125L,36126L,36127L,36128L,36129L,36130L, +36131L,36132L,36133L,36134L,36135L,36136L,36137L,36138L,36139L,36140L, +36141L,36142L,36143L,36144L,36145L,36146L,36147L,36148L,36149L,36150L, +36151L,36152L,36153L,36154L,36155L,36156L,36157L,36158L,36159L,36160L, +36161L,36162L,36163L,36164L,36165L,36166L,36167L,36168L,36169L,36170L, +36171L,36172L,36173L,36174L,36175L,36176L,36177L,36178L,36179L,36180L, +36181L,36182L,36183L,36184L,36185L,36186L,36187L,36188L,36189L,36190L, +36191L,36192L,36193L,36194L,36195L,36196L,36197L,36198L,36199L,36200L, +36201L,36202L,36203L,36204L,36205L,36206L,36207L,36208L,36209L,36210L, +36211L,36212L,36213L,36214L,36215L,36216L,36217L,36218L,36219L,36220L, +36221L,36222L,36223L,36224L,36225L,36226L,36227L,36228L,36229L,36230L, +36231L,36232L,36233L,36234L,36235L,36236L,36237L,36238L,36239L,36240L, +36241L,36242L,36243L,36244L,36245L,36246L,36247L,36248L,36249L,36250L, +36251L,36252L,36253L,36254L,36255L,36256L,36257L,36258L,36259L,36260L, +36261L,36262L,36263L,36264L,36265L,36266L,36267L,36268L,36269L,36270L, +36271L,36272L,36273L,36274L,36275L,36276L,36277L,36278L,36279L,36280L, +36281L,36282L,36283L,36284L,36285L,36286L,36287L,36288L,36289L,36290L, +36291L,36292L,36293L,36294L,36295L,36296L,36297L,36298L,36299L,36300L, +36301L,36302L,36303L,36304L,36305L,36306L,36307L,36308L,36309L,36310L, +36311L,36312L,36313L,36314L,36315L,36316L,36317L,36318L,36319L,36320L, +36321L,36322L,36323L,36324L,36325L,36326L,36327L,36328L,36329L,36330L, +36331L,36332L,36333L,36334L,36335L,36336L,36337L,36338L,36339L,36340L, +36341L,36342L,36343L,36344L,36345L,36346L,36347L,36348L,36349L,36350L, +36351L,36352L,36353L,36354L,36355L,36356L,36357L,36358L,36359L,36360L, +36361L,36362L,36363L,36364L,36365L,36366L,36367L,36368L,36369L,36370L, +36371L,36372L,36373L,36374L,36375L,36376L,36377L,36378L,36379L,36380L, +36381L,36382L,36383L,36384L,36385L,36386L,36387L,36388L,36389L,36390L, +36391L,36392L,36393L,36394L,36395L,36396L,36397L,36398L,36399L,36400L, +36401L,36402L,36403L,36404L,36405L,36406L,36407L,36408L,36409L,36410L, +36411L,36412L,36413L,36414L,36415L,36416L,36417L,36418L,36419L,36420L, +36421L,36422L,36423L,36424L,36425L,36426L,36427L,36428L,36429L,36430L, +36431L,36432L,36433L,36434L,36435L,36436L,36437L,36438L,36439L,36440L, +36441L,36442L,36443L,36444L,36445L,36446L,36447L,36448L,36449L,36450L, +36451L,36452L,36453L,36454L,36455L,36456L,36457L,36458L,36459L,36460L, +36461L,36462L,36463L,36464L,36465L,36466L,36467L,36468L,36469L,36470L, +36471L,36472L,36473L,36474L,36475L,36476L,36477L,36478L,36479L,36480L, +36481L,36482L,36483L,36484L,36485L,36486L,36487L,36488L,36489L,36490L, +36491L,36492L,36493L,36494L,36495L,36496L,36497L,36498L,36499L,36500L, +36501L,36502L,36503L,36504L,36505L,36506L,36507L,36508L,36509L,36510L, +36511L,36512L,36513L,36514L,36515L,36516L,36517L,36518L,36519L,36520L, +36521L,36522L,36523L,36524L,36525L,36526L,36527L,36528L,36529L,36530L, +36531L,36532L,36533L,36534L,36535L,36536L,36537L,36538L,36539L,36540L, +36541L,36542L,36543L,36544L,36545L,36546L,36547L,36548L,36549L,36550L, +36551L,36552L,36553L,36554L,36555L,36556L,36557L,36558L,36559L,36560L, +36561L,36562L,36563L,36564L,36565L,36566L,36567L,36568L,36569L,36570L, +36571L,36572L,36573L,36574L,36575L,36576L,36577L,36578L,36579L,36580L, +36581L,36582L,36583L,36584L,36585L,36586L,36587L,36588L,36589L,36590L, +36591L,36592L,36593L,36594L,36595L,36596L,36597L,36598L,36599L,36600L, +36601L,36602L,36603L,36604L,36605L,36606L,36607L,36608L,36609L,36610L, +36611L,36612L,36613L,36614L,36615L,36616L,36617L,36618L,36619L,36620L, +36621L,36622L,36623L,36624L,36625L,36626L,36627L,36628L,36629L,36630L, +36631L,36632L,36633L,36634L,36635L,36636L,36637L,36638L,36639L,36640L, +36641L,36642L,36643L,36644L,36645L,36646L,36647L,36648L,36649L,36650L, +36651L,36652L,36653L,36654L,36655L,36656L,36657L,36658L,36659L,36660L, +36661L,36662L,36663L,36664L,36665L,36666L,36667L,36668L,36669L,36670L, +36671L,36672L,36673L,36674L,36675L,36676L,36677L,36678L,36679L,36680L, +36681L,36682L,36683L,36684L,36685L,36686L,36687L,36688L,36689L,36690L, +36691L,36692L,36693L,36694L,36695L,36696L,36697L,36698L,36699L,36700L, +36701L,36702L,36703L,36704L,36705L,36706L,36707L,36708L,36709L,36710L, +36711L,36712L,36713L,36714L,36715L,36716L,36717L,36718L,36719L,36720L, +36721L,36722L,36723L,36724L,36725L,36726L,36727L,36728L,36729L,36730L, +36731L,36732L,36733L,36734L,36735L,36736L,36737L,36738L,36739L,36740L, +36741L,36742L,36743L,36744L,36745L,36746L,36747L,36748L,36749L,36750L, +36751L,36752L,36753L,36754L,36755L,36756L,36757L,36758L,36759L,36760L, +36761L,36762L,36763L,36764L,36765L,36766L,36767L,36768L,36769L,36770L, +36771L,36772L,36773L,36774L,36775L,36776L,36777L,36778L,36779L,36780L, +36781L,36782L,36783L,36784L,36785L,36786L,36787L,36788L,36789L,36790L, +36791L,36792L,36793L,36794L,36795L,36796L,36797L,36798L,36799L,36800L, +36801L,36802L,36803L,36804L,36805L,36806L,36807L,36808L,36809L,36810L, +36811L,36812L,36813L,36814L,36815L,36816L,36817L,36818L,36819L,36820L, +36821L,36822L,36823L,36824L,36825L,36826L,36827L,36828L,36829L,36830L, +36831L,36832L,36833L,36834L,36835L,36836L,36837L,36838L,36839L,36840L, +36841L,36842L,36843L,36844L,36845L,36846L,36847L,36848L,36849L,36850L, +36851L,36852L,36853L,36854L,36855L,36856L,36857L,36858L,36859L,36860L, +36861L,36862L,36863L,36864L,36865L,36866L,36867L,36868L,36869L,36870L, +36871L,36872L,36873L,36874L,36875L,36876L,36877L,36878L,36879L,36880L, +36881L,36882L,36883L,36884L,36885L,36886L,36887L,36888L,36889L,36890L, +36891L,36892L,36893L,36894L,36895L,36896L,36897L,36898L,36899L,36900L, +36901L,36902L,36903L,36904L,36905L,36906L,36907L,36908L,36909L,36910L, +36911L,36912L,36913L,36914L,36915L,36916L,36917L,36918L,36919L,36920L, +36921L,36922L,36923L,36924L,36925L,36926L,36927L,36928L,36929L,36930L, +36931L,36932L,36933L,36934L,36935L,36936L,36937L,36938L,36939L,36940L, +36941L,36942L,36943L,36944L,36945L,36946L,36947L,36948L,36949L,36950L, +36951L,36952L,36953L,36954L,36955L,36956L,36957L,36958L,36959L,36960L, +36961L,36962L,36963L,36964L,36965L,36966L,36967L,36968L,36969L,36970L, +36971L,36972L,36973L,36974L,36975L,36976L,36977L,36978L,36979L,36980L, +36981L,36982L,36983L,36984L,36985L,36986L,36987L,36988L,36989L,36990L, +36991L,36992L,36993L,36994L,36995L,36996L,36997L,36998L,36999L,37000L, +37001L,37002L,37003L,37004L,37005L,37006L,37007L,37008L,37009L,37010L, +37011L,37012L,37013L,37014L,37015L,37016L,37017L,37018L,37019L,37020L, +37021L,37022L,37023L,37024L,37025L,37026L,37027L,37028L,37029L,37030L, +37031L,37032L,37033L,37034L,37035L,37036L,37037L,37038L,37039L,37040L, +37041L,37042L,37043L,37044L,37045L,37046L,37047L,37048L,37049L,37050L, +37051L,37052L,37053L,37054L,37055L,37056L,37057L,37058L,37059L,37060L, +37061L,37062L,37063L,37064L,37065L,37066L,37067L,37068L,37069L,37070L, +37071L,37072L,37073L,37074L,37075L,37076L,37077L,37078L,37079L,37080L, +37081L,37082L,37083L,37084L,37085L,37086L,37087L,37088L,37089L,37090L, +37091L,37092L,37093L,37094L,37095L,37096L,37097L,37098L,37099L,37100L, +37101L,37102L,37103L,37104L,37105L,37106L,37107L,37108L,37109L,37110L, +37111L,37112L,37113L,37114L,37115L,37116L,37117L,37118L,37119L,37120L, +37121L,37122L,37123L,37124L,37125L,37126L,37127L,37128L,37129L,37130L, +37131L,37132L,37133L,37134L,37135L,37136L,37137L,37138L,37139L,37140L, +37141L,37142L,37143L,37144L,37145L,37146L,37147L,37148L,37149L,37150L, +37151L,37152L,37153L,37154L,37155L,37156L,37157L,37158L,37159L,37160L, +37161L,37162L,37163L,37164L,37165L,37166L,37167L,37168L,37169L,37170L, +37171L,37172L,37173L,37174L,37175L,37176L,37177L,37178L,37179L,37180L, +37181L,37182L,37183L,37184L,37185L,37186L,37187L,37188L,37189L,37190L, +37191L,37192L,37193L,37194L,37195L,37196L,37197L,37198L,37199L,37200L, +37201L,37202L,37203L,37204L,37205L,37206L,37207L,37208L,37209L,37210L, +37211L,37212L,37213L,37214L,37215L,37216L,37217L,37218L,37219L,37220L, +37221L,37222L,37223L,37224L,37225L,37226L,37227L,37228L,37229L,37230L, +37231L,37232L,37233L,37234L,37235L,37236L,37237L,37238L,37239L,37240L, +37241L,37242L,37243L,37244L,37245L,37246L,37247L,37248L,37249L,37250L, +37251L,37252L,37253L,37254L,37255L,37256L,37257L,37258L,37259L,37260L, +37261L,37262L,37263L,37264L,37265L,37266L,37267L,37268L,37269L,37270L, +37271L,37272L,37273L,37274L,37275L,37276L,37277L,37278L,37279L,37280L, +37281L,37282L,37283L,37284L,37285L,37286L,37287L,37288L,37289L,37290L, +37291L,37292L,37293L,37294L,37295L,37296L,37297L,37298L,37299L,37300L, +37301L,37302L,37303L,37304L,37305L,37306L,37307L,37308L,37309L,37310L, +37311L,37312L,37313L,37314L,37315L,37316L,37317L,37318L,37319L,37320L, +37321L,37322L,37323L,37324L,37325L,37326L,37327L,37328L,37329L,37330L, +37331L,37332L,37333L,37334L,37335L,37336L,37337L,37338L,37339L,37340L, +37341L,37342L,37343L,37344L,37345L,37346L,37347L,37348L,37349L,37350L, +37351L,37352L,37353L,37354L,37355L,37356L,37357L,37358L,37359L,37360L, +37361L,37362L,37363L,37364L,37365L,37366L,37367L,37368L,37369L,37370L, +37371L,37372L,37373L,37374L,37375L,37376L,37377L,37378L,37379L,37380L, +37381L,37382L,37383L,37384L,37385L,37386L,37387L,37388L,37389L,37390L, +37391L,37392L,37393L,37394L,37395L,37396L,37397L,37398L,37399L,37400L, +37401L,37402L,37403L,37404L,37405L,37406L,37407L,37408L,37409L,37410L, +37411L,37412L,37413L,37414L,37415L,37416L,37417L,37418L,37419L,37420L, +37421L,37422L,37423L,37424L,37425L,37426L,37427L,37428L,37429L,37430L, +37431L,37432L,37433L,37434L,37435L,37436L,37437L,37438L,37439L,37440L, +37441L,37442L,37443L,37444L,37445L,37446L,37447L,37448L,37449L,37450L, +37451L,37452L,37453L,37454L,37455L,37456L,37457L,37458L,37459L,37460L, +37461L,37462L,37463L,37464L,37465L,37466L,37467L,37468L,37469L,37470L, +37471L,37472L,37473L,37474L,37475L,37476L,37477L,37478L,37479L,37480L, +37481L,37482L,37483L,37484L,37485L,37486L,37487L,37488L,37489L,37490L, +37491L,37492L,37493L,37494L,37495L,37496L,37497L,37498L,37499L,37500L, +37501L,37502L,37503L,37504L,37505L,37506L,37507L,37508L,37509L,37510L, +37511L,37512L,37513L,37514L,37515L,37516L,37517L,37518L,37519L,37520L, +37521L,37522L,37523L,37524L,37525L,37526L,37527L,37528L,37529L,37530L, +37531L,37532L,37533L,37534L,37535L,37536L,37537L,37538L,37539L,37540L, +37541L,37542L,37543L,37544L,37545L,37546L,37547L,37548L,37549L,37550L, +37551L,37552L,37553L,37554L,37555L,37556L,37557L,37558L,37559L,37560L, +37561L,37562L,37563L,37564L,37565L,37566L,37567L,37568L,37569L,37570L, +37571L,37572L,37573L,37574L,37575L,37576L,37577L,37578L,37579L,37580L, +37581L,37582L,37583L,37584L,37585L,37586L,37587L,37588L,37589L,37590L, +37591L,37592L,37593L,37594L,37595L,37596L,37597L,37598L,37599L,37600L, +37601L,37602L,37603L,37604L,37605L,37606L,37607L,37608L,37609L,37610L, +37611L,37612L,37613L,37614L,37615L,37616L,37617L,37618L,37619L,37620L, +37621L,37622L,37623L,37624L,37625L,37626L,37627L,37628L,37629L,37630L, +37631L,37632L,37633L,37634L,37635L,37636L,37637L,37638L,37639L,37640L, +37641L,37642L,37643L,37644L,37645L,37646L,37647L,37648L,37649L,37650L, +37651L,37652L,37653L,37654L,37655L,37656L,37657L,37658L,37659L,37660L, +37661L,37662L,37663L,37664L,37665L,37666L,37667L,37668L,37669L,37670L, +37671L,37672L,37673L,37674L,37675L,37676L,37677L,37678L,37679L,37680L, +37681L,37682L,37683L,37684L,37685L,37686L,37687L,37688L,37689L,37690L, +37691L,37692L,37693L,37694L,37695L,37696L,37697L,37698L,37699L,37700L, +37701L,37702L,37703L,37704L,37705L,37706L,37707L,37708L,37709L,37710L, +37711L,37712L,37713L,37714L,37715L,37716L,37717L,37718L,37719L,37720L, +37721L,37722L,37723L,37724L,37725L,37726L,37727L,37728L,37729L,37730L, +37731L,37732L,37733L,37734L,37735L,37736L,37737L,37738L,37739L,37740L, +37741L,37742L,37743L,37744L,37745L,37746L,37747L,37748L,37749L,37750L, +37751L,37752L,37753L,37754L,37755L,37756L,37757L,37758L,37759L,37760L, +37761L,37762L,37763L,37764L,37765L,37766L,37767L,37768L,37769L,37770L, +37771L,37772L,37773L,37774L,37775L,37776L,37777L,37778L,37779L,37780L, +37781L,37782L,37783L,37784L,37785L,37786L,37787L,37788L,37789L,37790L, +37791L,37792L,37793L,37794L,37795L,37796L,37797L,37798L,37799L,37800L, +37801L,37802L,37803L,37804L,37805L,37806L,37807L,37808L,37809L,37810L, +37811L,37812L,37813L,37814L,37815L,37816L,37817L,37818L,37819L,37820L, +37821L,37822L,37823L,37824L,37825L,37826L,37827L,37828L,37829L,37830L, +37831L,37832L,37833L,37834L,37835L,37836L,37837L,37838L,37839L,37840L, +37841L,37842L,37843L,37844L,37845L,37846L,37847L,37848L,37849L,37850L, +37851L,37852L,37853L,37854L,37855L,37856L,37857L,37858L,37859L,37860L, +37861L,37862L,37863L,37864L,37865L,37866L,37867L,37868L,37869L,37870L, +37871L,37872L,37873L,37874L,37875L,37876L,37877L,37878L,37879L,37880L, +37881L,37882L,37883L,37884L,37885L,37886L,37887L,37888L,37889L,37890L, +37891L,37892L,37893L,37894L,37895L,37896L,37897L,37898L,37899L,37900L, +37901L,37902L,37903L,37904L,37905L,37906L,37907L,37908L,37909L,37910L, +37911L,37912L,37913L,37914L,37915L,37916L,37917L,37918L,37919L,37920L, +37921L,37922L,37923L,37924L,37925L,37926L,37927L,37928L,37929L,37930L, +37931L,37932L,37933L,37934L,37935L,37936L,37937L,37938L,37939L,37940L, +37941L,37942L,37943L,37944L,37945L,37946L,37947L,37948L,37949L,37950L, +37951L,37952L,37953L,37954L,37955L,37956L,37957L,37958L,37959L,37960L, +37961L,37962L,37963L,37964L,37965L,37966L,37967L,37968L,37969L,37970L, +37971L,37972L,37973L,37974L,37975L,37976L,37977L,37978L,37979L,37980L, +37981L,37982L,37983L,37984L,37985L,37986L,37987L,37988L,37989L,37990L, +37991L,37992L,37993L,37994L,37995L,37996L,37997L,37998L,37999L,38000L, +38001L,38002L,38003L,38004L,38005L,38006L,38007L,38008L,38009L,38010L, +38011L,38012L,38013L,38014L,38015L,38016L,38017L,38018L,38019L,38020L, +38021L,38022L,38023L,38024L,38025L,38026L,38027L,38028L,38029L,38030L, +38031L,38032L,38033L,38034L,38035L,38036L,38037L,38038L,38039L,38040L, +38041L,38042L,38043L,38044L,38045L,38046L,38047L,38048L,38049L,38050L, +38051L,38052L,38053L,38054L,38055L,38056L,38057L,38058L,38059L,38060L, +38061L,38062L,38063L,38064L,38065L,38066L,38067L,38068L,38069L,38070L, +38071L,38072L,38073L,38074L,38075L,38076L,38077L,38078L,38079L,38080L, +38081L,38082L,38083L,38084L,38085L,38086L,38087L,38088L,38089L,38090L, +38091L,38092L,38093L,38094L,38095L,38096L,38097L,38098L,38099L,38100L, +38101L,38102L,38103L,38104L,38105L,38106L,38107L,38108L,38109L,38110L, +38111L,38112L,38113L,38114L,38115L,38116L,38117L,38118L,38119L,38120L, +38121L,38122L,38123L,38124L,38125L,38126L,38127L,38128L,38129L,38130L, +38131L,38132L,38133L,38134L,38135L,38136L,38137L,38138L,38139L,38140L, +38141L,38142L,38143L,38144L,38145L,38146L,38147L,38148L,38149L,38150L, +38151L,38152L,38153L,38154L,38155L,38156L,38157L,38158L,38159L,38160L, +38161L,38162L,38163L,38164L,38165L,38166L,38167L,38168L,38169L,38170L, +38171L,38172L,38173L,38174L,38175L,38176L,38177L,38178L,38179L,38180L, +38181L,38182L,38183L,38184L,38185L,38186L,38187L,38188L,38189L,38190L, +38191L,38192L,38193L,38194L,38195L,38196L,38197L,38198L,38199L,38200L, +38201L,38202L,38203L,38204L,38205L,38206L,38207L,38208L,38209L,38210L, +38211L,38212L,38213L,38214L,38215L,38216L,38217L,38218L,38219L,38220L, +38221L,38222L,38223L,38224L,38225L,38226L,38227L,38228L,38229L,38230L, +38231L,38232L,38233L,38234L,38235L,38236L,38237L,38238L,38239L,38240L, +38241L,38242L,38243L,38244L,38245L,38246L,38247L,38248L,38249L,38250L, +38251L,38252L,38253L,38254L,38255L,38256L,38257L,38258L,38259L,38260L, +38261L,38262L,38263L,38264L,38265L,38266L,38267L,38268L,38269L,38270L, +38271L,38272L,38273L,38274L,38275L,38276L,38277L,38278L,38279L,38280L, +38281L,38282L,38283L,38284L,38285L,38286L,38287L,38288L,38289L,38290L, +38291L,38292L,38293L,38294L,38295L,38296L,38297L,38298L,38299L,38300L, +38301L,38302L,38303L,38304L,38305L,38306L,38307L,38308L,38309L,38310L, +38311L,38312L,38313L,38314L,38315L,38316L,38317L,38318L,38319L,38320L, +38321L,38322L,38323L,38324L,38325L,38326L,38327L,38328L,38329L,38330L, +38331L,38332L,38333L,38334L,38335L,38336L,38337L,38338L,38339L,38340L, +38341L,38342L,38343L,38344L,38345L,38346L,38347L,38348L,38349L,38350L, +38351L,38352L,38353L,38354L,38355L,38356L,38357L,38358L,38359L,38360L, +38361L,38362L,38363L,38364L,38365L,38366L,38367L,38368L,38369L,38370L, +38371L,38372L,38373L,38374L,38375L,38376L,38377L,38378L,38379L,38380L, +38381L,38382L,38383L,38384L,38385L,38386L,38387L,38388L,38389L,38390L, +38391L,38392L,38393L,38394L,38395L,38396L,38397L,38398L,38399L,38400L, +38401L,38402L,38403L,38404L,38405L,38406L,38407L,38408L,38409L,38410L, +38411L,38412L,38413L,38414L,38415L,38416L,38417L,38418L,38419L,38420L, +38421L,38422L,38423L,38424L,38425L,38426L,38427L,38428L,38429L,38430L, +38431L,38432L,38433L,38434L,38435L,38436L,38437L,38438L,38439L,38440L, +38441L,38442L,38443L,38444L,38445L,38446L,38447L,38448L,38449L,38450L, +38451L,38452L,38453L,38454L,38455L,38456L,38457L,38458L,38459L,38460L, +38461L,38462L,38463L,38464L,38465L,38466L,38467L,38468L,38469L,38470L, +38471L,38472L,38473L,38474L,38475L,38476L,38477L,38478L,38479L,38480L, +38481L,38482L,38483L,38484L,38485L,38486L,38487L,38488L,38489L,38490L, +38491L,38492L,38493L,38494L,38495L,38496L,38497L,38498L,38499L,38500L, +38501L,38502L,38503L,38504L,38505L,38506L,38507L,38508L,38509L,38510L, +38511L,38512L,38513L,38514L,38515L,38516L,38517L,38518L,38519L,38520L, +38521L,38522L,38523L,38524L,38525L,38526L,38527L,38528L,38529L,38530L, +38531L,38532L,38533L,38534L,38535L,38536L,38537L,38538L,38539L,38540L, +38541L,38542L,38543L,38544L,38545L,38546L,38547L,38548L,38549L,38550L, +38551L,38552L,38553L,38554L,38555L,38556L,38557L,38558L,38559L,38560L, +38561L,38562L,38563L,38564L,38565L,38566L,38567L,38568L,38569L,38570L, +38571L,38572L,38573L,38574L,38575L,38576L,38577L,38578L,38579L,38580L, +38581L,38582L,38583L,38584L,38585L,38586L,38587L,38588L,38589L,38590L, +38591L,38592L,38593L,38594L,38595L,38596L,38597L,38598L,38599L,38600L, +38601L,38602L,38603L,38604L,38605L,38606L,38607L,38608L,38609L,38610L, +38611L,38612L,38613L,38614L,38615L,38616L,38617L,38618L,38619L,38620L, +38621L,38622L,38623L,38624L,38625L,38626L,38627L,38628L,38629L,38630L, +38631L,38632L,38633L,38634L,38635L,38636L,38637L,38638L,38639L,38640L, +38641L,38642L,38643L,38644L,38645L,38646L,38647L,38648L,38649L,38650L, +38651L,38652L,38653L,38654L,38655L,38656L,38657L,38658L,38659L,38660L, +38661L,38662L,38663L,38664L,38665L,38666L,38667L,38668L,38669L,38670L, +38671L,38672L,38673L,38674L,38675L,38676L,38677L,38678L,38679L,38680L, +38681L,38682L,38683L,38684L,38685L,38686L,38687L,38688L,38689L,38690L, +38691L,38692L,38693L,38694L,38695L,38696L,38697L,38698L,38699L,38700L, +38701L,38702L,38703L,38704L,38705L,38706L,38707L,38708L,38709L,38710L, +38711L,38712L,38713L,38714L,38715L,38716L,38717L,38718L,38719L,38720L, +38721L,38722L,38723L,38724L,38725L,38726L,38727L,38728L,38729L,38730L, +38731L,38732L,38733L,38734L,38735L,38736L,38737L,38738L,38739L,38740L, +38741L,38742L,38743L,38744L,38745L,38746L,38747L,38748L,38749L,38750L, +38751L,38752L,38753L,38754L,38755L,38756L,38757L,38758L,38759L,38760L, +38761L,38762L,38763L,38764L,38765L,38766L,38767L,38768L,38769L,38770L, +38771L,38772L,38773L,38774L,38775L,38776L,38777L,38778L,38779L,38780L, +38781L,38782L,38783L,38784L,38785L,38786L,38787L,38788L,38789L,38790L, +38791L,38792L,38793L,38794L,38795L,38796L,38797L,38798L,38799L,38800L, +38801L,38802L,38803L,38804L,38805L,38806L,38807L,38808L,38809L,38810L, +38811L,38812L,38813L,38814L,38815L,38816L,38817L,38818L,38819L,38820L, +38821L,38822L,38823L,38824L,38825L,38826L,38827L,38828L,38829L,38830L, +38831L,38832L,38833L,38834L,38835L,38836L,38837L,38838L,38839L,38840L, +38841L,38842L,38843L,38844L,38845L,38846L,38847L,38848L,38849L,38850L, +38851L,38852L,38853L,38854L,38855L,38856L,38857L,38858L,38859L,38860L, +38861L,38862L,38863L,38864L,38865L,38866L,38867L,38868L,38869L,38870L, +38871L,38872L,38873L,38874L,38875L,38876L,38877L,38878L,38879L,38880L, +38881L,38882L,38883L,38884L,38885L,38886L,38887L,38888L,38889L,38890L, +38891L,38892L,38893L,38894L,38895L,38896L,38897L,38898L,38899L,38900L, +38901L,38902L,38903L,38904L,38905L,38906L,38907L,38908L,38909L,38910L, +38911L,38912L,38913L,38914L,38915L,38916L,38917L,38918L,38919L,38920L, +38921L,38922L,38923L,38924L,38925L,38926L,38927L,38928L,38929L,38930L, +38931L,38932L,38933L,38934L,38935L,38936L,38937L,38938L,38939L,38940L, +38941L,38942L,38943L,38944L,38945L,38946L,38947L,38948L,38949L,38950L, +38951L,38952L,38953L,38954L,38955L,38956L,38957L,38958L,38959L,38960L, +38961L,38962L,38963L,38964L,38965L,38966L,38967L,38968L,38969L,38970L, +38971L,38972L,38973L,38974L,38975L,38976L,38977L,38978L,38979L,38980L, +38981L,38982L,38983L,38984L,38985L,38986L,38987L,38988L,38989L,38990L, +38991L,38992L,38993L,38994L,38995L,38996L,38997L,38998L,38999L,39000L, +39001L,39002L,39003L,39004L,39005L,39006L,39007L,39008L,39009L,39010L, +39011L,39012L,39013L,39014L,39015L,39016L,39017L,39018L,39019L,39020L, +39021L,39022L,39023L,39024L,39025L,39026L,39027L,39028L,39029L,39030L, +39031L,39032L,39033L,39034L,39035L,39036L,39037L,39038L,39039L,39040L, +39041L,39042L,39043L,39044L,39045L,39046L,39047L,39048L,39049L,39050L, +39051L,39052L,39053L,39054L,39055L,39056L,39057L,39058L,39059L,39060L, +39061L,39062L,39063L,39064L,39065L,39066L,39067L,39068L,39069L,39070L, +39071L,39072L,39073L,39074L,39075L,39076L,39077L,39078L,39079L,39080L, +39081L,39082L,39083L,39084L,39085L,39086L,39087L,39088L,39089L,39090L, +39091L,39092L,39093L,39094L,39095L,39096L,39097L,39098L,39099L,39100L, +39101L,39102L,39103L,39104L,39105L,39106L,39107L,39108L,39109L,39110L, +39111L,39112L,39113L,39114L,39115L,39116L,39117L,39118L,39119L,39120L, +39121L,39122L,39123L,39124L,39125L,39126L,39127L,39128L,39129L,39130L, +39131L,39132L,39133L,39134L,39135L,39136L,39137L,39138L,39139L,39140L, +39141L,39142L,39143L,39144L,39145L,39146L,39147L,39148L,39149L,39150L, +39151L,39152L,39153L,39154L,39155L,39156L,39157L,39158L,39159L,39160L, +39161L,39162L,39163L,39164L,39165L,39166L,39167L,39168L,39169L,39170L, +39171L,39172L,39173L,39174L,39175L,39176L,39177L,39178L,39179L,39180L, +39181L,39182L,39183L,39184L,39185L,39186L,39187L,39188L,39189L,39190L, +39191L,39192L,39193L,39194L,39195L,39196L,39197L,39198L,39199L,39200L, +39201L,39202L,39203L,39204L,39205L,39206L,39207L,39208L,39209L,39210L, +39211L,39212L,39213L,39214L,39215L,39216L,39217L,39218L,39219L,39220L, +39221L,39222L,39223L,39224L,39225L,39226L,39227L,39228L,39229L,39230L, +39231L,39232L,39233L,39234L,39235L,39236L,39237L,39238L,39239L,39240L, +39241L,39242L,39243L,39244L,39245L,39246L,39247L,39248L,39249L,39250L, +39251L,39252L,39253L,39254L,39255L,39256L,39257L,39258L,39259L,39260L, +39261L,39262L,39263L,39264L,39265L,39266L,39267L,39268L,39269L,39270L, +39271L,39272L,39273L,39274L,39275L,39276L,39277L,39278L,39279L,39280L, +39281L,39282L,39283L,39284L,39285L,39286L,39287L,39288L,39289L,39290L, +39291L,39292L,39293L,39294L,39295L,39296L,39297L,39298L,39299L,39300L, +39301L,39302L,39303L,39304L,39305L,39306L,39307L,39308L,39309L,39310L, +39311L,39312L,39313L,39314L,39315L,39316L,39317L,39318L,39319L,39320L, +39321L,39322L,39323L,39324L,39325L,39326L,39327L,39328L,39329L,39330L, +39331L,39332L,39333L,39334L,39335L,39336L,39337L,39338L,39339L,39340L, +39341L,39342L,39343L,39344L,39345L,39346L,39347L,39348L,39349L,39350L, +39351L,39352L,39353L,39354L,39355L,39356L,39357L,39358L,39359L,39360L, +39361L,39362L,39363L,39364L,39365L,39366L,39367L,39368L,39369L,39370L, +39371L,39372L,39373L,39374L,39375L,39376L,39377L,39378L,39379L,39380L, +39381L,39382L,39383L,39384L,39385L,39386L,39387L,39388L,39389L,39390L, +39391L,39392L,39393L,39394L,39395L,39396L,39397L,39398L,39399L,39400L, +39401L,39402L,39403L,39404L,39405L,39406L,39407L,39408L,39409L,39410L, +39411L,39412L,39413L,39414L,39415L,39416L,39417L,39418L,39419L,39420L, +39421L,39422L,39423L,39424L,39425L,39426L,39427L,39428L,39429L,39430L, +39431L,39432L,39433L,39434L,39435L,39436L,39437L,39438L,39439L,39440L, +39441L,39442L,39443L,39444L,39445L,39446L,39447L,39448L,39449L,39450L, +39451L,39452L,39453L,39454L,39455L,39456L,39457L,39458L,39459L,39460L, +39461L,39462L,39463L,39464L,39465L,39466L,39467L,39468L,39469L,39470L, +39471L,39472L,39473L,39474L,39475L,39476L,39477L,39478L,39479L,39480L, +39481L,39482L,39483L,39484L,39485L,39486L,39487L,39488L,39489L,39490L, +39491L,39492L,39493L,39494L,39495L,39496L,39497L,39498L,39499L,39500L, +39501L,39502L,39503L,39504L,39505L,39506L,39507L,39508L,39509L,39510L, +39511L,39512L,39513L,39514L,39515L,39516L,39517L,39518L,39519L,39520L, +39521L,39522L,39523L,39524L,39525L,39526L,39527L,39528L,39529L,39530L, +39531L,39532L,39533L,39534L,39535L,39536L,39537L,39538L,39539L,39540L, +39541L,39542L,39543L,39544L,39545L,39546L,39547L,39548L,39549L,39550L, +39551L,39552L,39553L,39554L,39555L,39556L,39557L,39558L,39559L,39560L, +39561L,39562L,39563L,39564L,39565L,39566L,39567L,39568L,39569L,39570L, +39571L,39572L,39573L,39574L,39575L,39576L,39577L,39578L,39579L,39580L, +39581L,39582L,39583L,39584L,39585L,39586L,39587L,39588L,39589L,39590L, +39591L,39592L,39593L,39594L,39595L,39596L,39597L,39598L,39599L,39600L, +39601L,39602L,39603L,39604L,39605L,39606L,39607L,39608L,39609L,39610L, +39611L,39612L,39613L,39614L,39615L,39616L,39617L,39618L,39619L,39620L, +39621L,39622L,39623L,39624L,39625L,39626L,39627L,39628L,39629L,39630L, +39631L,39632L,39633L,39634L,39635L,39636L,39637L,39638L,39639L,39640L, +39641L,39642L,39643L,39644L,39645L,39646L,39647L,39648L,39649L,39650L, +39651L,39652L,39653L,39654L,39655L,39656L,39657L,39658L,39659L,39660L, +39661L,39662L,39663L,39664L,39665L,39666L,39667L,39668L,39669L,39670L, +39671L,39672L,39673L,39674L,39675L,39676L,39677L,39678L,39679L,39680L, +39681L,39682L,39683L,39684L,39685L,39686L,39687L,39688L,39689L,39690L, +39691L,39692L,39693L,39694L,39695L,39696L,39697L,39698L,39699L,39700L, +39701L,39702L,39703L,39704L,39705L,39706L,39707L,39708L,39709L,39710L, +39711L,39712L,39713L,39714L,39715L,39716L,39717L,39718L,39719L,39720L, +39721L,39722L,39723L,39724L,39725L,39726L,39727L,39728L,39729L,39730L, +39731L,39732L,39733L,39734L,39735L,39736L,39737L,39738L,39739L,39740L, +39741L,39742L,39743L,39744L,39745L,39746L,39747L,39748L,39749L,39750L, +39751L,39752L,39753L,39754L,39755L,39756L,39757L,39758L,39759L,39760L, +39761L,39762L,39763L,39764L,39765L,39766L,39767L,39768L,39769L,39770L, +39771L,39772L,39773L,39774L,39775L,39776L,39777L,39778L,39779L,39780L, +39781L,39782L,39783L,39784L,39785L,39786L,39787L,39788L,39789L,39790L, +39791L,39792L,39793L,39794L,39795L,39796L,39797L,39798L,39799L,39800L, +39801L,39802L,39803L,39804L,39805L,39806L,39807L,39808L,39809L,39810L, +39811L,39812L,39813L,39814L,39815L,39816L,39817L,39818L,39819L,39820L, +39821L,39822L,39823L,39824L,39825L,39826L,39827L,39828L,39829L,39830L, +39831L,39832L,39833L,39834L,39835L,39836L,39837L,39838L,39839L,39840L, +39841L,39842L,39843L,39844L,39845L,39846L,39847L,39848L,39849L,39850L, +39851L,39852L,39853L,39854L,39855L,39856L,39857L,39858L,39859L,39860L, +39861L,39862L,39863L,39864L,39865L,39866L,39867L,39868L,39869L,39870L, +39871L,39872L,39873L,39874L,39875L,39876L,39877L,39878L,39879L,39880L, +39881L,39882L,39883L,39884L,39885L,39886L,39887L,39888L,39889L,39890L, +39891L,39892L,39893L,39894L,39895L,39896L,39897L,39898L,39899L,39900L, +39901L,39902L,39903L,39904L,39905L,39906L,39907L,39908L,39909L,39910L, +39911L,39912L,39913L,39914L,39915L,39916L,39917L,39918L,39919L,39920L, +39921L,39922L,39923L,39924L,39925L,39926L,39927L,39928L,39929L,39930L, +39931L,39932L,39933L,39934L,39935L,39936L,39937L,39938L,39939L,39940L, +39941L,39942L,39943L,39944L,39945L,39946L,39947L,39948L,39949L,39950L, +39951L,39952L,39953L,39954L,39955L,39956L,39957L,39958L,39959L,39960L, +39961L,39962L,39963L,39964L,39965L,39966L,39967L,39968L,39969L,39970L, +39971L,39972L,39973L,39974L,39975L,39976L,39977L,39978L,39979L,39980L, +39981L,39982L,39983L,39984L,39985L,39986L,39987L,39988L,39989L,39990L, +39991L,39992L,39993L,39994L,39995L,39996L,39997L,39998L,39999L,40000L, +40001L,40002L,40003L,40004L,40005L,40006L,40007L,40008L,40009L,40010L, +40011L,40012L,40013L,40014L,40015L,40016L,40017L,40018L,40019L,40020L, +40021L,40022L,40023L,40024L,40025L,40026L,40027L,40028L,40029L,40030L, +40031L,40032L,40033L,40034L,40035L,40036L,40037L,40038L,40039L,40040L, +40041L,40042L,40043L,40044L,40045L,40046L,40047L,40048L,40049L,40050L, +40051L,40052L,40053L,40054L,40055L,40056L,40057L,40058L,40059L,40060L, +40061L,40062L,40063L,40064L,40065L,40066L,40067L,40068L,40069L,40070L, +40071L,40072L,40073L,40074L,40075L,40076L,40077L,40078L,40079L,40080L, +40081L,40082L,40083L,40084L,40085L,40086L,40087L,40088L,40089L,40090L, +40091L,40092L,40093L,40094L,40095L,40096L,40097L,40098L,40099L,40100L, +40101L,40102L,40103L,40104L,40105L,40106L,40107L,40108L,40109L,40110L, +40111L,40112L,40113L,40114L,40115L,40116L,40117L,40118L,40119L,40120L, +40121L,40122L,40123L,40124L,40125L,40126L,40127L,40128L,40129L,40130L, +40131L,40132L,40133L,40134L,40135L,40136L,40137L,40138L,40139L,40140L, +40141L,40142L,40143L,40144L,40145L,40146L,40147L,40148L,40149L,40150L, +40151L,40152L,40153L,40154L,40155L,40156L,40157L,40158L,40159L,40160L, +40161L,40162L,40163L,40164L,40165L,40166L,40167L,40168L,40169L,40170L, +40171L,40172L,40173L,40174L,40175L,40176L,40177L,40178L,40179L,40180L, +40181L,40182L,40183L,40184L,40185L,40186L,40187L,40188L,40189L,40190L, +40191L,40192L,40193L,40194L,40195L,40196L,40197L,40198L,40199L,40200L, +40201L,40202L,40203L,40204L,40205L,40206L,40207L,40208L,40209L,40210L, +40211L,40212L,40213L,40214L,40215L,40216L,40217L,40218L,40219L,40220L, +40221L,40222L,40223L,40224L,40225L,40226L,40227L,40228L,40229L,40230L, +40231L,40232L,40233L,40234L,40235L,40236L,40237L,40238L,40239L,40240L, +40241L,40242L,40243L,40244L,40245L,40246L,40247L,40248L,40249L,40250L, +40251L,40252L,40253L,40254L,40255L,40256L,40257L,40258L,40259L,40260L, +40261L,40262L,40263L,40264L,40265L,40266L,40267L,40268L,40269L,40270L, +40271L,40272L,40273L,40274L,40275L,40276L,40277L,40278L,40279L,40280L, +40281L,40282L,40283L,40284L,40285L,40286L,40287L,40288L,40289L,40290L, +40291L,40292L,40293L,40294L,40295L,40296L,40297L,40298L,40299L,40300L, +40301L,40302L,40303L,40304L,40305L,40306L,40307L,40308L,40309L,40310L, +40311L,40312L,40313L,40314L,40315L,40316L,40317L,40318L,40319L,40320L, +40321L,40322L,40323L,40324L,40325L,40326L,40327L,40328L,40329L,40330L, +40331L,40332L,40333L,40334L,40335L,40336L,40337L,40338L,40339L,40340L, +40341L,40342L,40343L,40344L,40345L,40346L,40347L,40348L,40349L,40350L, +40351L,40352L,40353L,40354L,40355L,40356L,40357L,40358L,40359L,40360L, +40361L,40362L,40363L,40364L,40365L,40366L,40367L,40368L,40369L,40370L, +40371L,40372L,40373L,40374L,40375L,40376L,40377L,40378L,40379L,40380L, +40381L,40382L,40383L,40384L,40385L,40386L,40387L,40388L,40389L,40390L, +40391L,40392L,40393L,40394L,40395L,40396L,40397L,40398L,40399L,40400L, +40401L,40402L,40403L,40404L,40405L,40406L,40407L,40408L,40409L,40410L, +40411L,40412L,40413L,40414L,40415L,40416L,40417L,40418L,40419L,40420L, +40421L,40422L,40423L,40424L,40425L,40426L,40427L,40428L,40429L,40430L, +40431L,40432L,40433L,40434L,40435L,40436L,40437L,40438L,40439L,40440L, +40441L,40442L,40443L,40444L,40445L,40446L,40447L,40448L,40449L,40450L, +40451L,40452L,40453L,40454L,40455L,40456L,40457L,40458L,40459L,40460L, +40461L,40462L,40463L,40464L,40465L,40466L,40467L,40468L,40469L,40470L, +40471L,40472L,40473L,40474L,40475L,40476L,40477L,40478L,40479L,40480L, +40481L,40482L,40483L,40484L,40485L,40486L,40487L,40488L,40489L,40490L, +40491L,40492L,40493L,40494L,40495L,40496L,40497L,40498L,40499L,40500L, +40501L,40502L,40503L,40504L,40505L,40506L,40507L,40508L,40509L,40510L, +40511L,40512L,40513L,40514L,40515L,40516L,40517L,40518L,40519L,40520L, +40521L,40522L,40523L,40524L,40525L,40526L,40527L,40528L,40529L,40530L, +40531L,40532L,40533L,40534L,40535L,40536L,40537L,40538L,40539L,40540L, +40541L,40542L,40543L,40544L,40545L,40546L,40547L,40548L,40549L,40550L, +40551L,40552L,40553L,40554L,40555L,40556L,40557L,40558L,40559L,40560L, +40561L,40562L,40563L,40564L,40565L,40566L,40567L,40568L,40569L,40570L, +40571L,40572L,40573L,40574L,40575L,40576L,40577L,40578L,40579L,40580L, +40581L,40582L,40583L,40584L,40585L,40586L,40587L,40588L,40589L,40590L, +40591L,40592L,40593L,40594L,40595L,40596L,40597L,40598L,40599L,40600L, +40601L,40602L,40603L,40604L,40605L,40606L,40607L,40608L,40609L,40610L, +40611L,40612L,40613L,40614L,40615L,40616L,40617L,40618L,40619L,40620L, +40621L,40622L,40623L,40624L,40625L,40626L,40627L,40628L,40629L,40630L, +40631L,40632L,40633L,40634L,40635L,40636L,40637L,40638L,40639L,40640L, +40641L,40642L,40643L,40644L,40645L,40646L,40647L,40648L,40649L,40650L, +40651L,40652L,40653L,40654L,40655L,40656L,40657L,40658L,40659L,40660L, +40661L,40662L,40663L,40664L,40665L,40666L,40667L,40668L,40669L,40670L, +40671L,40672L,40673L,40674L,40675L,40676L,40677L,40678L,40679L,40680L, +40681L,40682L,40683L,40684L,40685L,40686L,40687L,40688L,40689L,40690L, +40691L,40692L,40693L,40694L,40695L,40696L,40697L,40698L,40699L,40700L, +40701L,40702L,40703L,40704L,40705L,40706L,40707L,40708L,40709L,40710L, +40711L,40712L,40713L,40714L,40715L,40716L,40717L,40718L,40719L,40720L, +40721L,40722L,40723L,40724L,40725L,40726L,40727L,40728L,40729L,40730L, +40731L,40732L,40733L,40734L,40735L,40736L,40737L,40738L,40739L,40740L, +40741L,40742L,40743L,40744L,40745L,40746L,40747L,40748L,40749L,40750L, +40751L,40752L,40753L,40754L,40755L,40756L,40757L,40758L,40759L,40760L, +40761L,40762L,40763L,40764L,40765L,40766L,40767L,40768L,40769L,40770L, +40771L,40772L,40773L,40774L,40775L,40776L,40777L,40778L,40779L,40780L, +40781L,40782L,40783L,40784L,40785L,40786L,40787L,40788L,40789L,40790L, +40791L,40792L,40793L,40794L,40795L,40796L,40797L,40798L,40799L,40800L, +40801L,40802L,40803L,40804L,40805L,40806L,40807L,40808L,40809L,40810L, +40811L,40812L,40813L,40814L,40815L,40816L,40817L,40818L,40819L,40820L, +40821L,40822L,40823L,40824L,40825L,40826L,40827L,40828L,40829L,40830L, +40831L,40832L,40833L,40834L,40835L,40836L,40837L,40838L,40839L,40840L, +40841L,40842L,40843L,40844L,40845L,40846L,40847L,40848L,40849L,40850L, +40851L,40852L,40853L,40854L,40855L,40856L,40857L,40858L,40859L,40860L, +40861L,40862L,40863L,40864L,40865L,40866L,40867L,40868L,40869L,40870L, +40871L,40872L,40873L,40874L,40875L,40876L,40877L,40878L,40879L,40880L, +40881L,40882L,40883L,40884L,40885L,40886L,40887L,40888L,40889L,40890L, +40891L,40892L,40893L,40894L,40895L,40896L,40897L,40898L,40899L,40900L, +40901L,40902L,40903L,40904L,40905L,40906L,40907L,40908L,40909L,40910L, +40911L,40912L,40913L,40914L,40915L,40916L,40917L,40918L,40919L,40920L, +40921L,40922L,40923L,40924L,40925L,40926L,40927L,40928L,40929L,40930L, +40931L,40932L,40933L,40934L,40935L,40936L,40937L,40938L,40939L,40940L, +40941L,40942L,40943L,40944L,40945L,40946L,40947L,40948L,40949L,40950L, +40951L,40952L,40953L,40954L,40955L,40956L,40957L,40958L,40959L,40960L, +40961L,40962L,40963L,40964L,40965L,40966L,40967L,40968L,40969L,40970L, +40971L,40972L,40973L,40974L,40975L,40976L,40977L,40978L,40979L,40980L, +40981L,40982L,40983L,40984L,40985L,40986L,40987L,40988L,40989L,40990L, +40991L,40992L,40993L,40994L,40995L,40996L,40997L,40998L,40999L,41000L, +41001L,41002L,41003L,41004L,41005L,41006L,41007L,41008L,41009L,41010L, +41011L,41012L,41013L,41014L,41015L,41016L,41017L,41018L,41019L,41020L, +41021L,41022L,41023L,41024L,41025L,41026L,41027L,41028L,41029L,41030L, +41031L,41032L,41033L,41034L,41035L,41036L,41037L,41038L,41039L,41040L, +41041L,41042L,41043L,41044L,41045L,41046L,41047L,41048L,41049L,41050L, +41051L,41052L,41053L,41054L,41055L,41056L,41057L,41058L,41059L,41060L, +41061L,41062L,41063L,41064L,41065L,41066L,41067L,41068L,41069L,41070L, +41071L,41072L,41073L,41074L,41075L,41076L,41077L,41078L,41079L,41080L, +41081L,41082L,41083L,41084L,41085L,41086L,41087L,41088L,41089L,41090L, +41091L,41092L,41093L,41094L,41095L,41096L,41097L,41098L,41099L,41100L, +41101L,41102L,41103L,41104L,41105L,41106L,41107L,41108L,41109L,41110L, +41111L,41112L,41113L,41114L,41115L,41116L,41117L,41118L,41119L,41120L, +41121L,41122L,41123L,41124L,41125L,41126L,41127L,41128L,41129L,41130L, +41131L,41132L,41133L,41134L,41135L,41136L,41137L,41138L,41139L,41140L, +41141L,41142L,41143L,41144L,41145L,41146L,41147L,41148L,41149L,41150L, +41151L,41152L,41153L,41154L,41155L,41156L,41157L,41158L,41159L,41160L, +41161L,41162L,41163L,41164L,41165L,41166L,41167L,41168L,41169L,41170L, +41171L,41172L,41173L,41174L,41175L,41176L,41177L,41178L,41179L,41180L, +41181L,41182L,41183L,41184L,41185L,41186L,41187L,41188L,41189L,41190L, +41191L,41192L,41193L,41194L,41195L,41196L,41197L,41198L,41199L,41200L, +41201L,41202L,41203L,41204L,41205L,41206L,41207L,41208L,41209L,41210L, +41211L,41212L,41213L,41214L,41215L,41216L,41217L,41218L,41219L,41220L, +41221L,41222L,41223L,41224L,41225L,41226L,41227L,41228L,41229L,41230L, +41231L,41232L,41233L,41234L,41235L,41236L,41237L,41238L,41239L,41240L, +41241L,41242L,41243L,41244L,41245L,41246L,41247L,41248L,41249L,41250L, +41251L,41252L,41253L,41254L,41255L,41256L,41257L,41258L,41259L,41260L, +41261L,41262L,41263L,41264L,41265L,41266L,41267L,41268L,41269L,41270L, +41271L,41272L,41273L,41274L,41275L,41276L,41277L,41278L,41279L,41280L, +41281L,41282L,41283L,41284L,41285L,41286L,41287L,41288L,41289L,41290L, +41291L,41292L,41293L,41294L,41295L,41296L,41297L,41298L,41299L,41300L, +41301L,41302L,41303L,41304L,41305L,41306L,41307L,41308L,41309L,41310L, +41311L,41312L,41313L,41314L,41315L,41316L,41317L,41318L,41319L,41320L, +41321L,41322L,41323L,41324L,41325L,41326L,41327L,41328L,41329L,41330L, +41331L,41332L,41333L,41334L,41335L,41336L,41337L,41338L,41339L,41340L, +41341L,41342L,41343L,41344L,41345L,41346L,41347L,41348L,41349L,41350L, +41351L,41352L,41353L,41354L,41355L,41356L,41357L,41358L,41359L,41360L, +41361L,41362L,41363L,41364L,41365L,41366L,41367L,41368L,41369L,41370L, +41371L,41372L,41373L,41374L,41375L,41376L,41377L,41378L,41379L,41380L, +41381L,41382L,41383L,41384L,41385L,41386L,41387L,41388L,41389L,41390L, +41391L,41392L,41393L,41394L,41395L,41396L,41397L,41398L,41399L,41400L, +41401L,41402L,41403L,41404L,41405L,41406L,41407L,41408L,41409L,41410L, +41411L,41412L,41413L,41414L,41415L,41416L,41417L,41418L,41419L,41420L, +41421L,41422L,41423L,41424L,41425L,41426L,41427L,41428L,41429L,41430L, +41431L,41432L,41433L,41434L,41435L,41436L,41437L,41438L,41439L,41440L, +41441L,41442L,41443L,41444L,41445L,41446L,41447L,41448L,41449L,41450L, +41451L,41452L,41453L,41454L,41455L,41456L,41457L,41458L,41459L,41460L, +41461L,41462L,41463L,41464L,41465L,41466L,41467L,41468L,41469L,41470L, +41471L,41472L,41473L,41474L,41475L,41476L,41477L,41478L,41479L,41480L, +41481L,41482L,41483L,41484L,41485L,41486L,41487L,41488L,41489L,41490L, +41491L,41492L,41493L,41494L,41495L,41496L,41497L,41498L,41499L,41500L, +41501L,41502L,41503L,41504L,41505L,41506L,41507L,41508L,41509L,41510L, +41511L,41512L,41513L,41514L,41515L,41516L,41517L,41518L,41519L,41520L, +41521L,41522L,41523L,41524L,41525L,41526L,41527L,41528L,41529L,41530L, +41531L,41532L,41533L,41534L,41535L,41536L,41537L,41538L,41539L,41540L, +41541L,41542L,41543L,41544L,41545L,41546L,41547L,41548L,41549L,41550L, +41551L,41552L,41553L,41554L,41555L,41556L,41557L,41558L,41559L,41560L, +41561L,41562L,41563L,41564L,41565L,41566L,41567L,41568L,41569L,41570L, +41571L,41572L,41573L,41574L,41575L,41576L,41577L,41578L,41579L,41580L, +41581L,41582L,41583L,41584L,41585L,41586L,41587L,41588L,41589L,41590L, +41591L,41592L,41593L,41594L,41595L,41596L,41597L,41598L,41599L,41600L, +41601L,41602L,41603L,41604L,41605L,41606L,41607L,41608L,41609L,41610L, +41611L,41612L,41613L,41614L,41615L,41616L,41617L,41618L,41619L,41620L, +41621L,41622L,41623L,41624L,41625L,41626L,41627L,41628L,41629L,41630L, +41631L,41632L,41633L,41634L,41635L,41636L,41637L,41638L,41639L,41640L, +41641L,41642L,41643L,41644L,41645L,41646L,41647L,41648L,41649L,41650L, +41651L,41652L,41653L,41654L,41655L,41656L,41657L,41658L,41659L,41660L, +41661L,41662L,41663L,41664L,41665L,41666L,41667L,41668L,41669L,41670L, +41671L,41672L,41673L,41674L,41675L,41676L,41677L,41678L,41679L,41680L, +41681L,41682L,41683L,41684L,41685L,41686L,41687L,41688L,41689L,41690L, +41691L,41692L,41693L,41694L,41695L,41696L,41697L,41698L,41699L,41700L, +41701L,41702L,41703L,41704L,41705L,41706L,41707L,41708L,41709L,41710L, +41711L,41712L,41713L,41714L,41715L,41716L,41717L,41718L,41719L,41720L, +41721L,41722L,41723L,41724L,41725L,41726L,41727L,41728L,41729L,41730L, +41731L,41732L,41733L,41734L,41735L,41736L,41737L,41738L,41739L,41740L, +41741L,41742L,41743L,41744L,41745L,41746L,41747L,41748L,41749L,41750L, +41751L,41752L,41753L,41754L,41755L,41756L,41757L,41758L,41759L,41760L, +41761L,41762L,41763L,41764L,41765L,41766L,41767L,41768L,41769L,41770L, +41771L,41772L,41773L,41774L,41775L,41776L,41777L,41778L,41779L,41780L, +41781L,41782L,41783L,41784L,41785L,41786L,41787L,41788L,41789L,41790L, +41791L,41792L,41793L,41794L,41795L,41796L,41797L,41798L,41799L,41800L, +41801L,41802L,41803L,41804L,41805L,41806L,41807L,41808L,41809L,41810L, +41811L,41812L,41813L,41814L,41815L,41816L,41817L,41818L,41819L,41820L, +41821L,41822L,41823L,41824L,41825L,41826L,41827L,41828L,41829L,41830L, +41831L,41832L,41833L,41834L,41835L,41836L,41837L,41838L,41839L,41840L, +41841L,41842L,41843L,41844L,41845L,41846L,41847L,41848L,41849L,41850L, +41851L,41852L,41853L,41854L,41855L,41856L,41857L,41858L,41859L,41860L, +41861L,41862L,41863L,41864L,41865L,41866L,41867L,41868L,41869L,41870L, +41871L,41872L,41873L,41874L,41875L,41876L,41877L,41878L,41879L,41880L, +41881L,41882L,41883L,41884L,41885L,41886L,41887L,41888L,41889L,41890L, +41891L,41892L,41893L,41894L,41895L,41896L,41897L,41898L,41899L,41900L, +41901L,41902L,41903L,41904L,41905L,41906L,41907L,41908L,41909L,41910L, +41911L,41912L,41913L,41914L,41915L,41916L,41917L,41918L,41919L,41920L, +41921L,41922L,41923L,41924L,41925L,41926L,41927L,41928L,41929L,41930L, +41931L,41932L,41933L,41934L,41935L,41936L,41937L,41938L,41939L,41940L, +41941L,41942L,41943L,41944L,41945L,41946L,41947L,41948L,41949L,41950L, +41951L,41952L,41953L,41954L,41955L,41956L,41957L,41958L,41959L,41960L, +41961L,41962L,41963L,41964L,41965L,41966L,41967L,41968L,41969L,41970L, +41971L,41972L,41973L,41974L,41975L,41976L,41977L,41978L,41979L,41980L, +41981L,41982L,41983L,41984L,41985L,41986L,41987L,41988L,41989L,41990L, +41991L,41992L,41993L,41994L,41995L,41996L,41997L,41998L,41999L,42000L, +42001L,42002L,42003L,42004L,42005L,42006L,42007L,42008L,42009L,42010L, +42011L,42012L,42013L,42014L,42015L,42016L,42017L,42018L,42019L,42020L, +42021L,42022L,42023L,42024L,42025L,42026L,42027L,42028L,42029L,42030L, +42031L,42032L,42033L,42034L,42035L,42036L,42037L,42038L,42039L,42040L, +42041L,42042L,42043L,42044L,42045L,42046L,42047L,42048L,42049L,42050L, +42051L,42052L,42053L,42054L,42055L,42056L,42057L,42058L,42059L,42060L, +42061L,42062L,42063L,42064L,42065L,42066L,42067L,42068L,42069L,42070L, +42071L,42072L,42073L,42074L,42075L,42076L,42077L,42078L,42079L,42080L, +42081L,42082L,42083L,42084L,42085L,42086L,42087L,42088L,42089L,42090L, +42091L,42092L,42093L,42094L,42095L,42096L,42097L,42098L,42099L,42100L, +42101L,42102L,42103L,42104L,42105L,42106L,42107L,42108L,42109L,42110L, +42111L,42112L,42113L,42114L,42115L,42116L,42117L,42118L,42119L,42120L, +42121L,42122L,42123L,42124L,42125L,42126L,42127L,42128L,42129L,42130L, +42131L,42132L,42133L,42134L,42135L,42136L,42137L,42138L,42139L,42140L, +42141L,42142L,42143L,42144L,42145L,42146L,42147L,42148L,42149L,42150L, +42151L,42152L,42153L,42154L,42155L,42156L,42157L,42158L,42159L,42160L, +42161L,42162L,42163L,42164L,42165L,42166L,42167L,42168L,42169L,42170L, +42171L,42172L,42173L,42174L,42175L,42176L,42177L,42178L,42179L,42180L, +42181L,42182L,42183L,42184L,42185L,42186L,42187L,42188L,42189L,42190L, +42191L,42192L,42193L,42194L,42195L,42196L,42197L,42198L,42199L,42200L, +42201L,42202L,42203L,42204L,42205L,42206L,42207L,42208L,42209L,42210L, +42211L,42212L,42213L,42214L,42215L,42216L,42217L,42218L,42219L,42220L, +42221L,42222L,42223L,42224L,42225L,42226L,42227L,42228L,42229L,42230L, +42231L,42232L,42233L,42234L,42235L,42236L,42237L,42238L,42239L,42240L, +42241L,42242L,42243L,42244L,42245L,42246L,42247L,42248L,42249L,42250L, +42251L,42252L,42253L,42254L,42255L,42256L,42257L,42258L,42259L,42260L, +42261L,42262L,42263L,42264L,42265L,42266L,42267L,42268L,42269L,42270L, +42271L,42272L,42273L,42274L,42275L,42276L,42277L,42278L,42279L,42280L, +42281L,42282L,42283L,42284L,42285L,42286L,42287L,42288L,42289L,42290L, +42291L,42292L,42293L,42294L,42295L,42296L,42297L,42298L,42299L,42300L, +42301L,42302L,42303L,42304L,42305L,42306L,42307L,42308L,42309L,42310L, +42311L,42312L,42313L,42314L,42315L,42316L,42317L,42318L,42319L,42320L, +42321L,42322L,42323L,42324L,42325L,42326L,42327L,42328L,42329L,42330L, +42331L,42332L,42333L,42334L,42335L,42336L,42337L,42338L,42339L,42340L, +42341L,42342L,42343L,42344L,42345L,42346L,42347L,42348L,42349L,42350L, +42351L,42352L,42353L,42354L,42355L,42356L,42357L,42358L,42359L,42360L, +42361L,42362L,42363L,42364L,42365L,42366L,42367L,42368L,42369L,42370L, +42371L,42372L,42373L,42374L,42375L,42376L,42377L,42378L,42379L,42380L, +42381L,42382L,42383L,42384L,42385L,42386L,42387L,42388L,42389L,42390L, +42391L,42392L,42393L,42394L,42395L,42396L,42397L,42398L,42399L,42400L, +42401L,42402L,42403L,42404L,42405L,42406L,42407L,42408L,42409L,42410L, +42411L,42412L,42413L,42414L,42415L,42416L,42417L,42418L,42419L,42420L, +42421L,42422L,42423L,42424L,42425L,42426L,42427L,42428L,42429L,42430L, +42431L,42432L,42433L,42434L,42435L,42436L,42437L,42438L,42439L,42440L, +42441L,42442L,42443L,42444L,42445L,42446L,42447L,42448L,42449L,42450L, +42451L,42452L,42453L,42454L,42455L,42456L,42457L,42458L,42459L,42460L, +42461L,42462L,42463L,42464L,42465L,42466L,42467L,42468L,42469L,42470L, +42471L,42472L,42473L,42474L,42475L,42476L,42477L,42478L,42479L,42480L, +42481L,42482L,42483L,42484L,42485L,42486L,42487L,42488L,42489L,42490L, +42491L,42492L,42493L,42494L,42495L,42496L,42497L,42498L,42499L,42500L, +42501L,42502L,42503L,42504L,42505L,42506L,42507L,42508L,42509L,42510L, +42511L,42512L,42513L,42514L,42515L,42516L,42517L,42518L,42519L,42520L, +42521L,42522L,42523L,42524L,42525L,42526L,42527L,42528L,42529L,42530L, +42531L,42532L,42533L,42534L,42535L,42536L,42537L,42538L,42539L,42540L, +42541L,42542L,42543L,42544L,42545L,42546L,42547L,42548L,42549L,42550L, +42551L,42552L,42553L,42554L,42555L,42556L,42557L,42558L,42559L,42560L, +42560L,42562L,42562L,42564L,42564L,42566L,42566L,42568L,42568L,42570L, +42570L,42572L,42572L,42574L,42574L,42576L,42576L,42578L,42578L,42580L, +42580L,42582L,42582L,42584L,42584L,42586L,42586L,42588L,42588L,42590L, +42590L,42592L,42592L,42594L,42594L,42596L,42596L,42598L,42598L,42600L, +42600L,42602L,42602L,42604L,42604L,42606L,42607L,42608L,42609L,42610L, +42611L,42612L,42613L,42614L,42615L,42616L,42617L,42618L,42619L,42620L, +42621L,42622L,42623L,42624L,42624L,42626L,42626L,42628L,42628L,42630L, +42630L,42632L,42632L,42634L,42634L,42636L,42636L,42638L,42638L,42640L, +42640L,42642L,42642L,42644L,42644L,42646L,42646L,42648L,42648L,42650L, +42650L,42652L,42653L,42654L,42655L,42656L,42657L,42658L,42659L,42660L, +42661L,42662L,42663L,42664L,42665L,42666L,42667L,42668L,42669L,42670L, +42671L,42672L,42673L,42674L,42675L,42676L,42677L,42678L,42679L,42680L, +42681L,42682L,42683L,42684L,42685L,42686L,42687L,42688L,42689L,42690L, +42691L,42692L,42693L,42694L,42695L,42696L,42697L,42698L,42699L,42700L, +42701L,42702L,42703L,42704L,42705L,42706L,42707L,42708L,42709L,42710L, +42711L,42712L,42713L,42714L,42715L,42716L,42717L,42718L,42719L,42720L, +42721L,42722L,42723L,42724L,42725L,42726L,42727L,42728L,42729L,42730L, +42731L,42732L,42733L,42734L,42735L,42736L,42737L,42738L,42739L,42740L, +42741L,42742L,42743L,42744L,42745L,42746L,42747L,42748L,42749L,42750L, +42751L,42752L,42753L,42754L,42755L,42756L,42757L,42758L,42759L,42760L, +42761L,42762L,42763L,42764L,42765L,42766L,42767L,42768L,42769L,42770L, +42771L,42772L,42773L,42774L,42775L,42776L,42777L,42778L,42779L,42780L, +42781L,42782L,42783L,42784L,42785L,42786L,42786L,42788L,42788L,42790L, +42790L,42792L,42792L,42794L,42794L,42796L,42796L,42798L,42798L,42800L, +42801L,42802L,42802L,42804L,42804L,42806L,42806L,42808L,42808L,42810L, +42810L,42812L,42812L,42814L,42814L,42816L,42816L,42818L,42818L,42820L, +42820L,42822L,42822L,42824L,42824L,42826L,42826L,42828L,42828L,42830L, +42830L,42832L,42832L,42834L,42834L,42836L,42836L,42838L,42838L,42840L, +42840L,42842L,42842L,42844L,42844L,42846L,42846L,42848L,42848L,42850L, +42850L,42852L,42852L,42854L,42854L,42856L,42856L,42858L,42858L,42860L, +42860L,42862L,42862L,42864L,42865L,42866L,42867L,42868L,42869L,42870L, +42871L,42872L,42873L,42873L,42875L,42875L,42877L,42878L,42878L,42880L, +42880L,42882L,42882L,42884L,42884L,42886L,42886L,42888L,42889L,42890L, +42891L,42891L,42893L,42894L,42895L,42896L,42896L,42898L,42898L,42900L, +42901L,42902L,42902L,42904L,42904L,42906L,42906L,42908L,42908L,42910L, +42910L,42912L,42912L,42914L,42914L,42916L,42916L,42918L,42918L,42920L, +42920L,42922L,42923L,42924L,42925L,42926L,42927L,42928L,42929L,42930L, +42931L,42932L,42932L,42934L,42934L,42936L,42937L,42938L,42939L,42940L, +42941L,42942L,42943L,42944L,42945L,42946L,42947L,42948L,42949L,42950L, +42951L,42952L,42953L,42954L,42955L,42956L,42957L,42958L,42959L,42960L, +42961L,42962L,42963L,42964L,42965L,42966L,42967L,42968L,42969L,42970L, +42971L,42972L,42973L,42974L,42975L,42976L,42977L,42978L,42979L,42980L, +42981L,42982L,42983L,42984L,42985L,42986L,42987L,42988L,42989L,42990L, +42991L,42992L,42993L,42994L,42995L,42996L,42997L,42998L,42999L,43000L, +43001L,43002L,43003L,43004L,43005L,43006L,43007L,43008L,43009L,43010L, +43011L,43012L,43013L,43014L,43015L,43016L,43017L,43018L,43019L,43020L, +43021L,43022L,43023L,43024L,43025L,43026L,43027L,43028L,43029L,43030L, +43031L,43032L,43033L,43034L,43035L,43036L,43037L,43038L,43039L,43040L, +43041L,43042L,43043L,43044L,43045L,43046L,43047L,43048L,43049L,43050L, +43051L,43052L,43053L,43054L,43055L,43056L,43057L,43058L,43059L,43060L, +43061L,43062L,43063L,43064L,43065L,43066L,43067L,43068L,43069L,43070L, +43071L,43072L,43073L,43074L,43075L,43076L,43077L,43078L,43079L,43080L, +43081L,43082L,43083L,43084L,43085L,43086L,43087L,43088L,43089L,43090L, +43091L,43092L,43093L,43094L,43095L,43096L,43097L,43098L,43099L,43100L, +43101L,43102L,43103L,43104L,43105L,43106L,43107L,43108L,43109L,43110L, +43111L,43112L,43113L,43114L,43115L,43116L,43117L,43118L,43119L,43120L, +43121L,43122L,43123L,43124L,43125L,43126L,43127L,43128L,43129L,43130L, +43131L,43132L,43133L,43134L,43135L,43136L,43137L,43138L,43139L,43140L, +43141L,43142L,43143L,43144L,43145L,43146L,43147L,43148L,43149L,43150L, +43151L,43152L,43153L,43154L,43155L,43156L,43157L,43158L,43159L,43160L, +43161L,43162L,43163L,43164L,43165L,43166L,43167L,43168L,43169L,43170L, +43171L,43172L,43173L,43174L,43175L,43176L,43177L,43178L,43179L,43180L, +43181L,43182L,43183L,43184L,43185L,43186L,43187L,43188L,43189L,43190L, +43191L,43192L,43193L,43194L,43195L,43196L,43197L,43198L,43199L,43200L, +43201L,43202L,43203L,43204L,43205L,43206L,43207L,43208L,43209L,43210L, +43211L,43212L,43213L,43214L,43215L,43216L,43217L,43218L,43219L,43220L, +43221L,43222L,43223L,43224L,43225L,43226L,43227L,43228L,43229L,43230L, +43231L,43232L,43233L,43234L,43235L,43236L,43237L,43238L,43239L,43240L, +43241L,43242L,43243L,43244L,43245L,43246L,43247L,43248L,43249L,43250L, +43251L,43252L,43253L,43254L,43255L,43256L,43257L,43258L,43259L,43260L, +43261L,43262L,43263L,43264L,43265L,43266L,43267L,43268L,43269L,43270L, +43271L,43272L,43273L,43274L,43275L,43276L,43277L,43278L,43279L,43280L, +43281L,43282L,43283L,43284L,43285L,43286L,43287L,43288L,43289L,43290L, +43291L,43292L,43293L,43294L,43295L,43296L,43297L,43298L,43299L,43300L, +43301L,43302L,43303L,43304L,43305L,43306L,43307L,43308L,43309L,43310L, +43311L,43312L,43313L,43314L,43315L,43316L,43317L,43318L,43319L,43320L, +43321L,43322L,43323L,43324L,43325L,43326L,43327L,43328L,43329L,43330L, +43331L,43332L,43333L,43334L,43335L,43336L,43337L,43338L,43339L,43340L, +43341L,43342L,43343L,43344L,43345L,43346L,43347L,43348L,43349L,43350L, +43351L,43352L,43353L,43354L,43355L,43356L,43357L,43358L,43359L,43360L, +43361L,43362L,43363L,43364L,43365L,43366L,43367L,43368L,43369L,43370L, +43371L,43372L,43373L,43374L,43375L,43376L,43377L,43378L,43379L,43380L, +43381L,43382L,43383L,43384L,43385L,43386L,43387L,43388L,43389L,43390L, +43391L,43392L,43393L,43394L,43395L,43396L,43397L,43398L,43399L,43400L, +43401L,43402L,43403L,43404L,43405L,43406L,43407L,43408L,43409L,43410L, +43411L,43412L,43413L,43414L,43415L,43416L,43417L,43418L,43419L,43420L, +43421L,43422L,43423L,43424L,43425L,43426L,43427L,43428L,43429L,43430L, +43431L,43432L,43433L,43434L,43435L,43436L,43437L,43438L,43439L,43440L, +43441L,43442L,43443L,43444L,43445L,43446L,43447L,43448L,43449L,43450L, +43451L,43452L,43453L,43454L,43455L,43456L,43457L,43458L,43459L,43460L, +43461L,43462L,43463L,43464L,43465L,43466L,43467L,43468L,43469L,43470L, +43471L,43472L,43473L,43474L,43475L,43476L,43477L,43478L,43479L,43480L, +43481L,43482L,43483L,43484L,43485L,43486L,43487L,43488L,43489L,43490L, +43491L,43492L,43493L,43494L,43495L,43496L,43497L,43498L,43499L,43500L, +43501L,43502L,43503L,43504L,43505L,43506L,43507L,43508L,43509L,43510L, +43511L,43512L,43513L,43514L,43515L,43516L,43517L,43518L,43519L,43520L, +43521L,43522L,43523L,43524L,43525L,43526L,43527L,43528L,43529L,43530L, +43531L,43532L,43533L,43534L,43535L,43536L,43537L,43538L,43539L,43540L, +43541L,43542L,43543L,43544L,43545L,43546L,43547L,43548L,43549L,43550L, +43551L,43552L,43553L,43554L,43555L,43556L,43557L,43558L,43559L,43560L, +43561L,43562L,43563L,43564L,43565L,43566L,43567L,43568L,43569L,43570L, +43571L,43572L,43573L,43574L,43575L,43576L,43577L,43578L,43579L,43580L, +43581L,43582L,43583L,43584L,43585L,43586L,43587L,43588L,43589L,43590L, +43591L,43592L,43593L,43594L,43595L,43596L,43597L,43598L,43599L,43600L, +43601L,43602L,43603L,43604L,43605L,43606L,43607L,43608L,43609L,43610L, +43611L,43612L,43613L,43614L,43615L,43616L,43617L,43618L,43619L,43620L, +43621L,43622L,43623L,43624L,43625L,43626L,43627L,43628L,43629L,43630L, +43631L,43632L,43633L,43634L,43635L,43636L,43637L,43638L,43639L,43640L, +43641L,43642L,43643L,43644L,43645L,43646L,43647L,43648L,43649L,43650L, +43651L,43652L,43653L,43654L,43655L,43656L,43657L,43658L,43659L,43660L, +43661L,43662L,43663L,43664L,43665L,43666L,43667L,43668L,43669L,43670L, +43671L,43672L,43673L,43674L,43675L,43676L,43677L,43678L,43679L,43680L, +43681L,43682L,43683L,43684L,43685L,43686L,43687L,43688L,43689L,43690L, +43691L,43692L,43693L,43694L,43695L,43696L,43697L,43698L,43699L,43700L, +43701L,43702L,43703L,43704L,43705L,43706L,43707L,43708L,43709L,43710L, +43711L,43712L,43713L,43714L,43715L,43716L,43717L,43718L,43719L,43720L, +43721L,43722L,43723L,43724L,43725L,43726L,43727L,43728L,43729L,43730L, +43731L,43732L,43733L,43734L,43735L,43736L,43737L,43738L,43739L,43740L, +43741L,43742L,43743L,43744L,43745L,43746L,43747L,43748L,43749L,43750L, +43751L,43752L,43753L,43754L,43755L,43756L,43757L,43758L,43759L,43760L, +43761L,43762L,43763L,43764L,43765L,43766L,43767L,43768L,43769L,43770L, +43771L,43772L,43773L,43774L,43775L,43776L,43777L,43778L,43779L,43780L, +43781L,43782L,43783L,43784L,43785L,43786L,43787L,43788L,43789L,43790L, +43791L,43792L,43793L,43794L,43795L,43796L,43797L,43798L,43799L,43800L, +43801L,43802L,43803L,43804L,43805L,43806L,43807L,43808L,43809L,43810L, +43811L,43812L,43813L,43814L,43815L,43816L,43817L,43818L,43819L,43820L, +43821L,43822L,43823L,43824L,43825L,43826L,43827L,43828L,43829L,43830L, +43831L,43832L,43833L,43834L,43835L,43836L,43837L,43838L,43839L,43840L, +43841L,43842L,43843L,43844L,43845L,43846L,43847L,43848L,43849L,43850L, +43851L,43852L,43853L,43854L,43855L,43856L,43857L,43858L,42931L,43860L, +43861L,43862L,43863L,43864L,43865L,43866L,43867L,43868L,43869L,43870L, +43871L,43872L,43873L,43874L,43875L,43876L,43877L,43878L,43879L,43880L, +43881L,43882L,43883L,43884L,43885L,43886L,43887L,5024,5025,5026,5027,5028, +5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043, +5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058, +5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073, +5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088, +5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, +43968L,43969L,43970L,43971L,43972L,43973L,43974L,43975L,43976L,43977L, +43978L,43979L,43980L,43981L,43982L,43983L,43984L,43985L,43986L,43987L, +43988L,43989L,43990L,43991L,43992L,43993L,43994L,43995L,43996L,43997L, +43998L,43999L,44000L,44001L,44002L,44003L,44004L,44005L,44006L,44007L, +44008L,44009L,44010L,44011L,44012L,44013L,44014L,44015L,44016L,44017L, +44018L,44019L,44020L,44021L,44022L,44023L,44024L,44025L,44026L,44027L, +44028L,44029L,44030L,44031L,44032L,44033L,44034L,44035L,44036L,44037L, +44038L,44039L,44040L,44041L,44042L,44043L,44044L,44045L,44046L,44047L, +44048L,44049L,44050L,44051L,44052L,44053L,44054L,44055L,44056L,44057L, +44058L,44059L,44060L,44061L,44062L,44063L,44064L,44065L,44066L,44067L, +44068L,44069L,44070L,44071L,44072L,44073L,44074L,44075L,44076L,44077L, +44078L,44079L,44080L,44081L,44082L,44083L,44084L,44085L,44086L,44087L, +44088L,44089L,44090L,44091L,44092L,44093L,44094L,44095L,44096L,44097L, +44098L,44099L,44100L,44101L,44102L,44103L,44104L,44105L,44106L,44107L, +44108L,44109L,44110L,44111L,44112L,44113L,44114L,44115L,44116L,44117L, +44118L,44119L,44120L,44121L,44122L,44123L,44124L,44125L,44126L,44127L, +44128L,44129L,44130L,44131L,44132L,44133L,44134L,44135L,44136L,44137L, +44138L,44139L,44140L,44141L,44142L,44143L,44144L,44145L,44146L,44147L, +44148L,44149L,44150L,44151L,44152L,44153L,44154L,44155L,44156L,44157L, +44158L,44159L,44160L,44161L,44162L,44163L,44164L,44165L,44166L,44167L, +44168L,44169L,44170L,44171L,44172L,44173L,44174L,44175L,44176L,44177L, +44178L,44179L,44180L,44181L,44182L,44183L,44184L,44185L,44186L,44187L, +44188L,44189L,44190L,44191L,44192L,44193L,44194L,44195L,44196L,44197L, +44198L,44199L,44200L,44201L,44202L,44203L,44204L,44205L,44206L,44207L, +44208L,44209L,44210L,44211L,44212L,44213L,44214L,44215L,44216L,44217L, +44218L,44219L,44220L,44221L,44222L,44223L,44224L,44225L,44226L,44227L, +44228L,44229L,44230L,44231L,44232L,44233L,44234L,44235L,44236L,44237L, +44238L,44239L,44240L,44241L,44242L,44243L,44244L,44245L,44246L,44247L, +44248L,44249L,44250L,44251L,44252L,44253L,44254L,44255L,44256L,44257L, +44258L,44259L,44260L,44261L,44262L,44263L,44264L,44265L,44266L,44267L, +44268L,44269L,44270L,44271L,44272L,44273L,44274L,44275L,44276L,44277L, +44278L,44279L,44280L,44281L,44282L,44283L,44284L,44285L,44286L,44287L, +44288L,44289L,44290L,44291L,44292L,44293L,44294L,44295L,44296L,44297L, +44298L,44299L,44300L,44301L,44302L,44303L,44304L,44305L,44306L,44307L, +44308L,44309L,44310L,44311L,44312L,44313L,44314L,44315L,44316L,44317L, +44318L,44319L,44320L,44321L,44322L,44323L,44324L,44325L,44326L,44327L, +44328L,44329L,44330L,44331L,44332L,44333L,44334L,44335L,44336L,44337L, +44338L,44339L,44340L,44341L,44342L,44343L,44344L,44345L,44346L,44347L, +44348L,44349L,44350L,44351L,44352L,44353L,44354L,44355L,44356L,44357L, +44358L,44359L,44360L,44361L,44362L,44363L,44364L,44365L,44366L,44367L, +44368L,44369L,44370L,44371L,44372L,44373L,44374L,44375L,44376L,44377L, +44378L,44379L,44380L,44381L,44382L,44383L,44384L,44385L,44386L,44387L, +44388L,44389L,44390L,44391L,44392L,44393L,44394L,44395L,44396L,44397L, +44398L,44399L,44400L,44401L,44402L,44403L,44404L,44405L,44406L,44407L, +44408L,44409L,44410L,44411L,44412L,44413L,44414L,44415L,44416L,44417L, +44418L,44419L,44420L,44421L,44422L,44423L,44424L,44425L,44426L,44427L, +44428L,44429L,44430L,44431L,44432L,44433L,44434L,44435L,44436L,44437L, +44438L,44439L,44440L,44441L,44442L,44443L,44444L,44445L,44446L,44447L, +44448L,44449L,44450L,44451L,44452L,44453L,44454L,44455L,44456L,44457L, +44458L,44459L,44460L,44461L,44462L,44463L,44464L,44465L,44466L,44467L, +44468L,44469L,44470L,44471L,44472L,44473L,44474L,44475L,44476L,44477L, +44478L,44479L,44480L,44481L,44482L,44483L,44484L,44485L,44486L,44487L, +44488L,44489L,44490L,44491L,44492L,44493L,44494L,44495L,44496L,44497L, +44498L,44499L,44500L,44501L,44502L,44503L,44504L,44505L,44506L,44507L, +44508L,44509L,44510L,44511L,44512L,44513L,44514L,44515L,44516L,44517L, +44518L,44519L,44520L,44521L,44522L,44523L,44524L,44525L,44526L,44527L, +44528L,44529L,44530L,44531L,44532L,44533L,44534L,44535L,44536L,44537L, +44538L,44539L,44540L,44541L,44542L,44543L,44544L,44545L,44546L,44547L, +44548L,44549L,44550L,44551L,44552L,44553L,44554L,44555L,44556L,44557L, +44558L,44559L,44560L,44561L,44562L,44563L,44564L,44565L,44566L,44567L, +44568L,44569L,44570L,44571L,44572L,44573L,44574L,44575L,44576L,44577L, +44578L,44579L,44580L,44581L,44582L,44583L,44584L,44585L,44586L,44587L, +44588L,44589L,44590L,44591L,44592L,44593L,44594L,44595L,44596L,44597L, +44598L,44599L,44600L,44601L,44602L,44603L,44604L,44605L,44606L,44607L, +44608L,44609L,44610L,44611L,44612L,44613L,44614L,44615L,44616L,44617L, +44618L,44619L,44620L,44621L,44622L,44623L,44624L,44625L,44626L,44627L, +44628L,44629L,44630L,44631L,44632L,44633L,44634L,44635L,44636L,44637L, +44638L,44639L,44640L,44641L,44642L,44643L,44644L,44645L,44646L,44647L, +44648L,44649L,44650L,44651L,44652L,44653L,44654L,44655L,44656L,44657L, +44658L,44659L,44660L,44661L,44662L,44663L,44664L,44665L,44666L,44667L, +44668L,44669L,44670L,44671L,44672L,44673L,44674L,44675L,44676L,44677L, +44678L,44679L,44680L,44681L,44682L,44683L,44684L,44685L,44686L,44687L, +44688L,44689L,44690L,44691L,44692L,44693L,44694L,44695L,44696L,44697L, +44698L,44699L,44700L,44701L,44702L,44703L,44704L,44705L,44706L,44707L, +44708L,44709L,44710L,44711L,44712L,44713L,44714L,44715L,44716L,44717L, +44718L,44719L,44720L,44721L,44722L,44723L,44724L,44725L,44726L,44727L, +44728L,44729L,44730L,44731L,44732L,44733L,44734L,44735L,44736L,44737L, +44738L,44739L,44740L,44741L,44742L,44743L,44744L,44745L,44746L,44747L, +44748L,44749L,44750L,44751L,44752L,44753L,44754L,44755L,44756L,44757L, +44758L,44759L,44760L,44761L,44762L,44763L,44764L,44765L,44766L,44767L, +44768L,44769L,44770L,44771L,44772L,44773L,44774L,44775L,44776L,44777L, +44778L,44779L,44780L,44781L,44782L,44783L,44784L,44785L,44786L,44787L, +44788L,44789L,44790L,44791L,44792L,44793L,44794L,44795L,44796L,44797L, +44798L,44799L,44800L,44801L,44802L,44803L,44804L,44805L,44806L,44807L, +44808L,44809L,44810L,44811L,44812L,44813L,44814L,44815L,44816L,44817L, +44818L,44819L,44820L,44821L,44822L,44823L,44824L,44825L,44826L,44827L, +44828L,44829L,44830L,44831L,44832L,44833L,44834L,44835L,44836L,44837L, +44838L,44839L,44840L,44841L,44842L,44843L,44844L,44845L,44846L,44847L, +44848L,44849L,44850L,44851L,44852L,44853L,44854L,44855L,44856L,44857L, +44858L,44859L,44860L,44861L,44862L,44863L,44864L,44865L,44866L,44867L, +44868L,44869L,44870L,44871L,44872L,44873L,44874L,44875L,44876L,44877L, +44878L,44879L,44880L,44881L,44882L,44883L,44884L,44885L,44886L,44887L, +44888L,44889L,44890L,44891L,44892L,44893L,44894L,44895L,44896L,44897L, +44898L,44899L,44900L,44901L,44902L,44903L,44904L,44905L,44906L,44907L, +44908L,44909L,44910L,44911L,44912L,44913L,44914L,44915L,44916L,44917L, +44918L,44919L,44920L,44921L,44922L,44923L,44924L,44925L,44926L,44927L, +44928L,44929L,44930L,44931L,44932L,44933L,44934L,44935L,44936L,44937L, +44938L,44939L,44940L,44941L,44942L,44943L,44944L,44945L,44946L,44947L, +44948L,44949L,44950L,44951L,44952L,44953L,44954L,44955L,44956L,44957L, +44958L,44959L,44960L,44961L,44962L,44963L,44964L,44965L,44966L,44967L, +44968L,44969L,44970L,44971L,44972L,44973L,44974L,44975L,44976L,44977L, +44978L,44979L,44980L,44981L,44982L,44983L,44984L,44985L,44986L,44987L, +44988L,44989L,44990L,44991L,44992L,44993L,44994L,44995L,44996L,44997L, +44998L,44999L,45000L,45001L,45002L,45003L,45004L,45005L,45006L,45007L, +45008L,45009L,45010L,45011L,45012L,45013L,45014L,45015L,45016L,45017L, +45018L,45019L,45020L,45021L,45022L,45023L,45024L,45025L,45026L,45027L, +45028L,45029L,45030L,45031L,45032L,45033L,45034L,45035L,45036L,45037L, +45038L,45039L,45040L,45041L,45042L,45043L,45044L,45045L,45046L,45047L, +45048L,45049L,45050L,45051L,45052L,45053L,45054L,45055L,45056L,45057L, +45058L,45059L,45060L,45061L,45062L,45063L,45064L,45065L,45066L,45067L, +45068L,45069L,45070L,45071L,45072L,45073L,45074L,45075L,45076L,45077L, +45078L,45079L,45080L,45081L,45082L,45083L,45084L,45085L,45086L,45087L, +45088L,45089L,45090L,45091L,45092L,45093L,45094L,45095L,45096L,45097L, +45098L,45099L,45100L,45101L,45102L,45103L,45104L,45105L,45106L,45107L, +45108L,45109L,45110L,45111L,45112L,45113L,45114L,45115L,45116L,45117L, +45118L,45119L,45120L,45121L,45122L,45123L,45124L,45125L,45126L,45127L, +45128L,45129L,45130L,45131L,45132L,45133L,45134L,45135L,45136L,45137L, +45138L,45139L,45140L,45141L,45142L,45143L,45144L,45145L,45146L,45147L, +45148L,45149L,45150L,45151L,45152L,45153L,45154L,45155L,45156L,45157L, +45158L,45159L,45160L,45161L,45162L,45163L,45164L,45165L,45166L,45167L, +45168L,45169L,45170L,45171L,45172L,45173L,45174L,45175L,45176L,45177L, +45178L,45179L,45180L,45181L,45182L,45183L,45184L,45185L,45186L,45187L, +45188L,45189L,45190L,45191L,45192L,45193L,45194L,45195L,45196L,45197L, +45198L,45199L,45200L,45201L,45202L,45203L,45204L,45205L,45206L,45207L, +45208L,45209L,45210L,45211L,45212L,45213L,45214L,45215L,45216L,45217L, +45218L,45219L,45220L,45221L,45222L,45223L,45224L,45225L,45226L,45227L, +45228L,45229L,45230L,45231L,45232L,45233L,45234L,45235L,45236L,45237L, +45238L,45239L,45240L,45241L,45242L,45243L,45244L,45245L,45246L,45247L, +45248L,45249L,45250L,45251L,45252L,45253L,45254L,45255L,45256L,45257L, +45258L,45259L,45260L,45261L,45262L,45263L,45264L,45265L,45266L,45267L, +45268L,45269L,45270L,45271L,45272L,45273L,45274L,45275L,45276L,45277L, +45278L,45279L,45280L,45281L,45282L,45283L,45284L,45285L,45286L,45287L, +45288L,45289L,45290L,45291L,45292L,45293L,45294L,45295L,45296L,45297L, +45298L,45299L,45300L,45301L,45302L,45303L,45304L,45305L,45306L,45307L, +45308L,45309L,45310L,45311L,45312L,45313L,45314L,45315L,45316L,45317L, +45318L,45319L,45320L,45321L,45322L,45323L,45324L,45325L,45326L,45327L, +45328L,45329L,45330L,45331L,45332L,45333L,45334L,45335L,45336L,45337L, +45338L,45339L,45340L,45341L,45342L,45343L,45344L,45345L,45346L,45347L, +45348L,45349L,45350L,45351L,45352L,45353L,45354L,45355L,45356L,45357L, +45358L,45359L,45360L,45361L,45362L,45363L,45364L,45365L,45366L,45367L, +45368L,45369L,45370L,45371L,45372L,45373L,45374L,45375L,45376L,45377L, +45378L,45379L,45380L,45381L,45382L,45383L,45384L,45385L,45386L,45387L, +45388L,45389L,45390L,45391L,45392L,45393L,45394L,45395L,45396L,45397L, +45398L,45399L,45400L,45401L,45402L,45403L,45404L,45405L,45406L,45407L, +45408L,45409L,45410L,45411L,45412L,45413L,45414L,45415L,45416L,45417L, +45418L,45419L,45420L,45421L,45422L,45423L,45424L,45425L,45426L,45427L, +45428L,45429L,45430L,45431L,45432L,45433L,45434L,45435L,45436L,45437L, +45438L,45439L,45440L,45441L,45442L,45443L,45444L,45445L,45446L,45447L, +45448L,45449L,45450L,45451L,45452L,45453L,45454L,45455L,45456L,45457L, +45458L,45459L,45460L,45461L,45462L,45463L,45464L,45465L,45466L,45467L, +45468L,45469L,45470L,45471L,45472L,45473L,45474L,45475L,45476L,45477L, +45478L,45479L,45480L,45481L,45482L,45483L,45484L,45485L,45486L,45487L, +45488L,45489L,45490L,45491L,45492L,45493L,45494L,45495L,45496L,45497L, +45498L,45499L,45500L,45501L,45502L,45503L,45504L,45505L,45506L,45507L, +45508L,45509L,45510L,45511L,45512L,45513L,45514L,45515L,45516L,45517L, +45518L,45519L,45520L,45521L,45522L,45523L,45524L,45525L,45526L,45527L, +45528L,45529L,45530L,45531L,45532L,45533L,45534L,45535L,45536L,45537L, +45538L,45539L,45540L,45541L,45542L,45543L,45544L,45545L,45546L,45547L, +45548L,45549L,45550L,45551L,45552L,45553L,45554L,45555L,45556L,45557L, +45558L,45559L,45560L,45561L,45562L,45563L,45564L,45565L,45566L,45567L, +45568L,45569L,45570L,45571L,45572L,45573L,45574L,45575L,45576L,45577L, +45578L,45579L,45580L,45581L,45582L,45583L,45584L,45585L,45586L,45587L, +45588L,45589L,45590L,45591L,45592L,45593L,45594L,45595L,45596L,45597L, +45598L,45599L,45600L,45601L,45602L,45603L,45604L,45605L,45606L,45607L, +45608L,45609L,45610L,45611L,45612L,45613L,45614L,45615L,45616L,45617L, +45618L,45619L,45620L,45621L,45622L,45623L,45624L,45625L,45626L,45627L, +45628L,45629L,45630L,45631L,45632L,45633L,45634L,45635L,45636L,45637L, +45638L,45639L,45640L,45641L,45642L,45643L,45644L,45645L,45646L,45647L, +45648L,45649L,45650L,45651L,45652L,45653L,45654L,45655L,45656L,45657L, +45658L,45659L,45660L,45661L,45662L,45663L,45664L,45665L,45666L,45667L, +45668L,45669L,45670L,45671L,45672L,45673L,45674L,45675L,45676L,45677L, +45678L,45679L,45680L,45681L,45682L,45683L,45684L,45685L,45686L,45687L, +45688L,45689L,45690L,45691L,45692L,45693L,45694L,45695L,45696L,45697L, +45698L,45699L,45700L,45701L,45702L,45703L,45704L,45705L,45706L,45707L, +45708L,45709L,45710L,45711L,45712L,45713L,45714L,45715L,45716L,45717L, +45718L,45719L,45720L,45721L,45722L,45723L,45724L,45725L,45726L,45727L, +45728L,45729L,45730L,45731L,45732L,45733L,45734L,45735L,45736L,45737L, +45738L,45739L,45740L,45741L,45742L,45743L,45744L,45745L,45746L,45747L, +45748L,45749L,45750L,45751L,45752L,45753L,45754L,45755L,45756L,45757L, +45758L,45759L,45760L,45761L,45762L,45763L,45764L,45765L,45766L,45767L, +45768L,45769L,45770L,45771L,45772L,45773L,45774L,45775L,45776L,45777L, +45778L,45779L,45780L,45781L,45782L,45783L,45784L,45785L,45786L,45787L, +45788L,45789L,45790L,45791L,45792L,45793L,45794L,45795L,45796L,45797L, +45798L,45799L,45800L,45801L,45802L,45803L,45804L,45805L,45806L,45807L, +45808L,45809L,45810L,45811L,45812L,45813L,45814L,45815L,45816L,45817L, +45818L,45819L,45820L,45821L,45822L,45823L,45824L,45825L,45826L,45827L, +45828L,45829L,45830L,45831L,45832L,45833L,45834L,45835L,45836L,45837L, +45838L,45839L,45840L,45841L,45842L,45843L,45844L,45845L,45846L,45847L, +45848L,45849L,45850L,45851L,45852L,45853L,45854L,45855L,45856L,45857L, +45858L,45859L,45860L,45861L,45862L,45863L,45864L,45865L,45866L,45867L, +45868L,45869L,45870L,45871L,45872L,45873L,45874L,45875L,45876L,45877L, +45878L,45879L,45880L,45881L,45882L,45883L,45884L,45885L,45886L,45887L, +45888L,45889L,45890L,45891L,45892L,45893L,45894L,45895L,45896L,45897L, +45898L,45899L,45900L,45901L,45902L,45903L,45904L,45905L,45906L,45907L, +45908L,45909L,45910L,45911L,45912L,45913L,45914L,45915L,45916L,45917L, +45918L,45919L,45920L,45921L,45922L,45923L,45924L,45925L,45926L,45927L, +45928L,45929L,45930L,45931L,45932L,45933L,45934L,45935L,45936L,45937L, +45938L,45939L,45940L,45941L,45942L,45943L,45944L,45945L,45946L,45947L, +45948L,45949L,45950L,45951L,45952L,45953L,45954L,45955L,45956L,45957L, +45958L,45959L,45960L,45961L,45962L,45963L,45964L,45965L,45966L,45967L, +45968L,45969L,45970L,45971L,45972L,45973L,45974L,45975L,45976L,45977L, +45978L,45979L,45980L,45981L,45982L,45983L,45984L,45985L,45986L,45987L, +45988L,45989L,45990L,45991L,45992L,45993L,45994L,45995L,45996L,45997L, +45998L,45999L,46000L,46001L,46002L,46003L,46004L,46005L,46006L,46007L, +46008L,46009L,46010L,46011L,46012L,46013L,46014L,46015L,46016L,46017L, +46018L,46019L,46020L,46021L,46022L,46023L,46024L,46025L,46026L,46027L, +46028L,46029L,46030L,46031L,46032L,46033L,46034L,46035L,46036L,46037L, +46038L,46039L,46040L,46041L,46042L,46043L,46044L,46045L,46046L,46047L, +46048L,46049L,46050L,46051L,46052L,46053L,46054L,46055L,46056L,46057L, +46058L,46059L,46060L,46061L,46062L,46063L,46064L,46065L,46066L,46067L, +46068L,46069L,46070L,46071L,46072L,46073L,46074L,46075L,46076L,46077L, +46078L,46079L,46080L,46081L,46082L,46083L,46084L,46085L,46086L,46087L, +46088L,46089L,46090L,46091L,46092L,46093L,46094L,46095L,46096L,46097L, +46098L,46099L,46100L,46101L,46102L,46103L,46104L,46105L,46106L,46107L, +46108L,46109L,46110L,46111L,46112L,46113L,46114L,46115L,46116L,46117L, +46118L,46119L,46120L,46121L,46122L,46123L,46124L,46125L,46126L,46127L, +46128L,46129L,46130L,46131L,46132L,46133L,46134L,46135L,46136L,46137L, +46138L,46139L,46140L,46141L,46142L,46143L,46144L,46145L,46146L,46147L, +46148L,46149L,46150L,46151L,46152L,46153L,46154L,46155L,46156L,46157L, +46158L,46159L,46160L,46161L,46162L,46163L,46164L,46165L,46166L,46167L, +46168L,46169L,46170L,46171L,46172L,46173L,46174L,46175L,46176L,46177L, +46178L,46179L,46180L,46181L,46182L,46183L,46184L,46185L,46186L,46187L, +46188L,46189L,46190L,46191L,46192L,46193L,46194L,46195L,46196L,46197L, +46198L,46199L,46200L,46201L,46202L,46203L,46204L,46205L,46206L,46207L, +46208L,46209L,46210L,46211L,46212L,46213L,46214L,46215L,46216L,46217L, +46218L,46219L,46220L,46221L,46222L,46223L,46224L,46225L,46226L,46227L, +46228L,46229L,46230L,46231L,46232L,46233L,46234L,46235L,46236L,46237L, +46238L,46239L,46240L,46241L,46242L,46243L,46244L,46245L,46246L,46247L, +46248L,46249L,46250L,46251L,46252L,46253L,46254L,46255L,46256L,46257L, +46258L,46259L,46260L,46261L,46262L,46263L,46264L,46265L,46266L,46267L, +46268L,46269L,46270L,46271L,46272L,46273L,46274L,46275L,46276L,46277L, +46278L,46279L,46280L,46281L,46282L,46283L,46284L,46285L,46286L,46287L, +46288L,46289L,46290L,46291L,46292L,46293L,46294L,46295L,46296L,46297L, +46298L,46299L,46300L,46301L,46302L,46303L,46304L,46305L,46306L,46307L, +46308L,46309L,46310L,46311L,46312L,46313L,46314L,46315L,46316L,46317L, +46318L,46319L,46320L,46321L,46322L,46323L,46324L,46325L,46326L,46327L, +46328L,46329L,46330L,46331L,46332L,46333L,46334L,46335L,46336L,46337L, +46338L,46339L,46340L,46341L,46342L,46343L,46344L,46345L,46346L,46347L, +46348L,46349L,46350L,46351L,46352L,46353L,46354L,46355L,46356L,46357L, +46358L,46359L,46360L,46361L,46362L,46363L,46364L,46365L,46366L,46367L, +46368L,46369L,46370L,46371L,46372L,46373L,46374L,46375L,46376L,46377L, +46378L,46379L,46380L,46381L,46382L,46383L,46384L,46385L,46386L,46387L, +46388L,46389L,46390L,46391L,46392L,46393L,46394L,46395L,46396L,46397L, +46398L,46399L,46400L,46401L,46402L,46403L,46404L,46405L,46406L,46407L, +46408L,46409L,46410L,46411L,46412L,46413L,46414L,46415L,46416L,46417L, +46418L,46419L,46420L,46421L,46422L,46423L,46424L,46425L,46426L,46427L, +46428L,46429L,46430L,46431L,46432L,46433L,46434L,46435L,46436L,46437L, +46438L,46439L,46440L,46441L,46442L,46443L,46444L,46445L,46446L,46447L, +46448L,46449L,46450L,46451L,46452L,46453L,46454L,46455L,46456L,46457L, +46458L,46459L,46460L,46461L,46462L,46463L,46464L,46465L,46466L,46467L, +46468L,46469L,46470L,46471L,46472L,46473L,46474L,46475L,46476L,46477L, +46478L,46479L,46480L,46481L,46482L,46483L,46484L,46485L,46486L,46487L, +46488L,46489L,46490L,46491L,46492L,46493L,46494L,46495L,46496L,46497L, +46498L,46499L,46500L,46501L,46502L,46503L,46504L,46505L,46506L,46507L, +46508L,46509L,46510L,46511L,46512L,46513L,46514L,46515L,46516L,46517L, +46518L,46519L,46520L,46521L,46522L,46523L,46524L,46525L,46526L,46527L, +46528L,46529L,46530L,46531L,46532L,46533L,46534L,46535L,46536L,46537L, +46538L,46539L,46540L,46541L,46542L,46543L,46544L,46545L,46546L,46547L, +46548L,46549L,46550L,46551L,46552L,46553L,46554L,46555L,46556L,46557L, +46558L,46559L,46560L,46561L,46562L,46563L,46564L,46565L,46566L,46567L, +46568L,46569L,46570L,46571L,46572L,46573L,46574L,46575L,46576L,46577L, +46578L,46579L,46580L,46581L,46582L,46583L,46584L,46585L,46586L,46587L, +46588L,46589L,46590L,46591L,46592L,46593L,46594L,46595L,46596L,46597L, +46598L,46599L,46600L,46601L,46602L,46603L,46604L,46605L,46606L,46607L, +46608L,46609L,46610L,46611L,46612L,46613L,46614L,46615L,46616L,46617L, +46618L,46619L,46620L,46621L,46622L,46623L,46624L,46625L,46626L,46627L, +46628L,46629L,46630L,46631L,46632L,46633L,46634L,46635L,46636L,46637L, +46638L,46639L,46640L,46641L,46642L,46643L,46644L,46645L,46646L,46647L, +46648L,46649L,46650L,46651L,46652L,46653L,46654L,46655L,46656L,46657L, +46658L,46659L,46660L,46661L,46662L,46663L,46664L,46665L,46666L,46667L, +46668L,46669L,46670L,46671L,46672L,46673L,46674L,46675L,46676L,46677L, +46678L,46679L,46680L,46681L,46682L,46683L,46684L,46685L,46686L,46687L, +46688L,46689L,46690L,46691L,46692L,46693L,46694L,46695L,46696L,46697L, +46698L,46699L,46700L,46701L,46702L,46703L,46704L,46705L,46706L,46707L, +46708L,46709L,46710L,46711L,46712L,46713L,46714L,46715L,46716L,46717L, +46718L,46719L,46720L,46721L,46722L,46723L,46724L,46725L,46726L,46727L, +46728L,46729L,46730L,46731L,46732L,46733L,46734L,46735L,46736L,46737L, +46738L,46739L,46740L,46741L,46742L,46743L,46744L,46745L,46746L,46747L, +46748L,46749L,46750L,46751L,46752L,46753L,46754L,46755L,46756L,46757L, +46758L,46759L,46760L,46761L,46762L,46763L,46764L,46765L,46766L,46767L, +46768L,46769L,46770L,46771L,46772L,46773L,46774L,46775L,46776L,46777L, +46778L,46779L,46780L,46781L,46782L,46783L,46784L,46785L,46786L,46787L, +46788L,46789L,46790L,46791L,46792L,46793L,46794L,46795L,46796L,46797L, +46798L,46799L,46800L,46801L,46802L,46803L,46804L,46805L,46806L,46807L, +46808L,46809L,46810L,46811L,46812L,46813L,46814L,46815L,46816L,46817L, +46818L,46819L,46820L,46821L,46822L,46823L,46824L,46825L,46826L,46827L, +46828L,46829L,46830L,46831L,46832L,46833L,46834L,46835L,46836L,46837L, +46838L,46839L,46840L,46841L,46842L,46843L,46844L,46845L,46846L,46847L, +46848L,46849L,46850L,46851L,46852L,46853L,46854L,46855L,46856L,46857L, +46858L,46859L,46860L,46861L,46862L,46863L,46864L,46865L,46866L,46867L, +46868L,46869L,46870L,46871L,46872L,46873L,46874L,46875L,46876L,46877L, +46878L,46879L,46880L,46881L,46882L,46883L,46884L,46885L,46886L,46887L, +46888L,46889L,46890L,46891L,46892L,46893L,46894L,46895L,46896L,46897L, +46898L,46899L,46900L,46901L,46902L,46903L,46904L,46905L,46906L,46907L, +46908L,46909L,46910L,46911L,46912L,46913L,46914L,46915L,46916L,46917L, +46918L,46919L,46920L,46921L,46922L,46923L,46924L,46925L,46926L,46927L, +46928L,46929L,46930L,46931L,46932L,46933L,46934L,46935L,46936L,46937L, +46938L,46939L,46940L,46941L,46942L,46943L,46944L,46945L,46946L,46947L, +46948L,46949L,46950L,46951L,46952L,46953L,46954L,46955L,46956L,46957L, +46958L,46959L,46960L,46961L,46962L,46963L,46964L,46965L,46966L,46967L, +46968L,46969L,46970L,46971L,46972L,46973L,46974L,46975L,46976L,46977L, +46978L,46979L,46980L,46981L,46982L,46983L,46984L,46985L,46986L,46987L, +46988L,46989L,46990L,46991L,46992L,46993L,46994L,46995L,46996L,46997L, +46998L,46999L,47000L,47001L,47002L,47003L,47004L,47005L,47006L,47007L, +47008L,47009L,47010L,47011L,47012L,47013L,47014L,47015L,47016L,47017L, +47018L,47019L,47020L,47021L,47022L,47023L,47024L,47025L,47026L,47027L, +47028L,47029L,47030L,47031L,47032L,47033L,47034L,47035L,47036L,47037L, +47038L,47039L,47040L,47041L,47042L,47043L,47044L,47045L,47046L,47047L, +47048L,47049L,47050L,47051L,47052L,47053L,47054L,47055L,47056L,47057L, +47058L,47059L,47060L,47061L,47062L,47063L,47064L,47065L,47066L,47067L, +47068L,47069L,47070L,47071L,47072L,47073L,47074L,47075L,47076L,47077L, +47078L,47079L,47080L,47081L,47082L,47083L,47084L,47085L,47086L,47087L, +47088L,47089L,47090L,47091L,47092L,47093L,47094L,47095L,47096L,47097L, +47098L,47099L,47100L,47101L,47102L,47103L,47104L,47105L,47106L,47107L, +47108L,47109L,47110L,47111L,47112L,47113L,47114L,47115L,47116L,47117L, +47118L,47119L,47120L,47121L,47122L,47123L,47124L,47125L,47126L,47127L, +47128L,47129L,47130L,47131L,47132L,47133L,47134L,47135L,47136L,47137L, +47138L,47139L,47140L,47141L,47142L,47143L,47144L,47145L,47146L,47147L, +47148L,47149L,47150L,47151L,47152L,47153L,47154L,47155L,47156L,47157L, +47158L,47159L,47160L,47161L,47162L,47163L,47164L,47165L,47166L,47167L, +47168L,47169L,47170L,47171L,47172L,47173L,47174L,47175L,47176L,47177L, +47178L,47179L,47180L,47181L,47182L,47183L,47184L,47185L,47186L,47187L, +47188L,47189L,47190L,47191L,47192L,47193L,47194L,47195L,47196L,47197L, +47198L,47199L,47200L,47201L,47202L,47203L,47204L,47205L,47206L,47207L, +47208L,47209L,47210L,47211L,47212L,47213L,47214L,47215L,47216L,47217L, +47218L,47219L,47220L,47221L,47222L,47223L,47224L,47225L,47226L,47227L, +47228L,47229L,47230L,47231L,47232L,47233L,47234L,47235L,47236L,47237L, +47238L,47239L,47240L,47241L,47242L,47243L,47244L,47245L,47246L,47247L, +47248L,47249L,47250L,47251L,47252L,47253L,47254L,47255L,47256L,47257L, +47258L,47259L,47260L,47261L,47262L,47263L,47264L,47265L,47266L,47267L, +47268L,47269L,47270L,47271L,47272L,47273L,47274L,47275L,47276L,47277L, +47278L,47279L,47280L,47281L,47282L,47283L,47284L,47285L,47286L,47287L, +47288L,47289L,47290L,47291L,47292L,47293L,47294L,47295L,47296L,47297L, +47298L,47299L,47300L,47301L,47302L,47303L,47304L,47305L,47306L,47307L, +47308L,47309L,47310L,47311L,47312L,47313L,47314L,47315L,47316L,47317L, +47318L,47319L,47320L,47321L,47322L,47323L,47324L,47325L,47326L,47327L, +47328L,47329L,47330L,47331L,47332L,47333L,47334L,47335L,47336L,47337L, +47338L,47339L,47340L,47341L,47342L,47343L,47344L,47345L,47346L,47347L, +47348L,47349L,47350L,47351L,47352L,47353L,47354L,47355L,47356L,47357L, +47358L,47359L,47360L,47361L,47362L,47363L,47364L,47365L,47366L,47367L, +47368L,47369L,47370L,47371L,47372L,47373L,47374L,47375L,47376L,47377L, +47378L,47379L,47380L,47381L,47382L,47383L,47384L,47385L,47386L,47387L, +47388L,47389L,47390L,47391L,47392L,47393L,47394L,47395L,47396L,47397L, +47398L,47399L,47400L,47401L,47402L,47403L,47404L,47405L,47406L,47407L, +47408L,47409L,47410L,47411L,47412L,47413L,47414L,47415L,47416L,47417L, +47418L,47419L,47420L,47421L,47422L,47423L,47424L,47425L,47426L,47427L, +47428L,47429L,47430L,47431L,47432L,47433L,47434L,47435L,47436L,47437L, +47438L,47439L,47440L,47441L,47442L,47443L,47444L,47445L,47446L,47447L, +47448L,47449L,47450L,47451L,47452L,47453L,47454L,47455L,47456L,47457L, +47458L,47459L,47460L,47461L,47462L,47463L,47464L,47465L,47466L,47467L, +47468L,47469L,47470L,47471L,47472L,47473L,47474L,47475L,47476L,47477L, +47478L,47479L,47480L,47481L,47482L,47483L,47484L,47485L,47486L,47487L, +47488L,47489L,47490L,47491L,47492L,47493L,47494L,47495L,47496L,47497L, +47498L,47499L,47500L,47501L,47502L,47503L,47504L,47505L,47506L,47507L, +47508L,47509L,47510L,47511L,47512L,47513L,47514L,47515L,47516L,47517L, +47518L,47519L,47520L,47521L,47522L,47523L,47524L,47525L,47526L,47527L, +47528L,47529L,47530L,47531L,47532L,47533L,47534L,47535L,47536L,47537L, +47538L,47539L,47540L,47541L,47542L,47543L,47544L,47545L,47546L,47547L, +47548L,47549L,47550L,47551L,47552L,47553L,47554L,47555L,47556L,47557L, +47558L,47559L,47560L,47561L,47562L,47563L,47564L,47565L,47566L,47567L, +47568L,47569L,47570L,47571L,47572L,47573L,47574L,47575L,47576L,47577L, +47578L,47579L,47580L,47581L,47582L,47583L,47584L,47585L,47586L,47587L, +47588L,47589L,47590L,47591L,47592L,47593L,47594L,47595L,47596L,47597L, +47598L,47599L,47600L,47601L,47602L,47603L,47604L,47605L,47606L,47607L, +47608L,47609L,47610L,47611L,47612L,47613L,47614L,47615L,47616L,47617L, +47618L,47619L,47620L,47621L,47622L,47623L,47624L,47625L,47626L,47627L, +47628L,47629L,47630L,47631L,47632L,47633L,47634L,47635L,47636L,47637L, +47638L,47639L,47640L,47641L,47642L,47643L,47644L,47645L,47646L,47647L, +47648L,47649L,47650L,47651L,47652L,47653L,47654L,47655L,47656L,47657L, +47658L,47659L,47660L,47661L,47662L,47663L,47664L,47665L,47666L,47667L, +47668L,47669L,47670L,47671L,47672L,47673L,47674L,47675L,47676L,47677L, +47678L,47679L,47680L,47681L,47682L,47683L,47684L,47685L,47686L,47687L, +47688L,47689L,47690L,47691L,47692L,47693L,47694L,47695L,47696L,47697L, +47698L,47699L,47700L,47701L,47702L,47703L,47704L,47705L,47706L,47707L, +47708L,47709L,47710L,47711L,47712L,47713L,47714L,47715L,47716L,47717L, +47718L,47719L,47720L,47721L,47722L,47723L,47724L,47725L,47726L,47727L, +47728L,47729L,47730L,47731L,47732L,47733L,47734L,47735L,47736L,47737L, +47738L,47739L,47740L,47741L,47742L,47743L,47744L,47745L,47746L,47747L, +47748L,47749L,47750L,47751L,47752L,47753L,47754L,47755L,47756L,47757L, +47758L,47759L,47760L,47761L,47762L,47763L,47764L,47765L,47766L,47767L, +47768L,47769L,47770L,47771L,47772L,47773L,47774L,47775L,47776L,47777L, +47778L,47779L,47780L,47781L,47782L,47783L,47784L,47785L,47786L,47787L, +47788L,47789L,47790L,47791L,47792L,47793L,47794L,47795L,47796L,47797L, +47798L,47799L,47800L,47801L,47802L,47803L,47804L,47805L,47806L,47807L, +47808L,47809L,47810L,47811L,47812L,47813L,47814L,47815L,47816L,47817L, +47818L,47819L,47820L,47821L,47822L,47823L,47824L,47825L,47826L,47827L, +47828L,47829L,47830L,47831L,47832L,47833L,47834L,47835L,47836L,47837L, +47838L,47839L,47840L,47841L,47842L,47843L,47844L,47845L,47846L,47847L, +47848L,47849L,47850L,47851L,47852L,47853L,47854L,47855L,47856L,47857L, +47858L,47859L,47860L,47861L,47862L,47863L,47864L,47865L,47866L,47867L, +47868L,47869L,47870L,47871L,47872L,47873L,47874L,47875L,47876L,47877L, +47878L,47879L,47880L,47881L,47882L,47883L,47884L,47885L,47886L,47887L, +47888L,47889L,47890L,47891L,47892L,47893L,47894L,47895L,47896L,47897L, +47898L,47899L,47900L,47901L,47902L,47903L,47904L,47905L,47906L,47907L, +47908L,47909L,47910L,47911L,47912L,47913L,47914L,47915L,47916L,47917L, +47918L,47919L,47920L,47921L,47922L,47923L,47924L,47925L,47926L,47927L, +47928L,47929L,47930L,47931L,47932L,47933L,47934L,47935L,47936L,47937L, +47938L,47939L,47940L,47941L,47942L,47943L,47944L,47945L,47946L,47947L, +47948L,47949L,47950L,47951L,47952L,47953L,47954L,47955L,47956L,47957L, +47958L,47959L,47960L,47961L,47962L,47963L,47964L,47965L,47966L,47967L, +47968L,47969L,47970L,47971L,47972L,47973L,47974L,47975L,47976L,47977L, +47978L,47979L,47980L,47981L,47982L,47983L,47984L,47985L,47986L,47987L, +47988L,47989L,47990L,47991L,47992L,47993L,47994L,47995L,47996L,47997L, +47998L,47999L,48000L,48001L,48002L,48003L,48004L,48005L,48006L,48007L, +48008L,48009L,48010L,48011L,48012L,48013L,48014L,48015L,48016L,48017L, +48018L,48019L,48020L,48021L,48022L,48023L,48024L,48025L,48026L,48027L, +48028L,48029L,48030L,48031L,48032L,48033L,48034L,48035L,48036L,48037L, +48038L,48039L,48040L,48041L,48042L,48043L,48044L,48045L,48046L,48047L, +48048L,48049L,48050L,48051L,48052L,48053L,48054L,48055L,48056L,48057L, +48058L,48059L,48060L,48061L,48062L,48063L,48064L,48065L,48066L,48067L, +48068L,48069L,48070L,48071L,48072L,48073L,48074L,48075L,48076L,48077L, +48078L,48079L,48080L,48081L,48082L,48083L,48084L,48085L,48086L,48087L, +48088L,48089L,48090L,48091L,48092L,48093L,48094L,48095L,48096L,48097L, +48098L,48099L,48100L,48101L,48102L,48103L,48104L,48105L,48106L,48107L, +48108L,48109L,48110L,48111L,48112L,48113L,48114L,48115L,48116L,48117L, +48118L,48119L,48120L,48121L,48122L,48123L,48124L,48125L,48126L,48127L, +48128L,48129L,48130L,48131L,48132L,48133L,48134L,48135L,48136L,48137L, +48138L,48139L,48140L,48141L,48142L,48143L,48144L,48145L,48146L,48147L, +48148L,48149L,48150L,48151L,48152L,48153L,48154L,48155L,48156L,48157L, +48158L,48159L,48160L,48161L,48162L,48163L,48164L,48165L,48166L,48167L, +48168L,48169L,48170L,48171L,48172L,48173L,48174L,48175L,48176L,48177L, +48178L,48179L,48180L,48181L,48182L,48183L,48184L,48185L,48186L,48187L, +48188L,48189L,48190L,48191L,48192L,48193L,48194L,48195L,48196L,48197L, +48198L,48199L,48200L,48201L,48202L,48203L,48204L,48205L,48206L,48207L, +48208L,48209L,48210L,48211L,48212L,48213L,48214L,48215L,48216L,48217L, +48218L,48219L,48220L,48221L,48222L,48223L,48224L,48225L,48226L,48227L, +48228L,48229L,48230L,48231L,48232L,48233L,48234L,48235L,48236L,48237L, +48238L,48239L,48240L,48241L,48242L,48243L,48244L,48245L,48246L,48247L, +48248L,48249L,48250L,48251L,48252L,48253L,48254L,48255L,48256L,48257L, +48258L,48259L,48260L,48261L,48262L,48263L,48264L,48265L,48266L,48267L, +48268L,48269L,48270L,48271L,48272L,48273L,48274L,48275L,48276L,48277L, +48278L,48279L,48280L,48281L,48282L,48283L,48284L,48285L,48286L,48287L, +48288L,48289L,48290L,48291L,48292L,48293L,48294L,48295L,48296L,48297L, +48298L,48299L,48300L,48301L,48302L,48303L,48304L,48305L,48306L,48307L, +48308L,48309L,48310L,48311L,48312L,48313L,48314L,48315L,48316L,48317L, +48318L,48319L,48320L,48321L,48322L,48323L,48324L,48325L,48326L,48327L, +48328L,48329L,48330L,48331L,48332L,48333L,48334L,48335L,48336L,48337L, +48338L,48339L,48340L,48341L,48342L,48343L,48344L,48345L,48346L,48347L, +48348L,48349L,48350L,48351L,48352L,48353L,48354L,48355L,48356L,48357L, +48358L,48359L,48360L,48361L,48362L,48363L,48364L,48365L,48366L,48367L, +48368L,48369L,48370L,48371L,48372L,48373L,48374L,48375L,48376L,48377L, +48378L,48379L,48380L,48381L,48382L,48383L,48384L,48385L,48386L,48387L, +48388L,48389L,48390L,48391L,48392L,48393L,48394L,48395L,48396L,48397L, +48398L,48399L,48400L,48401L,48402L,48403L,48404L,48405L,48406L,48407L, +48408L,48409L,48410L,48411L,48412L,48413L,48414L,48415L,48416L,48417L, +48418L,48419L,48420L,48421L,48422L,48423L,48424L,48425L,48426L,48427L, +48428L,48429L,48430L,48431L,48432L,48433L,48434L,48435L,48436L,48437L, +48438L,48439L,48440L,48441L,48442L,48443L,48444L,48445L,48446L,48447L, +48448L,48449L,48450L,48451L,48452L,48453L,48454L,48455L,48456L,48457L, +48458L,48459L,48460L,48461L,48462L,48463L,48464L,48465L,48466L,48467L, +48468L,48469L,48470L,48471L,48472L,48473L,48474L,48475L,48476L,48477L, +48478L,48479L,48480L,48481L,48482L,48483L,48484L,48485L,48486L,48487L, +48488L,48489L,48490L,48491L,48492L,48493L,48494L,48495L,48496L,48497L, +48498L,48499L,48500L,48501L,48502L,48503L,48504L,48505L,48506L,48507L, +48508L,48509L,48510L,48511L,48512L,48513L,48514L,48515L,48516L,48517L, +48518L,48519L,48520L,48521L,48522L,48523L,48524L,48525L,48526L,48527L, +48528L,48529L,48530L,48531L,48532L,48533L,48534L,48535L,48536L,48537L, +48538L,48539L,48540L,48541L,48542L,48543L,48544L,48545L,48546L,48547L, +48548L,48549L,48550L,48551L,48552L,48553L,48554L,48555L,48556L,48557L, +48558L,48559L,48560L,48561L,48562L,48563L,48564L,48565L,48566L,48567L, +48568L,48569L,48570L,48571L,48572L,48573L,48574L,48575L,48576L,48577L, +48578L,48579L,48580L,48581L,48582L,48583L,48584L,48585L,48586L,48587L, +48588L,48589L,48590L,48591L,48592L,48593L,48594L,48595L,48596L,48597L, +48598L,48599L,48600L,48601L,48602L,48603L,48604L,48605L,48606L,48607L, +48608L,48609L,48610L,48611L,48612L,48613L,48614L,48615L,48616L,48617L, +48618L,48619L,48620L,48621L,48622L,48623L,48624L,48625L,48626L,48627L, +48628L,48629L,48630L,48631L,48632L,48633L,48634L,48635L,48636L,48637L, +48638L,48639L,48640L,48641L,48642L,48643L,48644L,48645L,48646L,48647L, +48648L,48649L,48650L,48651L,48652L,48653L,48654L,48655L,48656L,48657L, +48658L,48659L,48660L,48661L,48662L,48663L,48664L,48665L,48666L,48667L, +48668L,48669L,48670L,48671L,48672L,48673L,48674L,48675L,48676L,48677L, +48678L,48679L,48680L,48681L,48682L,48683L,48684L,48685L,48686L,48687L, +48688L,48689L,48690L,48691L,48692L,48693L,48694L,48695L,48696L,48697L, +48698L,48699L,48700L,48701L,48702L,48703L,48704L,48705L,48706L,48707L, +48708L,48709L,48710L,48711L,48712L,48713L,48714L,48715L,48716L,48717L, +48718L,48719L,48720L,48721L,48722L,48723L,48724L,48725L,48726L,48727L, +48728L,48729L,48730L,48731L,48732L,48733L,48734L,48735L,48736L,48737L, +48738L,48739L,48740L,48741L,48742L,48743L,48744L,48745L,48746L,48747L, +48748L,48749L,48750L,48751L,48752L,48753L,48754L,48755L,48756L,48757L, +48758L,48759L,48760L,48761L,48762L,48763L,48764L,48765L,48766L,48767L, +48768L,48769L,48770L,48771L,48772L,48773L,48774L,48775L,48776L,48777L, +48778L,48779L,48780L,48781L,48782L,48783L,48784L,48785L,48786L,48787L, +48788L,48789L,48790L,48791L,48792L,48793L,48794L,48795L,48796L,48797L, +48798L,48799L,48800L,48801L,48802L,48803L,48804L,48805L,48806L,48807L, +48808L,48809L,48810L,48811L,48812L,48813L,48814L,48815L,48816L,48817L, +48818L,48819L,48820L,48821L,48822L,48823L,48824L,48825L,48826L,48827L, +48828L,48829L,48830L,48831L,48832L,48833L,48834L,48835L,48836L,48837L, +48838L,48839L,48840L,48841L,48842L,48843L,48844L,48845L,48846L,48847L, +48848L,48849L,48850L,48851L,48852L,48853L,48854L,48855L,48856L,48857L, +48858L,48859L,48860L,48861L,48862L,48863L,48864L,48865L,48866L,48867L, +48868L,48869L,48870L,48871L,48872L,48873L,48874L,48875L,48876L,48877L, +48878L,48879L,48880L,48881L,48882L,48883L,48884L,48885L,48886L,48887L, +48888L,48889L,48890L,48891L,48892L,48893L,48894L,48895L,48896L,48897L, +48898L,48899L,48900L,48901L,48902L,48903L,48904L,48905L,48906L,48907L, +48908L,48909L,48910L,48911L,48912L,48913L,48914L,48915L,48916L,48917L, +48918L,48919L,48920L,48921L,48922L,48923L,48924L,48925L,48926L,48927L, +48928L,48929L,48930L,48931L,48932L,48933L,48934L,48935L,48936L,48937L, +48938L,48939L,48940L,48941L,48942L,48943L,48944L,48945L,48946L,48947L, +48948L,48949L,48950L,48951L,48952L,48953L,48954L,48955L,48956L,48957L, +48958L,48959L,48960L,48961L,48962L,48963L,48964L,48965L,48966L,48967L, +48968L,48969L,48970L,48971L,48972L,48973L,48974L,48975L,48976L,48977L, +48978L,48979L,48980L,48981L,48982L,48983L,48984L,48985L,48986L,48987L, +48988L,48989L,48990L,48991L,48992L,48993L,48994L,48995L,48996L,48997L, +48998L,48999L,49000L,49001L,49002L,49003L,49004L,49005L,49006L,49007L, +49008L,49009L,49010L,49011L,49012L,49013L,49014L,49015L,49016L,49017L, +49018L,49019L,49020L,49021L,49022L,49023L,49024L,49025L,49026L,49027L, +49028L,49029L,49030L,49031L,49032L,49033L,49034L,49035L,49036L,49037L, +49038L,49039L,49040L,49041L,49042L,49043L,49044L,49045L,49046L,49047L, +49048L,49049L,49050L,49051L,49052L,49053L,49054L,49055L,49056L,49057L, +49058L,49059L,49060L,49061L,49062L,49063L,49064L,49065L,49066L,49067L, +49068L,49069L,49070L,49071L,49072L,49073L,49074L,49075L,49076L,49077L, +49078L,49079L,49080L,49081L,49082L,49083L,49084L,49085L,49086L,49087L, +49088L,49089L,49090L,49091L,49092L,49093L,49094L,49095L,49096L,49097L, +49098L,49099L,49100L,49101L,49102L,49103L,49104L,49105L,49106L,49107L, +49108L,49109L,49110L,49111L,49112L,49113L,49114L,49115L,49116L,49117L, +49118L,49119L,49120L,49121L,49122L,49123L,49124L,49125L,49126L,49127L, +49128L,49129L,49130L,49131L,49132L,49133L,49134L,49135L,49136L,49137L, +49138L,49139L,49140L,49141L,49142L,49143L,49144L,49145L,49146L,49147L, +49148L,49149L,49150L,49151L,49152L,49153L,49154L,49155L,49156L,49157L, +49158L,49159L,49160L,49161L,49162L,49163L,49164L,49165L,49166L,49167L, +49168L,49169L,49170L,49171L,49172L,49173L,49174L,49175L,49176L,49177L, +49178L,49179L,49180L,49181L,49182L,49183L,49184L,49185L,49186L,49187L, +49188L,49189L,49190L,49191L,49192L,49193L,49194L,49195L,49196L,49197L, +49198L,49199L,49200L,49201L,49202L,49203L,49204L,49205L,49206L,49207L, +49208L,49209L,49210L,49211L,49212L,49213L,49214L,49215L,49216L,49217L, +49218L,49219L,49220L,49221L,49222L,49223L,49224L,49225L,49226L,49227L, +49228L,49229L,49230L,49231L,49232L,49233L,49234L,49235L,49236L,49237L, +49238L,49239L,49240L,49241L,49242L,49243L,49244L,49245L,49246L,49247L, +49248L,49249L,49250L,49251L,49252L,49253L,49254L,49255L,49256L,49257L, +49258L,49259L,49260L,49261L,49262L,49263L,49264L,49265L,49266L,49267L, +49268L,49269L,49270L,49271L,49272L,49273L,49274L,49275L,49276L,49277L, +49278L,49279L,49280L,49281L,49282L,49283L,49284L,49285L,49286L,49287L, +49288L,49289L,49290L,49291L,49292L,49293L,49294L,49295L,49296L,49297L, +49298L,49299L,49300L,49301L,49302L,49303L,49304L,49305L,49306L,49307L, +49308L,49309L,49310L,49311L,49312L,49313L,49314L,49315L,49316L,49317L, +49318L,49319L,49320L,49321L,49322L,49323L,49324L,49325L,49326L,49327L, +49328L,49329L,49330L,49331L,49332L,49333L,49334L,49335L,49336L,49337L, +49338L,49339L,49340L,49341L,49342L,49343L,49344L,49345L,49346L,49347L, +49348L,49349L,49350L,49351L,49352L,49353L,49354L,49355L,49356L,49357L, +49358L,49359L,49360L,49361L,49362L,49363L,49364L,49365L,49366L,49367L, +49368L,49369L,49370L,49371L,49372L,49373L,49374L,49375L,49376L,49377L, +49378L,49379L,49380L,49381L,49382L,49383L,49384L,49385L,49386L,49387L, +49388L,49389L,49390L,49391L,49392L,49393L,49394L,49395L,49396L,49397L, +49398L,49399L,49400L,49401L,49402L,49403L,49404L,49405L,49406L,49407L, +49408L,49409L,49410L,49411L,49412L,49413L,49414L,49415L,49416L,49417L, +49418L,49419L,49420L,49421L,49422L,49423L,49424L,49425L,49426L,49427L, +49428L,49429L,49430L,49431L,49432L,49433L,49434L,49435L,49436L,49437L, +49438L,49439L,49440L,49441L,49442L,49443L,49444L,49445L,49446L,49447L, +49448L,49449L,49450L,49451L,49452L,49453L,49454L,49455L,49456L,49457L, +49458L,49459L,49460L,49461L,49462L,49463L,49464L,49465L,49466L,49467L, +49468L,49469L,49470L,49471L,49472L,49473L,49474L,49475L,49476L,49477L, +49478L,49479L,49480L,49481L,49482L,49483L,49484L,49485L,49486L,49487L, +49488L,49489L,49490L,49491L,49492L,49493L,49494L,49495L,49496L,49497L, +49498L,49499L,49500L,49501L,49502L,49503L,49504L,49505L,49506L,49507L, +49508L,49509L,49510L,49511L,49512L,49513L,49514L,49515L,49516L,49517L, +49518L,49519L,49520L,49521L,49522L,49523L,49524L,49525L,49526L,49527L, +49528L,49529L,49530L,49531L,49532L,49533L,49534L,49535L,49536L,49537L, +49538L,49539L,49540L,49541L,49542L,49543L,49544L,49545L,49546L,49547L, +49548L,49549L,49550L,49551L,49552L,49553L,49554L,49555L,49556L,49557L, +49558L,49559L,49560L,49561L,49562L,49563L,49564L,49565L,49566L,49567L, +49568L,49569L,49570L,49571L,49572L,49573L,49574L,49575L,49576L,49577L, +49578L,49579L,49580L,49581L,49582L,49583L,49584L,49585L,49586L,49587L, +49588L,49589L,49590L,49591L,49592L,49593L,49594L,49595L,49596L,49597L, +49598L,49599L,49600L,49601L,49602L,49603L,49604L,49605L,49606L,49607L, +49608L,49609L,49610L,49611L,49612L,49613L,49614L,49615L,49616L,49617L, +49618L,49619L,49620L,49621L,49622L,49623L,49624L,49625L,49626L,49627L, +49628L,49629L,49630L,49631L,49632L,49633L,49634L,49635L,49636L,49637L, +49638L,49639L,49640L,49641L,49642L,49643L,49644L,49645L,49646L,49647L, +49648L,49649L,49650L,49651L,49652L,49653L,49654L,49655L,49656L,49657L, +49658L,49659L,49660L,49661L,49662L,49663L,49664L,49665L,49666L,49667L, +49668L,49669L,49670L,49671L,49672L,49673L,49674L,49675L,49676L,49677L, +49678L,49679L,49680L,49681L,49682L,49683L,49684L,49685L,49686L,49687L, +49688L,49689L,49690L,49691L,49692L,49693L,49694L,49695L,49696L,49697L, +49698L,49699L,49700L,49701L,49702L,49703L,49704L,49705L,49706L,49707L, +49708L,49709L,49710L,49711L,49712L,49713L,49714L,49715L,49716L,49717L, +49718L,49719L,49720L,49721L,49722L,49723L,49724L,49725L,49726L,49727L, +49728L,49729L,49730L,49731L,49732L,49733L,49734L,49735L,49736L,49737L, +49738L,49739L,49740L,49741L,49742L,49743L,49744L,49745L,49746L,49747L, +49748L,49749L,49750L,49751L,49752L,49753L,49754L,49755L,49756L,49757L, +49758L,49759L,49760L,49761L,49762L,49763L,49764L,49765L,49766L,49767L, +49768L,49769L,49770L,49771L,49772L,49773L,49774L,49775L,49776L,49777L, +49778L,49779L,49780L,49781L,49782L,49783L,49784L,49785L,49786L,49787L, +49788L,49789L,49790L,49791L,49792L,49793L,49794L,49795L,49796L,49797L, +49798L,49799L,49800L,49801L,49802L,49803L,49804L,49805L,49806L,49807L, +49808L,49809L,49810L,49811L,49812L,49813L,49814L,49815L,49816L,49817L, +49818L,49819L,49820L,49821L,49822L,49823L,49824L,49825L,49826L,49827L, +49828L,49829L,49830L,49831L,49832L,49833L,49834L,49835L,49836L,49837L, +49838L,49839L,49840L,49841L,49842L,49843L,49844L,49845L,49846L,49847L, +49848L,49849L,49850L,49851L,49852L,49853L,49854L,49855L,49856L,49857L, +49858L,49859L,49860L,49861L,49862L,49863L,49864L,49865L,49866L,49867L, +49868L,49869L,49870L,49871L,49872L,49873L,49874L,49875L,49876L,49877L, +49878L,49879L,49880L,49881L,49882L,49883L,49884L,49885L,49886L,49887L, +49888L,49889L,49890L,49891L,49892L,49893L,49894L,49895L,49896L,49897L, +49898L,49899L,49900L,49901L,49902L,49903L,49904L,49905L,49906L,49907L, +49908L,49909L,49910L,49911L,49912L,49913L,49914L,49915L,49916L,49917L, +49918L,49919L,49920L,49921L,49922L,49923L,49924L,49925L,49926L,49927L, +49928L,49929L,49930L,49931L,49932L,49933L,49934L,49935L,49936L,49937L, +49938L,49939L,49940L,49941L,49942L,49943L,49944L,49945L,49946L,49947L, +49948L,49949L,49950L,49951L,49952L,49953L,49954L,49955L,49956L,49957L, +49958L,49959L,49960L,49961L,49962L,49963L,49964L,49965L,49966L,49967L, +49968L,49969L,49970L,49971L,49972L,49973L,49974L,49975L,49976L,49977L, +49978L,49979L,49980L,49981L,49982L,49983L,49984L,49985L,49986L,49987L, +49988L,49989L,49990L,49991L,49992L,49993L,49994L,49995L,49996L,49997L, +49998L,49999L,50000L,50001L,50002L,50003L,50004L,50005L,50006L,50007L, +50008L,50009L,50010L,50011L,50012L,50013L,50014L,50015L,50016L,50017L, +50018L,50019L,50020L,50021L,50022L,50023L,50024L,50025L,50026L,50027L, +50028L,50029L,50030L,50031L,50032L,50033L,50034L,50035L,50036L,50037L, +50038L,50039L,50040L,50041L,50042L,50043L,50044L,50045L,50046L,50047L, +50048L,50049L,50050L,50051L,50052L,50053L,50054L,50055L,50056L,50057L, +50058L,50059L,50060L,50061L,50062L,50063L,50064L,50065L,50066L,50067L, +50068L,50069L,50070L,50071L,50072L,50073L,50074L,50075L,50076L,50077L, +50078L,50079L,50080L,50081L,50082L,50083L,50084L,50085L,50086L,50087L, +50088L,50089L,50090L,50091L,50092L,50093L,50094L,50095L,50096L,50097L, +50098L,50099L,50100L,50101L,50102L,50103L,50104L,50105L,50106L,50107L, +50108L,50109L,50110L,50111L,50112L,50113L,50114L,50115L,50116L,50117L, +50118L,50119L,50120L,50121L,50122L,50123L,50124L,50125L,50126L,50127L, +50128L,50129L,50130L,50131L,50132L,50133L,50134L,50135L,50136L,50137L, +50138L,50139L,50140L,50141L,50142L,50143L,50144L,50145L,50146L,50147L, +50148L,50149L,50150L,50151L,50152L,50153L,50154L,50155L,50156L,50157L, +50158L,50159L,50160L,50161L,50162L,50163L,50164L,50165L,50166L,50167L, +50168L,50169L,50170L,50171L,50172L,50173L,50174L,50175L,50176L,50177L, +50178L,50179L,50180L,50181L,50182L,50183L,50184L,50185L,50186L,50187L, +50188L,50189L,50190L,50191L,50192L,50193L,50194L,50195L,50196L,50197L, +50198L,50199L,50200L,50201L,50202L,50203L,50204L,50205L,50206L,50207L, +50208L,50209L,50210L,50211L,50212L,50213L,50214L,50215L,50216L,50217L, +50218L,50219L,50220L,50221L,50222L,50223L,50224L,50225L,50226L,50227L, +50228L,50229L,50230L,50231L,50232L,50233L,50234L,50235L,50236L,50237L, +50238L,50239L,50240L,50241L,50242L,50243L,50244L,50245L,50246L,50247L, +50248L,50249L,50250L,50251L,50252L,50253L,50254L,50255L,50256L,50257L, +50258L,50259L,50260L,50261L,50262L,50263L,50264L,50265L,50266L,50267L, +50268L,50269L,50270L,50271L,50272L,50273L,50274L,50275L,50276L,50277L, +50278L,50279L,50280L,50281L,50282L,50283L,50284L,50285L,50286L,50287L, +50288L,50289L,50290L,50291L,50292L,50293L,50294L,50295L,50296L,50297L, +50298L,50299L,50300L,50301L,50302L,50303L,50304L,50305L,50306L,50307L, +50308L,50309L,50310L,50311L,50312L,50313L,50314L,50315L,50316L,50317L, +50318L,50319L,50320L,50321L,50322L,50323L,50324L,50325L,50326L,50327L, +50328L,50329L,50330L,50331L,50332L,50333L,50334L,50335L,50336L,50337L, +50338L,50339L,50340L,50341L,50342L,50343L,50344L,50345L,50346L,50347L, +50348L,50349L,50350L,50351L,50352L,50353L,50354L,50355L,50356L,50357L, +50358L,50359L,50360L,50361L,50362L,50363L,50364L,50365L,50366L,50367L, +50368L,50369L,50370L,50371L,50372L,50373L,50374L,50375L,50376L,50377L, +50378L,50379L,50380L,50381L,50382L,50383L,50384L,50385L,50386L,50387L, +50388L,50389L,50390L,50391L,50392L,50393L,50394L,50395L,50396L,50397L, +50398L,50399L,50400L,50401L,50402L,50403L,50404L,50405L,50406L,50407L, +50408L,50409L,50410L,50411L,50412L,50413L,50414L,50415L,50416L,50417L, +50418L,50419L,50420L,50421L,50422L,50423L,50424L,50425L,50426L,50427L, +50428L,50429L,50430L,50431L,50432L,50433L,50434L,50435L,50436L,50437L, +50438L,50439L,50440L,50441L,50442L,50443L,50444L,50445L,50446L,50447L, +50448L,50449L,50450L,50451L,50452L,50453L,50454L,50455L,50456L,50457L, +50458L,50459L,50460L,50461L,50462L,50463L,50464L,50465L,50466L,50467L, +50468L,50469L,50470L,50471L,50472L,50473L,50474L,50475L,50476L,50477L, +50478L,50479L,50480L,50481L,50482L,50483L,50484L,50485L,50486L,50487L, +50488L,50489L,50490L,50491L,50492L,50493L,50494L,50495L,50496L,50497L, +50498L,50499L,50500L,50501L,50502L,50503L,50504L,50505L,50506L,50507L, +50508L,50509L,50510L,50511L,50512L,50513L,50514L,50515L,50516L,50517L, +50518L,50519L,50520L,50521L,50522L,50523L,50524L,50525L,50526L,50527L, +50528L,50529L,50530L,50531L,50532L,50533L,50534L,50535L,50536L,50537L, +50538L,50539L,50540L,50541L,50542L,50543L,50544L,50545L,50546L,50547L, +50548L,50549L,50550L,50551L,50552L,50553L,50554L,50555L,50556L,50557L, +50558L,50559L,50560L,50561L,50562L,50563L,50564L,50565L,50566L,50567L, +50568L,50569L,50570L,50571L,50572L,50573L,50574L,50575L,50576L,50577L, +50578L,50579L,50580L,50581L,50582L,50583L,50584L,50585L,50586L,50587L, +50588L,50589L,50590L,50591L,50592L,50593L,50594L,50595L,50596L,50597L, +50598L,50599L,50600L,50601L,50602L,50603L,50604L,50605L,50606L,50607L, +50608L,50609L,50610L,50611L,50612L,50613L,50614L,50615L,50616L,50617L, +50618L,50619L,50620L,50621L,50622L,50623L,50624L,50625L,50626L,50627L, +50628L,50629L,50630L,50631L,50632L,50633L,50634L,50635L,50636L,50637L, +50638L,50639L,50640L,50641L,50642L,50643L,50644L,50645L,50646L,50647L, +50648L,50649L,50650L,50651L,50652L,50653L,50654L,50655L,50656L,50657L, +50658L,50659L,50660L,50661L,50662L,50663L,50664L,50665L,50666L,50667L, +50668L,50669L,50670L,50671L,50672L,50673L,50674L,50675L,50676L,50677L, +50678L,50679L,50680L,50681L,50682L,50683L,50684L,50685L,50686L,50687L, +50688L,50689L,50690L,50691L,50692L,50693L,50694L,50695L,50696L,50697L, +50698L,50699L,50700L,50701L,50702L,50703L,50704L,50705L,50706L,50707L, +50708L,50709L,50710L,50711L,50712L,50713L,50714L,50715L,50716L,50717L, +50718L,50719L,50720L,50721L,50722L,50723L,50724L,50725L,50726L,50727L, +50728L,50729L,50730L,50731L,50732L,50733L,50734L,50735L,50736L,50737L, +50738L,50739L,50740L,50741L,50742L,50743L,50744L,50745L,50746L,50747L, +50748L,50749L,50750L,50751L,50752L,50753L,50754L,50755L,50756L,50757L, +50758L,50759L,50760L,50761L,50762L,50763L,50764L,50765L,50766L,50767L, +50768L,50769L,50770L,50771L,50772L,50773L,50774L,50775L,50776L,50777L, +50778L,50779L,50780L,50781L,50782L,50783L,50784L,50785L,50786L,50787L, +50788L,50789L,50790L,50791L,50792L,50793L,50794L,50795L,50796L,50797L, +50798L,50799L,50800L,50801L,50802L,50803L,50804L,50805L,50806L,50807L, +50808L,50809L,50810L,50811L,50812L,50813L,50814L,50815L,50816L,50817L, +50818L,50819L,50820L,50821L,50822L,50823L,50824L,50825L,50826L,50827L, +50828L,50829L,50830L,50831L,50832L,50833L,50834L,50835L,50836L,50837L, +50838L,50839L,50840L,50841L,50842L,50843L,50844L,50845L,50846L,50847L, +50848L,50849L,50850L,50851L,50852L,50853L,50854L,50855L,50856L,50857L, +50858L,50859L,50860L,50861L,50862L,50863L,50864L,50865L,50866L,50867L, +50868L,50869L,50870L,50871L,50872L,50873L,50874L,50875L,50876L,50877L, +50878L,50879L,50880L,50881L,50882L,50883L,50884L,50885L,50886L,50887L, +50888L,50889L,50890L,50891L,50892L,50893L,50894L,50895L,50896L,50897L, +50898L,50899L,50900L,50901L,50902L,50903L,50904L,50905L,50906L,50907L, +50908L,50909L,50910L,50911L,50912L,50913L,50914L,50915L,50916L,50917L, +50918L,50919L,50920L,50921L,50922L,50923L,50924L,50925L,50926L,50927L, +50928L,50929L,50930L,50931L,50932L,50933L,50934L,50935L,50936L,50937L, +50938L,50939L,50940L,50941L,50942L,50943L,50944L,50945L,50946L,50947L, +50948L,50949L,50950L,50951L,50952L,50953L,50954L,50955L,50956L,50957L, +50958L,50959L,50960L,50961L,50962L,50963L,50964L,50965L,50966L,50967L, +50968L,50969L,50970L,50971L,50972L,50973L,50974L,50975L,50976L,50977L, +50978L,50979L,50980L,50981L,50982L,50983L,50984L,50985L,50986L,50987L, +50988L,50989L,50990L,50991L,50992L,50993L,50994L,50995L,50996L,50997L, +50998L,50999L,51000L,51001L,51002L,51003L,51004L,51005L,51006L,51007L, +51008L,51009L,51010L,51011L,51012L,51013L,51014L,51015L,51016L,51017L, +51018L,51019L,51020L,51021L,51022L,51023L,51024L,51025L,51026L,51027L, +51028L,51029L,51030L,51031L,51032L,51033L,51034L,51035L,51036L,51037L, +51038L,51039L,51040L,51041L,51042L,51043L,51044L,51045L,51046L,51047L, +51048L,51049L,51050L,51051L,51052L,51053L,51054L,51055L,51056L,51057L, +51058L,51059L,51060L,51061L,51062L,51063L,51064L,51065L,51066L,51067L, +51068L,51069L,51070L,51071L,51072L,51073L,51074L,51075L,51076L,51077L, +51078L,51079L,51080L,51081L,51082L,51083L,51084L,51085L,51086L,51087L, +51088L,51089L,51090L,51091L,51092L,51093L,51094L,51095L,51096L,51097L, +51098L,51099L,51100L,51101L,51102L,51103L,51104L,51105L,51106L,51107L, +51108L,51109L,51110L,51111L,51112L,51113L,51114L,51115L,51116L,51117L, +51118L,51119L,51120L,51121L,51122L,51123L,51124L,51125L,51126L,51127L, +51128L,51129L,51130L,51131L,51132L,51133L,51134L,51135L,51136L,51137L, +51138L,51139L,51140L,51141L,51142L,51143L,51144L,51145L,51146L,51147L, +51148L,51149L,51150L,51151L,51152L,51153L,51154L,51155L,51156L,51157L, +51158L,51159L,51160L,51161L,51162L,51163L,51164L,51165L,51166L,51167L, +51168L,51169L,51170L,51171L,51172L,51173L,51174L,51175L,51176L,51177L, +51178L,51179L,51180L,51181L,51182L,51183L,51184L,51185L,51186L,51187L, +51188L,51189L,51190L,51191L,51192L,51193L,51194L,51195L,51196L,51197L, +51198L,51199L,51200L,51201L,51202L,51203L,51204L,51205L,51206L,51207L, +51208L,51209L,51210L,51211L,51212L,51213L,51214L,51215L,51216L,51217L, +51218L,51219L,51220L,51221L,51222L,51223L,51224L,51225L,51226L,51227L, +51228L,51229L,51230L,51231L,51232L,51233L,51234L,51235L,51236L,51237L, +51238L,51239L,51240L,51241L,51242L,51243L,51244L,51245L,51246L,51247L, +51248L,51249L,51250L,51251L,51252L,51253L,51254L,51255L,51256L,51257L, +51258L,51259L,51260L,51261L,51262L,51263L,51264L,51265L,51266L,51267L, +51268L,51269L,51270L,51271L,51272L,51273L,51274L,51275L,51276L,51277L, +51278L,51279L,51280L,51281L,51282L,51283L,51284L,51285L,51286L,51287L, +51288L,51289L,51290L,51291L,51292L,51293L,51294L,51295L,51296L,51297L, +51298L,51299L,51300L,51301L,51302L,51303L,51304L,51305L,51306L,51307L, +51308L,51309L,51310L,51311L,51312L,51313L,51314L,51315L,51316L,51317L, +51318L,51319L,51320L,51321L,51322L,51323L,51324L,51325L,51326L,51327L, +51328L,51329L,51330L,51331L,51332L,51333L,51334L,51335L,51336L,51337L, +51338L,51339L,51340L,51341L,51342L,51343L,51344L,51345L,51346L,51347L, +51348L,51349L,51350L,51351L,51352L,51353L,51354L,51355L,51356L,51357L, +51358L,51359L,51360L,51361L,51362L,51363L,51364L,51365L,51366L,51367L, +51368L,51369L,51370L,51371L,51372L,51373L,51374L,51375L,51376L,51377L, +51378L,51379L,51380L,51381L,51382L,51383L,51384L,51385L,51386L,51387L, +51388L,51389L,51390L,51391L,51392L,51393L,51394L,51395L,51396L,51397L, +51398L,51399L,51400L,51401L,51402L,51403L,51404L,51405L,51406L,51407L, +51408L,51409L,51410L,51411L,51412L,51413L,51414L,51415L,51416L,51417L, +51418L,51419L,51420L,51421L,51422L,51423L,51424L,51425L,51426L,51427L, +51428L,51429L,51430L,51431L,51432L,51433L,51434L,51435L,51436L,51437L, +51438L,51439L,51440L,51441L,51442L,51443L,51444L,51445L,51446L,51447L, +51448L,51449L,51450L,51451L,51452L,51453L,51454L,51455L,51456L,51457L, +51458L,51459L,51460L,51461L,51462L,51463L,51464L,51465L,51466L,51467L, +51468L,51469L,51470L,51471L,51472L,51473L,51474L,51475L,51476L,51477L, +51478L,51479L,51480L,51481L,51482L,51483L,51484L,51485L,51486L,51487L, +51488L,51489L,51490L,51491L,51492L,51493L,51494L,51495L,51496L,51497L, +51498L,51499L,51500L,51501L,51502L,51503L,51504L,51505L,51506L,51507L, +51508L,51509L,51510L,51511L,51512L,51513L,51514L,51515L,51516L,51517L, +51518L,51519L,51520L,51521L,51522L,51523L,51524L,51525L,51526L,51527L, +51528L,51529L,51530L,51531L,51532L,51533L,51534L,51535L,51536L,51537L, +51538L,51539L,51540L,51541L,51542L,51543L,51544L,51545L,51546L,51547L, +51548L,51549L,51550L,51551L,51552L,51553L,51554L,51555L,51556L,51557L, +51558L,51559L,51560L,51561L,51562L,51563L,51564L,51565L,51566L,51567L, +51568L,51569L,51570L,51571L,51572L,51573L,51574L,51575L,51576L,51577L, +51578L,51579L,51580L,51581L,51582L,51583L,51584L,51585L,51586L,51587L, +51588L,51589L,51590L,51591L,51592L,51593L,51594L,51595L,51596L,51597L, +51598L,51599L,51600L,51601L,51602L,51603L,51604L,51605L,51606L,51607L, +51608L,51609L,51610L,51611L,51612L,51613L,51614L,51615L,51616L,51617L, +51618L,51619L,51620L,51621L,51622L,51623L,51624L,51625L,51626L,51627L, +51628L,51629L,51630L,51631L,51632L,51633L,51634L,51635L,51636L,51637L, +51638L,51639L,51640L,51641L,51642L,51643L,51644L,51645L,51646L,51647L, +51648L,51649L,51650L,51651L,51652L,51653L,51654L,51655L,51656L,51657L, +51658L,51659L,51660L,51661L,51662L,51663L,51664L,51665L,51666L,51667L, +51668L,51669L,51670L,51671L,51672L,51673L,51674L,51675L,51676L,51677L, +51678L,51679L,51680L,51681L,51682L,51683L,51684L,51685L,51686L,51687L, +51688L,51689L,51690L,51691L,51692L,51693L,51694L,51695L,51696L,51697L, +51698L,51699L,51700L,51701L,51702L,51703L,51704L,51705L,51706L,51707L, +51708L,51709L,51710L,51711L,51712L,51713L,51714L,51715L,51716L,51717L, +51718L,51719L,51720L,51721L,51722L,51723L,51724L,51725L,51726L,51727L, +51728L,51729L,51730L,51731L,51732L,51733L,51734L,51735L,51736L,51737L, +51738L,51739L,51740L,51741L,51742L,51743L,51744L,51745L,51746L,51747L, +51748L,51749L,51750L,51751L,51752L,51753L,51754L,51755L,51756L,51757L, +51758L,51759L,51760L,51761L,51762L,51763L,51764L,51765L,51766L,51767L, +51768L,51769L,51770L,51771L,51772L,51773L,51774L,51775L,51776L,51777L, +51778L,51779L,51780L,51781L,51782L,51783L,51784L,51785L,51786L,51787L, +51788L,51789L,51790L,51791L,51792L,51793L,51794L,51795L,51796L,51797L, +51798L,51799L,51800L,51801L,51802L,51803L,51804L,51805L,51806L,51807L, +51808L,51809L,51810L,51811L,51812L,51813L,51814L,51815L,51816L,51817L, +51818L,51819L,51820L,51821L,51822L,51823L,51824L,51825L,51826L,51827L, +51828L,51829L,51830L,51831L,51832L,51833L,51834L,51835L,51836L,51837L, +51838L,51839L,51840L,51841L,51842L,51843L,51844L,51845L,51846L,51847L, +51848L,51849L,51850L,51851L,51852L,51853L,51854L,51855L,51856L,51857L, +51858L,51859L,51860L,51861L,51862L,51863L,51864L,51865L,51866L,51867L, +51868L,51869L,51870L,51871L,51872L,51873L,51874L,51875L,51876L,51877L, +51878L,51879L,51880L,51881L,51882L,51883L,51884L,51885L,51886L,51887L, +51888L,51889L,51890L,51891L,51892L,51893L,51894L,51895L,51896L,51897L, +51898L,51899L,51900L,51901L,51902L,51903L,51904L,51905L,51906L,51907L, +51908L,51909L,51910L,51911L,51912L,51913L,51914L,51915L,51916L,51917L, +51918L,51919L,51920L,51921L,51922L,51923L,51924L,51925L,51926L,51927L, +51928L,51929L,51930L,51931L,51932L,51933L,51934L,51935L,51936L,51937L, +51938L,51939L,51940L,51941L,51942L,51943L,51944L,51945L,51946L,51947L, +51948L,51949L,51950L,51951L,51952L,51953L,51954L,51955L,51956L,51957L, +51958L,51959L,51960L,51961L,51962L,51963L,51964L,51965L,51966L,51967L, +51968L,51969L,51970L,51971L,51972L,51973L,51974L,51975L,51976L,51977L, +51978L,51979L,51980L,51981L,51982L,51983L,51984L,51985L,51986L,51987L, +51988L,51989L,51990L,51991L,51992L,51993L,51994L,51995L,51996L,51997L, +51998L,51999L,52000L,52001L,52002L,52003L,52004L,52005L,52006L,52007L, +52008L,52009L,52010L,52011L,52012L,52013L,52014L,52015L,52016L,52017L, +52018L,52019L,52020L,52021L,52022L,52023L,52024L,52025L,52026L,52027L, +52028L,52029L,52030L,52031L,52032L,52033L,52034L,52035L,52036L,52037L, +52038L,52039L,52040L,52041L,52042L,52043L,52044L,52045L,52046L,52047L, +52048L,52049L,52050L,52051L,52052L,52053L,52054L,52055L,52056L,52057L, +52058L,52059L,52060L,52061L,52062L,52063L,52064L,52065L,52066L,52067L, +52068L,52069L,52070L,52071L,52072L,52073L,52074L,52075L,52076L,52077L, +52078L,52079L,52080L,52081L,52082L,52083L,52084L,52085L,52086L,52087L, +52088L,52089L,52090L,52091L,52092L,52093L,52094L,52095L,52096L,52097L, +52098L,52099L,52100L,52101L,52102L,52103L,52104L,52105L,52106L,52107L, +52108L,52109L,52110L,52111L,52112L,52113L,52114L,52115L,52116L,52117L, +52118L,52119L,52120L,52121L,52122L,52123L,52124L,52125L,52126L,52127L, +52128L,52129L,52130L,52131L,52132L,52133L,52134L,52135L,52136L,52137L, +52138L,52139L,52140L,52141L,52142L,52143L,52144L,52145L,52146L,52147L, +52148L,52149L,52150L,52151L,52152L,52153L,52154L,52155L,52156L,52157L, +52158L,52159L,52160L,52161L,52162L,52163L,52164L,52165L,52166L,52167L, +52168L,52169L,52170L,52171L,52172L,52173L,52174L,52175L,52176L,52177L, +52178L,52179L,52180L,52181L,52182L,52183L,52184L,52185L,52186L,52187L, +52188L,52189L,52190L,52191L,52192L,52193L,52194L,52195L,52196L,52197L, +52198L,52199L,52200L,52201L,52202L,52203L,52204L,52205L,52206L,52207L, +52208L,52209L,52210L,52211L,52212L,52213L,52214L,52215L,52216L,52217L, +52218L,52219L,52220L,52221L,52222L,52223L,52224L,52225L,52226L,52227L, +52228L,52229L,52230L,52231L,52232L,52233L,52234L,52235L,52236L,52237L, +52238L,52239L,52240L,52241L,52242L,52243L,52244L,52245L,52246L,52247L, +52248L,52249L,52250L,52251L,52252L,52253L,52254L,52255L,52256L,52257L, +52258L,52259L,52260L,52261L,52262L,52263L,52264L,52265L,52266L,52267L, +52268L,52269L,52270L,52271L,52272L,52273L,52274L,52275L,52276L,52277L, +52278L,52279L,52280L,52281L,52282L,52283L,52284L,52285L,52286L,52287L, +52288L,52289L,52290L,52291L,52292L,52293L,52294L,52295L,52296L,52297L, +52298L,52299L,52300L,52301L,52302L,52303L,52304L,52305L,52306L,52307L, +52308L,52309L,52310L,52311L,52312L,52313L,52314L,52315L,52316L,52317L, +52318L,52319L,52320L,52321L,52322L,52323L,52324L,52325L,52326L,52327L, +52328L,52329L,52330L,52331L,52332L,52333L,52334L,52335L,52336L,52337L, +52338L,52339L,52340L,52341L,52342L,52343L,52344L,52345L,52346L,52347L, +52348L,52349L,52350L,52351L,52352L,52353L,52354L,52355L,52356L,52357L, +52358L,52359L,52360L,52361L,52362L,52363L,52364L,52365L,52366L,52367L, +52368L,52369L,52370L,52371L,52372L,52373L,52374L,52375L,52376L,52377L, +52378L,52379L,52380L,52381L,52382L,52383L,52384L,52385L,52386L,52387L, +52388L,52389L,52390L,52391L,52392L,52393L,52394L,52395L,52396L,52397L, +52398L,52399L,52400L,52401L,52402L,52403L,52404L,52405L,52406L,52407L, +52408L,52409L,52410L,52411L,52412L,52413L,52414L,52415L,52416L,52417L, +52418L,52419L,52420L,52421L,52422L,52423L,52424L,52425L,52426L,52427L, +52428L,52429L,52430L,52431L,52432L,52433L,52434L,52435L,52436L,52437L, +52438L,52439L,52440L,52441L,52442L,52443L,52444L,52445L,52446L,52447L, +52448L,52449L,52450L,52451L,52452L,52453L,52454L,52455L,52456L,52457L, +52458L,52459L,52460L,52461L,52462L,52463L,52464L,52465L,52466L,52467L, +52468L,52469L,52470L,52471L,52472L,52473L,52474L,52475L,52476L,52477L, +52478L,52479L,52480L,52481L,52482L,52483L,52484L,52485L,52486L,52487L, +52488L,52489L,52490L,52491L,52492L,52493L,52494L,52495L,52496L,52497L, +52498L,52499L,52500L,52501L,52502L,52503L,52504L,52505L,52506L,52507L, +52508L,52509L,52510L,52511L,52512L,52513L,52514L,52515L,52516L,52517L, +52518L,52519L,52520L,52521L,52522L,52523L,52524L,52525L,52526L,52527L, +52528L,52529L,52530L,52531L,52532L,52533L,52534L,52535L,52536L,52537L, +52538L,52539L,52540L,52541L,52542L,52543L,52544L,52545L,52546L,52547L, +52548L,52549L,52550L,52551L,52552L,52553L,52554L,52555L,52556L,52557L, +52558L,52559L,52560L,52561L,52562L,52563L,52564L,52565L,52566L,52567L, +52568L,52569L,52570L,52571L,52572L,52573L,52574L,52575L,52576L,52577L, +52578L,52579L,52580L,52581L,52582L,52583L,52584L,52585L,52586L,52587L, +52588L,52589L,52590L,52591L,52592L,52593L,52594L,52595L,52596L,52597L, +52598L,52599L,52600L,52601L,52602L,52603L,52604L,52605L,52606L,52607L, +52608L,52609L,52610L,52611L,52612L,52613L,52614L,52615L,52616L,52617L, +52618L,52619L,52620L,52621L,52622L,52623L,52624L,52625L,52626L,52627L, +52628L,52629L,52630L,52631L,52632L,52633L,52634L,52635L,52636L,52637L, +52638L,52639L,52640L,52641L,52642L,52643L,52644L,52645L,52646L,52647L, +52648L,52649L,52650L,52651L,52652L,52653L,52654L,52655L,52656L,52657L, +52658L,52659L,52660L,52661L,52662L,52663L,52664L,52665L,52666L,52667L, +52668L,52669L,52670L,52671L,52672L,52673L,52674L,52675L,52676L,52677L, +52678L,52679L,52680L,52681L,52682L,52683L,52684L,52685L,52686L,52687L, +52688L,52689L,52690L,52691L,52692L,52693L,52694L,52695L,52696L,52697L, +52698L,52699L,52700L,52701L,52702L,52703L,52704L,52705L,52706L,52707L, +52708L,52709L,52710L,52711L,52712L,52713L,52714L,52715L,52716L,52717L, +52718L,52719L,52720L,52721L,52722L,52723L,52724L,52725L,52726L,52727L, +52728L,52729L,52730L,52731L,52732L,52733L,52734L,52735L,52736L,52737L, +52738L,52739L,52740L,52741L,52742L,52743L,52744L,52745L,52746L,52747L, +52748L,52749L,52750L,52751L,52752L,52753L,52754L,52755L,52756L,52757L, +52758L,52759L,52760L,52761L,52762L,52763L,52764L,52765L,52766L,52767L, +52768L,52769L,52770L,52771L,52772L,52773L,52774L,52775L,52776L,52777L, +52778L,52779L,52780L,52781L,52782L,52783L,52784L,52785L,52786L,52787L, +52788L,52789L,52790L,52791L,52792L,52793L,52794L,52795L,52796L,52797L, +52798L,52799L,52800L,52801L,52802L,52803L,52804L,52805L,52806L,52807L, +52808L,52809L,52810L,52811L,52812L,52813L,52814L,52815L,52816L,52817L, +52818L,52819L,52820L,52821L,52822L,52823L,52824L,52825L,52826L,52827L, +52828L,52829L,52830L,52831L,52832L,52833L,52834L,52835L,52836L,52837L, +52838L,52839L,52840L,52841L,52842L,52843L,52844L,52845L,52846L,52847L, +52848L,52849L,52850L,52851L,52852L,52853L,52854L,52855L,52856L,52857L, +52858L,52859L,52860L,52861L,52862L,52863L,52864L,52865L,52866L,52867L, +52868L,52869L,52870L,52871L,52872L,52873L,52874L,52875L,52876L,52877L, +52878L,52879L,52880L,52881L,52882L,52883L,52884L,52885L,52886L,52887L, +52888L,52889L,52890L,52891L,52892L,52893L,52894L,52895L,52896L,52897L, +52898L,52899L,52900L,52901L,52902L,52903L,52904L,52905L,52906L,52907L, +52908L,52909L,52910L,52911L,52912L,52913L,52914L,52915L,52916L,52917L, +52918L,52919L,52920L,52921L,52922L,52923L,52924L,52925L,52926L,52927L, +52928L,52929L,52930L,52931L,52932L,52933L,52934L,52935L,52936L,52937L, +52938L,52939L,52940L,52941L,52942L,52943L,52944L,52945L,52946L,52947L, +52948L,52949L,52950L,52951L,52952L,52953L,52954L,52955L,52956L,52957L, +52958L,52959L,52960L,52961L,52962L,52963L,52964L,52965L,52966L,52967L, +52968L,52969L,52970L,52971L,52972L,52973L,52974L,52975L,52976L,52977L, +52978L,52979L,52980L,52981L,52982L,52983L,52984L,52985L,52986L,52987L, +52988L,52989L,52990L,52991L,52992L,52993L,52994L,52995L,52996L,52997L, +52998L,52999L,53000L,53001L,53002L,53003L,53004L,53005L,53006L,53007L, +53008L,53009L,53010L,53011L,53012L,53013L,53014L,53015L,53016L,53017L, +53018L,53019L,53020L,53021L,53022L,53023L,53024L,53025L,53026L,53027L, +53028L,53029L,53030L,53031L,53032L,53033L,53034L,53035L,53036L,53037L, +53038L,53039L,53040L,53041L,53042L,53043L,53044L,53045L,53046L,53047L, +53048L,53049L,53050L,53051L,53052L,53053L,53054L,53055L,53056L,53057L, +53058L,53059L,53060L,53061L,53062L,53063L,53064L,53065L,53066L,53067L, +53068L,53069L,53070L,53071L,53072L,53073L,53074L,53075L,53076L,53077L, +53078L,53079L,53080L,53081L,53082L,53083L,53084L,53085L,53086L,53087L, +53088L,53089L,53090L,53091L,53092L,53093L,53094L,53095L,53096L,53097L, +53098L,53099L,53100L,53101L,53102L,53103L,53104L,53105L,53106L,53107L, +53108L,53109L,53110L,53111L,53112L,53113L,53114L,53115L,53116L,53117L, +53118L,53119L,53120L,53121L,53122L,53123L,53124L,53125L,53126L,53127L, +53128L,53129L,53130L,53131L,53132L,53133L,53134L,53135L,53136L,53137L, +53138L,53139L,53140L,53141L,53142L,53143L,53144L,53145L,53146L,53147L, +53148L,53149L,53150L,53151L,53152L,53153L,53154L,53155L,53156L,53157L, +53158L,53159L,53160L,53161L,53162L,53163L,53164L,53165L,53166L,53167L, +53168L,53169L,53170L,53171L,53172L,53173L,53174L,53175L,53176L,53177L, +53178L,53179L,53180L,53181L,53182L,53183L,53184L,53185L,53186L,53187L, +53188L,53189L,53190L,53191L,53192L,53193L,53194L,53195L,53196L,53197L, +53198L,53199L,53200L,53201L,53202L,53203L,53204L,53205L,53206L,53207L, +53208L,53209L,53210L,53211L,53212L,53213L,53214L,53215L,53216L,53217L, +53218L,53219L,53220L,53221L,53222L,53223L,53224L,53225L,53226L,53227L, +53228L,53229L,53230L,53231L,53232L,53233L,53234L,53235L,53236L,53237L, +53238L,53239L,53240L,53241L,53242L,53243L,53244L,53245L,53246L,53247L, +53248L,53249L,53250L,53251L,53252L,53253L,53254L,53255L,53256L,53257L, +53258L,53259L,53260L,53261L,53262L,53263L,53264L,53265L,53266L,53267L, +53268L,53269L,53270L,53271L,53272L,53273L,53274L,53275L,53276L,53277L, +53278L,53279L,53280L,53281L,53282L,53283L,53284L,53285L,53286L,53287L, +53288L,53289L,53290L,53291L,53292L,53293L,53294L,53295L,53296L,53297L, +53298L,53299L,53300L,53301L,53302L,53303L,53304L,53305L,53306L,53307L, +53308L,53309L,53310L,53311L,53312L,53313L,53314L,53315L,53316L,53317L, +53318L,53319L,53320L,53321L,53322L,53323L,53324L,53325L,53326L,53327L, +53328L,53329L,53330L,53331L,53332L,53333L,53334L,53335L,53336L,53337L, +53338L,53339L,53340L,53341L,53342L,53343L,53344L,53345L,53346L,53347L, +53348L,53349L,53350L,53351L,53352L,53353L,53354L,53355L,53356L,53357L, +53358L,53359L,53360L,53361L,53362L,53363L,53364L,53365L,53366L,53367L, +53368L,53369L,53370L,53371L,53372L,53373L,53374L,53375L,53376L,53377L, +53378L,53379L,53380L,53381L,53382L,53383L,53384L,53385L,53386L,53387L, +53388L,53389L,53390L,53391L,53392L,53393L,53394L,53395L,53396L,53397L, +53398L,53399L,53400L,53401L,53402L,53403L,53404L,53405L,53406L,53407L, +53408L,53409L,53410L,53411L,53412L,53413L,53414L,53415L,53416L,53417L, +53418L,53419L,53420L,53421L,53422L,53423L,53424L,53425L,53426L,53427L, +53428L,53429L,53430L,53431L,53432L,53433L,53434L,53435L,53436L,53437L, +53438L,53439L,53440L,53441L,53442L,53443L,53444L,53445L,53446L,53447L, +53448L,53449L,53450L,53451L,53452L,53453L,53454L,53455L,53456L,53457L, +53458L,53459L,53460L,53461L,53462L,53463L,53464L,53465L,53466L,53467L, +53468L,53469L,53470L,53471L,53472L,53473L,53474L,53475L,53476L,53477L, +53478L,53479L,53480L,53481L,53482L,53483L,53484L,53485L,53486L,53487L, +53488L,53489L,53490L,53491L,53492L,53493L,53494L,53495L,53496L,53497L, +53498L,53499L,53500L,53501L,53502L,53503L,53504L,53505L,53506L,53507L, +53508L,53509L,53510L,53511L,53512L,53513L,53514L,53515L,53516L,53517L, +53518L,53519L,53520L,53521L,53522L,53523L,53524L,53525L,53526L,53527L, +53528L,53529L,53530L,53531L,53532L,53533L,53534L,53535L,53536L,53537L, +53538L,53539L,53540L,53541L,53542L,53543L,53544L,53545L,53546L,53547L, +53548L,53549L,53550L,53551L,53552L,53553L,53554L,53555L,53556L,53557L, +53558L,53559L,53560L,53561L,53562L,53563L,53564L,53565L,53566L,53567L, +53568L,53569L,53570L,53571L,53572L,53573L,53574L,53575L,53576L,53577L, +53578L,53579L,53580L,53581L,53582L,53583L,53584L,53585L,53586L,53587L, +53588L,53589L,53590L,53591L,53592L,53593L,53594L,53595L,53596L,53597L, +53598L,53599L,53600L,53601L,53602L,53603L,53604L,53605L,53606L,53607L, +53608L,53609L,53610L,53611L,53612L,53613L,53614L,53615L,53616L,53617L, +53618L,53619L,53620L,53621L,53622L,53623L,53624L,53625L,53626L,53627L, +53628L,53629L,53630L,53631L,53632L,53633L,53634L,53635L,53636L,53637L, +53638L,53639L,53640L,53641L,53642L,53643L,53644L,53645L,53646L,53647L, +53648L,53649L,53650L,53651L,53652L,53653L,53654L,53655L,53656L,53657L, +53658L,53659L,53660L,53661L,53662L,53663L,53664L,53665L,53666L,53667L, +53668L,53669L,53670L,53671L,53672L,53673L,53674L,53675L,53676L,53677L, +53678L,53679L,53680L,53681L,53682L,53683L,53684L,53685L,53686L,53687L, +53688L,53689L,53690L,53691L,53692L,53693L,53694L,53695L,53696L,53697L, +53698L,53699L,53700L,53701L,53702L,53703L,53704L,53705L,53706L,53707L, +53708L,53709L,53710L,53711L,53712L,53713L,53714L,53715L,53716L,53717L, +53718L,53719L,53720L,53721L,53722L,53723L,53724L,53725L,53726L,53727L, +53728L,53729L,53730L,53731L,53732L,53733L,53734L,53735L,53736L,53737L, +53738L,53739L,53740L,53741L,53742L,53743L,53744L,53745L,53746L,53747L, +53748L,53749L,53750L,53751L,53752L,53753L,53754L,53755L,53756L,53757L, +53758L,53759L,53760L,53761L,53762L,53763L,53764L,53765L,53766L,53767L, +53768L,53769L,53770L,53771L,53772L,53773L,53774L,53775L,53776L,53777L, +53778L,53779L,53780L,53781L,53782L,53783L,53784L,53785L,53786L,53787L, +53788L,53789L,53790L,53791L,53792L,53793L,53794L,53795L,53796L,53797L, +53798L,53799L,53800L,53801L,53802L,53803L,53804L,53805L,53806L,53807L, +53808L,53809L,53810L,53811L,53812L,53813L,53814L,53815L,53816L,53817L, +53818L,53819L,53820L,53821L,53822L,53823L,53824L,53825L,53826L,53827L, +53828L,53829L,53830L,53831L,53832L,53833L,53834L,53835L,53836L,53837L, +53838L,53839L,53840L,53841L,53842L,53843L,53844L,53845L,53846L,53847L, +53848L,53849L,53850L,53851L,53852L,53853L,53854L,53855L,53856L,53857L, +53858L,53859L,53860L,53861L,53862L,53863L,53864L,53865L,53866L,53867L, +53868L,53869L,53870L,53871L,53872L,53873L,53874L,53875L,53876L,53877L, +53878L,53879L,53880L,53881L,53882L,53883L,53884L,53885L,53886L,53887L, +53888L,53889L,53890L,53891L,53892L,53893L,53894L,53895L,53896L,53897L, +53898L,53899L,53900L,53901L,53902L,53903L,53904L,53905L,53906L,53907L, +53908L,53909L,53910L,53911L,53912L,53913L,53914L,53915L,53916L,53917L, +53918L,53919L,53920L,53921L,53922L,53923L,53924L,53925L,53926L,53927L, +53928L,53929L,53930L,53931L,53932L,53933L,53934L,53935L,53936L,53937L, +53938L,53939L,53940L,53941L,53942L,53943L,53944L,53945L,53946L,53947L, +53948L,53949L,53950L,53951L,53952L,53953L,53954L,53955L,53956L,53957L, +53958L,53959L,53960L,53961L,53962L,53963L,53964L,53965L,53966L,53967L, +53968L,53969L,53970L,53971L,53972L,53973L,53974L,53975L,53976L,53977L, +53978L,53979L,53980L,53981L,53982L,53983L,53984L,53985L,53986L,53987L, +53988L,53989L,53990L,53991L,53992L,53993L,53994L,53995L,53996L,53997L, +53998L,53999L,54000L,54001L,54002L,54003L,54004L,54005L,54006L,54007L, +54008L,54009L,54010L,54011L,54012L,54013L,54014L,54015L,54016L,54017L, +54018L,54019L,54020L,54021L,54022L,54023L,54024L,54025L,54026L,54027L, +54028L,54029L,54030L,54031L,54032L,54033L,54034L,54035L,54036L,54037L, +54038L,54039L,54040L,54041L,54042L,54043L,54044L,54045L,54046L,54047L, +54048L,54049L,54050L,54051L,54052L,54053L,54054L,54055L,54056L,54057L, +54058L,54059L,54060L,54061L,54062L,54063L,54064L,54065L,54066L,54067L, +54068L,54069L,54070L,54071L,54072L,54073L,54074L,54075L,54076L,54077L, +54078L,54079L,54080L,54081L,54082L,54083L,54084L,54085L,54086L,54087L, +54088L,54089L,54090L,54091L,54092L,54093L,54094L,54095L,54096L,54097L, +54098L,54099L,54100L,54101L,54102L,54103L,54104L,54105L,54106L,54107L, +54108L,54109L,54110L,54111L,54112L,54113L,54114L,54115L,54116L,54117L, +54118L,54119L,54120L,54121L,54122L,54123L,54124L,54125L,54126L,54127L, +54128L,54129L,54130L,54131L,54132L,54133L,54134L,54135L,54136L,54137L, +54138L,54139L,54140L,54141L,54142L,54143L,54144L,54145L,54146L,54147L, +54148L,54149L,54150L,54151L,54152L,54153L,54154L,54155L,54156L,54157L, +54158L,54159L,54160L,54161L,54162L,54163L,54164L,54165L,54166L,54167L, +54168L,54169L,54170L,54171L,54172L,54173L,54174L,54175L,54176L,54177L, +54178L,54179L,54180L,54181L,54182L,54183L,54184L,54185L,54186L,54187L, +54188L,54189L,54190L,54191L,54192L,54193L,54194L,54195L,54196L,54197L, +54198L,54199L,54200L,54201L,54202L,54203L,54204L,54205L,54206L,54207L, +54208L,54209L,54210L,54211L,54212L,54213L,54214L,54215L,54216L,54217L, +54218L,54219L,54220L,54221L,54222L,54223L,54224L,54225L,54226L,54227L, +54228L,54229L,54230L,54231L,54232L,54233L,54234L,54235L,54236L,54237L, +54238L,54239L,54240L,54241L,54242L,54243L,54244L,54245L,54246L,54247L, +54248L,54249L,54250L,54251L,54252L,54253L,54254L,54255L,54256L,54257L, +54258L,54259L,54260L,54261L,54262L,54263L,54264L,54265L,54266L,54267L, +54268L,54269L,54270L,54271L,54272L,54273L,54274L,54275L,54276L,54277L, +54278L,54279L,54280L,54281L,54282L,54283L,54284L,54285L,54286L,54287L, +54288L,54289L,54290L,54291L,54292L,54293L,54294L,54295L,54296L,54297L, +54298L,54299L,54300L,54301L,54302L,54303L,54304L,54305L,54306L,54307L, +54308L,54309L,54310L,54311L,54312L,54313L,54314L,54315L,54316L,54317L, +54318L,54319L,54320L,54321L,54322L,54323L,54324L,54325L,54326L,54327L, +54328L,54329L,54330L,54331L,54332L,54333L,54334L,54335L,54336L,54337L, +54338L,54339L,54340L,54341L,54342L,54343L,54344L,54345L,54346L,54347L, +54348L,54349L,54350L,54351L,54352L,54353L,54354L,54355L,54356L,54357L, +54358L,54359L,54360L,54361L,54362L,54363L,54364L,54365L,54366L,54367L, +54368L,54369L,54370L,54371L,54372L,54373L,54374L,54375L,54376L,54377L, +54378L,54379L,54380L,54381L,54382L,54383L,54384L,54385L,54386L,54387L, +54388L,54389L,54390L,54391L,54392L,54393L,54394L,54395L,54396L,54397L, +54398L,54399L,54400L,54401L,54402L,54403L,54404L,54405L,54406L,54407L, +54408L,54409L,54410L,54411L,54412L,54413L,54414L,54415L,54416L,54417L, +54418L,54419L,54420L,54421L,54422L,54423L,54424L,54425L,54426L,54427L, +54428L,54429L,54430L,54431L,54432L,54433L,54434L,54435L,54436L,54437L, +54438L,54439L,54440L,54441L,54442L,54443L,54444L,54445L,54446L,54447L, +54448L,54449L,54450L,54451L,54452L,54453L,54454L,54455L,54456L,54457L, +54458L,54459L,54460L,54461L,54462L,54463L,54464L,54465L,54466L,54467L, +54468L,54469L,54470L,54471L,54472L,54473L,54474L,54475L,54476L,54477L, +54478L,54479L,54480L,54481L,54482L,54483L,54484L,54485L,54486L,54487L, +54488L,54489L,54490L,54491L,54492L,54493L,54494L,54495L,54496L,54497L, +54498L,54499L,54500L,54501L,54502L,54503L,54504L,54505L,54506L,54507L, +54508L,54509L,54510L,54511L,54512L,54513L,54514L,54515L,54516L,54517L, +54518L,54519L,54520L,54521L,54522L,54523L,54524L,54525L,54526L,54527L, +54528L,54529L,54530L,54531L,54532L,54533L,54534L,54535L,54536L,54537L, +54538L,54539L,54540L,54541L,54542L,54543L,54544L,54545L,54546L,54547L, +54548L,54549L,54550L,54551L,54552L,54553L,54554L,54555L,54556L,54557L, +54558L,54559L,54560L,54561L,54562L,54563L,54564L,54565L,54566L,54567L, +54568L,54569L,54570L,54571L,54572L,54573L,54574L,54575L,54576L,54577L, +54578L,54579L,54580L,54581L,54582L,54583L,54584L,54585L,54586L,54587L, +54588L,54589L,54590L,54591L,54592L,54593L,54594L,54595L,54596L,54597L, +54598L,54599L,54600L,54601L,54602L,54603L,54604L,54605L,54606L,54607L, +54608L,54609L,54610L,54611L,54612L,54613L,54614L,54615L,54616L,54617L, +54618L,54619L,54620L,54621L,54622L,54623L,54624L,54625L,54626L,54627L, +54628L,54629L,54630L,54631L,54632L,54633L,54634L,54635L,54636L,54637L, +54638L,54639L,54640L,54641L,54642L,54643L,54644L,54645L,54646L,54647L, +54648L,54649L,54650L,54651L,54652L,54653L,54654L,54655L,54656L,54657L, +54658L,54659L,54660L,54661L,54662L,54663L,54664L,54665L,54666L,54667L, +54668L,54669L,54670L,54671L,54672L,54673L,54674L,54675L,54676L,54677L, +54678L,54679L,54680L,54681L,54682L,54683L,54684L,54685L,54686L,54687L, +54688L,54689L,54690L,54691L,54692L,54693L,54694L,54695L,54696L,54697L, +54698L,54699L,54700L,54701L,54702L,54703L,54704L,54705L,54706L,54707L, +54708L,54709L,54710L,54711L,54712L,54713L,54714L,54715L,54716L,54717L, +54718L,54719L,54720L,54721L,54722L,54723L,54724L,54725L,54726L,54727L, +54728L,54729L,54730L,54731L,54732L,54733L,54734L,54735L,54736L,54737L, +54738L,54739L,54740L,54741L,54742L,54743L,54744L,54745L,54746L,54747L, +54748L,54749L,54750L,54751L,54752L,54753L,54754L,54755L,54756L,54757L, +54758L,54759L,54760L,54761L,54762L,54763L,54764L,54765L,54766L,54767L, +54768L,54769L,54770L,54771L,54772L,54773L,54774L,54775L,54776L,54777L, +54778L,54779L,54780L,54781L,54782L,54783L,54784L,54785L,54786L,54787L, +54788L,54789L,54790L,54791L,54792L,54793L,54794L,54795L,54796L,54797L, +54798L,54799L,54800L,54801L,54802L,54803L,54804L,54805L,54806L,54807L, +54808L,54809L,54810L,54811L,54812L,54813L,54814L,54815L,54816L,54817L, +54818L,54819L,54820L,54821L,54822L,54823L,54824L,54825L,54826L,54827L, +54828L,54829L,54830L,54831L,54832L,54833L,54834L,54835L,54836L,54837L, +54838L,54839L,54840L,54841L,54842L,54843L,54844L,54845L,54846L,54847L, +54848L,54849L,54850L,54851L,54852L,54853L,54854L,54855L,54856L,54857L, +54858L,54859L,54860L,54861L,54862L,54863L,54864L,54865L,54866L,54867L, +54868L,54869L,54870L,54871L,54872L,54873L,54874L,54875L,54876L,54877L, +54878L,54879L,54880L,54881L,54882L,54883L,54884L,54885L,54886L,54887L, +54888L,54889L,54890L,54891L,54892L,54893L,54894L,54895L,54896L,54897L, +54898L,54899L,54900L,54901L,54902L,54903L,54904L,54905L,54906L,54907L, +54908L,54909L,54910L,54911L,54912L,54913L,54914L,54915L,54916L,54917L, +54918L,54919L,54920L,54921L,54922L,54923L,54924L,54925L,54926L,54927L, +54928L,54929L,54930L,54931L,54932L,54933L,54934L,54935L,54936L,54937L, +54938L,54939L,54940L,54941L,54942L,54943L,54944L,54945L,54946L,54947L, +54948L,54949L,54950L,54951L,54952L,54953L,54954L,54955L,54956L,54957L, +54958L,54959L,54960L,54961L,54962L,54963L,54964L,54965L,54966L,54967L, +54968L,54969L,54970L,54971L,54972L,54973L,54974L,54975L,54976L,54977L, +54978L,54979L,54980L,54981L,54982L,54983L,54984L,54985L,54986L,54987L, +54988L,54989L,54990L,54991L,54992L,54993L,54994L,54995L,54996L,54997L, +54998L,54999L,55000L,55001L,55002L,55003L,55004L,55005L,55006L,55007L, +55008L,55009L,55010L,55011L,55012L,55013L,55014L,55015L,55016L,55017L, +55018L,55019L,55020L,55021L,55022L,55023L,55024L,55025L,55026L,55027L, +55028L,55029L,55030L,55031L,55032L,55033L,55034L,55035L,55036L,55037L, +55038L,55039L,55040L,55041L,55042L,55043L,55044L,55045L,55046L,55047L, +55048L,55049L,55050L,55051L,55052L,55053L,55054L,55055L,55056L,55057L, +55058L,55059L,55060L,55061L,55062L,55063L,55064L,55065L,55066L,55067L, +55068L,55069L,55070L,55071L,55072L,55073L,55074L,55075L,55076L,55077L, +55078L,55079L,55080L,55081L,55082L,55083L,55084L,55085L,55086L,55087L, +55088L,55089L,55090L,55091L,55092L,55093L,55094L,55095L,55096L,55097L, +55098L,55099L,55100L,55101L,55102L,55103L,55104L,55105L,55106L,55107L, +55108L,55109L,55110L,55111L,55112L,55113L,55114L,55115L,55116L,55117L, +55118L,55119L,55120L,55121L,55122L,55123L,55124L,55125L,55126L,55127L, +55128L,55129L,55130L,55131L,55132L,55133L,55134L,55135L,55136L,55137L, +55138L,55139L,55140L,55141L,55142L,55143L,55144L,55145L,55146L,55147L, +55148L,55149L,55150L,55151L,55152L,55153L,55154L,55155L,55156L,55157L, +55158L,55159L,55160L,55161L,55162L,55163L,55164L,55165L,55166L,55167L, +55168L,55169L,55170L,55171L,55172L,55173L,55174L,55175L,55176L,55177L, +55178L,55179L,55180L,55181L,55182L,55183L,55184L,55185L,55186L,55187L, +55188L,55189L,55190L,55191L,55192L,55193L,55194L,55195L,55196L,55197L, +55198L,55199L,55200L,55201L,55202L,55203L,55204L,55205L,55206L,55207L, +55208L,55209L,55210L,55211L,55212L,55213L,55214L,55215L,55216L,55217L, +55218L,55219L,55220L,55221L,55222L,55223L,55224L,55225L,55226L,55227L, +55228L,55229L,55230L,55231L,55232L,55233L,55234L,55235L,55236L,55237L, +55238L,55239L,55240L,55241L,55242L,55243L,55244L,55245L,55246L,55247L, +55248L,55249L,55250L,55251L,55252L,55253L,55254L,55255L,55256L,55257L, +55258L,55259L,55260L,55261L,55262L,55263L,55264L,55265L,55266L,55267L, +55268L,55269L,55270L,55271L,55272L,55273L,55274L,55275L,55276L,55277L, +55278L,55279L,55280L,55281L,55282L,55283L,55284L,55285L,55286L,55287L, +55288L,55289L,55290L,55291L,55292L,55293L,55294L,55295L,55296L,55297L, +55298L,55299L,55300L,55301L,55302L,55303L,55304L,55305L,55306L,55307L, +55308L,55309L,55310L,55311L,55312L,55313L,55314L,55315L,55316L,55317L, +55318L,55319L,55320L,55321L,55322L,55323L,55324L,55325L,55326L,55327L, +55328L,55329L,55330L,55331L,55332L,55333L,55334L,55335L,55336L,55337L, +55338L,55339L,55340L,55341L,55342L,55343L,55344L,55345L,55346L,55347L, +55348L,55349L,55350L,55351L,55352L,55353L,55354L,55355L,55356L,55357L, +55358L,55359L,55360L,55361L,55362L,55363L,55364L,55365L,55366L,55367L, +55368L,55369L,55370L,55371L,55372L,55373L,55374L,55375L,55376L,55377L, +55378L,55379L,55380L,55381L,55382L,55383L,55384L,55385L,55386L,55387L, +55388L,55389L,55390L,55391L,55392L,55393L,55394L,55395L,55396L,55397L, +55398L,55399L,55400L,55401L,55402L,55403L,55404L,55405L,55406L,55407L, +55408L,55409L,55410L,55411L,55412L,55413L,55414L,55415L,55416L,55417L, +55418L,55419L,55420L,55421L,55422L,55423L,55424L,55425L,55426L,55427L, +55428L,55429L,55430L,55431L,55432L,55433L,55434L,55435L,55436L,55437L, +55438L,55439L,55440L,55441L,55442L,55443L,55444L,55445L,55446L,55447L, +55448L,55449L,55450L,55451L,55452L,55453L,55454L,55455L,55456L,55457L, +55458L,55459L,55460L,55461L,55462L,55463L,55464L,55465L,55466L,55467L, +55468L,55469L,55470L,55471L,55472L,55473L,55474L,55475L,55476L,55477L, +55478L,55479L,55480L,55481L,55482L,55483L,55484L,55485L,55486L,55487L, +55488L,55489L,55490L,55491L,55492L,55493L,55494L,55495L,55496L,55497L, +55498L,55499L,55500L,55501L,55502L,55503L,55504L,55505L,55506L,55507L, +55508L,55509L,55510L,55511L,55512L,55513L,55514L,55515L,55516L,55517L, +55518L,55519L,55520L,55521L,55522L,55523L,55524L,55525L,55526L,55527L, +55528L,55529L,55530L,55531L,55532L,55533L,55534L,55535L,55536L,55537L, +55538L,55539L,55540L,55541L,55542L,55543L,55544L,55545L,55546L,55547L, +55548L,55549L,55550L,55551L,55552L,55553L,55554L,55555L,55556L,55557L, +55558L,55559L,55560L,55561L,55562L,55563L,55564L,55565L,55566L,55567L, +55568L,55569L,55570L,55571L,55572L,55573L,55574L,55575L,55576L,55577L, +55578L,55579L,55580L,55581L,55582L,55583L,55584L,55585L,55586L,55587L, +55588L,55589L,55590L,55591L,55592L,55593L,55594L,55595L,55596L,55597L, +55598L,55599L,55600L,55601L,55602L,55603L,55604L,55605L,55606L,55607L, +55608L,55609L,55610L,55611L,55612L,55613L,55614L,55615L,55616L,55617L, +55618L,55619L,55620L,55621L,55622L,55623L,55624L,55625L,55626L,55627L, +55628L,55629L,55630L,55631L,55632L,55633L,55634L,55635L,55636L,55637L, +55638L,55639L,55640L,55641L,55642L,55643L,55644L,55645L,55646L,55647L, +55648L,55649L,55650L,55651L,55652L,55653L,55654L,55655L,55656L,55657L, +55658L,55659L,55660L,55661L,55662L,55663L,55664L,55665L,55666L,55667L, +55668L,55669L,55670L,55671L,55672L,55673L,55674L,55675L,55676L,55677L, +55678L,55679L,55680L,55681L,55682L,55683L,55684L,55685L,55686L,55687L, +55688L,55689L,55690L,55691L,55692L,55693L,55694L,55695L,55696L,55697L, +55698L,55699L,55700L,55701L,55702L,55703L,55704L,55705L,55706L,55707L, +55708L,55709L,55710L,55711L,55712L,55713L,55714L,55715L,55716L,55717L, +55718L,55719L,55720L,55721L,55722L,55723L,55724L,55725L,55726L,55727L, +55728L,55729L,55730L,55731L,55732L,55733L,55734L,55735L,55736L,55737L, +55738L,55739L,55740L,55741L,55742L,55743L,55744L,55745L,55746L,55747L, +55748L,55749L,55750L,55751L,55752L,55753L,55754L,55755L,55756L,55757L, +55758L,55759L,55760L,55761L,55762L,55763L,55764L,55765L,55766L,55767L, +55768L,55769L,55770L,55771L,55772L,55773L,55774L,55775L,55776L,55777L, +55778L,55779L,55780L,55781L,55782L,55783L,55784L,55785L,55786L,55787L, +55788L,55789L,55790L,55791L,55792L,55793L,55794L,55795L,55796L,55797L, +55798L,55799L,55800L,55801L,55802L,55803L,55804L,55805L,55806L,55807L, +55808L,55809L,55810L,55811L,55812L,55813L,55814L,55815L,55816L,55817L, +55818L,55819L,55820L,55821L,55822L,55823L,55824L,55825L,55826L,55827L, +55828L,55829L,55830L,55831L,55832L,55833L,55834L,55835L,55836L,55837L, +55838L,55839L,55840L,55841L,55842L,55843L,55844L,55845L,55846L,55847L, +55848L,55849L,55850L,55851L,55852L,55853L,55854L,55855L,55856L,55857L, +55858L,55859L,55860L,55861L,55862L,55863L,55864L,55865L,55866L,55867L, +55868L,55869L,55870L,55871L,55872L,55873L,55874L,55875L,55876L,55877L, +55878L,55879L,55880L,55881L,55882L,55883L,55884L,55885L,55886L,55887L, +55888L,55889L,55890L,55891L,55892L,55893L,55894L,55895L,55896L,55897L, +55898L,55899L,55900L,55901L,55902L,55903L,55904L,55905L,55906L,55907L, +55908L,55909L,55910L,55911L,55912L,55913L,55914L,55915L,55916L,55917L, +55918L,55919L,55920L,55921L,55922L,55923L,55924L,55925L,55926L,55927L, +55928L,55929L,55930L,55931L,55932L,55933L,55934L,55935L,55936L,55937L, +55938L,55939L,55940L,55941L,55942L,55943L,55944L,55945L,55946L,55947L, +55948L,55949L,55950L,55951L,55952L,55953L,55954L,55955L,55956L,55957L, +55958L,55959L,55960L,55961L,55962L,55963L,55964L,55965L,55966L,55967L, +55968L,55969L,55970L,55971L,55972L,55973L,55974L,55975L,55976L,55977L, +55978L,55979L,55980L,55981L,55982L,55983L,55984L,55985L,55986L,55987L, +55988L,55989L,55990L,55991L,55992L,55993L,55994L,55995L,55996L,55997L, +55998L,55999L,56000L,56001L,56002L,56003L,56004L,56005L,56006L,56007L, +56008L,56009L,56010L,56011L,56012L,56013L,56014L,56015L,56016L,56017L, +56018L,56019L,56020L,56021L,56022L,56023L,56024L,56025L,56026L,56027L, +56028L,56029L,56030L,56031L,56032L,56033L,56034L,56035L,56036L,56037L, +56038L,56039L,56040L,56041L,56042L,56043L,56044L,56045L,56046L,56047L, +56048L,56049L,56050L,56051L,56052L,56053L,56054L,56055L,56056L,56057L, +56058L,56059L,56060L,56061L,56062L,56063L,56064L,56065L,56066L,56067L, +56068L,56069L,56070L,56071L,56072L,56073L,56074L,56075L,56076L,56077L, +56078L,56079L,56080L,56081L,56082L,56083L,56084L,56085L,56086L,56087L, +56088L,56089L,56090L,56091L,56092L,56093L,56094L,56095L,56096L,56097L, +56098L,56099L,56100L,56101L,56102L,56103L,56104L,56105L,56106L,56107L, +56108L,56109L,56110L,56111L,56112L,56113L,56114L,56115L,56116L,56117L, +56118L,56119L,56120L,56121L,56122L,56123L,56124L,56125L,56126L,56127L, +56128L,56129L,56130L,56131L,56132L,56133L,56134L,56135L,56136L,56137L, +56138L,56139L,56140L,56141L,56142L,56143L,56144L,56145L,56146L,56147L, +56148L,56149L,56150L,56151L,56152L,56153L,56154L,56155L,56156L,56157L, +56158L,56159L,56160L,56161L,56162L,56163L,56164L,56165L,56166L,56167L, +56168L,56169L,56170L,56171L,56172L,56173L,56174L,56175L,56176L,56177L, +56178L,56179L,56180L,56181L,56182L,56183L,56184L,56185L,56186L,56187L, +56188L,56189L,56190L,56191L,56192L,56193L,56194L,56195L,56196L,56197L, +56198L,56199L,56200L,56201L,56202L,56203L,56204L,56205L,56206L,56207L, +56208L,56209L,56210L,56211L,56212L,56213L,56214L,56215L,56216L,56217L, +56218L,56219L,56220L,56221L,56222L,56223L,56224L,56225L,56226L,56227L, +56228L,56229L,56230L,56231L,56232L,56233L,56234L,56235L,56236L,56237L, +56238L,56239L,56240L,56241L,56242L,56243L,56244L,56245L,56246L,56247L, +56248L,56249L,56250L,56251L,56252L,56253L,56254L,56255L,56256L,56257L, +56258L,56259L,56260L,56261L,56262L,56263L,56264L,56265L,56266L,56267L, +56268L,56269L,56270L,56271L,56272L,56273L,56274L,56275L,56276L,56277L, +56278L,56279L,56280L,56281L,56282L,56283L,56284L,56285L,56286L,56287L, +56288L,56289L,56290L,56291L,56292L,56293L,56294L,56295L,56296L,56297L, +56298L,56299L,56300L,56301L,56302L,56303L,56304L,56305L,56306L,56307L, +56308L,56309L,56310L,56311L,56312L,56313L,56314L,56315L,56316L,56317L, +56318L,56319L,56320L,56321L,56322L,56323L,56324L,56325L,56326L,56327L, +56328L,56329L,56330L,56331L,56332L,56333L,56334L,56335L,56336L,56337L, +56338L,56339L,56340L,56341L,56342L,56343L,56344L,56345L,56346L,56347L, +56348L,56349L,56350L,56351L,56352L,56353L,56354L,56355L,56356L,56357L, +56358L,56359L,56360L,56361L,56362L,56363L,56364L,56365L,56366L,56367L, +56368L,56369L,56370L,56371L,56372L,56373L,56374L,56375L,56376L,56377L, +56378L,56379L,56380L,56381L,56382L,56383L,56384L,56385L,56386L,56387L, +56388L,56389L,56390L,56391L,56392L,56393L,56394L,56395L,56396L,56397L, +56398L,56399L,56400L,56401L,56402L,56403L,56404L,56405L,56406L,56407L, +56408L,56409L,56410L,56411L,56412L,56413L,56414L,56415L,56416L,56417L, +56418L,56419L,56420L,56421L,56422L,56423L,56424L,56425L,56426L,56427L, +56428L,56429L,56430L,56431L,56432L,56433L,56434L,56435L,56436L,56437L, +56438L,56439L,56440L,56441L,56442L,56443L,56444L,56445L,56446L,56447L, +56448L,56449L,56450L,56451L,56452L,56453L,56454L,56455L,56456L,56457L, +56458L,56459L,56460L,56461L,56462L,56463L,56464L,56465L,56466L,56467L, +56468L,56469L,56470L,56471L,56472L,56473L,56474L,56475L,56476L,56477L, +56478L,56479L,56480L,56481L,56482L,56483L,56484L,56485L,56486L,56487L, +56488L,56489L,56490L,56491L,56492L,56493L,56494L,56495L,56496L,56497L, +56498L,56499L,56500L,56501L,56502L,56503L,56504L,56505L,56506L,56507L, +56508L,56509L,56510L,56511L,56512L,56513L,56514L,56515L,56516L,56517L, +56518L,56519L,56520L,56521L,56522L,56523L,56524L,56525L,56526L,56527L, +56528L,56529L,56530L,56531L,56532L,56533L,56534L,56535L,56536L,56537L, +56538L,56539L,56540L,56541L,56542L,56543L,56544L,56545L,56546L,56547L, +56548L,56549L,56550L,56551L,56552L,56553L,56554L,56555L,56556L,56557L, +56558L,56559L,56560L,56561L,56562L,56563L,56564L,56565L,56566L,56567L, +56568L,56569L,56570L,56571L,56572L,56573L,56574L,56575L,56576L,56577L, +56578L,56579L,56580L,56581L,56582L,56583L,56584L,56585L,56586L,56587L, +56588L,56589L,56590L,56591L,56592L,56593L,56594L,56595L,56596L,56597L, +56598L,56599L,56600L,56601L,56602L,56603L,56604L,56605L,56606L,56607L, +56608L,56609L,56610L,56611L,56612L,56613L,56614L,56615L,56616L,56617L, +56618L,56619L,56620L,56621L,56622L,56623L,56624L,56625L,56626L,56627L, +56628L,56629L,56630L,56631L,56632L,56633L,56634L,56635L,56636L,56637L, +56638L,56639L,56640L,56641L,56642L,56643L,56644L,56645L,56646L,56647L, +56648L,56649L,56650L,56651L,56652L,56653L,56654L,56655L,56656L,56657L, +56658L,56659L,56660L,56661L,56662L,56663L,56664L,56665L,56666L,56667L, +56668L,56669L,56670L,56671L,56672L,56673L,56674L,56675L,56676L,56677L, +56678L,56679L,56680L,56681L,56682L,56683L,56684L,56685L,56686L,56687L, +56688L,56689L,56690L,56691L,56692L,56693L,56694L,56695L,56696L,56697L, +56698L,56699L,56700L,56701L,56702L,56703L,56704L,56705L,56706L,56707L, +56708L,56709L,56710L,56711L,56712L,56713L,56714L,56715L,56716L,56717L, +56718L,56719L,56720L,56721L,56722L,56723L,56724L,56725L,56726L,56727L, +56728L,56729L,56730L,56731L,56732L,56733L,56734L,56735L,56736L,56737L, +56738L,56739L,56740L,56741L,56742L,56743L,56744L,56745L,56746L,56747L, +56748L,56749L,56750L,56751L,56752L,56753L,56754L,56755L,56756L,56757L, +56758L,56759L,56760L,56761L,56762L,56763L,56764L,56765L,56766L,56767L, +56768L,56769L,56770L,56771L,56772L,56773L,56774L,56775L,56776L,56777L, +56778L,56779L,56780L,56781L,56782L,56783L,56784L,56785L,56786L,56787L, +56788L,56789L,56790L,56791L,56792L,56793L,56794L,56795L,56796L,56797L, +56798L,56799L,56800L,56801L,56802L,56803L,56804L,56805L,56806L,56807L, +56808L,56809L,56810L,56811L,56812L,56813L,56814L,56815L,56816L,56817L, +56818L,56819L,56820L,56821L,56822L,56823L,56824L,56825L,56826L,56827L, +56828L,56829L,56830L,56831L,56832L,56833L,56834L,56835L,56836L,56837L, +56838L,56839L,56840L,56841L,56842L,56843L,56844L,56845L,56846L,56847L, +56848L,56849L,56850L,56851L,56852L,56853L,56854L,56855L,56856L,56857L, +56858L,56859L,56860L,56861L,56862L,56863L,56864L,56865L,56866L,56867L, +56868L,56869L,56870L,56871L,56872L,56873L,56874L,56875L,56876L,56877L, +56878L,56879L,56880L,56881L,56882L,56883L,56884L,56885L,56886L,56887L, +56888L,56889L,56890L,56891L,56892L,56893L,56894L,56895L,56896L,56897L, +56898L,56899L,56900L,56901L,56902L,56903L,56904L,56905L,56906L,56907L, +56908L,56909L,56910L,56911L,56912L,56913L,56914L,56915L,56916L,56917L, +56918L,56919L,56920L,56921L,56922L,56923L,56924L,56925L,56926L,56927L, +56928L,56929L,56930L,56931L,56932L,56933L,56934L,56935L,56936L,56937L, +56938L,56939L,56940L,56941L,56942L,56943L,56944L,56945L,56946L,56947L, +56948L,56949L,56950L,56951L,56952L,56953L,56954L,56955L,56956L,56957L, +56958L,56959L,56960L,56961L,56962L,56963L,56964L,56965L,56966L,56967L, +56968L,56969L,56970L,56971L,56972L,56973L,56974L,56975L,56976L,56977L, +56978L,56979L,56980L,56981L,56982L,56983L,56984L,56985L,56986L,56987L, +56988L,56989L,56990L,56991L,56992L,56993L,56994L,56995L,56996L,56997L, +56998L,56999L,57000L,57001L,57002L,57003L,57004L,57005L,57006L,57007L, +57008L,57009L,57010L,57011L,57012L,57013L,57014L,57015L,57016L,57017L, +57018L,57019L,57020L,57021L,57022L,57023L,57024L,57025L,57026L,57027L, +57028L,57029L,57030L,57031L,57032L,57033L,57034L,57035L,57036L,57037L, +57038L,57039L,57040L,57041L,57042L,57043L,57044L,57045L,57046L,57047L, +57048L,57049L,57050L,57051L,57052L,57053L,57054L,57055L,57056L,57057L, +57058L,57059L,57060L,57061L,57062L,57063L,57064L,57065L,57066L,57067L, +57068L,57069L,57070L,57071L,57072L,57073L,57074L,57075L,57076L,57077L, +57078L,57079L,57080L,57081L,57082L,57083L,57084L,57085L,57086L,57087L, +57088L,57089L,57090L,57091L,57092L,57093L,57094L,57095L,57096L,57097L, +57098L,57099L,57100L,57101L,57102L,57103L,57104L,57105L,57106L,57107L, +57108L,57109L,57110L,57111L,57112L,57113L,57114L,57115L,57116L,57117L, +57118L,57119L,57120L,57121L,57122L,57123L,57124L,57125L,57126L,57127L, +57128L,57129L,57130L,57131L,57132L,57133L,57134L,57135L,57136L,57137L, +57138L,57139L,57140L,57141L,57142L,57143L,57144L,57145L,57146L,57147L, +57148L,57149L,57150L,57151L,57152L,57153L,57154L,57155L,57156L,57157L, +57158L,57159L,57160L,57161L,57162L,57163L,57164L,57165L,57166L,57167L, +57168L,57169L,57170L,57171L,57172L,57173L,57174L,57175L,57176L,57177L, +57178L,57179L,57180L,57181L,57182L,57183L,57184L,57185L,57186L,57187L, +57188L,57189L,57190L,57191L,57192L,57193L,57194L,57195L,57196L,57197L, +57198L,57199L,57200L,57201L,57202L,57203L,57204L,57205L,57206L,57207L, +57208L,57209L,57210L,57211L,57212L,57213L,57214L,57215L,57216L,57217L, +57218L,57219L,57220L,57221L,57222L,57223L,57224L,57225L,57226L,57227L, +57228L,57229L,57230L,57231L,57232L,57233L,57234L,57235L,57236L,57237L, +57238L,57239L,57240L,57241L,57242L,57243L,57244L,57245L,57246L,57247L, +57248L,57249L,57250L,57251L,57252L,57253L,57254L,57255L,57256L,57257L, +57258L,57259L,57260L,57261L,57262L,57263L,57264L,57265L,57266L,57267L, +57268L,57269L,57270L,57271L,57272L,57273L,57274L,57275L,57276L,57277L, +57278L,57279L,57280L,57281L,57282L,57283L,57284L,57285L,57286L,57287L, +57288L,57289L,57290L,57291L,57292L,57293L,57294L,57295L,57296L,57297L, +57298L,57299L,57300L,57301L,57302L,57303L,57304L,57305L,57306L,57307L, +57308L,57309L,57310L,57311L,57312L,57313L,57314L,57315L,57316L,57317L, +57318L,57319L,57320L,57321L,57322L,57323L,57324L,57325L,57326L,57327L, +57328L,57329L,57330L,57331L,57332L,57333L,57334L,57335L,57336L,57337L, +57338L,57339L,57340L,57341L,57342L,57343L,57344L,57345L,57346L,57347L, +57348L,57349L,57350L,57351L,57352L,57353L,57354L,57355L,57356L,57357L, +57358L,57359L,57360L,57361L,57362L,57363L,57364L,57365L,57366L,57367L, +57368L,57369L,57370L,57371L,57372L,57373L,57374L,57375L,57376L,57377L, +57378L,57379L,57380L,57381L,57382L,57383L,57384L,57385L,57386L,57387L, +57388L,57389L,57390L,57391L,57392L,57393L,57394L,57395L,57396L,57397L, +57398L,57399L,57400L,57401L,57402L,57403L,57404L,57405L,57406L,57407L, +57408L,57409L,57410L,57411L,57412L,57413L,57414L,57415L,57416L,57417L, +57418L,57419L,57420L,57421L,57422L,57423L,57424L,57425L,57426L,57427L, +57428L,57429L,57430L,57431L,57432L,57433L,57434L,57435L,57436L,57437L, +57438L,57439L,57440L,57441L,57442L,57443L,57444L,57445L,57446L,57447L, +57448L,57449L,57450L,57451L,57452L,57453L,57454L,57455L,57456L,57457L, +57458L,57459L,57460L,57461L,57462L,57463L,57464L,57465L,57466L,57467L, +57468L,57469L,57470L,57471L,57472L,57473L,57474L,57475L,57476L,57477L, +57478L,57479L,57480L,57481L,57482L,57483L,57484L,57485L,57486L,57487L, +57488L,57489L,57490L,57491L,57492L,57493L,57494L,57495L,57496L,57497L, +57498L,57499L,57500L,57501L,57502L,57503L,57504L,57505L,57506L,57507L, +57508L,57509L,57510L,57511L,57512L,57513L,57514L,57515L,57516L,57517L, +57518L,57519L,57520L,57521L,57522L,57523L,57524L,57525L,57526L,57527L, +57528L,57529L,57530L,57531L,57532L,57533L,57534L,57535L,57536L,57537L, +57538L,57539L,57540L,57541L,57542L,57543L,57544L,57545L,57546L,57547L, +57548L,57549L,57550L,57551L,57552L,57553L,57554L,57555L,57556L,57557L, +57558L,57559L,57560L,57561L,57562L,57563L,57564L,57565L,57566L,57567L, +57568L,57569L,57570L,57571L,57572L,57573L,57574L,57575L,57576L,57577L, +57578L,57579L,57580L,57581L,57582L,57583L,57584L,57585L,57586L,57587L, +57588L,57589L,57590L,57591L,57592L,57593L,57594L,57595L,57596L,57597L, +57598L,57599L,57600L,57601L,57602L,57603L,57604L,57605L,57606L,57607L, +57608L,57609L,57610L,57611L,57612L,57613L,57614L,57615L,57616L,57617L, +57618L,57619L,57620L,57621L,57622L,57623L,57624L,57625L,57626L,57627L, +57628L,57629L,57630L,57631L,57632L,57633L,57634L,57635L,57636L,57637L, +57638L,57639L,57640L,57641L,57642L,57643L,57644L,57645L,57646L,57647L, +57648L,57649L,57650L,57651L,57652L,57653L,57654L,57655L,57656L,57657L, +57658L,57659L,57660L,57661L,57662L,57663L,57664L,57665L,57666L,57667L, +57668L,57669L,57670L,57671L,57672L,57673L,57674L,57675L,57676L,57677L, +57678L,57679L,57680L,57681L,57682L,57683L,57684L,57685L,57686L,57687L, +57688L,57689L,57690L,57691L,57692L,57693L,57694L,57695L,57696L,57697L, +57698L,57699L,57700L,57701L,57702L,57703L,57704L,57705L,57706L,57707L, +57708L,57709L,57710L,57711L,57712L,57713L,57714L,57715L,57716L,57717L, +57718L,57719L,57720L,57721L,57722L,57723L,57724L,57725L,57726L,57727L, +57728L,57729L,57730L,57731L,57732L,57733L,57734L,57735L,57736L,57737L, +57738L,57739L,57740L,57741L,57742L,57743L,57744L,57745L,57746L,57747L, +57748L,57749L,57750L,57751L,57752L,57753L,57754L,57755L,57756L,57757L, +57758L,57759L,57760L,57761L,57762L,57763L,57764L,57765L,57766L,57767L, +57768L,57769L,57770L,57771L,57772L,57773L,57774L,57775L,57776L,57777L, +57778L,57779L,57780L,57781L,57782L,57783L,57784L,57785L,57786L,57787L, +57788L,57789L,57790L,57791L,57792L,57793L,57794L,57795L,57796L,57797L, +57798L,57799L,57800L,57801L,57802L,57803L,57804L,57805L,57806L,57807L, +57808L,57809L,57810L,57811L,57812L,57813L,57814L,57815L,57816L,57817L, +57818L,57819L,57820L,57821L,57822L,57823L,57824L,57825L,57826L,57827L, +57828L,57829L,57830L,57831L,57832L,57833L,57834L,57835L,57836L,57837L, +57838L,57839L,57840L,57841L,57842L,57843L,57844L,57845L,57846L,57847L, +57848L,57849L,57850L,57851L,57852L,57853L,57854L,57855L,57856L,57857L, +57858L,57859L,57860L,57861L,57862L,57863L,57864L,57865L,57866L,57867L, +57868L,57869L,57870L,57871L,57872L,57873L,57874L,57875L,57876L,57877L, +57878L,57879L,57880L,57881L,57882L,57883L,57884L,57885L,57886L,57887L, +57888L,57889L,57890L,57891L,57892L,57893L,57894L,57895L,57896L,57897L, +57898L,57899L,57900L,57901L,57902L,57903L,57904L,57905L,57906L,57907L, +57908L,57909L,57910L,57911L,57912L,57913L,57914L,57915L,57916L,57917L, +57918L,57919L,57920L,57921L,57922L,57923L,57924L,57925L,57926L,57927L, +57928L,57929L,57930L,57931L,57932L,57933L,57934L,57935L,57936L,57937L, +57938L,57939L,57940L,57941L,57942L,57943L,57944L,57945L,57946L,57947L, +57948L,57949L,57950L,57951L,57952L,57953L,57954L,57955L,57956L,57957L, +57958L,57959L,57960L,57961L,57962L,57963L,57964L,57965L,57966L,57967L, +57968L,57969L,57970L,57971L,57972L,57973L,57974L,57975L,57976L,57977L, +57978L,57979L,57980L,57981L,57982L,57983L,57984L,57985L,57986L,57987L, +57988L,57989L,57990L,57991L,57992L,57993L,57994L,57995L,57996L,57997L, +57998L,57999L,58000L,58001L,58002L,58003L,58004L,58005L,58006L,58007L, +58008L,58009L,58010L,58011L,58012L,58013L,58014L,58015L,58016L,58017L, +58018L,58019L,58020L,58021L,58022L,58023L,58024L,58025L,58026L,58027L, +58028L,58029L,58030L,58031L,58032L,58033L,58034L,58035L,58036L,58037L, +58038L,58039L,58040L,58041L,58042L,58043L,58044L,58045L,58046L,58047L, +58048L,58049L,58050L,58051L,58052L,58053L,58054L,58055L,58056L,58057L, +58058L,58059L,58060L,58061L,58062L,58063L,58064L,58065L,58066L,58067L, +58068L,58069L,58070L,58071L,58072L,58073L,58074L,58075L,58076L,58077L, +58078L,58079L,58080L,58081L,58082L,58083L,58084L,58085L,58086L,58087L, +58088L,58089L,58090L,58091L,58092L,58093L,58094L,58095L,58096L,58097L, +58098L,58099L,58100L,58101L,58102L,58103L,58104L,58105L,58106L,58107L, +58108L,58109L,58110L,58111L,58112L,58113L,58114L,58115L,58116L,58117L, +58118L,58119L,58120L,58121L,58122L,58123L,58124L,58125L,58126L,58127L, +58128L,58129L,58130L,58131L,58132L,58133L,58134L,58135L,58136L,58137L, +58138L,58139L,58140L,58141L,58142L,58143L,58144L,58145L,58146L,58147L, +58148L,58149L,58150L,58151L,58152L,58153L,58154L,58155L,58156L,58157L, +58158L,58159L,58160L,58161L,58162L,58163L,58164L,58165L,58166L,58167L, +58168L,58169L,58170L,58171L,58172L,58173L,58174L,58175L,58176L,58177L, +58178L,58179L,58180L,58181L,58182L,58183L,58184L,58185L,58186L,58187L, +58188L,58189L,58190L,58191L,58192L,58193L,58194L,58195L,58196L,58197L, +58198L,58199L,58200L,58201L,58202L,58203L,58204L,58205L,58206L,58207L, +58208L,58209L,58210L,58211L,58212L,58213L,58214L,58215L,58216L,58217L, +58218L,58219L,58220L,58221L,58222L,58223L,58224L,58225L,58226L,58227L, +58228L,58229L,58230L,58231L,58232L,58233L,58234L,58235L,58236L,58237L, +58238L,58239L,58240L,58241L,58242L,58243L,58244L,58245L,58246L,58247L, +58248L,58249L,58250L,58251L,58252L,58253L,58254L,58255L,58256L,58257L, +58258L,58259L,58260L,58261L,58262L,58263L,58264L,58265L,58266L,58267L, +58268L,58269L,58270L,58271L,58272L,58273L,58274L,58275L,58276L,58277L, +58278L,58279L,58280L,58281L,58282L,58283L,58284L,58285L,58286L,58287L, +58288L,58289L,58290L,58291L,58292L,58293L,58294L,58295L,58296L,58297L, +58298L,58299L,58300L,58301L,58302L,58303L,58304L,58305L,58306L,58307L, +58308L,58309L,58310L,58311L,58312L,58313L,58314L,58315L,58316L,58317L, +58318L,58319L,58320L,58321L,58322L,58323L,58324L,58325L,58326L,58327L, +58328L,58329L,58330L,58331L,58332L,58333L,58334L,58335L,58336L,58337L, +58338L,58339L,58340L,58341L,58342L,58343L,58344L,58345L,58346L,58347L, +58348L,58349L,58350L,58351L,58352L,58353L,58354L,58355L,58356L,58357L, +58358L,58359L,58360L,58361L,58362L,58363L,58364L,58365L,58366L,58367L, +58368L,58369L,58370L,58371L,58372L,58373L,58374L,58375L,58376L,58377L, +58378L,58379L,58380L,58381L,58382L,58383L,58384L,58385L,58386L,58387L, +58388L,58389L,58390L,58391L,58392L,58393L,58394L,58395L,58396L,58397L, +58398L,58399L,58400L,58401L,58402L,58403L,58404L,58405L,58406L,58407L, +58408L,58409L,58410L,58411L,58412L,58413L,58414L,58415L,58416L,58417L, +58418L,58419L,58420L,58421L,58422L,58423L,58424L,58425L,58426L,58427L, +58428L,58429L,58430L,58431L,58432L,58433L,58434L,58435L,58436L,58437L, +58438L,58439L,58440L,58441L,58442L,58443L,58444L,58445L,58446L,58447L, +58448L,58449L,58450L,58451L,58452L,58453L,58454L,58455L,58456L,58457L, +58458L,58459L,58460L,58461L,58462L,58463L,58464L,58465L,58466L,58467L, +58468L,58469L,58470L,58471L,58472L,58473L,58474L,58475L,58476L,58477L, +58478L,58479L,58480L,58481L,58482L,58483L,58484L,58485L,58486L,58487L, +58488L,58489L,58490L,58491L,58492L,58493L,58494L,58495L,58496L,58497L, +58498L,58499L,58500L,58501L,58502L,58503L,58504L,58505L,58506L,58507L, +58508L,58509L,58510L,58511L,58512L,58513L,58514L,58515L,58516L,58517L, +58518L,58519L,58520L,58521L,58522L,58523L,58524L,58525L,58526L,58527L, +58528L,58529L,58530L,58531L,58532L,58533L,58534L,58535L,58536L,58537L, +58538L,58539L,58540L,58541L,58542L,58543L,58544L,58545L,58546L,58547L, +58548L,58549L,58550L,58551L,58552L,58553L,58554L,58555L,58556L,58557L, +58558L,58559L,58560L,58561L,58562L,58563L,58564L,58565L,58566L,58567L, +58568L,58569L,58570L,58571L,58572L,58573L,58574L,58575L,58576L,58577L, +58578L,58579L,58580L,58581L,58582L,58583L,58584L,58585L,58586L,58587L, +58588L,58589L,58590L,58591L,58592L,58593L,58594L,58595L,58596L,58597L, +58598L,58599L,58600L,58601L,58602L,58603L,58604L,58605L,58606L,58607L, +58608L,58609L,58610L,58611L,58612L,58613L,58614L,58615L,58616L,58617L, +58618L,58619L,58620L,58621L,58622L,58623L,58624L,58625L,58626L,58627L, +58628L,58629L,58630L,58631L,58632L,58633L,58634L,58635L,58636L,58637L, +58638L,58639L,58640L,58641L,58642L,58643L,58644L,58645L,58646L,58647L, +58648L,58649L,58650L,58651L,58652L,58653L,58654L,58655L,58656L,58657L, +58658L,58659L,58660L,58661L,58662L,58663L,58664L,58665L,58666L,58667L, +58668L,58669L,58670L,58671L,58672L,58673L,58674L,58675L,58676L,58677L, +58678L,58679L,58680L,58681L,58682L,58683L,58684L,58685L,58686L,58687L, +58688L,58689L,58690L,58691L,58692L,58693L,58694L,58695L,58696L,58697L, +58698L,58699L,58700L,58701L,58702L,58703L,58704L,58705L,58706L,58707L, +58708L,58709L,58710L,58711L,58712L,58713L,58714L,58715L,58716L,58717L, +58718L,58719L,58720L,58721L,58722L,58723L,58724L,58725L,58726L,58727L, +58728L,58729L,58730L,58731L,58732L,58733L,58734L,58735L,58736L,58737L, +58738L,58739L,58740L,58741L,58742L,58743L,58744L,58745L,58746L,58747L, +58748L,58749L,58750L,58751L,58752L,58753L,58754L,58755L,58756L,58757L, +58758L,58759L,58760L,58761L,58762L,58763L,58764L,58765L,58766L,58767L, +58768L,58769L,58770L,58771L,58772L,58773L,58774L,58775L,58776L,58777L, +58778L,58779L,58780L,58781L,58782L,58783L,58784L,58785L,58786L,58787L, +58788L,58789L,58790L,58791L,58792L,58793L,58794L,58795L,58796L,58797L, +58798L,58799L,58800L,58801L,58802L,58803L,58804L,58805L,58806L,58807L, +58808L,58809L,58810L,58811L,58812L,58813L,58814L,58815L,58816L,58817L, +58818L,58819L,58820L,58821L,58822L,58823L,58824L,58825L,58826L,58827L, +58828L,58829L,58830L,58831L,58832L,58833L,58834L,58835L,58836L,58837L, +58838L,58839L,58840L,58841L,58842L,58843L,58844L,58845L,58846L,58847L, +58848L,58849L,58850L,58851L,58852L,58853L,58854L,58855L,58856L,58857L, +58858L,58859L,58860L,58861L,58862L,58863L,58864L,58865L,58866L,58867L, +58868L,58869L,58870L,58871L,58872L,58873L,58874L,58875L,58876L,58877L, +58878L,58879L,58880L,58881L,58882L,58883L,58884L,58885L,58886L,58887L, +58888L,58889L,58890L,58891L,58892L,58893L,58894L,58895L,58896L,58897L, +58898L,58899L,58900L,58901L,58902L,58903L,58904L,58905L,58906L,58907L, +58908L,58909L,58910L,58911L,58912L,58913L,58914L,58915L,58916L,58917L, +58918L,58919L,58920L,58921L,58922L,58923L,58924L,58925L,58926L,58927L, +58928L,58929L,58930L,58931L,58932L,58933L,58934L,58935L,58936L,58937L, +58938L,58939L,58940L,58941L,58942L,58943L,58944L,58945L,58946L,58947L, +58948L,58949L,58950L,58951L,58952L,58953L,58954L,58955L,58956L,58957L, +58958L,58959L,58960L,58961L,58962L,58963L,58964L,58965L,58966L,58967L, +58968L,58969L,58970L,58971L,58972L,58973L,58974L,58975L,58976L,58977L, +58978L,58979L,58980L,58981L,58982L,58983L,58984L,58985L,58986L,58987L, +58988L,58989L,58990L,58991L,58992L,58993L,58994L,58995L,58996L,58997L, +58998L,58999L,59000L,59001L,59002L,59003L,59004L,59005L,59006L,59007L, +59008L,59009L,59010L,59011L,59012L,59013L,59014L,59015L,59016L,59017L, +59018L,59019L,59020L,59021L,59022L,59023L,59024L,59025L,59026L,59027L, +59028L,59029L,59030L,59031L,59032L,59033L,59034L,59035L,59036L,59037L, +59038L,59039L,59040L,59041L,59042L,59043L,59044L,59045L,59046L,59047L, +59048L,59049L,59050L,59051L,59052L,59053L,59054L,59055L,59056L,59057L, +59058L,59059L,59060L,59061L,59062L,59063L,59064L,59065L,59066L,59067L, +59068L,59069L,59070L,59071L,59072L,59073L,59074L,59075L,59076L,59077L, +59078L,59079L,59080L,59081L,59082L,59083L,59084L,59085L,59086L,59087L, +59088L,59089L,59090L,59091L,59092L,59093L,59094L,59095L,59096L,59097L, +59098L,59099L,59100L,59101L,59102L,59103L,59104L,59105L,59106L,59107L, +59108L,59109L,59110L,59111L,59112L,59113L,59114L,59115L,59116L,59117L, +59118L,59119L,59120L,59121L,59122L,59123L,59124L,59125L,59126L,59127L, +59128L,59129L,59130L,59131L,59132L,59133L,59134L,59135L,59136L,59137L, +59138L,59139L,59140L,59141L,59142L,59143L,59144L,59145L,59146L,59147L, +59148L,59149L,59150L,59151L,59152L,59153L,59154L,59155L,59156L,59157L, +59158L,59159L,59160L,59161L,59162L,59163L,59164L,59165L,59166L,59167L, +59168L,59169L,59170L,59171L,59172L,59173L,59174L,59175L,59176L,59177L, +59178L,59179L,59180L,59181L,59182L,59183L,59184L,59185L,59186L,59187L, +59188L,59189L,59190L,59191L,59192L,59193L,59194L,59195L,59196L,59197L, +59198L,59199L,59200L,59201L,59202L,59203L,59204L,59205L,59206L,59207L, +59208L,59209L,59210L,59211L,59212L,59213L,59214L,59215L,59216L,59217L, +59218L,59219L,59220L,59221L,59222L,59223L,59224L,59225L,59226L,59227L, +59228L,59229L,59230L,59231L,59232L,59233L,59234L,59235L,59236L,59237L, +59238L,59239L,59240L,59241L,59242L,59243L,59244L,59245L,59246L,59247L, +59248L,59249L,59250L,59251L,59252L,59253L,59254L,59255L,59256L,59257L, +59258L,59259L,59260L,59261L,59262L,59263L,59264L,59265L,59266L,59267L, +59268L,59269L,59270L,59271L,59272L,59273L,59274L,59275L,59276L,59277L, +59278L,59279L,59280L,59281L,59282L,59283L,59284L,59285L,59286L,59287L, +59288L,59289L,59290L,59291L,59292L,59293L,59294L,59295L,59296L,59297L, +59298L,59299L,59300L,59301L,59302L,59303L,59304L,59305L,59306L,59307L, +59308L,59309L,59310L,59311L,59312L,59313L,59314L,59315L,59316L,59317L, +59318L,59319L,59320L,59321L,59322L,59323L,59324L,59325L,59326L,59327L, +59328L,59329L,59330L,59331L,59332L,59333L,59334L,59335L,59336L,59337L, +59338L,59339L,59340L,59341L,59342L,59343L,59344L,59345L,59346L,59347L, +59348L,59349L,59350L,59351L,59352L,59353L,59354L,59355L,59356L,59357L, +59358L,59359L,59360L,59361L,59362L,59363L,59364L,59365L,59366L,59367L, +59368L,59369L,59370L,59371L,59372L,59373L,59374L,59375L,59376L,59377L, +59378L,59379L,59380L,59381L,59382L,59383L,59384L,59385L,59386L,59387L, +59388L,59389L,59390L,59391L,59392L,59393L,59394L,59395L,59396L,59397L, +59398L,59399L,59400L,59401L,59402L,59403L,59404L,59405L,59406L,59407L, +59408L,59409L,59410L,59411L,59412L,59413L,59414L,59415L,59416L,59417L, +59418L,59419L,59420L,59421L,59422L,59423L,59424L,59425L,59426L,59427L, +59428L,59429L,59430L,59431L,59432L,59433L,59434L,59435L,59436L,59437L, +59438L,59439L,59440L,59441L,59442L,59443L,59444L,59445L,59446L,59447L, +59448L,59449L,59450L,59451L,59452L,59453L,59454L,59455L,59456L,59457L, +59458L,59459L,59460L,59461L,59462L,59463L,59464L,59465L,59466L,59467L, +59468L,59469L,59470L,59471L,59472L,59473L,59474L,59475L,59476L,59477L, +59478L,59479L,59480L,59481L,59482L,59483L,59484L,59485L,59486L,59487L, +59488L,59489L,59490L,59491L,59492L,59493L,59494L,59495L,59496L,59497L, +59498L,59499L,59500L,59501L,59502L,59503L,59504L,59505L,59506L,59507L, +59508L,59509L,59510L,59511L,59512L,59513L,59514L,59515L,59516L,59517L, +59518L,59519L,59520L,59521L,59522L,59523L,59524L,59525L,59526L,59527L, +59528L,59529L,59530L,59531L,59532L,59533L,59534L,59535L,59536L,59537L, +59538L,59539L,59540L,59541L,59542L,59543L,59544L,59545L,59546L,59547L, +59548L,59549L,59550L,59551L,59552L,59553L,59554L,59555L,59556L,59557L, +59558L,59559L,59560L,59561L,59562L,59563L,59564L,59565L,59566L,59567L, +59568L,59569L,59570L,59571L,59572L,59573L,59574L,59575L,59576L,59577L, +59578L,59579L,59580L,59581L,59582L,59583L,59584L,59585L,59586L,59587L, +59588L,59589L,59590L,59591L,59592L,59593L,59594L,59595L,59596L,59597L, +59598L,59599L,59600L,59601L,59602L,59603L,59604L,59605L,59606L,59607L, +59608L,59609L,59610L,59611L,59612L,59613L,59614L,59615L,59616L,59617L, +59618L,59619L,59620L,59621L,59622L,59623L,59624L,59625L,59626L,59627L, +59628L,59629L,59630L,59631L,59632L,59633L,59634L,59635L,59636L,59637L, +59638L,59639L,59640L,59641L,59642L,59643L,59644L,59645L,59646L,59647L, +59648L,59649L,59650L,59651L,59652L,59653L,59654L,59655L,59656L,59657L, +59658L,59659L,59660L,59661L,59662L,59663L,59664L,59665L,59666L,59667L, +59668L,59669L,59670L,59671L,59672L,59673L,59674L,59675L,59676L,59677L, +59678L,59679L,59680L,59681L,59682L,59683L,59684L,59685L,59686L,59687L, +59688L,59689L,59690L,59691L,59692L,59693L,59694L,59695L,59696L,59697L, +59698L,59699L,59700L,59701L,59702L,59703L,59704L,59705L,59706L,59707L, +59708L,59709L,59710L,59711L,59712L,59713L,59714L,59715L,59716L,59717L, +59718L,59719L,59720L,59721L,59722L,59723L,59724L,59725L,59726L,59727L, +59728L,59729L,59730L,59731L,59732L,59733L,59734L,59735L,59736L,59737L, +59738L,59739L,59740L,59741L,59742L,59743L,59744L,59745L,59746L,59747L, +59748L,59749L,59750L,59751L,59752L,59753L,59754L,59755L,59756L,59757L, +59758L,59759L,59760L,59761L,59762L,59763L,59764L,59765L,59766L,59767L, +59768L,59769L,59770L,59771L,59772L,59773L,59774L,59775L,59776L,59777L, +59778L,59779L,59780L,59781L,59782L,59783L,59784L,59785L,59786L,59787L, +59788L,59789L,59790L,59791L,59792L,59793L,59794L,59795L,59796L,59797L, +59798L,59799L,59800L,59801L,59802L,59803L,59804L,59805L,59806L,59807L, +59808L,59809L,59810L,59811L,59812L,59813L,59814L,59815L,59816L,59817L, +59818L,59819L,59820L,59821L,59822L,59823L,59824L,59825L,59826L,59827L, +59828L,59829L,59830L,59831L,59832L,59833L,59834L,59835L,59836L,59837L, +59838L,59839L,59840L,59841L,59842L,59843L,59844L,59845L,59846L,59847L, +59848L,59849L,59850L,59851L,59852L,59853L,59854L,59855L,59856L,59857L, +59858L,59859L,59860L,59861L,59862L,59863L,59864L,59865L,59866L,59867L, +59868L,59869L,59870L,59871L,59872L,59873L,59874L,59875L,59876L,59877L, +59878L,59879L,59880L,59881L,59882L,59883L,59884L,59885L,59886L,59887L, +59888L,59889L,59890L,59891L,59892L,59893L,59894L,59895L,59896L,59897L, +59898L,59899L,59900L,59901L,59902L,59903L,59904L,59905L,59906L,59907L, +59908L,59909L,59910L,59911L,59912L,59913L,59914L,59915L,59916L,59917L, +59918L,59919L,59920L,59921L,59922L,59923L,59924L,59925L,59926L,59927L, +59928L,59929L,59930L,59931L,59932L,59933L,59934L,59935L,59936L,59937L, +59938L,59939L,59940L,59941L,59942L,59943L,59944L,59945L,59946L,59947L, +59948L,59949L,59950L,59951L,59952L,59953L,59954L,59955L,59956L,59957L, +59958L,59959L,59960L,59961L,59962L,59963L,59964L,59965L,59966L,59967L, +59968L,59969L,59970L,59971L,59972L,59973L,59974L,59975L,59976L,59977L, +59978L,59979L,59980L,59981L,59982L,59983L,59984L,59985L,59986L,59987L, +59988L,59989L,59990L,59991L,59992L,59993L,59994L,59995L,59996L,59997L, +59998L,59999L,60000L,60001L,60002L,60003L,60004L,60005L,60006L,60007L, +60008L,60009L,60010L,60011L,60012L,60013L,60014L,60015L,60016L,60017L, +60018L,60019L,60020L,60021L,60022L,60023L,60024L,60025L,60026L,60027L, +60028L,60029L,60030L,60031L,60032L,60033L,60034L,60035L,60036L,60037L, +60038L,60039L,60040L,60041L,60042L,60043L,60044L,60045L,60046L,60047L, +60048L,60049L,60050L,60051L,60052L,60053L,60054L,60055L,60056L,60057L, +60058L,60059L,60060L,60061L,60062L,60063L,60064L,60065L,60066L,60067L, +60068L,60069L,60070L,60071L,60072L,60073L,60074L,60075L,60076L,60077L, +60078L,60079L,60080L,60081L,60082L,60083L,60084L,60085L,60086L,60087L, +60088L,60089L,60090L,60091L,60092L,60093L,60094L,60095L,60096L,60097L, +60098L,60099L,60100L,60101L,60102L,60103L,60104L,60105L,60106L,60107L, +60108L,60109L,60110L,60111L,60112L,60113L,60114L,60115L,60116L,60117L, +60118L,60119L,60120L,60121L,60122L,60123L,60124L,60125L,60126L,60127L, +60128L,60129L,60130L,60131L,60132L,60133L,60134L,60135L,60136L,60137L, +60138L,60139L,60140L,60141L,60142L,60143L,60144L,60145L,60146L,60147L, +60148L,60149L,60150L,60151L,60152L,60153L,60154L,60155L,60156L,60157L, +60158L,60159L,60160L,60161L,60162L,60163L,60164L,60165L,60166L,60167L, +60168L,60169L,60170L,60171L,60172L,60173L,60174L,60175L,60176L,60177L, +60178L,60179L,60180L,60181L,60182L,60183L,60184L,60185L,60186L,60187L, +60188L,60189L,60190L,60191L,60192L,60193L,60194L,60195L,60196L,60197L, +60198L,60199L,60200L,60201L,60202L,60203L,60204L,60205L,60206L,60207L, +60208L,60209L,60210L,60211L,60212L,60213L,60214L,60215L,60216L,60217L, +60218L,60219L,60220L,60221L,60222L,60223L,60224L,60225L,60226L,60227L, +60228L,60229L,60230L,60231L,60232L,60233L,60234L,60235L,60236L,60237L, +60238L,60239L,60240L,60241L,60242L,60243L,60244L,60245L,60246L,60247L, +60248L,60249L,60250L,60251L,60252L,60253L,60254L,60255L,60256L,60257L, +60258L,60259L,60260L,60261L,60262L,60263L,60264L,60265L,60266L,60267L, +60268L,60269L,60270L,60271L,60272L,60273L,60274L,60275L,60276L,60277L, +60278L,60279L,60280L,60281L,60282L,60283L,60284L,60285L,60286L,60287L, +60288L,60289L,60290L,60291L,60292L,60293L,60294L,60295L,60296L,60297L, +60298L,60299L,60300L,60301L,60302L,60303L,60304L,60305L,60306L,60307L, +60308L,60309L,60310L,60311L,60312L,60313L,60314L,60315L,60316L,60317L, +60318L,60319L,60320L,60321L,60322L,60323L,60324L,60325L,60326L,60327L, +60328L,60329L,60330L,60331L,60332L,60333L,60334L,60335L,60336L,60337L, +60338L,60339L,60340L,60341L,60342L,60343L,60344L,60345L,60346L,60347L, +60348L,60349L,60350L,60351L,60352L,60353L,60354L,60355L,60356L,60357L, +60358L,60359L,60360L,60361L,60362L,60363L,60364L,60365L,60366L,60367L, +60368L,60369L,60370L,60371L,60372L,60373L,60374L,60375L,60376L,60377L, +60378L,60379L,60380L,60381L,60382L,60383L,60384L,60385L,60386L,60387L, +60388L,60389L,60390L,60391L,60392L,60393L,60394L,60395L,60396L,60397L, +60398L,60399L,60400L,60401L,60402L,60403L,60404L,60405L,60406L,60407L, +60408L,60409L,60410L,60411L,60412L,60413L,60414L,60415L,60416L,60417L, +60418L,60419L,60420L,60421L,60422L,60423L,60424L,60425L,60426L,60427L, +60428L,60429L,60430L,60431L,60432L,60433L,60434L,60435L,60436L,60437L, +60438L,60439L,60440L,60441L,60442L,60443L,60444L,60445L,60446L,60447L, +60448L,60449L,60450L,60451L,60452L,60453L,60454L,60455L,60456L,60457L, +60458L,60459L,60460L,60461L,60462L,60463L,60464L,60465L,60466L,60467L, +60468L,60469L,60470L,60471L,60472L,60473L,60474L,60475L,60476L,60477L, +60478L,60479L,60480L,60481L,60482L,60483L,60484L,60485L,60486L,60487L, +60488L,60489L,60490L,60491L,60492L,60493L,60494L,60495L,60496L,60497L, +60498L,60499L,60500L,60501L,60502L,60503L,60504L,60505L,60506L,60507L, +60508L,60509L,60510L,60511L,60512L,60513L,60514L,60515L,60516L,60517L, +60518L,60519L,60520L,60521L,60522L,60523L,60524L,60525L,60526L,60527L, +60528L,60529L,60530L,60531L,60532L,60533L,60534L,60535L,60536L,60537L, +60538L,60539L,60540L,60541L,60542L,60543L,60544L,60545L,60546L,60547L, +60548L,60549L,60550L,60551L,60552L,60553L,60554L,60555L,60556L,60557L, +60558L,60559L,60560L,60561L,60562L,60563L,60564L,60565L,60566L,60567L, +60568L,60569L,60570L,60571L,60572L,60573L,60574L,60575L,60576L,60577L, +60578L,60579L,60580L,60581L,60582L,60583L,60584L,60585L,60586L,60587L, +60588L,60589L,60590L,60591L,60592L,60593L,60594L,60595L,60596L,60597L, +60598L,60599L,60600L,60601L,60602L,60603L,60604L,60605L,60606L,60607L, +60608L,60609L,60610L,60611L,60612L,60613L,60614L,60615L,60616L,60617L, +60618L,60619L,60620L,60621L,60622L,60623L,60624L,60625L,60626L,60627L, +60628L,60629L,60630L,60631L,60632L,60633L,60634L,60635L,60636L,60637L, +60638L,60639L,60640L,60641L,60642L,60643L,60644L,60645L,60646L,60647L, +60648L,60649L,60650L,60651L,60652L,60653L,60654L,60655L,60656L,60657L, +60658L,60659L,60660L,60661L,60662L,60663L,60664L,60665L,60666L,60667L, +60668L,60669L,60670L,60671L,60672L,60673L,60674L,60675L,60676L,60677L, +60678L,60679L,60680L,60681L,60682L,60683L,60684L,60685L,60686L,60687L, +60688L,60689L,60690L,60691L,60692L,60693L,60694L,60695L,60696L,60697L, +60698L,60699L,60700L,60701L,60702L,60703L,60704L,60705L,60706L,60707L, +60708L,60709L,60710L,60711L,60712L,60713L,60714L,60715L,60716L,60717L, +60718L,60719L,60720L,60721L,60722L,60723L,60724L,60725L,60726L,60727L, +60728L,60729L,60730L,60731L,60732L,60733L,60734L,60735L,60736L,60737L, +60738L,60739L,60740L,60741L,60742L,60743L,60744L,60745L,60746L,60747L, +60748L,60749L,60750L,60751L,60752L,60753L,60754L,60755L,60756L,60757L, +60758L,60759L,60760L,60761L,60762L,60763L,60764L,60765L,60766L,60767L, +60768L,60769L,60770L,60771L,60772L,60773L,60774L,60775L,60776L,60777L, +60778L,60779L,60780L,60781L,60782L,60783L,60784L,60785L,60786L,60787L, +60788L,60789L,60790L,60791L,60792L,60793L,60794L,60795L,60796L,60797L, +60798L,60799L,60800L,60801L,60802L,60803L,60804L,60805L,60806L,60807L, +60808L,60809L,60810L,60811L,60812L,60813L,60814L,60815L,60816L,60817L, +60818L,60819L,60820L,60821L,60822L,60823L,60824L,60825L,60826L,60827L, +60828L,60829L,60830L,60831L,60832L,60833L,60834L,60835L,60836L,60837L, +60838L,60839L,60840L,60841L,60842L,60843L,60844L,60845L,60846L,60847L, +60848L,60849L,60850L,60851L,60852L,60853L,60854L,60855L,60856L,60857L, +60858L,60859L,60860L,60861L,60862L,60863L,60864L,60865L,60866L,60867L, +60868L,60869L,60870L,60871L,60872L,60873L,60874L,60875L,60876L,60877L, +60878L,60879L,60880L,60881L,60882L,60883L,60884L,60885L,60886L,60887L, +60888L,60889L,60890L,60891L,60892L,60893L,60894L,60895L,60896L,60897L, +60898L,60899L,60900L,60901L,60902L,60903L,60904L,60905L,60906L,60907L, +60908L,60909L,60910L,60911L,60912L,60913L,60914L,60915L,60916L,60917L, +60918L,60919L,60920L,60921L,60922L,60923L,60924L,60925L,60926L,60927L, +60928L,60929L,60930L,60931L,60932L,60933L,60934L,60935L,60936L,60937L, +60938L,60939L,60940L,60941L,60942L,60943L,60944L,60945L,60946L,60947L, +60948L,60949L,60950L,60951L,60952L,60953L,60954L,60955L,60956L,60957L, +60958L,60959L,60960L,60961L,60962L,60963L,60964L,60965L,60966L,60967L, +60968L,60969L,60970L,60971L,60972L,60973L,60974L,60975L,60976L,60977L, +60978L,60979L,60980L,60981L,60982L,60983L,60984L,60985L,60986L,60987L, +60988L,60989L,60990L,60991L,60992L,60993L,60994L,60995L,60996L,60997L, +60998L,60999L,61000L,61001L,61002L,61003L,61004L,61005L,61006L,61007L, +61008L,61009L,61010L,61011L,61012L,61013L,61014L,61015L,61016L,61017L, +61018L,61019L,61020L,61021L,61022L,61023L,61024L,61025L,61026L,61027L, +61028L,61029L,61030L,61031L,61032L,61033L,61034L,61035L,61036L,61037L, +61038L,61039L,61040L,61041L,61042L,61043L,61044L,61045L,61046L,61047L, +61048L,61049L,61050L,61051L,61052L,61053L,61054L,61055L,61056L,61057L, +61058L,61059L,61060L,61061L,61062L,61063L,61064L,61065L,61066L,61067L, +61068L,61069L,61070L,61071L,61072L,61073L,61074L,61075L,61076L,61077L, +61078L,61079L,61080L,61081L,61082L,61083L,61084L,61085L,61086L,61087L, +61088L,61089L,61090L,61091L,61092L,61093L,61094L,61095L,61096L,61097L, +61098L,61099L,61100L,61101L,61102L,61103L,61104L,61105L,61106L,61107L, +61108L,61109L,61110L,61111L,61112L,61113L,61114L,61115L,61116L,61117L, +61118L,61119L,61120L,61121L,61122L,61123L,61124L,61125L,61126L,61127L, +61128L,61129L,61130L,61131L,61132L,61133L,61134L,61135L,61136L,61137L, +61138L,61139L,61140L,61141L,61142L,61143L,61144L,61145L,61146L,61147L, +61148L,61149L,61150L,61151L,61152L,61153L,61154L,61155L,61156L,61157L, +61158L,61159L,61160L,61161L,61162L,61163L,61164L,61165L,61166L,61167L, +61168L,61169L,61170L,61171L,61172L,61173L,61174L,61175L,61176L,61177L, +61178L,61179L,61180L,61181L,61182L,61183L,61184L,61185L,61186L,61187L, +61188L,61189L,61190L,61191L,61192L,61193L,61194L,61195L,61196L,61197L, +61198L,61199L,61200L,61201L,61202L,61203L,61204L,61205L,61206L,61207L, +61208L,61209L,61210L,61211L,61212L,61213L,61214L,61215L,61216L,61217L, +61218L,61219L,61220L,61221L,61222L,61223L,61224L,61225L,61226L,61227L, +61228L,61229L,61230L,61231L,61232L,61233L,61234L,61235L,61236L,61237L, +61238L,61239L,61240L,61241L,61242L,61243L,61244L,61245L,61246L,61247L, +61248L,61249L,61250L,61251L,61252L,61253L,61254L,61255L,61256L,61257L, +61258L,61259L,61260L,61261L,61262L,61263L,61264L,61265L,61266L,61267L, +61268L,61269L,61270L,61271L,61272L,61273L,61274L,61275L,61276L,61277L, +61278L,61279L,61280L,61281L,61282L,61283L,61284L,61285L,61286L,61287L, +61288L,61289L,61290L,61291L,61292L,61293L,61294L,61295L,61296L,61297L, +61298L,61299L,61300L,61301L,61302L,61303L,61304L,61305L,61306L,61307L, +61308L,61309L,61310L,61311L,61312L,61313L,61314L,61315L,61316L,61317L, +61318L,61319L,61320L,61321L,61322L,61323L,61324L,61325L,61326L,61327L, +61328L,61329L,61330L,61331L,61332L,61333L,61334L,61335L,61336L,61337L, +61338L,61339L,61340L,61341L,61342L,61343L,61344L,61345L,61346L,61347L, +61348L,61349L,61350L,61351L,61352L,61353L,61354L,61355L,61356L,61357L, +61358L,61359L,61360L,61361L,61362L,61363L,61364L,61365L,61366L,61367L, +61368L,61369L,61370L,61371L,61372L,61373L,61374L,61375L,61376L,61377L, +61378L,61379L,61380L,61381L,61382L,61383L,61384L,61385L,61386L,61387L, +61388L,61389L,61390L,61391L,61392L,61393L,61394L,61395L,61396L,61397L, +61398L,61399L,61400L,61401L,61402L,61403L,61404L,61405L,61406L,61407L, +61408L,61409L,61410L,61411L,61412L,61413L,61414L,61415L,61416L,61417L, +61418L,61419L,61420L,61421L,61422L,61423L,61424L,61425L,61426L,61427L, +61428L,61429L,61430L,61431L,61432L,61433L,61434L,61435L,61436L,61437L, +61438L,61439L,61440L,61441L,61442L,61443L,61444L,61445L,61446L,61447L, +61448L,61449L,61450L,61451L,61452L,61453L,61454L,61455L,61456L,61457L, +61458L,61459L,61460L,61461L,61462L,61463L,61464L,61465L,61466L,61467L, +61468L,61469L,61470L,61471L,61472L,61473L,61474L,61475L,61476L,61477L, +61478L,61479L,61480L,61481L,61482L,61483L,61484L,61485L,61486L,61487L, +61488L,61489L,61490L,61491L,61492L,61493L,61494L,61495L,61496L,61497L, +61498L,61499L,61500L,61501L,61502L,61503L,61504L,61505L,61506L,61507L, +61508L,61509L,61510L,61511L,61512L,61513L,61514L,61515L,61516L,61517L, +61518L,61519L,61520L,61521L,61522L,61523L,61524L,61525L,61526L,61527L, +61528L,61529L,61530L,61531L,61532L,61533L,61534L,61535L,61536L,61537L, +61538L,61539L,61540L,61541L,61542L,61543L,61544L,61545L,61546L,61547L, +61548L,61549L,61550L,61551L,61552L,61553L,61554L,61555L,61556L,61557L, +61558L,61559L,61560L,61561L,61562L,61563L,61564L,61565L,61566L,61567L, +61568L,61569L,61570L,61571L,61572L,61573L,61574L,61575L,61576L,61577L, +61578L,61579L,61580L,61581L,61582L,61583L,61584L,61585L,61586L,61587L, +61588L,61589L,61590L,61591L,61592L,61593L,61594L,61595L,61596L,61597L, +61598L,61599L,61600L,61601L,61602L,61603L,61604L,61605L,61606L,61607L, +61608L,61609L,61610L,61611L,61612L,61613L,61614L,61615L,61616L,61617L, +61618L,61619L,61620L,61621L,61622L,61623L,61624L,61625L,61626L,61627L, +61628L,61629L,61630L,61631L,61632L,61633L,61634L,61635L,61636L,61637L, +61638L,61639L,61640L,61641L,61642L,61643L,61644L,61645L,61646L,61647L, +61648L,61649L,61650L,61651L,61652L,61653L,61654L,61655L,61656L,61657L, +61658L,61659L,61660L,61661L,61662L,61663L,61664L,61665L,61666L,61667L, +61668L,61669L,61670L,61671L,61672L,61673L,61674L,61675L,61676L,61677L, +61678L,61679L,61680L,61681L,61682L,61683L,61684L,61685L,61686L,61687L, +61688L,61689L,61690L,61691L,61692L,61693L,61694L,61695L,61696L,61697L, +61698L,61699L,61700L,61701L,61702L,61703L,61704L,61705L,61706L,61707L, +61708L,61709L,61710L,61711L,61712L,61713L,61714L,61715L,61716L,61717L, +61718L,61719L,61720L,61721L,61722L,61723L,61724L,61725L,61726L,61727L, +61728L,61729L,61730L,61731L,61732L,61733L,61734L,61735L,61736L,61737L, +61738L,61739L,61740L,61741L,61742L,61743L,61744L,61745L,61746L,61747L, +61748L,61749L,61750L,61751L,61752L,61753L,61754L,61755L,61756L,61757L, +61758L,61759L,61760L,61761L,61762L,61763L,61764L,61765L,61766L,61767L, +61768L,61769L,61770L,61771L,61772L,61773L,61774L,61775L,61776L,61777L, +61778L,61779L,61780L,61781L,61782L,61783L,61784L,61785L,61786L,61787L, +61788L,61789L,61790L,61791L,61792L,61793L,61794L,61795L,61796L,61797L, +61798L,61799L,61800L,61801L,61802L,61803L,61804L,61805L,61806L,61807L, +61808L,61809L,61810L,61811L,61812L,61813L,61814L,61815L,61816L,61817L, +61818L,61819L,61820L,61821L,61822L,61823L,61824L,61825L,61826L,61827L, +61828L,61829L,61830L,61831L,61832L,61833L,61834L,61835L,61836L,61837L, +61838L,61839L,61840L,61841L,61842L,61843L,61844L,61845L,61846L,61847L, +61848L,61849L,61850L,61851L,61852L,61853L,61854L,61855L,61856L,61857L, +61858L,61859L,61860L,61861L,61862L,61863L,61864L,61865L,61866L,61867L, +61868L,61869L,61870L,61871L,61872L,61873L,61874L,61875L,61876L,61877L, +61878L,61879L,61880L,61881L,61882L,61883L,61884L,61885L,61886L,61887L, +61888L,61889L,61890L,61891L,61892L,61893L,61894L,61895L,61896L,61897L, +61898L,61899L,61900L,61901L,61902L,61903L,61904L,61905L,61906L,61907L, +61908L,61909L,61910L,61911L,61912L,61913L,61914L,61915L,61916L,61917L, +61918L,61919L,61920L,61921L,61922L,61923L,61924L,61925L,61926L,61927L, +61928L,61929L,61930L,61931L,61932L,61933L,61934L,61935L,61936L,61937L, +61938L,61939L,61940L,61941L,61942L,61943L,61944L,61945L,61946L,61947L, +61948L,61949L,61950L,61951L,61952L,61953L,61954L,61955L,61956L,61957L, +61958L,61959L,61960L,61961L,61962L,61963L,61964L,61965L,61966L,61967L, +61968L,61969L,61970L,61971L,61972L,61973L,61974L,61975L,61976L,61977L, +61978L,61979L,61980L,61981L,61982L,61983L,61984L,61985L,61986L,61987L, +61988L,61989L,61990L,61991L,61992L,61993L,61994L,61995L,61996L,61997L, +61998L,61999L,62000L,62001L,62002L,62003L,62004L,62005L,62006L,62007L, +62008L,62009L,62010L,62011L,62012L,62013L,62014L,62015L,62016L,62017L, +62018L,62019L,62020L,62021L,62022L,62023L,62024L,62025L,62026L,62027L, +62028L,62029L,62030L,62031L,62032L,62033L,62034L,62035L,62036L,62037L, +62038L,62039L,62040L,62041L,62042L,62043L,62044L,62045L,62046L,62047L, +62048L,62049L,62050L,62051L,62052L,62053L,62054L,62055L,62056L,62057L, +62058L,62059L,62060L,62061L,62062L,62063L,62064L,62065L,62066L,62067L, +62068L,62069L,62070L,62071L,62072L,62073L,62074L,62075L,62076L,62077L, +62078L,62079L,62080L,62081L,62082L,62083L,62084L,62085L,62086L,62087L, +62088L,62089L,62090L,62091L,62092L,62093L,62094L,62095L,62096L,62097L, +62098L,62099L,62100L,62101L,62102L,62103L,62104L,62105L,62106L,62107L, +62108L,62109L,62110L,62111L,62112L,62113L,62114L,62115L,62116L,62117L, +62118L,62119L,62120L,62121L,62122L,62123L,62124L,62125L,62126L,62127L, +62128L,62129L,62130L,62131L,62132L,62133L,62134L,62135L,62136L,62137L, +62138L,62139L,62140L,62141L,62142L,62143L,62144L,62145L,62146L,62147L, +62148L,62149L,62150L,62151L,62152L,62153L,62154L,62155L,62156L,62157L, +62158L,62159L,62160L,62161L,62162L,62163L,62164L,62165L,62166L,62167L, +62168L,62169L,62170L,62171L,62172L,62173L,62174L,62175L,62176L,62177L, +62178L,62179L,62180L,62181L,62182L,62183L,62184L,62185L,62186L,62187L, +62188L,62189L,62190L,62191L,62192L,62193L,62194L,62195L,62196L,62197L, +62198L,62199L,62200L,62201L,62202L,62203L,62204L,62205L,62206L,62207L, +62208L,62209L,62210L,62211L,62212L,62213L,62214L,62215L,62216L,62217L, +62218L,62219L,62220L,62221L,62222L,62223L,62224L,62225L,62226L,62227L, +62228L,62229L,62230L,62231L,62232L,62233L,62234L,62235L,62236L,62237L, +62238L,62239L,62240L,62241L,62242L,62243L,62244L,62245L,62246L,62247L, +62248L,62249L,62250L,62251L,62252L,62253L,62254L,62255L,62256L,62257L, +62258L,62259L,62260L,62261L,62262L,62263L,62264L,62265L,62266L,62267L, +62268L,62269L,62270L,62271L,62272L,62273L,62274L,62275L,62276L,62277L, +62278L,62279L,62280L,62281L,62282L,62283L,62284L,62285L,62286L,62287L, +62288L,62289L,62290L,62291L,62292L,62293L,62294L,62295L,62296L,62297L, +62298L,62299L,62300L,62301L,62302L,62303L,62304L,62305L,62306L,62307L, +62308L,62309L,62310L,62311L,62312L,62313L,62314L,62315L,62316L,62317L, +62318L,62319L,62320L,62321L,62322L,62323L,62324L,62325L,62326L,62327L, +62328L,62329L,62330L,62331L,62332L,62333L,62334L,62335L,62336L,62337L, +62338L,62339L,62340L,62341L,62342L,62343L,62344L,62345L,62346L,62347L, +62348L,62349L,62350L,62351L,62352L,62353L,62354L,62355L,62356L,62357L, +62358L,62359L,62360L,62361L,62362L,62363L,62364L,62365L,62366L,62367L, +62368L,62369L,62370L,62371L,62372L,62373L,62374L,62375L,62376L,62377L, +62378L,62379L,62380L,62381L,62382L,62383L,62384L,62385L,62386L,62387L, +62388L,62389L,62390L,62391L,62392L,62393L,62394L,62395L,62396L,62397L, +62398L,62399L,62400L,62401L,62402L,62403L,62404L,62405L,62406L,62407L, +62408L,62409L,62410L,62411L,62412L,62413L,62414L,62415L,62416L,62417L, +62418L,62419L,62420L,62421L,62422L,62423L,62424L,62425L,62426L,62427L, +62428L,62429L,62430L,62431L,62432L,62433L,62434L,62435L,62436L,62437L, +62438L,62439L,62440L,62441L,62442L,62443L,62444L,62445L,62446L,62447L, +62448L,62449L,62450L,62451L,62452L,62453L,62454L,62455L,62456L,62457L, +62458L,62459L,62460L,62461L,62462L,62463L,62464L,62465L,62466L,62467L, +62468L,62469L,62470L,62471L,62472L,62473L,62474L,62475L,62476L,62477L, +62478L,62479L,62480L,62481L,62482L,62483L,62484L,62485L,62486L,62487L, +62488L,62489L,62490L,62491L,62492L,62493L,62494L,62495L,62496L,62497L, +62498L,62499L,62500L,62501L,62502L,62503L,62504L,62505L,62506L,62507L, +62508L,62509L,62510L,62511L,62512L,62513L,62514L,62515L,62516L,62517L, +62518L,62519L,62520L,62521L,62522L,62523L,62524L,62525L,62526L,62527L, +62528L,62529L,62530L,62531L,62532L,62533L,62534L,62535L,62536L,62537L, +62538L,62539L,62540L,62541L,62542L,62543L,62544L,62545L,62546L,62547L, +62548L,62549L,62550L,62551L,62552L,62553L,62554L,62555L,62556L,62557L, +62558L,62559L,62560L,62561L,62562L,62563L,62564L,62565L,62566L,62567L, +62568L,62569L,62570L,62571L,62572L,62573L,62574L,62575L,62576L,62577L, +62578L,62579L,62580L,62581L,62582L,62583L,62584L,62585L,62586L,62587L, +62588L,62589L,62590L,62591L,62592L,62593L,62594L,62595L,62596L,62597L, +62598L,62599L,62600L,62601L,62602L,62603L,62604L,62605L,62606L,62607L, +62608L,62609L,62610L,62611L,62612L,62613L,62614L,62615L,62616L,62617L, +62618L,62619L,62620L,62621L,62622L,62623L,62624L,62625L,62626L,62627L, +62628L,62629L,62630L,62631L,62632L,62633L,62634L,62635L,62636L,62637L, +62638L,62639L,62640L,62641L,62642L,62643L,62644L,62645L,62646L,62647L, +62648L,62649L,62650L,62651L,62652L,62653L,62654L,62655L,62656L,62657L, +62658L,62659L,62660L,62661L,62662L,62663L,62664L,62665L,62666L,62667L, +62668L,62669L,62670L,62671L,62672L,62673L,62674L,62675L,62676L,62677L, +62678L,62679L,62680L,62681L,62682L,62683L,62684L,62685L,62686L,62687L, +62688L,62689L,62690L,62691L,62692L,62693L,62694L,62695L,62696L,62697L, +62698L,62699L,62700L,62701L,62702L,62703L,62704L,62705L,62706L,62707L, +62708L,62709L,62710L,62711L,62712L,62713L,62714L,62715L,62716L,62717L, +62718L,62719L,62720L,62721L,62722L,62723L,62724L,62725L,62726L,62727L, +62728L,62729L,62730L,62731L,62732L,62733L,62734L,62735L,62736L,62737L, +62738L,62739L,62740L,62741L,62742L,62743L,62744L,62745L,62746L,62747L, +62748L,62749L,62750L,62751L,62752L,62753L,62754L,62755L,62756L,62757L, +62758L,62759L,62760L,62761L,62762L,62763L,62764L,62765L,62766L,62767L, +62768L,62769L,62770L,62771L,62772L,62773L,62774L,62775L,62776L,62777L, +62778L,62779L,62780L,62781L,62782L,62783L,62784L,62785L,62786L,62787L, +62788L,62789L,62790L,62791L,62792L,62793L,62794L,62795L,62796L,62797L, +62798L,62799L,62800L,62801L,62802L,62803L,62804L,62805L,62806L,62807L, +62808L,62809L,62810L,62811L,62812L,62813L,62814L,62815L,62816L,62817L, +62818L,62819L,62820L,62821L,62822L,62823L,62824L,62825L,62826L,62827L, +62828L,62829L,62830L,62831L,62832L,62833L,62834L,62835L,62836L,62837L, +62838L,62839L,62840L,62841L,62842L,62843L,62844L,62845L,62846L,62847L, +62848L,62849L,62850L,62851L,62852L,62853L,62854L,62855L,62856L,62857L, +62858L,62859L,62860L,62861L,62862L,62863L,62864L,62865L,62866L,62867L, +62868L,62869L,62870L,62871L,62872L,62873L,62874L,62875L,62876L,62877L, +62878L,62879L,62880L,62881L,62882L,62883L,62884L,62885L,62886L,62887L, +62888L,62889L,62890L,62891L,62892L,62893L,62894L,62895L,62896L,62897L, +62898L,62899L,62900L,62901L,62902L,62903L,62904L,62905L,62906L,62907L, +62908L,62909L,62910L,62911L,62912L,62913L,62914L,62915L,62916L,62917L, +62918L,62919L,62920L,62921L,62922L,62923L,62924L,62925L,62926L,62927L, +62928L,62929L,62930L,62931L,62932L,62933L,62934L,62935L,62936L,62937L, +62938L,62939L,62940L,62941L,62942L,62943L,62944L,62945L,62946L,62947L, +62948L,62949L,62950L,62951L,62952L,62953L,62954L,62955L,62956L,62957L, +62958L,62959L,62960L,62961L,62962L,62963L,62964L,62965L,62966L,62967L, +62968L,62969L,62970L,62971L,62972L,62973L,62974L,62975L,62976L,62977L, +62978L,62979L,62980L,62981L,62982L,62983L,62984L,62985L,62986L,62987L, +62988L,62989L,62990L,62991L,62992L,62993L,62994L,62995L,62996L,62997L, +62998L,62999L,63000L,63001L,63002L,63003L,63004L,63005L,63006L,63007L, +63008L,63009L,63010L,63011L,63012L,63013L,63014L,63015L,63016L,63017L, +63018L,63019L,63020L,63021L,63022L,63023L,63024L,63025L,63026L,63027L, +63028L,63029L,63030L,63031L,63032L,63033L,63034L,63035L,63036L,63037L, +63038L,63039L,63040L,63041L,63042L,63043L,63044L,63045L,63046L,63047L, +63048L,63049L,63050L,63051L,63052L,63053L,63054L,63055L,63056L,63057L, +63058L,63059L,63060L,63061L,63062L,63063L,63064L,63065L,63066L,63067L, +63068L,63069L,63070L,63071L,63072L,63073L,63074L,63075L,63076L,63077L, +63078L,63079L,63080L,63081L,63082L,63083L,63084L,63085L,63086L,63087L, +63088L,63089L,63090L,63091L,63092L,63093L,63094L,63095L,63096L,63097L, +63098L,63099L,63100L,63101L,63102L,63103L,63104L,63105L,63106L,63107L, +63108L,63109L,63110L,63111L,63112L,63113L,63114L,63115L,63116L,63117L, +63118L,63119L,63120L,63121L,63122L,63123L,63124L,63125L,63126L,63127L, +63128L,63129L,63130L,63131L,63132L,63133L,63134L,63135L,63136L,63137L, +63138L,63139L,63140L,63141L,63142L,63143L,63144L,63145L,63146L,63147L, +63148L,63149L,63150L,63151L,63152L,63153L,63154L,63155L,63156L,63157L, +63158L,63159L,63160L,63161L,63162L,63163L,63164L,63165L,63166L,63167L, +63168L,63169L,63170L,63171L,63172L,63173L,63174L,63175L,63176L,63177L, +63178L,63179L,63180L,63181L,63182L,63183L,63184L,63185L,63186L,63187L, +63188L,63189L,63190L,63191L,63192L,63193L,63194L,63195L,63196L,63197L, +63198L,63199L,63200L,63201L,63202L,63203L,63204L,63205L,63206L,63207L, +63208L,63209L,63210L,63211L,63212L,63213L,63214L,63215L,63216L,63217L, +63218L,63219L,63220L,63221L,63222L,63223L,63224L,63225L,63226L,63227L, +63228L,63229L,63230L,63231L,63232L,63233L,63234L,63235L,63236L,63237L, +63238L,63239L,63240L,63241L,63242L,63243L,63244L,63245L,63246L,63247L, +63248L,63249L,63250L,63251L,63252L,63253L,63254L,63255L,63256L,63257L, +63258L,63259L,63260L,63261L,63262L,63263L,63264L,63265L,63266L,63267L, +63268L,63269L,63270L,63271L,63272L,63273L,63274L,63275L,63276L,63277L, +63278L,63279L,63280L,63281L,63282L,63283L,63284L,63285L,63286L,63287L, +63288L,63289L,63290L,63291L,63292L,63293L,63294L,63295L,63296L,63297L, +63298L,63299L,63300L,63301L,63302L,63303L,63304L,63305L,63306L,63307L, +63308L,63309L,63310L,63311L,63312L,63313L,63314L,63315L,63316L,63317L, +63318L,63319L,63320L,63321L,63322L,63323L,63324L,63325L,63326L,63327L, +63328L,63329L,63330L,63331L,63332L,63333L,63334L,63335L,63336L,63337L, +63338L,63339L,63340L,63341L,63342L,63343L,63344L,63345L,63346L,63347L, +63348L,63349L,63350L,63351L,63352L,63353L,63354L,63355L,63356L,63357L, +63358L,63359L,63360L,63361L,63362L,63363L,63364L,63365L,63366L,63367L, +63368L,63369L,63370L,63371L,63372L,63373L,63374L,63375L,63376L,63377L, +63378L,63379L,63380L,63381L,63382L,63383L,63384L,63385L,63386L,63387L, +63388L,63389L,63390L,63391L,63392L,63393L,63394L,63395L,63396L,63397L, +63398L,63399L,63400L,63401L,63402L,63403L,63404L,63405L,63406L,63407L, +63408L,63409L,63410L,63411L,63412L,63413L,63414L,63415L,63416L,63417L, +63418L,63419L,63420L,63421L,63422L,63423L,63424L,63425L,63426L,63427L, +63428L,63429L,63430L,63431L,63432L,63433L,63434L,63435L,63436L,63437L, +63438L,63439L,63440L,63441L,63442L,63443L,63444L,63445L,63446L,63447L, +63448L,63449L,63450L,63451L,63452L,63453L,63454L,63455L,63456L,63457L, +63458L,63459L,63460L,63461L,63462L,63463L,63464L,63465L,63466L,63467L, +63468L,63469L,63470L,63471L,63472L,63473L,63474L,63475L,63476L,63477L, +63478L,63479L,63480L,63481L,63482L,63483L,63484L,63485L,63486L,63487L, +63488L,63489L,63490L,63491L,63492L,63493L,63494L,63495L,63496L,63497L, +63498L,63499L,63500L,63501L,63502L,63503L,63504L,63505L,63506L,63507L, +63508L,63509L,63510L,63511L,63512L,63513L,63514L,63515L,63516L,63517L, +63518L,63519L,63520L,63521L,63522L,63523L,63524L,63525L,63526L,63527L, +63528L,63529L,63530L,63531L,63532L,63533L,63534L,63535L,63536L,63537L, +63538L,63539L,63540L,63541L,63542L,63543L,63544L,63545L,63546L,63547L, +63548L,63549L,63550L,63551L,63552L,63553L,63554L,63555L,63556L,63557L, +63558L,63559L,63560L,63561L,63562L,63563L,63564L,63565L,63566L,63567L, +63568L,63569L,63570L,63571L,63572L,63573L,63574L,63575L,63576L,63577L, +63578L,63579L,63580L,63581L,63582L,63583L,63584L,63585L,63586L,63587L, +63588L,63589L,63590L,63591L,63592L,63593L,63594L,63595L,63596L,63597L, +63598L,63599L,63600L,63601L,63602L,63603L,63604L,63605L,63606L,63607L, +63608L,63609L,63610L,63611L,63612L,63613L,63614L,63615L,63616L,63617L, +63618L,63619L,63620L,63621L,63622L,63623L,63624L,63625L,63626L,63627L, +63628L,63629L,63630L,63631L,63632L,63633L,63634L,63635L,63636L,63637L, +63638L,63639L,63640L,63641L,63642L,63643L,63644L,63645L,63646L,63647L, +63648L,63649L,63650L,63651L,63652L,63653L,63654L,63655L,63656L,63657L, +63658L,63659L,63660L,63661L,63662L,63663L,63664L,63665L,63666L,63667L, +63668L,63669L,63670L,63671L,63672L,63673L,63674L,63675L,63676L,63677L, +63678L,63679L,63680L,63681L,63682L,63683L,63684L,63685L,63686L,63687L, +63688L,63689L,63690L,63691L,63692L,63693L,63694L,63695L,63696L,63697L, +63698L,63699L,63700L,63701L,63702L,63703L,63704L,63705L,63706L,63707L, +63708L,63709L,63710L,63711L,63712L,63713L,63714L,63715L,63716L,63717L, +63718L,63719L,63720L,63721L,63722L,63723L,63724L,63725L,63726L,63727L, +63728L,63729L,63730L,63731L,63732L,63733L,63734L,63735L,63736L,63737L, +63738L,63739L,63740L,63741L,63742L,63743L,63744L,63745L,63746L,63747L, +63748L,63749L,63750L,63751L,63752L,63753L,63754L,63755L,63756L,63757L, +63758L,63759L,63760L,63761L,63762L,63763L,63764L,63765L,63766L,63767L, +63768L,63769L,63770L,63771L,63772L,63773L,63774L,63775L,63776L,63777L, +63778L,63779L,63780L,63781L,63782L,63783L,63784L,63785L,63786L,63787L, +63788L,63789L,63790L,63791L,63792L,63793L,63794L,63795L,63796L,63797L, +63798L,63799L,63800L,63801L,63802L,63803L,63804L,63805L,63806L,63807L, +63808L,63809L,63810L,63811L,63812L,63813L,63814L,63815L,63816L,63817L, +63818L,63819L,63820L,63821L,63822L,63823L,63824L,63825L,63826L,63827L, +63828L,63829L,63830L,63831L,63832L,63833L,63834L,63835L,63836L,63837L, +63838L,63839L,63840L,63841L,63842L,63843L,63844L,63845L,63846L,63847L, +63848L,63849L,63850L,63851L,63852L,63853L,63854L,63855L,63856L,63857L, +63858L,63859L,63860L,63861L,63862L,63863L,63864L,63865L,63866L,63867L, +63868L,63869L,63870L,63871L,63872L,63873L,63874L,63875L,63876L,63877L, +63878L,63879L,63880L,63881L,63882L,63883L,63884L,63885L,63886L,63887L, +63888L,63889L,63890L,63891L,63892L,63893L,63894L,63895L,63896L,63897L, +63898L,63899L,63900L,63901L,63902L,63903L,63904L,63905L,63906L,63907L, +63908L,63909L,63910L,63911L,63912L,63913L,63914L,63915L,63916L,63917L, +63918L,63919L,63920L,63921L,63922L,63923L,63924L,63925L,63926L,63927L, +63928L,63929L,63930L,63931L,63932L,63933L,63934L,63935L,63936L,63937L, +63938L,63939L,63940L,63941L,63942L,63943L,63944L,63945L,63946L,63947L, +63948L,63949L,63950L,63951L,63952L,63953L,63954L,63955L,63956L,63957L, +63958L,63959L,63960L,63961L,63962L,63963L,63964L,63965L,63966L,63967L, +63968L,63969L,63970L,63971L,63972L,63973L,63974L,63975L,63976L,63977L, +63978L,63979L,63980L,63981L,63982L,63983L,63984L,63985L,63986L,63987L, +63988L,63989L,63990L,63991L,63992L,63993L,63994L,63995L,63996L,63997L, +63998L,63999L,64000L,64001L,64002L,64003L,64004L,64005L,64006L,64007L, +64008L,64009L,64010L,64011L,64012L,64013L,64014L,64015L,64016L,64017L, +64018L,64019L,64020L,64021L,64022L,64023L,64024L,64025L,64026L,64027L, +64028L,64029L,64030L,64031L,64032L,64033L,64034L,64035L,64036L,64037L, +64038L,64039L,64040L,64041L,64042L,64043L,64044L,64045L,64046L,64047L, +64048L,64049L,64050L,64051L,64052L,64053L,64054L,64055L,64056L,64057L, +64058L,64059L,64060L,64061L,64062L,64063L,64064L,64065L,64066L,64067L, +64068L,64069L,64070L,64071L,64072L,64073L,64074L,64075L,64076L,64077L, +64078L,64079L,64080L,64081L,64082L,64083L,64084L,64085L,64086L,64087L, +64088L,64089L,64090L,64091L,64092L,64093L,64094L,64095L,64096L,64097L, +64098L,64099L,64100L,64101L,64102L,64103L,64104L,64105L,64106L,64107L, +64108L,64109L,64110L,64111L,64112L,64113L,64114L,64115L,64116L,64117L, +64118L,64119L,64120L,64121L,64122L,64123L,64124L,64125L,64126L,64127L, +64128L,64129L,64130L,64131L,64132L,64133L,64134L,64135L,64136L,64137L, +64138L,64139L,64140L,64141L,64142L,64143L,64144L,64145L,64146L,64147L, +64148L,64149L,64150L,64151L,64152L,64153L,64154L,64155L,64156L,64157L, +64158L,64159L,64160L,64161L,64162L,64163L,64164L,64165L,64166L,64167L, +64168L,64169L,64170L,64171L,64172L,64173L,64174L,64175L,64176L,64177L, +64178L,64179L,64180L,64181L,64182L,64183L,64184L,64185L,64186L,64187L, +64188L,64189L,64190L,64191L,64192L,64193L,64194L,64195L,64196L,64197L, +64198L,64199L,64200L,64201L,64202L,64203L,64204L,64205L,64206L,64207L, +64208L,64209L,64210L,64211L,64212L,64213L,64214L,64215L,64216L,64217L, +64218L,64219L,64220L,64221L,64222L,64223L,64224L,64225L,64226L,64227L, +64228L,64229L,64230L,64231L,64232L,64233L,64234L,64235L,64236L,64237L, +64238L,64239L,64240L,64241L,64242L,64243L,64244L,64245L,64246L,64247L, +64248L,64249L,64250L,64251L,64252L,64253L,64254L,64255L,64256L,64257L, +64258L,64259L,64260L,64261L,64262L,64263L,64264L,64265L,64266L,64267L, +64268L,64269L,64270L,64271L,64272L,64273L,64274L,64275L,64276L,64277L, +64278L,64279L,64280L,64281L,64282L,64283L,64284L,64285L,64286L,64287L, +64288L,64289L,64290L,64291L,64292L,64293L,64294L,64295L,64296L,64297L, +64298L,64299L,64300L,64301L,64302L,64303L,64304L,64305L,64306L,64307L, +64308L,64309L,64310L,64311L,64312L,64313L,64314L,64315L,64316L,64317L, +64318L,64319L,64320L,64321L,64322L,64323L,64324L,64325L,64326L,64327L, +64328L,64329L,64330L,64331L,64332L,64333L,64334L,64335L,64336L,64337L, +64338L,64339L,64340L,64341L,64342L,64343L,64344L,64345L,64346L,64347L, +64348L,64349L,64350L,64351L,64352L,64353L,64354L,64355L,64356L,64357L, +64358L,64359L,64360L,64361L,64362L,64363L,64364L,64365L,64366L,64367L, +64368L,64369L,64370L,64371L,64372L,64373L,64374L,64375L,64376L,64377L, +64378L,64379L,64380L,64381L,64382L,64383L,64384L,64385L,64386L,64387L, +64388L,64389L,64390L,64391L,64392L,64393L,64394L,64395L,64396L,64397L, +64398L,64399L,64400L,64401L,64402L,64403L,64404L,64405L,64406L,64407L, +64408L,64409L,64410L,64411L,64412L,64413L,64414L,64415L,64416L,64417L, +64418L,64419L,64420L,64421L,64422L,64423L,64424L,64425L,64426L,64427L, +64428L,64429L,64430L,64431L,64432L,64433L,64434L,64435L,64436L,64437L, +64438L,64439L,64440L,64441L,64442L,64443L,64444L,64445L,64446L,64447L, +64448L,64449L,64450L,64451L,64452L,64453L,64454L,64455L,64456L,64457L, +64458L,64459L,64460L,64461L,64462L,64463L,64464L,64465L,64466L,64467L, +64468L,64469L,64470L,64471L,64472L,64473L,64474L,64475L,64476L,64477L, +64478L,64479L,64480L,64481L,64482L,64483L,64484L,64485L,64486L,64487L, +64488L,64489L,64490L,64491L,64492L,64493L,64494L,64495L,64496L,64497L, +64498L,64499L,64500L,64501L,64502L,64503L,64504L,64505L,64506L,64507L, +64508L,64509L,64510L,64511L,64512L,64513L,64514L,64515L,64516L,64517L, +64518L,64519L,64520L,64521L,64522L,64523L,64524L,64525L,64526L,64527L, +64528L,64529L,64530L,64531L,64532L,64533L,64534L,64535L,64536L,64537L, +64538L,64539L,64540L,64541L,64542L,64543L,64544L,64545L,64546L,64547L, +64548L,64549L,64550L,64551L,64552L,64553L,64554L,64555L,64556L,64557L, +64558L,64559L,64560L,64561L,64562L,64563L,64564L,64565L,64566L,64567L, +64568L,64569L,64570L,64571L,64572L,64573L,64574L,64575L,64576L,64577L, +64578L,64579L,64580L,64581L,64582L,64583L,64584L,64585L,64586L,64587L, +64588L,64589L,64590L,64591L,64592L,64593L,64594L,64595L,64596L,64597L, +64598L,64599L,64600L,64601L,64602L,64603L,64604L,64605L,64606L,64607L, +64608L,64609L,64610L,64611L,64612L,64613L,64614L,64615L,64616L,64617L, +64618L,64619L,64620L,64621L,64622L,64623L,64624L,64625L,64626L,64627L, +64628L,64629L,64630L,64631L,64632L,64633L,64634L,64635L,64636L,64637L, +64638L,64639L,64640L,64641L,64642L,64643L,64644L,64645L,64646L,64647L, +64648L,64649L,64650L,64651L,64652L,64653L,64654L,64655L,64656L,64657L, +64658L,64659L,64660L,64661L,64662L,64663L,64664L,64665L,64666L,64667L, +64668L,64669L,64670L,64671L,64672L,64673L,64674L,64675L,64676L,64677L, +64678L,64679L,64680L,64681L,64682L,64683L,64684L,64685L,64686L,64687L, +64688L,64689L,64690L,64691L,64692L,64693L,64694L,64695L,64696L,64697L, +64698L,64699L,64700L,64701L,64702L,64703L,64704L,64705L,64706L,64707L, +64708L,64709L,64710L,64711L,64712L,64713L,64714L,64715L,64716L,64717L, +64718L,64719L,64720L,64721L,64722L,64723L,64724L,64725L,64726L,64727L, +64728L,64729L,64730L,64731L,64732L,64733L,64734L,64735L,64736L,64737L, +64738L,64739L,64740L,64741L,64742L,64743L,64744L,64745L,64746L,64747L, +64748L,64749L,64750L,64751L,64752L,64753L,64754L,64755L,64756L,64757L, +64758L,64759L,64760L,64761L,64762L,64763L,64764L,64765L,64766L,64767L, +64768L,64769L,64770L,64771L,64772L,64773L,64774L,64775L,64776L,64777L, +64778L,64779L,64780L,64781L,64782L,64783L,64784L,64785L,64786L,64787L, +64788L,64789L,64790L,64791L,64792L,64793L,64794L,64795L,64796L,64797L, +64798L,64799L,64800L,64801L,64802L,64803L,64804L,64805L,64806L,64807L, +64808L,64809L,64810L,64811L,64812L,64813L,64814L,64815L,64816L,64817L, +64818L,64819L,64820L,64821L,64822L,64823L,64824L,64825L,64826L,64827L, +64828L,64829L,64830L,64831L,64832L,64833L,64834L,64835L,64836L,64837L, +64838L,64839L,64840L,64841L,64842L,64843L,64844L,64845L,64846L,64847L, +64848L,64849L,64850L,64851L,64852L,64853L,64854L,64855L,64856L,64857L, +64858L,64859L,64860L,64861L,64862L,64863L,64864L,64865L,64866L,64867L, +64868L,64869L,64870L,64871L,64872L,64873L,64874L,64875L,64876L,64877L, +64878L,64879L,64880L,64881L,64882L,64883L,64884L,64885L,64886L,64887L, +64888L,64889L,64890L,64891L,64892L,64893L,64894L,64895L,64896L,64897L, +64898L,64899L,64900L,64901L,64902L,64903L,64904L,64905L,64906L,64907L, +64908L,64909L,64910L,64911L,64912L,64913L,64914L,64915L,64916L,64917L, +64918L,64919L,64920L,64921L,64922L,64923L,64924L,64925L,64926L,64927L, +64928L,64929L,64930L,64931L,64932L,64933L,64934L,64935L,64936L,64937L, +64938L,64939L,64940L,64941L,64942L,64943L,64944L,64945L,64946L,64947L, +64948L,64949L,64950L,64951L,64952L,64953L,64954L,64955L,64956L,64957L, +64958L,64959L,64960L,64961L,64962L,64963L,64964L,64965L,64966L,64967L, +64968L,64969L,64970L,64971L,64972L,64973L,64974L,64975L,64976L,64977L, +64978L,64979L,64980L,64981L,64982L,64983L,64984L,64985L,64986L,64987L, +64988L,64989L,64990L,64991L,64992L,64993L,64994L,64995L,64996L,64997L, +64998L,64999L,65000L,65001L,65002L,65003L,65004L,65005L,65006L,65007L, +65008L,65009L,65010L,65011L,65012L,65013L,65014L,65015L,65016L,65017L, +65018L,65019L,65020L,65021L,65022L,65023L,65024L,65025L,65026L,65027L, +65028L,65029L,65030L,65031L,65032L,65033L,65034L,65035L,65036L,65037L, +65038L,65039L,65040L,65041L,65042L,65043L,65044L,65045L,65046L,65047L, +65048L,65049L,65050L,65051L,65052L,65053L,65054L,65055L,65056L,65057L, +65058L,65059L,65060L,65061L,65062L,65063L,65064L,65065L,65066L,65067L, +65068L,65069L,65070L,65071L,65072L,65073L,65074L,65075L,65076L,65077L, +65078L,65079L,65080L,65081L,65082L,65083L,65084L,65085L,65086L,65087L, +65088L,65089L,65090L,65091L,65092L,65093L,65094L,65095L,65096L,65097L, +65098L,65099L,65100L,65101L,65102L,65103L,65104L,65105L,65106L,65107L, +65108L,65109L,65110L,65111L,65112L,65113L,65114L,65115L,65116L,65117L, +65118L,65119L,65120L,65121L,65122L,65123L,65124L,65125L,65126L,65127L, +65128L,65129L,65130L,65131L,65132L,65133L,65134L,65135L,65136L,65137L, +65138L,65139L,65140L,65141L,65142L,65143L,65144L,65145L,65146L,65147L, +65148L,65149L,65150L,65151L,65152L,65153L,65154L,65155L,65156L,65157L, +65158L,65159L,65160L,65161L,65162L,65163L,65164L,65165L,65166L,65167L, +65168L,65169L,65170L,65171L,65172L,65173L,65174L,65175L,65176L,65177L, +65178L,65179L,65180L,65181L,65182L,65183L,65184L,65185L,65186L,65187L, +65188L,65189L,65190L,65191L,65192L,65193L,65194L,65195L,65196L,65197L, +65198L,65199L,65200L,65201L,65202L,65203L,65204L,65205L,65206L,65207L, +65208L,65209L,65210L,65211L,65212L,65213L,65214L,65215L,65216L,65217L, +65218L,65219L,65220L,65221L,65222L,65223L,65224L,65225L,65226L,65227L, +65228L,65229L,65230L,65231L,65232L,65233L,65234L,65235L,65236L,65237L, +65238L,65239L,65240L,65241L,65242L,65243L,65244L,65245L,65246L,65247L, +65248L,65249L,65250L,65251L,65252L,65253L,65254L,65255L,65256L,65257L, +65258L,65259L,65260L,65261L,65262L,65263L,65264L,65265L,65266L,65267L, +65268L,65269L,65270L,65271L,65272L,65273L,65274L,65275L,65276L,65277L, +65278L,65279L,65280L,65281L,65282L,65283L,65284L,65285L,65286L,65287L, +65288L,65289L,65290L,65291L,65292L,65293L,65294L,65295L,65296L,65297L, +65298L,65299L,65300L,65301L,65302L,65303L,65304L,65305L,65306L,65307L, +65308L,65309L,65310L,65311L,65312L,65313L,65314L,65315L,65316L,65317L, +65318L,65319L,65320L,65321L,65322L,65323L,65324L,65325L,65326L,65327L, +65328L,65329L,65330L,65331L,65332L,65333L,65334L,65335L,65336L,65337L, +65338L,65339L,65340L,65341L,65342L,65343L,65344L,65313L,65314L,65315L, +65316L,65317L,65318L,65319L,65320L,65321L,65322L,65323L,65324L,65325L, +65326L,65327L,65328L,65329L,65330L,65331L,65332L,65333L,65334L,65335L, +65336L,65337L,65338L,65371L,65372L,65373L,65374L,65375L,65376L,65377L, +65378L,65379L,65380L,65381L,65382L,65383L,65384L,65385L,65386L,65387L, +65388L,65389L,65390L,65391L,65392L,65393L,65394L,65395L,65396L,65397L, +65398L,65399L,65400L,65401L,65402L,65403L,65404L,65405L,65406L,65407L, +65408L,65409L,65410L,65411L,65412L,65413L,65414L,65415L,65416L,65417L, +65418L,65419L,65420L,65421L,65422L,65423L,65424L,65425L,65426L,65427L, +65428L,65429L,65430L,65431L,65432L,65433L,65434L,65435L,65436L,65437L, +65438L,65439L,65440L,65441L,65442L,65443L,65444L,65445L,65446L,65447L, +65448L,65449L,65450L,65451L,65452L,65453L,65454L,65455L,65456L,65457L, +65458L,65459L,65460L,65461L,65462L,65463L,65464L,65465L,65466L,65467L, +65468L,65469L,65470L,65471L,65472L,65473L,65474L,65475L,65476L,65477L, +65478L,65479L,65480L,65481L,65482L,65483L,65484L,65485L,65486L,65487L, +65488L,65489L,65490L,65491L,65492L,65493L,65494L,65495L,65496L,65497L, +65498L,65499L,65500L,65501L,65502L,65503L,65504L,65505L,65506L,65507L, +65508L,65509L,65510L,65511L,65512L,65513L,65514L,65515L,65516L,65517L, +65518L,65519L,65520L,65521L,65522L,65523L,65524L,65525L,65526L,65527L, +65528L,65529L,65530L,65531L,65532L,65533L,65534L,65535L, }; #endif #line 1 "duk_util_bitdecoder.c" @@ -85909,13 +90588,13 @@ const duk_uint16_t duk_unicode_re_canon_lookup[65536] = { * Bitstream decoder. */ -/* include removed: duk_internal.h */ +/* #include duk_internal.h -> already included */ /* Decode 'bits' bits from the input stream (bits must be 1...24). * When reading past bitstream end, zeroes are shifted in. The result * is signed to match duk_bd_decode_flagged. */ -DUK_INTERNAL duk_int32_t duk_bd_decode(duk_bitdecoder_ctx *ctx, duk_small_int_t bits) { +DUK_INTERNAL duk_uint32_t duk_bd_decode(duk_bitdecoder_ctx *ctx, duk_small_int_t bits) { duk_small_int_t shift; duk_uint32_t mask; duk_uint32_t tmp; @@ -85960,27 +90639,119 @@ DUK_INTERNAL duk_int32_t duk_bd_decode(duk_bitdecoder_ctx *ctx, duk_small_int_t return tmp; } -DUK_INTERNAL duk_small_int_t duk_bd_decode_flag(duk_bitdecoder_ctx *ctx) { - return (duk_small_int_t) duk_bd_decode(ctx, 1); +DUK_INTERNAL duk_small_uint_t duk_bd_decode_flag(duk_bitdecoder_ctx *ctx) { + return (duk_small_uint_t) duk_bd_decode(ctx, 1); } /* Decode a one-bit flag, and if set, decode a value of 'bits', otherwise return * default value. Return value is signed so that negative marker value can be * used by caller as a "not present" value. */ -DUK_INTERNAL duk_int32_t duk_bd_decode_flagged(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_int32_t def_value) { +DUK_INTERNAL duk_uint32_t duk_bd_decode_flagged(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_uint32_t def_value) { if (duk_bd_decode_flag(ctx)) { - return (duk_int32_t) duk_bd_decode(ctx, bits); + return duk_bd_decode(ctx, bits); } else { return def_value; } } + +/* Shared varint encoding. Match dukutil.py BitEncode.varuint(). */ +DUK_INTERNAL duk_uint32_t duk_bd_decode_varuint(duk_bitdecoder_ctx *ctx) { + duk_small_uint_t t; + + /* The bit encoding choices here are based on manual testing against + * the actual varuints generated by genbuiltins.py. + */ + switch (duk_bd_decode(ctx, 2)) { + case 0: + return 0; /* [0,0] */ + case 1: + return duk_bd_decode(ctx, 2) + 1; /* [1,4] */ + case 2: + return duk_bd_decode(ctx, 5) + 5; /* [5,36] */ + default: + t = duk_bd_decode(ctx, 7); + if (t == 0) { + return duk_bd_decode(ctx, 20); + } + return (t - 1) + 37; /* [37,163] */ + } +} + +/* Decode a bit packed string from a custom format used by genbuiltins.py. + * This function is here because it's used for both heap and thread inits. + * Caller must supply the output buffer whose size is NOT checked! + */ + +#define DUK__BITPACK_LETTER_LIMIT 26 +#define DUK__BITPACK_LOOKUP1 26 +#define DUK__BITPACK_LOOKUP2 27 +#define DUK__BITPACK_SWITCH1 28 +#define DUK__BITPACK_SWITCH 29 +#define DUK__BITPACK_UNUSED1 30 +#define DUK__BITPACK_EIGHTBIT 31 + +DUK_LOCAL const duk_uint8_t duk__bitpacked_lookup[16] = { + DUK_ASC_0, DUK_ASC_1, DUK_ASC_2, DUK_ASC_3, + DUK_ASC_4, DUK_ASC_5, DUK_ASC_6, DUK_ASC_7, + DUK_ASC_8, DUK_ASC_9, DUK_ASC_UNDERSCORE, DUK_ASC_SPACE, + 0xff, 0x80, DUK_ASC_DOUBLEQUOTE, DUK_ASC_LCURLY +}; + +DUK_INTERNAL duk_small_uint_t duk_bd_decode_bitpacked_string(duk_bitdecoder_ctx *bd, duk_uint8_t *out) { + duk_small_uint_t len; + duk_small_uint_t mode; + duk_small_uint_t t; + duk_small_uint_t i; + + len = duk_bd_decode(bd, 5); + if (len == 31) { + len = duk_bd_decode(bd, 8); /* Support up to 256 bytes; rare. */ + } + + mode = 32; /* 0 = uppercase, 32 = lowercase (= 'a' - 'A') */ + for (i = 0; i < len; i++) { + t = duk_bd_decode(bd, 5); + if (t < DUK__BITPACK_LETTER_LIMIT) { + t = t + DUK_ASC_UC_A + mode; + } else if (t == DUK__BITPACK_LOOKUP1) { + t = duk__bitpacked_lookup[duk_bd_decode(bd, 3)]; + } else if (t == DUK__BITPACK_LOOKUP2) { + t = duk__bitpacked_lookup[8 + duk_bd_decode(bd, 3)]; + } else if (t == DUK__BITPACK_SWITCH1) { + t = duk_bd_decode(bd, 5); + DUK_ASSERT_DISABLE(t >= 0); /* unsigned */ + DUK_ASSERT(t <= 25); + t = t + DUK_ASC_UC_A + (mode ^ 32); + } else if (t == DUK__BITPACK_SWITCH) { + mode = mode ^ 32; + t = duk_bd_decode(bd, 5); + DUK_ASSERT_DISABLE(t >= 0); + DUK_ASSERT(t <= 25); + t = t + DUK_ASC_UC_A + mode; + } else if (t == DUK__BITPACK_EIGHTBIT) { + t = duk_bd_decode(bd, 8); + } + out[i] = (duk_uint8_t) t; + } + + return len; +} + +/* automatic undefs */ +#undef DUK__BITPACK_EIGHTBIT +#undef DUK__BITPACK_LETTER_LIMIT +#undef DUK__BITPACK_LOOKUP1 +#undef DUK__BITPACK_LOOKUP2 +#undef DUK__BITPACK_SWITCH +#undef DUK__BITPACK_SWITCH1 +#undef DUK__BITPACK_UNUSED1 #line 1 "duk_util_bitencoder.c" /* * Bitstream encoder. */ -/* include removed: duk_internal.h */ +/* #include duk_internal.h -> already included */ DUK_INTERNAL void duk_be_encode(duk_bitencoder_ctx *ctx, duk_uint32_t data, duk_small_int_t bits) { duk_uint8_t tmp; @@ -86024,7 +90795,7 @@ DUK_INTERNAL void duk_be_finish(duk_bitencoder_ctx *ctx) { * Fast buffer writer with spare management. */ -/* include removed: duk_internal.h */ +/* #include duk_internal.h -> already included */ /* * Macro support functions (use only macros in calling code) @@ -86063,7 +90834,7 @@ DUK_INTERNAL void duk_bw_init_pushbuf(duk_hthread *thr, duk_bufwriter_ctx *bw_ct ctx = (duk_context *) thr; (void) duk_push_dynamic_buffer(ctx, buf_size); - bw_ctx->buf = (duk_hbuffer_dynamic *) duk_get_hbuffer(ctx, -1); + bw_ctx->buf = (duk_hbuffer_dynamic *) duk_known_hbuffer(ctx, -1); duk__bw_update_ptrs(thr, bw_ctx, 0, buf_size); } @@ -86390,7 +91161,7 @@ DUK_INTERNAL DUK_ALWAYS_INLINE void duk_raw_write_double_be(duk_uint8_t **p, duk * dependent, for instance. */ -/* include removed: duk_internal.h */ +/* #include duk_internal.h -> already included */ #if defined(DUK_USE_STRHASH_DENSE) /* 'magic' constants for Murmurhash2 */ @@ -86406,7 +91177,7 @@ DUK_INTERNAL duk_uint32_t duk_util_hashbytes(const duk_uint8_t *data, duk_size_t * endian access even on big endian architectures, which is * OK as long as it is consistent for a build. */ -#ifdef DUK_USE_HASHBYTES_UNALIGNED_U32_ACCESS +#if defined(DUK_USE_HASHBYTES_UNALIGNED_U32_ACCESS) duk_uint32_t k = *((const duk_uint32_t *) (const void *) data); #else duk_uint32_t k = ((duk_uint32_t) data[0]) | @@ -86438,40 +91209,43 @@ DUK_INTERNAL duk_uint32_t duk_util_hashbytes(const duk_uint8_t *data, duk_size_t return h; } #endif /* DUK_USE_STRHASH_DENSE */ + +/* automatic undefs */ +#undef DUK__MAGIC_M +#undef DUK__MAGIC_R #line 1 "duk_util_tinyrandom.c" /* - * A tiny random number generator. + * A tiny random number generator used for Math.random() and other internals. * - * Currently used for Math.random(). + * Default algorithm is xoroshiro128+: http://xoroshiro.di.unimi.it/xoroshiro128plus.c + * with SplitMix64 seed preparation: http://xorshift.di.unimi.it/splitmix64.c. + * + * Low memory targets and targets without 64-bit types use a slightly smaller + * (but slower) algorithm by Adi Shamir: + * http://www.woodmann.com/forum/archive/index.php/t-3100.html. * - * http://www.woodmann.com/forum/archive/index.php/t-3100.html */ -/* include removed: duk_internal.h */ +/* #include duk_internal.h -> already included */ + +#if !defined(DUK_USE_GET_RANDOM_DOUBLE) + +#if defined(DUK_USE_PREFER_SIZE) || !defined(DUK_USE_64BIT_OPS) +#define DUK__RANDOM_SHAMIR3OP +#else +#define DUK__RANDOM_XOROSHIRO128PLUS +#endif +#if defined(DUK__RANDOM_SHAMIR3OP) #define DUK__UPDATE_RND(rnd) do { \ - (rnd) += ((rnd) * (rnd)) | 0x05; \ - (rnd) = ((rnd) & 0xffffffffU); /* if duk_uint32_t is exactly 32 bits, this is a NOP */ \ + (rnd) += ((rnd) * (rnd)) | 0x05UL; \ + (rnd) = ((rnd) & 0xffffffffUL); /* if duk_uint32_t is exactly 32 bits, this is a NOP */ \ } while (0) #define DUK__RND_BIT(rnd) ((rnd) >> 31) /* only use the highest bit */ -DUK_INTERNAL duk_uint32_t duk_util_tinyrandom_get_bits(duk_hthread *thr, duk_small_int_t n) { - duk_small_int_t i; - duk_uint32_t res = 0; - duk_uint32_t rnd; - - rnd = thr->heap->rnd_state; - - for (i = 0; i < n; i++) { - DUK__UPDATE_RND(rnd); - res <<= 1; - res += DUK__RND_BIT(rnd); - } - - thr->heap->rnd_state = rnd; - - return res; +DUK_INTERNAL void duk_util_tinyrandom_prepare_seed(duk_hthread *thr) { + DUK_UNREF(thr); /* Nothing now. */ } DUK_INTERNAL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr) { @@ -86479,11 +91253,6 @@ DUK_INTERNAL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr) { duk_small_int_t n; duk_uint32_t rnd; - /* - * XXX: could make this a lot faster if we create the double memory - * representation directly. Feasible easily (must be uniform random). - */ - rnd = thr->heap->rnd_state; n = 53; /* enough to cover the whole mantissa */ @@ -86502,3 +91271,77 @@ DUK_INTERNAL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr) { return t; } +#endif /* DUK__RANDOM_SHAMIR3OP */ + +#if defined(DUK__RANDOM_XOROSHIRO128PLUS) +DUK_LOCAL DUK_ALWAYS_INLINE duk_uint64_t duk__rnd_splitmix64(duk_uint64_t *x) { + duk_uint64_t z; + z = (*x += 0x9E3779B97F4A7C15ULL); + z = (z ^ (z >> 30U)) * 0xBF58476D1CE4E5B9ULL; + z = (z ^ (z >> 27U)) * 0x94D049BB133111EBULL; + return z ^ (z >> 31U); +} + +DUK_LOCAL DUK_ALWAYS_INLINE duk_uint64_t duk__rnd_rotl(const duk_uint64_t x, duk_small_uint_t k) { + return (x << k) | (x >> (64U - k)); +} + +DUK_LOCAL DUK_ALWAYS_INLINE duk_uint64_t duk__xoroshiro128plus(duk_uint64_t *s) { + duk_uint64_t s0; + duk_uint64_t s1; + duk_uint64_t res; + + s0 = s[0]; + s1 = s[1]; + res = s0 + s1; + s1 ^= s0; + s[0] = duk__rnd_rotl(s0, 55) ^ s1 ^ (s1 << 14U); + s[1] = duk__rnd_rotl(s1, 36); + + return res; +} + +DUK_INTERNAL void duk_util_tinyrandom_prepare_seed(duk_hthread *thr) { + duk_small_uint_t i; + duk_uint64_t x; + + /* Mix both halves of the initial seed with SplitMix64. The intent + * is to ensure that very similar raw seeds (which is usually the case + * because current seed is Date.now()) result in different xoroshiro128+ + * seeds. + */ + x = thr->heap->rnd_state[0]; /* Only [0] is used as input here. */ + for (i = 0; i < 64; i++) { + thr->heap->rnd_state[i & 0x01] = duk__rnd_splitmix64(&x); /* Keep last 2 values. */ + } +} + +DUK_INTERNAL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr) { + duk_uint64_t v; + duk_double_union du; + + /* For big and little endian the integer and IEEE double byte order + * is the same so a direct assignment works. For mixed endian the + * 32-bit parts must be swapped. + */ + v = (0x3ffULL << 52U) | (duk__xoroshiro128plus((duk_uint64_t *) thr->heap->rnd_state) >> 12U); + du.ull[0] = v; +#if defined(DUK_USE_DOUBLE_ME) + do { + duk_uint32_t tmp; + tmp = du.ui[0]; + du.ui[0] = du.ui[1]; + du.ui[1] = tmp; + } while (0); +#endif + return du.d - 1.0; +} +#endif /* DUK__RANDOM_XOROSHIRO128PLUS */ + +#endif /* !DUK_USE_GET_RANDOM_DOUBLE */ + +/* automatic undefs */ +#undef DUK__RANDOM_SHAMIR3OP +#undef DUK__RANDOM_XOROSHIRO128PLUS +#undef DUK__RND_BIT +#undef DUK__UPDATE_RND diff --git a/lib/JavaScript/Duktape/C/duktape.h b/lib/JavaScript/Duktape/C/lib/duktape.h similarity index 68% rename from lib/JavaScript/Duktape/C/duktape.h rename to lib/JavaScript/Duktape/C/lib/duktape.h index a727187..caa2dbb 100644 --- a/lib/JavaScript/Duktape/C/duktape.h +++ b/lib/JavaScript/Duktape/C/lib/duktape.h @@ -1,12 +1,12 @@ /* - * Duktape public API for Duktape 1.5.0. + * Duktape public API for Duktape 2.0.0. * * See the API reference for documentation on call semantics. * The exposed API is inside the DUK_API_PUBLIC_H_INCLUDED * include guard. Other parts of the header are Duktape * internal and related to platform/compiler/feature detection. * - * Git commit 83d557704ee63f68ab40b6fcb00995c9b3d6777c (v1.5.0). + * Git commit 4180966c47d6d87106008dd4338de8d507c8072b (v2.0.0). * Git branch master. * * See Duktape AUTHORS.rst and LICENSE.txt for copyright and @@ -21,7 +21,7 @@ * * (http://opensource.org/licenses/MIT) * - * Copyright (c) 2013-2016 by Duktape authors (see AUTHORS.rst) + * Copyright (c) 2013-2017 by Duktape authors (see AUTHORS.rst) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -75,6 +75,18 @@ * * Ren\u00e9 Hollander * * Julien Hamaide (https://github.com/crazyjul) * * Sebastian G\u00f6tte (https://github.com/jaseg) + * * Tomasz Magulski (https://github.com/magul) + * * \D. Bohdan (https://github.com/dbohdan) + * * Ond\u0159ej Jirman (https://github.com/megous) + * * Sa\u00fal Ibarra Corretg\u00e9 + * * Jeremy HU + * * Ole Andr\u00e9 Vadla Ravn\u00e5s (https://github.com/oleavr) + * * Harold Brenes (https://github.com/harold-b) + * * Oliver Crow (https://github.com/ocrow) + * * Jakub Ch\u0142api\u0144ski (https://github.com/jchlapinski) + * * Brett Vickers (https://github.com/beevik) + * * Dominik Okwieka (https://github.com/okitec) + * * Remko Tron\u00e7on (https://el-tramo.be) * * Other contributions * =================== @@ -112,13 +124,13 @@ * * Michael Drake (https://github.com/tlsa) * * https://github.com/chris-y * * Laurent Zubiaur (https://github.com/lzubiaur) - * * Ole Andr\u00e9 Vadla Ravn\u00e5s (https://github.com/oleavr) + * * Neil Kolban (https://github.com/nkolban) * * If you are accidentally missing from this list, send me an e-mail * (``sami.vaarala@iki.fi``) and I'll fix the omission. */ -#ifndef DUKTAPE_H_INCLUDED +#if !defined(DUKTAPE_H_INCLUDED) #define DUKTAPE_H_INCLUDED #define DUK_SINGLE_FILE @@ -133,14 +145,14 @@ * BEGIN PUBLIC API */ -#ifndef DUK_API_PUBLIC_H_INCLUDED +#if !defined(DUK_API_PUBLIC_H_INCLUDED) #define DUK_API_PUBLIC_H_INCLUDED /* * Avoid C++ name mangling */ -#ifdef __cplusplus +#if defined(__cplusplus) extern "C" { #endif @@ -149,7 +161,7 @@ extern "C" { */ #undef DUK_API_VARIADIC_MACROS -#ifdef DUK_USE_VARIADIC_MACROS +#if defined(DUK_USE_VARIADIC_MACROS) #define DUK_API_VARIADIC_MACROS #endif @@ -163,32 +175,44 @@ extern "C" { * in Duktape web documentation. */ +struct duk_thread_state; struct duk_memory_functions; struct duk_function_list_entry; struct duk_number_list_entry; +struct duk_time_components; /* duk_context is now defined in duk_config.h because it may also be * referenced there by prototypes. */ +typedef struct duk_thread_state duk_thread_state; typedef struct duk_memory_functions duk_memory_functions; typedef struct duk_function_list_entry duk_function_list_entry; typedef struct duk_number_list_entry duk_number_list_entry; +typedef struct duk_time_components duk_time_components; typedef duk_ret_t (*duk_c_function)(duk_context *ctx); typedef void *(*duk_alloc_function) (void *udata, duk_size_t size); typedef void *(*duk_realloc_function) (void *udata, void *ptr, duk_size_t size); typedef void (*duk_free_function) (void *udata, void *ptr); -typedef void (*duk_fatal_function) (duk_context *ctx, duk_errcode_t code, const char *msg); +typedef void (*duk_fatal_function) (void *udata, const char *msg); typedef void (*duk_decode_char_function) (void *udata, duk_codepoint_t codepoint); typedef duk_codepoint_t (*duk_map_char_function) (void *udata, duk_codepoint_t codepoint); -typedef duk_ret_t (*duk_safe_call_function) (duk_context *ctx); +typedef duk_ret_t (*duk_safe_call_function) (duk_context *ctx, void *udata); typedef duk_size_t (*duk_debug_read_function) (void *udata, char *buffer, duk_size_t length); typedef duk_size_t (*duk_debug_write_function) (void *udata, const char *buffer, duk_size_t length); typedef duk_size_t (*duk_debug_peek_function) (void *udata); typedef void (*duk_debug_read_flush_function) (void *udata); typedef void (*duk_debug_write_flush_function) (void *udata); typedef duk_idx_t (*duk_debug_request_function) (duk_context *ctx, void *udata, duk_idx_t nvalues); -typedef void (*duk_debug_detached_function) (void *udata); +typedef void (*duk_debug_detached_function) (duk_context *ctx, void *udata); + +struct duk_thread_state { + /* XXX: Enough space to hold internal suspend/resume structure. + * This is rather awkward and to be fixed when the internal + * structure is visible for the public API header. + */ + char data[128]; +}; struct duk_memory_functions { duk_alloc_function alloc_func; @@ -208,29 +232,40 @@ struct duk_number_list_entry { duk_double_t value; }; +struct duk_time_components { + duk_double_t year; /* year, e.g. 2016, Ecmascript year range */ + duk_double_t month; /* month: 1-12 */ + duk_double_t day; /* day: 1-31 */ + duk_double_t hours; /* hour: 0-59 */ + duk_double_t minutes; /* minute: 0-59 */ + duk_double_t seconds; /* second: 0-59 (in POSIX time no leap second) */ + duk_double_t milliseconds; /* may contain sub-millisecond fractions */ + duk_double_t weekday; /* weekday: 0-6, 0=Sunday, 1=Monday, ..., 6=Saturday */ +}; + /* * Constants */ /* Duktape version, (major * 10000) + (minor * 100) + patch. Allows C code - * to #ifdef against Duktape API version. The same value is also available - * to Ecmascript code in Duktape.version. Unofficial development snapshots - * have 99 for patch level (e.g. 0.10.99 would be a development version - * after 0.10.0 but before the next official release). + * to #if (DUK_VERSION >= NNN) against Duktape API version. The same value + * is also available to Ecmascript code in Duktape.version. Unofficial + * development snapshots have 99 for patch level (e.g. 0.10.99 would be a + * development version after 0.10.0 but before the next official release). */ -#define DUK_VERSION 10500L +#define DUK_VERSION 20000L /* Git commit, describe, and branch for Duktape build. Useful for * non-official snapshot builds so that application code can easily log * which Duktape snapshot was used. Not available in the Ecmascript * environment. */ -#define DUK_GIT_COMMIT "83d557704ee63f68ab40b6fcb00995c9b3d6777c" -#define DUK_GIT_DESCRIBE "v1.5.0" +#define DUK_GIT_COMMIT "4180966c47d6d87106008dd4338de8d507c8072b" +#define DUK_GIT_DESCRIBE "v2.0.0" #define DUK_GIT_BRANCH "master" /* Duktape debug protocol version used by this build. */ -#define DUK_DEBUG_PROTOCOL_VERSION 1 +#define DUK_DEBUG_PROTOCOL_VERSION 2 /* Used to represent invalid index; if caller uses this without checking, * this index will map to a non-existent stack entry. Also used in some @@ -274,6 +309,7 @@ struct duk_number_list_entry { #define DUK_TYPE_MASK_POINTER (1 << DUK_TYPE_POINTER) #define DUK_TYPE_MASK_LIGHTFUNC (1 << DUK_TYPE_LIGHTFUNC) #define DUK_TYPE_MASK_THROW (1 << 10) /* internal flag value: throw if mask doesn't match */ +#define DUK_TYPE_MASK_PROMOTE (1 << 11) /* internal flag value: promote to object if mask matches */ /* Coercion hints */ #define DUK_HINT_NONE 0 /* prefer number, unless input is a Date, in which @@ -284,16 +320,16 @@ struct duk_number_list_entry { /* Enumeration flags for duk_enum() */ #define DUK_ENUM_INCLUDE_NONENUMERABLE (1 << 0) /* enumerate non-numerable properties in addition to enumerable */ -#define DUK_ENUM_INCLUDE_INTERNAL (1 << 1) /* enumerate internal properties (regardless of enumerability) */ -#define DUK_ENUM_OWN_PROPERTIES_ONLY (1 << 2) /* don't walk prototype chain, only check own properties */ -#define DUK_ENUM_ARRAY_INDICES_ONLY (1 << 3) /* only enumerate array indices */ -#define DUK_ENUM_SORT_ARRAY_INDICES (1 << 4) /* sort array indices, use with DUK_ENUM_ARRAY_INDICES_ONLY */ -#define DUK_ENUM_NO_PROXY_BEHAVIOR (1 << 5) /* enumerate a proxy object itself without invoking proxy behavior */ +#define DUK_ENUM_INCLUDE_HIDDEN (1 << 1) /* enumerate hidden symbols too (in Duktape 1.x called internal properties) */ +#define DUK_ENUM_INCLUDE_SYMBOLS (1 << 2) /* enumerate symbols */ +#define DUK_ENUM_EXCLUDE_STRINGS (1 << 3) /* exclude strings */ +#define DUK_ENUM_OWN_PROPERTIES_ONLY (1 << 4) /* don't walk prototype chain, only check own properties */ +#define DUK_ENUM_ARRAY_INDICES_ONLY (1 << 5) /* only enumerate array indices */ +#define DUK_ENUM_SORT_ARRAY_INDICES (1 << 6) /* sort array indices (applied to full enumeration result, including inherited array indices) */ +#define DUK_ENUM_NO_PROXY_BEHAVIOR (1 << 7) /* enumerate a proxy object itself without invoking proxy behavior */ /* Compilation flags for duk_compile() and duk_eval() */ -/* DUK_COMPILE_xxx bits 0-2 are reserved for an internal 'nargs' argument - * (the nargs value passed is direct stack arguments + 1 to account for an - * internal extra argument). +/* DUK_COMPILE_xxx bits 0-2 are reserved for an internal 'nargs' argument. */ #define DUK_COMPILE_EVAL (1 << 3) /* compile eval code (instead of global code) */ #define DUK_COMPILE_FUNCTION (1 << 4) /* compile function code (instead of global code) */ @@ -325,36 +361,20 @@ struct duk_number_list_entry { /* Flags for duk_push_thread_raw() */ #define DUK_THREAD_NEW_GLOBAL_ENV (1 << 0) /* create a new global environment */ -/* Flags for duk_push_string_file_raw() */ -#define DUK_STRING_PUSH_SAFE (1 << 0) /* no error if file does not exist */ +/* Flags for duk_gc() */ +#define DUK_GC_COMPACT (1 << 0) /* compact heap objects */ -/* Duktape specific error codes (must be 8 bits at most, see duk_error.h) */ +/* Error codes (must be 8 bits at most, see duk_error.h) */ #define DUK_ERR_NONE 0 /* no error (e.g. from duk_get_error_code()) */ -#define DUK_ERR_UNIMPLEMENTED_ERROR 50 /* UnimplementedError */ /* XXX: replace with TypeError? */ -#define DUK_ERR_UNSUPPORTED_ERROR 51 /* UnsupportedError */ /* XXX: replace with TypeError? */ -#define DUK_ERR_INTERNAL_ERROR 52 /* InternalError */ /* XXX: replace with plain Error? */ -#define DUK_ERR_ALLOC_ERROR 53 /* AllocError */ /* XXX: replace with RangeError? */ -#define DUK_ERR_ASSERTION_ERROR 54 /* AssertionError */ /* XXX: to be removed? */ -#define DUK_ERR_API_ERROR 55 /* APIError */ /* XXX: replace with TypeError? */ -#define DUK_ERR_UNCAUGHT_ERROR 56 /* UncaughtError */ /* XXX: to be removed? */ - -/* Ecmascript E5 specification error codes */ -#define DUK_ERR_ERROR 100 /* Error */ -#define DUK_ERR_EVAL_ERROR 101 /* EvalError */ -#define DUK_ERR_RANGE_ERROR 102 /* RangeError */ -#define DUK_ERR_REFERENCE_ERROR 103 /* ReferenceError */ -#define DUK_ERR_SYNTAX_ERROR 104 /* SyntaxError */ -#define DUK_ERR_TYPE_ERROR 105 /* TypeError */ -#define DUK_ERR_URI_ERROR 106 /* URIError */ +#define DUK_ERR_ERROR 1 /* Error */ +#define DUK_ERR_EVAL_ERROR 2 /* EvalError */ +#define DUK_ERR_RANGE_ERROR 3 /* RangeError */ +#define DUK_ERR_REFERENCE_ERROR 4 /* ReferenceError */ +#define DUK_ERR_SYNTAX_ERROR 5 /* SyntaxError */ +#define DUK_ERR_TYPE_ERROR 6 /* TypeError */ +#define DUK_ERR_URI_ERROR 7 /* URIError */ /* Return codes for C functions (shortcut for throwing an error) */ -#define DUK_RET_UNIMPLEMENTED_ERROR (-DUK_ERR_UNIMPLEMENTED_ERROR) -#define DUK_RET_UNSUPPORTED_ERROR (-DUK_ERR_UNSUPPORTED_ERROR) -#define DUK_RET_INTERNAL_ERROR (-DUK_ERR_INTERNAL_ERROR) -#define DUK_RET_ALLOC_ERROR (-DUK_ERR_ALLOC_ERROR) -#define DUK_RET_ASSERTION_ERROR (-DUK_ERR_ASSERTION_ERROR) -#define DUK_RET_API_ERROR (-DUK_ERR_API_ERROR) -#define DUK_RET_UNCAUGHT_ERROR (-DUK_ERR_UNCAUGHT_ERROR) #define DUK_RET_ERROR (-DUK_ERR_ERROR) #define DUK_RET_EVAL_ERROR (-DUK_ERR_EVAL_ERROR) #define DUK_RET_RANGE_ERROR (-DUK_ERR_RANGE_ERROR) @@ -367,20 +387,17 @@ struct duk_number_list_entry { #define DUK_EXEC_SUCCESS 0 #define DUK_EXEC_ERROR 1 -/* Log levels */ -#define DUK_LOG_TRACE 0 -#define DUK_LOG_DEBUG 1 -#define DUK_LOG_INFO 2 -#define DUK_LOG_WARN 3 -#define DUK_LOG_ERROR 4 -#define DUK_LOG_FATAL 5 +/* Debug levels for DUK_USE_DEBUG_WRITE(). */ +#define DUK_LEVEL_DEBUG 0 +#define DUK_LEVEL_DDEBUG 1 +#define DUK_LEVEL_DDDEBUG 2 /* * If no variadic macros, __FILE__ and __LINE__ are passed through globals * which is ugly and not thread safe. */ -#ifndef DUK_API_VARIADIC_MACROS +#if !defined(DUK_API_VARIADIC_MACROS) DUK_EXTERNAL_DECL const char *duk_api_global_filename; DUK_EXTERNAL_DECL duk_int_t duk_api_global_line; #endif @@ -397,6 +414,9 @@ duk_context *duk_create_heap(duk_alloc_function alloc_func, duk_fatal_function fatal_handler); DUK_EXTERNAL_DECL void duk_destroy_heap(duk_context *ctx); +DUK_EXTERNAL_DECL void duk_suspend(duk_context *ctx, duk_thread_state *state); +DUK_EXTERNAL_DECL void duk_resume(duk_context *ctx, const duk_thread_state *state); + #define duk_create_heap_default() \ duk_create_heap(NULL, NULL, NULL, NULL, NULL) @@ -419,29 +439,99 @@ DUK_EXTERNAL_DECL void duk_gc(duk_context *ctx, duk_uint_t flags); * Error handling */ -DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_throw(duk_context *ctx)); -DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_fatal(duk_context *ctx, duk_errcode_t err_code, const char *err_msg)); +DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_throw_raw(duk_context *ctx)); +#define duk_throw(ctx) \ + (duk_throw_raw((ctx)), (duk_ret_t) 0) +DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_fatal_raw(duk_context *ctx, const char *err_msg)); +#define duk_fatal(ctx,err_msg) \ + (duk_fatal_raw((ctx), (err_msg)), (duk_ret_t) 0) +#if defined(DUK_API_VARIADIC_MACROS) DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_error_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...)); - -#ifdef DUK_API_VARIADIC_MACROS #define duk_error(ctx,err_code,...) \ - duk_error_raw((ctx), (duk_errcode_t) (err_code), (const char *) (__FILE__), (duk_int_t) (__LINE__), __VA_ARGS__) -#else -DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_error_stash(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...)); -/* One problem with this macro is that expressions like the following fail - * to compile: "(void) duk_error(...)". But because duk_error() is noreturn, - * they make little sense anyway. - */ + (duk_error_raw((ctx), (duk_errcode_t) (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) +#define duk_generic_error(ctx,...) \ + (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) +#define duk_eval_error(ctx,...) \ + (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_EVAL_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) +#define duk_range_error(ctx,...) \ + (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_RANGE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) +#define duk_reference_error(ctx,...) \ + (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_REFERENCE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) +#define duk_syntax_error(ctx,...) \ + (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_SYNTAX_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) +#define duk_type_error(ctx,...) \ + (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_TYPE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) +#define duk_uri_error(ctx,...) \ + (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_URI_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) +#else /* DUK_API_VARIADIC_MACROS */ +/* For legacy compilers without variadic macros a macro hack is used to allow + * variable arguments. While the macro allows "return duk_error(...)", it + * will fail with e.g. "(void) duk_error(...)". The calls are noreturn but + * with a return value to allow the "return duk_error(...)" idiom. This may + * cause some compiler warnings, but without noreturn the generated code is + * often worse. The same approach as with variadic macros (using + * "(duk_error(...), 0)") won't work due to the macro hack structure. + */ +DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_error_stash(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...)); +DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_generic_error_stash(duk_context *ctx, const char *fmt, ...)); +DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_eval_error_stash(duk_context *ctx, const char *fmt, ...)); +DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_range_error_stash(duk_context *ctx, const char *fmt, ...)); +DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_reference_error_stash(duk_context *ctx, const char *fmt, ...)); +DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_syntax_error_stash(duk_context *ctx, const char *fmt, ...)); +DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_type_error_stash(duk_context *ctx, const char *fmt, ...)); +DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_uri_error_stash(duk_context *ctx, const char *fmt, ...)); #define duk_error \ - (duk_api_global_filename = (const char *) (__FILE__), \ - duk_api_global_line = (duk_int_t) (__LINE__), \ + (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ + duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ duk_error_stash) /* last value is func pointer, arguments follow in parens */ -#endif +#define duk_generic_error \ + (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ + duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ + duk_generic_error_stash) +#define duk_eval_error \ + (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ + duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ + duk_eval_error_stash) +#define duk_range_error \ + (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ + duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ + duk_range_error_stash) +#define duk_reference_error \ + (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ + duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ + duk_reference_error_stash) +#define duk_syntax_error \ + (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ + duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ + duk_syntax_error_stash) +#define duk_type_error \ + (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ + duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ + duk_type_error_stash) +#define duk_uri_error \ + (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ + duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ + duk_uri_error_stash) +#endif /* DUK_API_VARIADIC_MACROS */ DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_error_va_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap)); #define duk_error_va(ctx,err_code,fmt,ap) \ - duk_error_va_raw((ctx), (duk_errcode_t) (err_code), (const char *) (__FILE__), (duk_int_t) (__LINE__), (fmt), (ap)) + (duk_error_va_raw((ctx), (duk_errcode_t) (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) +#define duk_generic_error_va(ctx,fmt,ap) \ + (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) +#define duk_eval_error_va(ctx,fmt,ap) \ + (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_EVAL_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) +#define duk_range_error_va(ctx,fmt,ap) \ + (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_RANGE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) +#define duk_reference_error_va(ctx,fmt,ap) \ + (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_REFERENCE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) +#define duk_syntax_error_va(ctx,fmt,ap) \ + (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_SYNTAX_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) +#define duk_type_error_va(ctx,fmt,ap) \ + (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_TYPE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) +#define duk_uri_error_va(ctx,fmt,ap) \ + (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_URI_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) /* * Other state related functions @@ -454,13 +544,13 @@ DUK_EXTERNAL_DECL duk_bool_t duk_is_constructor_call(duk_context *ctx); * Stack management */ -DUK_EXTERNAL_DECL duk_idx_t duk_normalize_index(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_idx_t duk_require_normalize_index(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_valid_index(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_require_valid_index(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL duk_idx_t duk_normalize_index(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_idx_t duk_require_normalize_index(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_valid_index(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_require_valid_index(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_idx_t duk_get_top(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_set_top(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL void duk_set_top(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_idx_t duk_get_top_index(duk_context *ctx); DUK_EXTERNAL_DECL duk_idx_t duk_require_top_index(duk_context *ctx); @@ -480,14 +570,14 @@ DUK_EXTERNAL_DECL void duk_require_stack_top(duk_context *ctx, duk_idx_t top); * Stack manipulation (other than push/pop) */ -DUK_EXTERNAL_DECL void duk_swap(duk_context *ctx, duk_idx_t index1, duk_idx_t index2); -DUK_EXTERNAL_DECL void duk_swap_top(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_dup(duk_context *ctx, duk_idx_t from_index); +DUK_EXTERNAL_DECL void duk_swap(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); +DUK_EXTERNAL_DECL void duk_swap_top(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_dup(duk_context *ctx, duk_idx_t from_idx); DUK_EXTERNAL_DECL void duk_dup_top(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_insert(duk_context *ctx, duk_idx_t to_index); -DUK_EXTERNAL_DECL void duk_replace(duk_context *ctx, duk_idx_t to_index); -DUK_EXTERNAL_DECL void duk_copy(duk_context *ctx, duk_idx_t from_index, duk_idx_t to_index); -DUK_EXTERNAL_DECL void duk_remove(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL void duk_insert(duk_context *ctx, duk_idx_t to_idx); +DUK_EXTERNAL_DECL void duk_replace(duk_context *ctx, duk_idx_t to_idx); +DUK_EXTERNAL_DECL void duk_copy(duk_context *ctx, duk_idx_t from_idx, duk_idx_t to_idx); +DUK_EXTERNAL_DECL void duk_remove(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_xcopymove_raw(duk_context *to_ctx, duk_context *from_ctx, duk_idx_t count, duk_bool_t is_copy); #define duk_xmove_top(to_ctx,from_ctx,count) \ @@ -519,10 +609,6 @@ DUK_EXTERNAL_DECL void duk_push_pointer(duk_context *ctx, void *p); DUK_EXTERNAL_DECL const char *duk_push_sprintf(duk_context *ctx, const char *fmt, ...); DUK_EXTERNAL_DECL const char *duk_push_vsprintf(duk_context *ctx, const char *fmt, va_list ap); -DUK_EXTERNAL_DECL const char *duk_push_string_file_raw(duk_context *ctx, const char *path, duk_uint_t flags); -#define duk_push_string_file(ctx,path) \ - duk_push_string_file_raw((ctx), (path), 0) - DUK_EXTERNAL_DECL void duk_push_this(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_current_function(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_current_thread(duk_context *ctx); @@ -532,6 +618,7 @@ DUK_EXTERNAL_DECL void duk_push_global_stash(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_thread_stash(duk_context *ctx, duk_context *target_ctx); DUK_EXTERNAL_DECL duk_idx_t duk_push_object(duk_context *ctx); +DUK_EXTERNAL_DECL duk_idx_t duk_push_bare_object(duk_context *ctx); DUK_EXTERNAL_DECL duk_idx_t duk_push_array(duk_context *ctx); DUK_EXTERNAL_DECL duk_idx_t duk_push_c_function(duk_context *ctx, duk_c_function func, duk_idx_t nargs); DUK_EXTERNAL_DECL duk_idx_t duk_push_c_lightfunc(duk_context *ctx, duk_c_function func, duk_idx_t nargs, duk_idx_t length, duk_int_t magic); @@ -545,21 +632,21 @@ DUK_EXTERNAL_DECL duk_idx_t duk_push_thread_raw(duk_context *ctx, duk_uint_t fla DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...); -#ifdef DUK_API_VARIADIC_MACROS +#if defined(DUK_API_VARIADIC_MACROS) #define duk_push_error_object(ctx,err_code,...) \ - duk_push_error_object_raw((ctx), (err_code), (const char *) (__FILE__), (duk_int_t) (__LINE__), __VA_ARGS__) + duk_push_error_object_raw((ctx), (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__) #else DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_stash(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...); /* Note: parentheses are required so that the comma expression works in assignments. */ #define duk_push_error_object \ - (duk_api_global_filename = (const char *) (__FILE__), \ - duk_api_global_line = (duk_int_t) (__LINE__), \ + (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ + duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ duk_push_error_object_stash) /* last value is func pointer, arguments follow in parens */ #endif DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_va_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap); #define duk_push_error_object_va(ctx,err_code,fmt,ap) \ - duk_push_error_object_va_raw((ctx), (err_code), (const char *) (__FILE__), (duk_int_t) (__LINE__), (fmt), (ap)) + duk_push_error_object_va_raw((ctx), (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)) #define DUK_BUF_FLAG_DYNAMIC (1 << 0) /* internal flag: dynamic buffer */ #define DUK_BUF_FLAG_EXTERNAL (1 << 1) /* internal flag: external buffer */ @@ -577,19 +664,18 @@ DUK_EXTERNAL_DECL void *duk_push_buffer_raw(duk_context *ctx, duk_size_t size, d ((void) duk_push_buffer_raw((ctx), 0, DUK_BUF_FLAG_DYNAMIC | DUK_BUF_FLAG_EXTERNAL)) #define DUK_BUFOBJ_CREATE_ARRBUF (1 << 4) /* internal flag: create backing ArrayBuffer; keep in one byte */ -#define DUK_BUFOBJ_DUKTAPE_BUFFER 0 -#define DUK_BUFOBJ_NODEJS_BUFFER 1 -#define DUK_BUFOBJ_ARRAYBUFFER 2 -#define DUK_BUFOBJ_DATAVIEW (3 | DUK_BUFOBJ_CREATE_ARRBUF) -#define DUK_BUFOBJ_INT8ARRAY (4 | DUK_BUFOBJ_CREATE_ARRBUF) -#define DUK_BUFOBJ_UINT8ARRAY (5 | DUK_BUFOBJ_CREATE_ARRBUF) -#define DUK_BUFOBJ_UINT8CLAMPEDARRAY (6 | DUK_BUFOBJ_CREATE_ARRBUF) -#define DUK_BUFOBJ_INT16ARRAY (7 | DUK_BUFOBJ_CREATE_ARRBUF) -#define DUK_BUFOBJ_UINT16ARRAY (8 | DUK_BUFOBJ_CREATE_ARRBUF) -#define DUK_BUFOBJ_INT32ARRAY (9 | DUK_BUFOBJ_CREATE_ARRBUF) -#define DUK_BUFOBJ_UINT32ARRAY (10 | DUK_BUFOBJ_CREATE_ARRBUF) -#define DUK_BUFOBJ_FLOAT32ARRAY (11 | DUK_BUFOBJ_CREATE_ARRBUF) -#define DUK_BUFOBJ_FLOAT64ARRAY (12 | DUK_BUFOBJ_CREATE_ARRBUF) +#define DUK_BUFOBJ_ARRAYBUFFER 0 +#define DUK_BUFOBJ_NODEJS_BUFFER (1 | DUK_BUFOBJ_CREATE_ARRBUF) +#define DUK_BUFOBJ_DATAVIEW (2 | DUK_BUFOBJ_CREATE_ARRBUF) +#define DUK_BUFOBJ_INT8ARRAY (3 | DUK_BUFOBJ_CREATE_ARRBUF) +#define DUK_BUFOBJ_UINT8ARRAY (4 | DUK_BUFOBJ_CREATE_ARRBUF) +#define DUK_BUFOBJ_UINT8CLAMPEDARRAY (5 | DUK_BUFOBJ_CREATE_ARRBUF) +#define DUK_BUFOBJ_INT16ARRAY (6 | DUK_BUFOBJ_CREATE_ARRBUF) +#define DUK_BUFOBJ_UINT16ARRAY (7 | DUK_BUFOBJ_CREATE_ARRBUF) +#define DUK_BUFOBJ_INT32ARRAY (8 | DUK_BUFOBJ_CREATE_ARRBUF) +#define DUK_BUFOBJ_UINT32ARRAY (9 | DUK_BUFOBJ_CREATE_ARRBUF) +#define DUK_BUFOBJ_FLOAT32ARRAY (10 | DUK_BUFOBJ_CREATE_ARRBUF) +#define DUK_BUFOBJ_FLOAT64ARRAY (11 | DUK_BUFOBJ_CREATE_ARRBUF) DUK_EXTERNAL_DECL void duk_push_buffer_object(duk_context *ctx, duk_idx_t idx_buffer, duk_size_t byte_offset, duk_size_t byte_length, duk_uint_t flags); @@ -611,70 +697,77 @@ DUK_EXTERNAL_DECL void duk_pop_3(duk_context *ctx); * is not needed; duk_is_valid_index() gives the same information. */ -DUK_EXTERNAL_DECL duk_int_t duk_get_type(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_check_type(duk_context *ctx, duk_idx_t index, duk_int_t type); -DUK_EXTERNAL_DECL duk_uint_t duk_get_type_mask(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_check_type_mask(duk_context *ctx, duk_idx_t index, duk_uint_t mask); - -DUK_EXTERNAL_DECL duk_bool_t duk_is_undefined(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_null(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_null_or_undefined(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_boolean(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_number(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_nan(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_string(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_object(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_buffer(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_pointer(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_lightfunc(duk_context *ctx, duk_idx_t index); - -DUK_EXTERNAL_DECL duk_bool_t duk_is_array(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_function(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_c_function(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_ecmascript_function(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_bound_function(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_thread(duk_context *ctx, duk_idx_t index); - -#define duk_is_callable(ctx,index) \ - duk_is_function((ctx), (index)) -DUK_EXTERNAL_DECL duk_bool_t duk_is_dynamic_buffer(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_fixed_buffer(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_is_external_buffer(duk_context *ctx, duk_idx_t index); - -#define duk_is_primitive(ctx,index) \ - duk_check_type_mask((ctx), (index), DUK_TYPE_MASK_UNDEFINED | \ - DUK_TYPE_MASK_NULL | \ - DUK_TYPE_MASK_BOOLEAN | \ - DUK_TYPE_MASK_NUMBER | \ - DUK_TYPE_MASK_STRING | \ - DUK_TYPE_MASK_BUFFER | \ - DUK_TYPE_MASK_POINTER | \ - DUK_TYPE_MASK_LIGHTFUNC) - -#define duk_is_object_coercible(ctx,index) \ - duk_check_type_mask((ctx), (index), DUK_TYPE_MASK_BOOLEAN | \ - DUK_TYPE_MASK_NUMBER | \ - DUK_TYPE_MASK_STRING | \ - DUK_TYPE_MASK_OBJECT | \ - DUK_TYPE_MASK_BUFFER | \ - DUK_TYPE_MASK_POINTER | \ - DUK_TYPE_MASK_LIGHTFUNC) - -DUK_EXTERNAL_DECL duk_errcode_t duk_get_error_code(duk_context *ctx, duk_idx_t index); -#define duk_is_error(ctx,index) \ - (duk_get_error_code((ctx), (index)) != 0) -#define duk_is_eval_error(ctx,index) \ - (duk_get_error_code((ctx), (index)) == DUK_ERR_EVAL_ERROR) -#define duk_is_range_error(ctx,index) \ - (duk_get_error_code((ctx), (index)) == DUK_ERR_RANGE_ERROR) -#define duk_is_reference_error(ctx,index) \ - (duk_get_error_code((ctx), (index)) == DUK_ERR_REFERENCE_ERROR) -#define duk_is_syntax_error(ctx,index) \ - (duk_get_error_code((ctx), (index)) == DUK_ERR_SYNTAX_ERROR) -#define duk_is_type_error(ctx,index) \ - (duk_get_error_code((ctx), (index)) == DUK_ERR_TYPE_ERROR) -#define duk_is_uri_error(ctx,index) \ - (duk_get_error_code((ctx), (index)) == DUK_ERR_URI_ERROR) +DUK_EXTERNAL_DECL duk_int_t duk_get_type(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_check_type(duk_context *ctx, duk_idx_t idx, duk_int_t type); +DUK_EXTERNAL_DECL duk_uint_t duk_get_type_mask(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_check_type_mask(duk_context *ctx, duk_idx_t idx, duk_uint_t mask); + +DUK_EXTERNAL_DECL duk_bool_t duk_is_undefined(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_null(duk_context *ctx, duk_idx_t idx); +#define duk_is_null_or_undefined(ctx, idx) \ + ((duk_get_type_mask((ctx), (idx)) & (DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_UNDEFINED)) ? 1 : 0) + +DUK_EXTERNAL_DECL duk_bool_t duk_is_boolean(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_number(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_nan(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_string(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_object(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_buffer(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_buffer_data(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_pointer(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_lightfunc(duk_context *ctx, duk_idx_t idx); + +DUK_EXTERNAL_DECL duk_bool_t duk_is_symbol(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_array(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_function(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_c_function(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_ecmascript_function(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_bound_function(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_thread(duk_context *ctx, duk_idx_t idx); + +#define duk_is_callable(ctx,idx) \ + duk_is_function((ctx), (idx)) +DUK_EXTERNAL_DECL duk_bool_t duk_is_dynamic_buffer(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_fixed_buffer(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_is_external_buffer(duk_context *ctx, duk_idx_t idx); + +/* Buffers and lightfuncs are not considered primitive because they mimic + * objects and e.g. duk_to_primitive() will coerce them instead of returning + * them as is. Symbols are represented as strings internally. + */ +#define duk_is_primitive(ctx,idx) \ + duk_check_type_mask((ctx), (idx), DUK_TYPE_MASK_UNDEFINED | \ + DUK_TYPE_MASK_NULL | \ + DUK_TYPE_MASK_BOOLEAN | \ + DUK_TYPE_MASK_NUMBER | \ + DUK_TYPE_MASK_STRING | \ + DUK_TYPE_MASK_POINTER) + +/* Symbols are object coercible, covered by DUK_TYPE_MASK_STRING. */ +#define duk_is_object_coercible(ctx,idx) \ + duk_check_type_mask((ctx), (idx), DUK_TYPE_MASK_BOOLEAN | \ + DUK_TYPE_MASK_NUMBER | \ + DUK_TYPE_MASK_STRING | \ + DUK_TYPE_MASK_OBJECT | \ + DUK_TYPE_MASK_BUFFER | \ + DUK_TYPE_MASK_POINTER | \ + DUK_TYPE_MASK_LIGHTFUNC) + +DUK_EXTERNAL_DECL duk_errcode_t duk_get_error_code(duk_context *ctx, duk_idx_t idx); +#define duk_is_error(ctx,idx) \ + (duk_get_error_code((ctx), (idx)) != 0) +#define duk_is_eval_error(ctx,idx) \ + (duk_get_error_code((ctx), (idx)) == DUK_ERR_EVAL_ERROR) +#define duk_is_range_error(ctx,idx) \ + (duk_get_error_code((ctx), (idx)) == DUK_ERR_RANGE_ERROR) +#define duk_is_reference_error(ctx,idx) \ + (duk_get_error_code((ctx), (idx)) == DUK_ERR_REFERENCE_ERROR) +#define duk_is_syntax_error(ctx,idx) \ + (duk_get_error_code((ctx), (idx)) == DUK_ERR_SYNTAX_ERROR) +#define duk_is_type_error(ctx,idx) \ + (duk_get_error_code((ctx), (idx)) == DUK_ERR_TYPE_ERROR) +#define duk_is_uri_error(ctx,idx) \ + (duk_get_error_code((ctx), (idx)) == DUK_ERR_URI_ERROR) /* * Get operations: no coercion, returns default value for invalid @@ -684,48 +777,50 @@ DUK_EXTERNAL_DECL duk_errcode_t duk_get_error_code(duk_context *ctx, duk_idx_t i * are not included. */ -DUK_EXTERNAL_DECL duk_bool_t duk_get_boolean(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_double_t duk_get_number(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_int_t duk_get_int(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_uint_t duk_get_uint(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL const char *duk_get_string(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL const char *duk_get_lstring(duk_context *ctx, duk_idx_t index, duk_size_t *out_len); -DUK_EXTERNAL_DECL void *duk_get_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size); -DUK_EXTERNAL_DECL void *duk_get_buffer_data(duk_context *ctx, duk_idx_t index, duk_size_t *out_size); -DUK_EXTERNAL_DECL void *duk_get_pointer(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_c_function duk_get_c_function(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_context *duk_get_context(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void *duk_get_heapptr(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_size_t duk_get_length(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL duk_bool_t duk_get_boolean(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_double_t duk_get_number(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_int_t duk_get_int(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_uint_t duk_get_uint(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_get_string(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_get_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); +DUK_EXTERNAL_DECL void *duk_get_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); +DUK_EXTERNAL_DECL void *duk_get_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); +DUK_EXTERNAL_DECL void *duk_get_pointer(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_c_function duk_get_c_function(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_context *duk_get_context(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void *duk_get_heapptr(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_size_t duk_get_length(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_set_length(duk_context *ctx, duk_idx_t idx, duk_size_t len); /* * Require operations: no coercion, throw error if index or type * is incorrect. No defaulting. */ -#define duk_require_type_mask(ctx,index,mask) \ - ((void) duk_check_type_mask((ctx), (index), (mask) | DUK_TYPE_MASK_THROW)) - -DUK_EXTERNAL_DECL void duk_require_undefined(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_require_null(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_require_boolean(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_double_t duk_require_number(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_int_t duk_require_int(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_uint_t duk_require_uint(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL const char *duk_require_string(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL const char *duk_require_lstring(duk_context *ctx, duk_idx_t index, duk_size_t *out_len); -DUK_EXTERNAL_DECL void *duk_require_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size); -DUK_EXTERNAL_DECL void *duk_require_buffer_data(duk_context *ctx, duk_idx_t index, duk_size_t *out_size); -DUK_EXTERNAL_DECL void *duk_require_pointer(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_c_function duk_require_c_function(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_context *duk_require_context(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_require_function(duk_context *ctx, duk_idx_t index); -#define duk_require_callable(ctx,index) \ - duk_require_function((ctx), (index)) -DUK_EXTERNAL_DECL void *duk_require_heapptr(duk_context *ctx, duk_idx_t index); - -#define duk_require_object_coercible(ctx,index) \ - ((void) duk_check_type_mask((ctx), (index), DUK_TYPE_MASK_BOOLEAN | \ +#define duk_require_type_mask(ctx,idx,mask) \ + ((void) duk_check_type_mask((ctx), (idx), (mask) | DUK_TYPE_MASK_THROW)) + +DUK_EXTERNAL_DECL void duk_require_undefined(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_require_null(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_require_boolean(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_double_t duk_require_number(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_int_t duk_require_int(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_uint_t duk_require_uint(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_require_string(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_require_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); +DUK_EXTERNAL_DECL void *duk_require_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); +DUK_EXTERNAL_DECL void *duk_require_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); +DUK_EXTERNAL_DECL void *duk_require_pointer(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_c_function duk_require_c_function(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_context *duk_require_context(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_require_function(duk_context *ctx, duk_idx_t idx); +#define duk_require_callable(ctx,idx) \ + duk_require_function((ctx), (idx)) +DUK_EXTERNAL_DECL void *duk_require_heapptr(duk_context *ctx, duk_idx_t idx); + +/* Symbols are object coercible and covered by DUK_TYPE_MASK_STRING. */ +#define duk_require_object_coercible(ctx,idx) \ + ((void) duk_check_type_mask((ctx), (idx), DUK_TYPE_MASK_BOOLEAN | \ DUK_TYPE_MASK_NUMBER | \ DUK_TYPE_MASK_STRING | \ DUK_TYPE_MASK_OBJECT | \ @@ -741,57 +836,58 @@ DUK_EXTERNAL_DECL void *duk_require_heapptr(duk_context *ctx, duk_idx_t index); * or an internal error (e.g. from out of memory). */ -DUK_EXTERNAL_DECL void duk_to_undefined(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_to_null(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_bool_t duk_to_boolean(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_double_t duk_to_number(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_int_t duk_to_int(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_uint_t duk_to_uint(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_int32_t duk_to_int32(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_uint32_t duk_to_uint32(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_uint16_t duk_to_uint16(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL const char *duk_to_string(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL const char *duk_to_lstring(duk_context *ctx, duk_idx_t index, duk_size_t *out_len); -DUK_EXTERNAL_DECL void *duk_to_buffer_raw(duk_context *ctx, duk_idx_t index, duk_size_t *out_size, duk_uint_t flags); -DUK_EXTERNAL_DECL void *duk_to_pointer(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_to_object(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_to_defaultvalue(duk_context *ctx, duk_idx_t index, duk_int_t hint); -DUK_EXTERNAL_DECL void duk_to_primitive(duk_context *ctx, duk_idx_t index, duk_int_t hint); +DUK_EXTERNAL_DECL void duk_to_undefined(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_to_null(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_bool_t duk_to_boolean(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_double_t duk_to_number(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_int_t duk_to_int(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_uint_t duk_to_uint(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_int32_t duk_to_int32(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_uint32_t duk_to_uint32(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_uint16_t duk_to_uint16(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_to_string(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_to_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); +DUK_EXTERNAL_DECL void *duk_to_buffer_raw(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, duk_uint_t flags); +DUK_EXTERNAL_DECL void *duk_to_pointer(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_to_object(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_to_primitive(duk_context *ctx, duk_idx_t idx, duk_int_t hint); #define DUK_BUF_MODE_FIXED 0 /* internal: request fixed buffer result */ #define DUK_BUF_MODE_DYNAMIC 1 /* internal: request dynamic buffer result */ #define DUK_BUF_MODE_DONTCARE 2 /* internal: don't care about fixed/dynamic nature */ -#define duk_to_buffer(ctx,index,out_size) \ - duk_to_buffer_raw((ctx), (index), (out_size), DUK_BUF_MODE_DONTCARE) -#define duk_to_fixed_buffer(ctx,index,out_size) \ - duk_to_buffer_raw((ctx), (index), (out_size), DUK_BUF_MODE_FIXED) -#define duk_to_dynamic_buffer(ctx,index,out_size) \ - duk_to_buffer_raw((ctx), (index), (out_size), DUK_BUF_MODE_DYNAMIC) +#define duk_to_buffer(ctx,idx,out_size) \ + duk_to_buffer_raw((ctx), (idx), (out_size), DUK_BUF_MODE_DONTCARE) +#define duk_to_fixed_buffer(ctx,idx,out_size) \ + duk_to_buffer_raw((ctx), (idx), (out_size), DUK_BUF_MODE_FIXED) +#define duk_to_dynamic_buffer(ctx,idx,out_size) \ + duk_to_buffer_raw((ctx), (idx), (out_size), DUK_BUF_MODE_DYNAMIC) /* safe variants of a few coercion operations */ -DUK_EXTERNAL_DECL const char *duk_safe_to_lstring(duk_context *ctx, duk_idx_t index, duk_size_t *out_len); -#define duk_safe_to_string(ctx,index) \ - duk_safe_to_lstring((ctx), (index), NULL) +DUK_EXTERNAL_DECL const char *duk_safe_to_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); +#define duk_safe_to_string(ctx,idx) \ + duk_safe_to_lstring((ctx), (idx), NULL) /* * Misc conversion */ -DUK_EXTERNAL_DECL const char *duk_base64_encode(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_base64_decode(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL const char *duk_hex_encode(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_hex_decode(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL const char *duk_json_encode(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_json_decode(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL const char *duk_base64_encode(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_base64_decode(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_hex_encode(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_hex_decode(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL const char *duk_json_encode(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_json_decode(duk_context *ctx, duk_idx_t idx); + +DUK_EXTERNAL_DECL const char *duk_buffer_to_string(duk_context *ctx, duk_idx_t idx); /* * Buffer */ -DUK_EXTERNAL_DECL void *duk_resize_buffer(duk_context *ctx, duk_idx_t index, duk_size_t new_size); -DUK_EXTERNAL_DECL void *duk_steal_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size); -DUK_EXTERNAL_DECL void duk_config_buffer(duk_context *ctx, duk_idx_t index, void *ptr, duk_size_t len); +DUK_EXTERNAL_DECL void *duk_resize_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t new_size); +DUK_EXTERNAL_DECL void *duk_steal_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); +DUK_EXTERNAL_DECL void duk_config_buffer(duk_context *ctx, duk_idx_t idx, void *ptr, duk_size_t len); /* * Property access @@ -801,36 +897,51 @@ DUK_EXTERNAL_DECL void duk_config_buffer(duk_context *ctx, duk_idx_t index, void * index as a property name (e.g. 123 is equivalent to the key "123"). */ -DUK_EXTERNAL_DECL duk_bool_t duk_get_prop(duk_context *ctx, duk_idx_t obj_index); -DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key); -DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index); -DUK_EXTERNAL_DECL duk_bool_t duk_put_prop(duk_context *ctx, duk_idx_t obj_index); -DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key); -DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index); -DUK_EXTERNAL_DECL duk_bool_t duk_del_prop(duk_context *ctx, duk_idx_t obj_index); -DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key); -DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index); -DUK_EXTERNAL_DECL duk_bool_t duk_has_prop(duk_context *ctx, duk_idx_t obj_index); -DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key); -DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index); -DUK_EXTERNAL_DECL void duk_def_prop(duk_context *ctx, duk_idx_t obj_index, duk_uint_t flags); +DUK_EXTERNAL_DECL duk_bool_t duk_get_prop(duk_context *ctx, duk_idx_t obj_idx); +DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); +DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); +DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); +DUK_EXTERNAL_DECL duk_bool_t duk_put_prop(duk_context *ctx, duk_idx_t obj_idx); +DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); +DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); +DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); +DUK_EXTERNAL_DECL duk_bool_t duk_del_prop(duk_context *ctx, duk_idx_t obj_idx); +DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); +DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); +DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); +DUK_EXTERNAL_DECL duk_bool_t duk_has_prop(duk_context *ctx, duk_idx_t obj_idx); +DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); +DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); +DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); + +DUK_EXTERNAL_DECL void duk_get_prop_desc(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t flags); +DUK_EXTERNAL_DECL void duk_def_prop(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t flags); DUK_EXTERNAL_DECL duk_bool_t duk_get_global_string(duk_context *ctx, const char *key); +DUK_EXTERNAL_DECL duk_bool_t duk_get_global_lstring(duk_context *ctx, const char *key, duk_size_t key_len); DUK_EXTERNAL_DECL duk_bool_t duk_put_global_string(duk_context *ctx, const char *key); +DUK_EXTERNAL_DECL duk_bool_t duk_put_global_lstring(duk_context *ctx, const char *key, duk_size_t key_len); + +/* + * Inspection + */ + +DUK_EXTERNAL_DECL void duk_inspect_value(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_inspect_callstack_entry(duk_context *ctx, duk_int_t level); /* * Object prototype */ -DUK_EXTERNAL_DECL void duk_get_prototype(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_set_prototype(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL void duk_get_prototype(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_set_prototype(duk_context *ctx, duk_idx_t idx); /* * Object finalizer */ -DUK_EXTERNAL_DECL void duk_get_finalizer(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_set_finalizer(duk_context *ctx, duk_idx_t index); +DUK_EXTERNAL_DECL void duk_get_finalizer(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_set_finalizer(duk_context *ctx, duk_idx_t idx); /* * Global object @@ -842,36 +953,24 @@ DUK_EXTERNAL_DECL void duk_set_global_object(duk_context *ctx); * Duktape/C function magic value */ -DUK_EXTERNAL_DECL duk_int_t duk_get_magic(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL void duk_set_magic(duk_context *ctx, duk_idx_t index, duk_int_t magic); +DUK_EXTERNAL_DECL duk_int_t duk_get_magic(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL void duk_set_magic(duk_context *ctx, duk_idx_t idx, duk_int_t magic); DUK_EXTERNAL_DECL duk_int_t duk_get_current_magic(duk_context *ctx); /* * Module helpers: put multiple function or constant properties */ -DUK_EXTERNAL_DECL void duk_put_function_list(duk_context *ctx, duk_idx_t obj_index, const duk_function_list_entry *funcs); -DUK_EXTERNAL_DECL void duk_put_number_list(duk_context *ctx, duk_idx_t obj_index, const duk_number_list_entry *numbers); - -/* - * Variable access - */ - -/* XXX: These calls are incomplete and not usable now. They are not (yet) - * part of the public API. - */ -DUK_EXTERNAL_DECL void duk_get_var(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_put_var(duk_context *ctx); -DUK_EXTERNAL_DECL duk_bool_t duk_del_var(duk_context *ctx); -DUK_EXTERNAL_DECL duk_bool_t duk_has_var(duk_context *ctx); +DUK_EXTERNAL_DECL void duk_put_function_list(duk_context *ctx, duk_idx_t obj_idx, const duk_function_list_entry *funcs); +DUK_EXTERNAL_DECL void duk_put_number_list(duk_context *ctx, duk_idx_t obj_idx, const duk_number_list_entry *numbers); /* * Object operations */ -DUK_EXTERNAL_DECL void duk_compact(duk_context *ctx, duk_idx_t obj_index); -DUK_EXTERNAL_DECL void duk_enum(duk_context *ctx, duk_idx_t obj_index, duk_uint_t enum_flags); -DUK_EXTERNAL_DECL duk_bool_t duk_next(duk_context *ctx, duk_idx_t enum_index, duk_bool_t get_value); +DUK_EXTERNAL_DECL void duk_compact(duk_context *ctx, duk_idx_t obj_idx); +DUK_EXTERNAL_DECL void duk_enum(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t enum_flags); +DUK_EXTERNAL_DECL duk_bool_t duk_next(duk_context *ctx, duk_idx_t enum_idx, duk_bool_t get_value); /* * String manipulation @@ -879,19 +978,20 @@ DUK_EXTERNAL_DECL duk_bool_t duk_next(duk_context *ctx, duk_idx_t enum_index, du DUK_EXTERNAL_DECL void duk_concat(duk_context *ctx, duk_idx_t count); DUK_EXTERNAL_DECL void duk_join(duk_context *ctx, duk_idx_t count); -DUK_EXTERNAL_DECL void duk_decode_string(duk_context *ctx, duk_idx_t index, duk_decode_char_function callback, void *udata); -DUK_EXTERNAL_DECL void duk_map_string(duk_context *ctx, duk_idx_t index, duk_map_char_function callback, void *udata); -DUK_EXTERNAL_DECL void duk_substring(duk_context *ctx, duk_idx_t index, duk_size_t start_char_offset, duk_size_t end_char_offset); -DUK_EXTERNAL_DECL void duk_trim(duk_context *ctx, duk_idx_t index); -DUK_EXTERNAL_DECL duk_codepoint_t duk_char_code_at(duk_context *ctx, duk_idx_t index, duk_size_t char_offset); +DUK_EXTERNAL_DECL void duk_decode_string(duk_context *ctx, duk_idx_t idx, duk_decode_char_function callback, void *udata); +DUK_EXTERNAL_DECL void duk_map_string(duk_context *ctx, duk_idx_t idx, duk_map_char_function callback, void *udata); +DUK_EXTERNAL_DECL void duk_substring(duk_context *ctx, duk_idx_t idx, duk_size_t start_char_offset, duk_size_t end_char_offset); +DUK_EXTERNAL_DECL void duk_trim(duk_context *ctx, duk_idx_t idx); +DUK_EXTERNAL_DECL duk_codepoint_t duk_char_code_at(duk_context *ctx, duk_idx_t idx, duk_size_t char_offset); /* * Ecmascript operators */ -DUK_EXTERNAL_DECL duk_bool_t duk_equals(duk_context *ctx, duk_idx_t index1, duk_idx_t index2); -DUK_EXTERNAL_DECL duk_bool_t duk_strict_equals(duk_context *ctx, duk_idx_t index1, duk_idx_t index2); -DUK_EXTERNAL_DECL duk_bool_t duk_instanceof(duk_context *ctx, duk_idx_t index1, duk_idx_t index2); +DUK_EXTERNAL_DECL duk_bool_t duk_equals(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); +DUK_EXTERNAL_DECL duk_bool_t duk_strict_equals(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); +DUK_EXTERNAL_DECL duk_bool_t duk_samevalue(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); +DUK_EXTERNAL_DECL duk_bool_t duk_instanceof(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); /* * Function (method) calls @@ -899,13 +999,13 @@ DUK_EXTERNAL_DECL duk_bool_t duk_instanceof(duk_context *ctx, duk_idx_t index1, DUK_EXTERNAL_DECL void duk_call(duk_context *ctx, duk_idx_t nargs); DUK_EXTERNAL_DECL void duk_call_method(duk_context *ctx, duk_idx_t nargs); -DUK_EXTERNAL_DECL void duk_call_prop(duk_context *ctx, duk_idx_t obj_index, duk_idx_t nargs); +DUK_EXTERNAL_DECL void duk_call_prop(duk_context *ctx, duk_idx_t obj_idx, duk_idx_t nargs); DUK_EXTERNAL_DECL duk_int_t duk_pcall(duk_context *ctx, duk_idx_t nargs); DUK_EXTERNAL_DECL duk_int_t duk_pcall_method(duk_context *ctx, duk_idx_t nargs); -DUK_EXTERNAL_DECL duk_int_t duk_pcall_prop(duk_context *ctx, duk_idx_t obj_index, duk_idx_t nargs); +DUK_EXTERNAL_DECL duk_int_t duk_pcall_prop(duk_context *ctx, duk_idx_t obj_idx, duk_idx_t nargs); DUK_EXTERNAL_DECL void duk_new(duk_context *ctx, duk_idx_t nargs); DUK_EXTERNAL_DECL duk_int_t duk_pnew(duk_context *ctx, duk_idx_t nargs); -DUK_EXTERNAL_DECL duk_int_t duk_safe_call(duk_context *ctx, duk_safe_call_function func, duk_idx_t nargs, duk_idx_t nrets); +DUK_EXTERNAL_DECL duk_int_t duk_safe_call(duk_context *ctx, duk_safe_call_function func, void *udata, duk_idx_t nargs, duk_idx_t nrets); /* * Thread management @@ -924,103 +1024,72 @@ DUK_EXTERNAL_DECL duk_int_t duk_compile_raw(duk_context *ctx, const char *src_bu /* plain */ #define duk_eval(ctx) \ - ((void) duk_eval_raw((ctx), NULL, 0, 2 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOFILENAME)) + ((void) duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOFILENAME)) #define duk_eval_noresult(ctx) \ - ((void) duk_eval_raw((ctx), NULL, 0, 2 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) + ((void) duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) #define duk_peval(ctx) \ - (duk_eval_raw((ctx), NULL, 0, 2 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOFILENAME)) + (duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOFILENAME)) #define duk_peval_noresult(ctx) \ - (duk_eval_raw((ctx), NULL, 0, 2 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) + (duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) #define duk_compile(ctx,flags) \ - ((void) duk_compile_raw((ctx), NULL, 0, 3 /*args*/ | (flags))) + ((void) duk_compile_raw((ctx), NULL, 0, 2 /*args*/ | (flags))) #define duk_pcompile(ctx,flags) \ - (duk_compile_raw((ctx), NULL, 0, 3 /*args*/ | (flags) | DUK_COMPILE_SAFE)) + (duk_compile_raw((ctx), NULL, 0, 2 /*args*/ | (flags) | DUK_COMPILE_SAFE)) /* string */ #define duk_eval_string(ctx,src) \ - ((void) duk_eval_raw((ctx), (src), 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) + ((void) duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) #define duk_eval_string_noresult(ctx,src) \ - ((void) duk_eval_raw((ctx), (src), 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) + ((void) duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) #define duk_peval_string(ctx,src) \ - (duk_eval_raw((ctx), (src), 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) + (duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) #define duk_peval_string_noresult(ctx,src) \ - (duk_eval_raw((ctx), (src), 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) + (duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) #define duk_compile_string(ctx,flags,src) \ - ((void) duk_compile_raw((ctx), (src), 0, 1 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) + ((void) duk_compile_raw((ctx), (src), 0, 0 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) #define duk_compile_string_filename(ctx,flags,src) \ - ((void) duk_compile_raw((ctx), (src), 0, 2 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN)) + ((void) duk_compile_raw((ctx), (src), 0, 1 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN)) #define duk_pcompile_string(ctx,flags,src) \ - (duk_compile_raw((ctx), (src), 0, 1 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) + (duk_compile_raw((ctx), (src), 0, 0 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) #define duk_pcompile_string_filename(ctx,flags,src) \ - (duk_compile_raw((ctx), (src), 0, 2 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN)) + (duk_compile_raw((ctx), (src), 0, 1 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN)) /* lstring */ #define duk_eval_lstring(ctx,buf,len) \ - ((void) duk_eval_raw((ctx), buf, len, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME)) + ((void) duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME)) #define duk_eval_lstring_noresult(ctx,buf,len) \ - ((void) duk_eval_raw((ctx), buf, len, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) + ((void) duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) #define duk_peval_lstring(ctx,buf,len) \ - (duk_eval_raw((ctx), buf, len, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_SAFE | DUK_COMPILE_NOFILENAME)) + (duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_SAFE | DUK_COMPILE_NOFILENAME)) #define duk_peval_lstring_noresult(ctx,buf,len) \ - (duk_eval_raw((ctx), buf, len, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) + (duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) #define duk_compile_lstring(ctx,flags,buf,len) \ - ((void) duk_compile_raw((ctx), buf, len, 1 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME)) + ((void) duk_compile_raw((ctx), buf, len, 0 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME)) #define duk_compile_lstring_filename(ctx,flags,buf,len) \ - ((void) duk_compile_raw((ctx), buf, len, 2 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE)) + ((void) duk_compile_raw((ctx), buf, len, 1 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE)) #define duk_pcompile_lstring(ctx,flags,buf,len) \ - (duk_compile_raw((ctx), buf, len, 1 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME)) + (duk_compile_raw((ctx), buf, len, 0 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME)) #define duk_pcompile_lstring_filename(ctx,flags,buf,len) \ - (duk_compile_raw((ctx), buf, len, 2 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE)) - -/* file */ -#define duk_eval_file(ctx,path) \ - ((void) duk_push_string_file_raw((ctx), (path), 0), \ - (void) duk_push_string((ctx), (path)), \ - (void) duk_eval_raw((ctx), NULL, 0, 3 /*args*/ | DUK_COMPILE_EVAL)) - -#define duk_eval_file_noresult(ctx,path) \ - ((void) duk_push_string_file_raw((ctx), (path), 0), \ - (void) duk_push_string((ctx), (path)), \ - (void) duk_eval_raw((ctx), NULL, 0, 3 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NORESULT)) - -#define duk_peval_file(ctx,path) \ - ((void) duk_push_string_file_raw((ctx), (path), DUK_STRING_PUSH_SAFE), \ - (void) duk_push_string((ctx), (path)), \ - duk_eval_raw((ctx), NULL, 0, 3 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE)) - -#define duk_peval_file_noresult(ctx,path) \ - ((void) duk_push_string_file_raw((ctx), (path), DUK_STRING_PUSH_SAFE), \ - (void) duk_push_string((ctx), (path)), \ - duk_eval_raw((ctx), NULL, 0, 3 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NORESULT)) - -#define duk_compile_file(ctx,flags,path) \ - ((void) duk_push_string_file_raw((ctx), (path), 0), \ - (void) duk_push_string((ctx), (path)), \ - (void) duk_compile_raw((ctx), NULL, 0, 3 /*args*/ | (flags))) - -#define duk_pcompile_file(ctx,flags,path) \ - ((void) duk_push_string_file_raw((ctx), (path), DUK_STRING_PUSH_SAFE), \ - (void) duk_push_string((ctx), (path)), \ - duk_compile_raw((ctx), NULL, 0, 3 /*args*/ | (flags) | DUK_COMPILE_SAFE)) + (duk_compile_raw((ctx), buf, len, 1 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE)) /* * Bytecode load/dump @@ -1029,58 +1098,38 @@ DUK_EXTERNAL_DECL duk_int_t duk_compile_raw(duk_context *ctx, const char *src_bu DUK_EXTERNAL_DECL void duk_dump_function(duk_context *ctx); DUK_EXTERNAL_DECL void duk_load_function(duk_context *ctx); -/* - * Logging - */ - -DUK_EXTERNAL_DECL void duk_log(duk_context *ctx, duk_int_t level, const char *fmt, ...); -DUK_EXTERNAL_DECL void duk_log_va(duk_context *ctx, duk_int_t level, const char *fmt, va_list ap); - /* * Debugging */ DUK_EXTERNAL_DECL void duk_push_context_dump(duk_context *ctx); -#if defined(DUK_USE_FILE_IO) -/* internal use */ -#define duk_dump_context_filehandle(ctx,fh) \ - (duk_push_context_dump((ctx)), \ - DUK_FPRINTF((fh), "%s\n", duk_safe_to_string(ctx, -1)), \ - duk_pop(ctx)) - -/* external use */ -#define duk_dump_context_stdout(ctx) \ - duk_dump_context_filehandle((ctx), DUK_STDOUT) -#define duk_dump_context_stderr(ctx) \ - duk_dump_context_filehandle((ctx), DUK_STDERR) -#else /* DUK_USE_FILE_IO */ -#define duk_dump_context_stdout(ctx) ((void) 0) -#define duk_dump_context_stderr(ctx) ((void) 0) -#endif /* DUK_USE_FILE_IO */ - /* * Debugger (debug protocol) */ -#define duk_debugger_attach(ctx,read_cb,write_cb,peek_cb,read_flush_cb,write_flush_cb,detached_cb,udata) \ - duk_debugger_attach_custom((ctx), (read_cb), (write_cb), (peek_cb), (read_flush_cb), (write_flush_cb), \ - NULL, (detached_cb), (udata)) - -DUK_EXTERNAL_DECL void duk_debugger_attach_custom(duk_context *ctx, - duk_debug_read_function read_cb, - duk_debug_write_function write_cb, - duk_debug_peek_function peek_cb, - duk_debug_read_flush_function read_flush_cb, - duk_debug_write_flush_function write_flush_cb, - duk_debug_request_function request_cb, - duk_debug_detached_function detached_cb, - void *udata); +DUK_EXTERNAL_DECL void duk_debugger_attach(duk_context *ctx, + duk_debug_read_function read_cb, + duk_debug_write_function write_cb, + duk_debug_peek_function peek_cb, + duk_debug_read_flush_function read_flush_cb, + duk_debug_write_flush_function write_flush_cb, + duk_debug_request_function request_cb, + duk_debug_detached_function detached_cb, + void *udata); DUK_EXTERNAL_DECL void duk_debugger_detach(duk_context *ctx); DUK_EXTERNAL_DECL void duk_debugger_cooperate(duk_context *ctx); DUK_EXTERNAL_DECL duk_bool_t duk_debugger_notify(duk_context *ctx, duk_idx_t nvalues); DUK_EXTERNAL_DECL void duk_debugger_pause(duk_context *ctx); +/* + * Time handling + */ + +DUK_EXTERNAL_DECL duk_double_t duk_get_now(duk_context *ctx); +DUK_EXTERNAL_DECL void duk_time_to_components(duk_context *ctx, duk_double_t timeval, duk_time_components *comp); +DUK_EXTERNAL_DECL duk_double_t duk_components_to_time(duk_context *ctx, duk_time_components *comp); + /* * Date provider related constants * @@ -1117,7 +1166,7 @@ DUK_EXTERNAL_DECL void duk_debugger_pause(duk_context *ctx); * depend on the specific ordering, so change with care. 16 bits are not * enough for all parts (year, specifically). * - * (Must be in-sync with genbuiltins.py.) + * Must be in-sync with genbuiltins.py. */ #define DUK_DATE_IDX_YEAR 0 /* year */ #define DUK_DATE_IDX_MONTH 1 /* month: 0 to 11 */ @@ -1129,7 +1178,7 @@ DUK_EXTERNAL_DECL void duk_debugger_pause(duk_context *ctx); #define DUK_DATE_IDX_WEEKDAY 7 /* weekday: 0 to 6, 0=sunday, 1=monday, etc */ #define DUK_DATE_IDX_NUM_PARTS 8 -/* Internal API call flags, used for various functions in this file. +/* Internal API call flags, used for various functions in duk_bi_date.c. * Certain flags are used by only certain functions, but since the flags * don't overlap, a single flags value can be passed around to multiple * functions. @@ -1137,7 +1186,7 @@ DUK_EXTERNAL_DECL void duk_debugger_pause(duk_context *ctx); * The unused top bits of the flags field are also used to pass values * to helpers (duk__get_part_helper() and duk__set_part_helper()). * - * (Must be in-sync with genbuiltins.py.) + * Must be in-sync with genbuiltins.py. */ /* NOTE: when writing a Date provider you only need a few specific @@ -1174,7 +1223,7 @@ DUK_EXTERNAL_DECL const void * const duk_rom_compressed_pointers[]; * C++ name mangling */ -#ifdef __cplusplus +#if defined(__cplusplus) /* end 'extern "C"' wrapper */ } #endif @@ -1235,7 +1284,7 @@ DUK_EXTERNAL_DECL const void * const duk_rom_compressed_pointers[]; * duk_tval values. See: misc/clang_aliasing.c. */ -#ifndef DUK_DBLUNION_H_INCLUDED +#if !defined(DUK_DBLUNION_H_INCLUDED) #define DUK_DBLUNION_H_INCLUDED /* @@ -1263,7 +1312,7 @@ typedef union duk_double_union duk_double_union; */ #if defined(DUK_USE_DOUBLE_LE) -#ifdef DUK_USE_64BIT_OPS +#if defined(DUK_USE_64BIT_OPS) #define DUK_DBL_IDX_ULL0 0 #endif #define DUK_DBL_IDX_UI0 1 @@ -1283,7 +1332,7 @@ typedef union duk_double_union duk_double_union; #define DUK_DBL_IDX_VP0 DUK_DBL_IDX_UI0 /* packed tval */ #define DUK_DBL_IDX_VP1 DUK_DBL_IDX_UI1 /* packed tval */ #elif defined(DUK_USE_DOUBLE_BE) -#ifdef DUK_USE_64BIT_OPS +#if defined(DUK_USE_64BIT_OPS) #define DUK_DBL_IDX_ULL0 0 #endif #define DUK_DBL_IDX_UI0 0 @@ -1303,7 +1352,7 @@ typedef union duk_double_union duk_double_union; #define DUK_DBL_IDX_VP0 DUK_DBL_IDX_UI0 /* packed tval */ #define DUK_DBL_IDX_VP1 DUK_DBL_IDX_UI1 /* packed tval */ #elif defined(DUK_USE_DOUBLE_ME) -#ifdef DUK_USE_64BIT_OPS +#if defined(DUK_USE_64BIT_OPS) #define DUK_DBL_IDX_ULL0 0 /* not directly applicable, byte order differs from a double */ #endif #define DUK_DBL_IDX_UI0 0 @@ -1339,8 +1388,8 @@ typedef union duk_double_union duk_double_union; (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) (v); \ } while (0) -#ifdef DUK_USE_64BIT_OPS -#ifdef DUK_USE_DOUBLE_ME +#if defined(DUK_USE_64BIT_OPS) +#if defined(DUK_USE_DOUBLE_ME) #define DUK_DBLUNION_SET_HIGH32_ZERO_LOW32(u,v) do { \ (u)->ull[DUK_DBL_IDX_ULL0] = (duk_uint64_t) (v); \ } while (0) @@ -1364,8 +1413,8 @@ typedef union duk_double_union duk_double_union; #define DUK_DBLUNION_GET_HIGH32(u) ((u)->ui[DUK_DBL_IDX_UI0]) #define DUK_DBLUNION_GET_LOW32(u) ((u)->ui[DUK_DBL_IDX_UI1]) -#ifdef DUK_USE_64BIT_OPS -#ifdef DUK_USE_DOUBLE_ME +#if defined(DUK_USE_64BIT_OPS) +#if defined(DUK_USE_DOUBLE_ME) #define DUK_DBLUNION_SET_UINT64(u,v) do { \ (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) ((v) >> 32); \ (u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (v); \ @@ -1405,70 +1454,98 @@ typedef union duk_double_union duk_double_union; * feature that while doubles have a mixed byte order (32107654), unsigned * long long values has a little endian byte order (76543210). When writing * a logical double value through a ULL pointer, the 32-bit words need to be - * swapped; hence the #ifdefs below for ULL writes with DUK_USE_DOUBLE_ME. + * swapped; hence the #if defined()s below for ULL writes with DUK_USE_DOUBLE_ME. * This is not full ARM support but suffices for some environments. */ -#ifdef DUK_USE_64BIT_OPS -#ifdef DUK_USE_DOUBLE_ME +#if defined(DUK_USE_64BIT_OPS) +#if defined(DUK_USE_DOUBLE_ME) +/* Macros for 64-bit ops + mixed endian doubles. */ #define DUK__DBLUNION_SET_NAN_FULL(u) do { \ (u)->ull[DUK_DBL_IDX_ULL0] = 0x000000007ff80000ULL; \ } while (0) +#define DUK__DBLUNION_IS_NAN_FULL(u) \ + ((((u)->ull[DUK_DBL_IDX_ULL0] & 0x000000007ff00000ULL) == 0x000000007ff00000ULL) && \ + ((((u)->ull[DUK_DBL_IDX_ULL0]) & 0xffffffff000fffffULL) != 0)) +#define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \ + ((u)->ull[DUK_DBL_IDX_ULL0] == 0x000000007ff80000ULL) +#define DUK__DBLUNION_IS_ANYINF(u) \ + (((u)->ull[DUK_DBL_IDX_ULL0] & 0xffffffff7fffffffULL) == 0x000000007ff00000ULL) +#define DUK__DBLUNION_IS_POSINF(u) \ + ((u)->ull[DUK_DBL_IDX_ULL0] == 0x000000007ff00000ULL) +#define DUK__DBLUNION_IS_NEGINF(u) \ + ((u)->ull[DUK_DBL_IDX_ULL0] == 0x00000000fff00000ULL) +#define DUK__DBLUNION_IS_ANYZERO(u) \ + (((u)->ull[DUK_DBL_IDX_ULL0] & 0xffffffff7fffffffULL) == 0x0000000000000000ULL) +#define DUK__DBLUNION_IS_POSZERO(u) \ + ((u)->ull[DUK_DBL_IDX_ULL0] == 0x0000000000000000ULL) +#define DUK__DBLUNION_IS_NEGZERO(u) \ + ((u)->ull[DUK_DBL_IDX_ULL0] == 0x0000000080000000ULL) #else +/* Macros for 64-bit ops + big/little endian doubles. */ #define DUK__DBLUNION_SET_NAN_FULL(u) do { \ (u)->ull[DUK_DBL_IDX_ULL0] = 0x7ff8000000000000ULL; \ } while (0) +#define DUK__DBLUNION_IS_NAN_FULL(u) \ + ((((u)->ull[DUK_DBL_IDX_ULL0] & 0x7ff0000000000000ULL) == 0x7ff0000000000000UL) && \ + ((((u)->ull[DUK_DBL_IDX_ULL0]) & 0x000fffffffffffffULL) != 0)) +#define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \ + ((u)->ull[DUK_DBL_IDX_ULL0] == 0x7ff8000000000000ULL) +#define DUK__DBLUNION_IS_ANYINF(u) \ + (((u)->ull[DUK_DBL_IDX_ULL0] & 0x7fffffffffffffffULL) == 0x7ff0000000000000ULL) +#define DUK__DBLUNION_IS_POSINF(u) \ + ((u)->ull[DUK_DBL_IDX_ULL0] == 0x7ff0000000000000ULL) +#define DUK__DBLUNION_IS_NEGINF(u) \ + ((u)->ull[DUK_DBL_IDX_ULL0] == 0xfff0000000000000ULL) +#define DUK__DBLUNION_IS_ANYZERO(u) \ + (((u)->ull[DUK_DBL_IDX_ULL0] & 0x7fffffffffffffffULL) == 0x0000000000000000ULL) +#define DUK__DBLUNION_IS_POSZERO(u) \ + ((u)->ull[DUK_DBL_IDX_ULL0] == 0x0000000000000000ULL) +#define DUK__DBLUNION_IS_NEGZERO(u) \ + ((u)->ull[DUK_DBL_IDX_ULL0] == 0x8000000000000000ULL) #endif #else /* DUK_USE_64BIT_OPS */ +/* Macros for no 64-bit ops, any endianness. */ #define DUK__DBLUNION_SET_NAN_FULL(u) do { \ (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) 0x7ff80000UL; \ (u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) 0x00000000UL; \ } while (0) -#endif /* DUK_USE_64BIT_OPS */ - -#define DUK__DBLUNION_SET_NAN_NOTFULL(u) do { \ - (u)->us[DUK_DBL_IDX_US0] = 0x7ff8UL; \ - } while (0) - -#ifdef DUK_USE_64BIT_OPS -#ifdef DUK_USE_DOUBLE_ME -#define DUK__DBLUNION_IS_NAN_FULL(u) \ - /* E == 0x7ff, F != 0 => NaN */ \ - ((((u)->us[DUK_DBL_IDX_US0] & 0x7ff0UL) == 0x7ff0UL) && \ - ((((u)->ull[DUK_DBL_IDX_ULL0]) & 0xffffffff000fffffULL) != 0)) -#else #define DUK__DBLUNION_IS_NAN_FULL(u) \ - /* E == 0x7ff, F != 0 => NaN */ \ - ((((u)->us[DUK_DBL_IDX_US0] & 0x7ff0UL) == 0x7ff0UL) && \ - ((((u)->ull[DUK_DBL_IDX_ULL0]) & 0x000fffffffffffffULL) != 0)) -#endif -#else /* DUK_USE_64BIT_OPS */ -#define DUK__DBLUNION_IS_NAN_FULL(u) \ - /* E == 0x7ff, F != 0 => NaN */ \ ((((u)->ui[DUK_DBL_IDX_UI0] & 0x7ff00000UL) == 0x7ff00000UL) && \ (((u)->ui[DUK_DBL_IDX_UI0] & 0x000fffffUL) != 0 || \ (u)->ui[DUK_DBL_IDX_UI1] != 0)) +#define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \ + (((u)->ui[DUK_DBL_IDX_UI0] == 0x7ff80000UL) && \ + ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) +#define DUK__DBLUNION_IS_ANYINF(u) \ + ((((u)->ui[DUK_DBL_IDX_UI0] & 0x7fffffffUL) == 0x7ff00000UL) && \ + ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) +#define DUK__DBLUNION_IS_POSINF(u) \ + (((u)->ui[DUK_DBL_IDX_UI0] == 0x7ff00000UL) && \ + ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) +#define DUK__DBLUNION_IS_NEGINF(u) \ + (((u)->ui[DUK_DBL_IDX_UI0] == 0xfff00000UL) && \ + ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) +#define DUK__DBLUNION_IS_ANYZERO(u) \ + ((((u)->ui[DUK_DBL_IDX_UI0] & 0x7fffffffUL) == 0x00000000UL) && \ + ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) +#define DUK__DBLUNION_IS_POSZERO(u) \ + (((u)->ui[DUK_DBL_IDX_UI0] == 0x00000000UL) && \ + ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) +#define DUK__DBLUNION_IS_NEGZERO(u) \ + (((u)->ui[DUK_DBL_IDX_UI0] == 0x80000000UL) && \ + ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) #endif /* DUK_USE_64BIT_OPS */ +#define DUK__DBLUNION_SET_NAN_NOTFULL(u) do { \ + (u)->us[DUK_DBL_IDX_US0] = 0x7ff8UL; \ + } while (0) + #define DUK__DBLUNION_IS_NAN_NOTFULL(u) \ /* E == 0x7ff, topmost four bits of F != 0 => assume NaN */ \ ((((u)->us[DUK_DBL_IDX_US0] & 0x7ff0UL) == 0x7ff0UL) && \ (((u)->us[DUK_DBL_IDX_US0] & 0x000fUL) != 0x0000UL)) -#ifdef DUK_USE_64BIT_OPS -#ifdef DUK_USE_DOUBLE_ME -#define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \ - ((u)->ull[DUK_DBL_IDX_ULL0] == 0x000000007ff80000ULL) -#else -#define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \ - ((u)->ull[DUK_DBL_IDX_ULL0] == 0x7ff8000000000000ULL) -#endif -#else /* DUK_USE_64BIT_OPS */ -#define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \ - (((u)->ui[DUK_DBL_IDX_UI0] == 0x7ff80000UL) && \ - ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) -#endif /* DUK_USE_64BIT_OPS */ - #define DUK__DBLUNION_IS_NORMALIZED_NAN_NOTFULL(u) \ /* E == 0x7ff, F == 8 => normalized NaN */ \ ((u)->us[DUK_DBL_IDX_US0] == 0x7ff8UL) @@ -1508,8 +1585,8 @@ typedef union duk_double_union duk_double_union; DUK_DBLUNION_IS_NORMALIZED_NAN((u))) /* or is a normalized NaN */ #else /* DUK_USE_PACKED_TVAL */ #define DUK_DBLUNION_NORMALIZE_NAN_CHECK(u) /* nop: no need to normalize */ -#define DUK_DBLUNION_IS_NAN(u) (DUK_ISNAN((u)->d)) -#define DUK_DBLUNION_IS_NORMALIZED_NAN(u) (DUK_ISNAN((u)->d)) +#define DUK_DBLUNION_IS_NAN(u) DUK__DBLUNION_IS_NAN_FULL((u)) /* (DUK_ISNAN((u)->d)) */ +#define DUK_DBLUNION_IS_NORMALIZED_NAN(u) DUK__DBLUNION_IS_NAN_FULL((u)) /* (DUK_ISNAN((u)->d)) */ #define DUK_DBLUNION_IS_NORMALIZED(u) 1 /* all doubles are considered normalized */ #define DUK_DBLUNION_SET_NAN(u) do { \ /* in non-packed representation we don't care about which NaN is used */ \ @@ -1517,6 +1594,14 @@ typedef union duk_double_union duk_double_union; } while (0) #endif /* DUK_USE_PACKED_TVAL */ +#define DUK_DBLUNION_IS_ANYINF(u) DUK__DBLUNION_IS_ANYINF((u)) +#define DUK_DBLUNION_IS_POSINF(u) DUK__DBLUNION_IS_POSINF((u)) +#define DUK_DBLUNION_IS_NEGINF(u) DUK__DBLUNION_IS_NEGINF((u)) + +#define DUK_DBLUNION_IS_ANYZERO(u) DUK__DBLUNION_IS_ANYZERO((u)) +#define DUK_DBLUNION_IS_POSZERO(u) DUK__DBLUNION_IS_POSZERO((u)) +#define DUK_DBLUNION_IS_NEGZERO(u) DUK__DBLUNION_IS_NEGZERO((u)) + /* XXX: native 64-bit byteswaps when available */ /* 64-bit byteswap, same operation independent of target endianness. */ @@ -1562,6 +1647,15 @@ typedef union duk_double_union duk_double_union; /* Reverse operation is the same. */ #define DUK_DBLUNION_DOUBLE_NTOH(u) DUK_DBLUNION_DOUBLE_HTON((u)) +/* Some sign bit helpers. */ +#if defined(DUK_USE_64BIT_OPS) +#define DUK_DBLUNION_HAS_SIGNBIT(u) (((u)->ull[DUK_DBL_IDX_ULL0] & 0x8000000000000000ULL) != 0) +#define DUK_DBLUNION_GET_SIGNBIT(u) (((u)->ull[DUK_DBL_IDX_ULL0] >> 63U)) +#else +#define DUK_DBLUNION_HAS_SIGNBIT(u) (((u)->ui[DUK_DBL_IDX_UI0] & 0x80000000UL) != 0) +#define DUK_DBLUNION_GET_SIGNBIT(u) (((u)->ui[DUK_DBL_IDX_UI0] >> 31U)) +#endif + #endif /* DUK_DBLUNION_H_INCLUDED */ #endif /* DUKTAPE_H_INCLUDED */ diff --git a/lib/JavaScript/Duktape/C/metadata.json b/lib/JavaScript/Duktape/C/metadata.json deleted file mode 100644 index 8fa72dc..0000000 --- a/lib/JavaScript/Duktape/C/metadata.json +++ /dev/null @@ -1,629 +0,0 @@ -{ - "line_map": [ - { - "original_line": 1, - "combined_line": 114, - "original_file": "duk_internal.h" - }, - { - "original_line": 1, - "combined_line": 160, - "original_file": "duk_replacements.h" - }, - { - "original_line": 1, - "combined_line": 189, - "original_file": "duk_jmpbuf.h" - }, - { - "original_line": 1, - "combined_line": 214, - "original_file": "duk_exception.h" - }, - { - "original_line": 1, - "combined_line": 233, - "original_file": "duk_forwdecl.h" - }, - { - "original_line": 1, - "combined_line": 356, - "original_file": "duk_tval.h" - }, - { - "original_line": 1, - "combined_line": 875, - "original_file": "duk_builtins.h" - }, - { - "original_line": 52, - "combined_line": 1730, - "original_file": "duk_internal.h" - }, - { - "original_line": 1, - "combined_line": 1732, - "original_file": "duk_util.h" - }, - { - "original_line": 1, - "combined_line": 2263, - "original_file": "duk_strings.h" - }, - { - "original_line": 1, - "combined_line": 2516, - "original_file": "duk_js_bytecode.h" - }, - { - "original_line": 1, - "combined_line": 2722, - "original_file": "duk_lexer.h" - }, - { - "original_line": 1, - "combined_line": 3155, - "original_file": "duk_js_compiler.h" - }, - { - "original_line": 1, - "combined_line": 3383, - "original_file": "duk_regexp.h" - }, - { - "original_line": 1, - "combined_line": 3466, - "original_file": "duk_heaphdr.h" - }, - { - "original_line": 1, - "combined_line": 4217, - "original_file": "duk_api_internal.h" - }, - { - "original_line": 1, - "combined_line": 4412, - "original_file": "duk_hstring.h" - }, - { - "original_line": 1, - "combined_line": 4632, - "original_file": "duk_hobject.h" - }, - { - "original_line": 1, - "combined_line": 5559, - "original_file": "duk_hcompiledfunction.h" - }, - { - "original_line": 1, - "combined_line": 5799, - "original_file": "duk_hnativefunction.h" - }, - { - "original_line": 1, - "combined_line": 5832, - "original_file": "duk_hbufferobject.h" - }, - { - "original_line": 1, - "combined_line": 5966, - "original_file": "duk_hthread.h" - }, - { - "original_line": 1, - "combined_line": 6347, - "original_file": "duk_hbuffer.h" - }, - { - "original_line": 1, - "combined_line": 6676, - "original_file": "duk_heap.h" - }, - { - "original_line": 1, - "combined_line": 7273, - "original_file": "duk_debugger.h" - }, - { - "original_line": 1, - "combined_line": 7418, - "original_file": "duk_debug.h" - }, - { - "original_line": 1, - "combined_line": 7604, - "original_file": "duk_error.h" - }, - { - "original_line": 1, - "combined_line": 8040, - "original_file": "duk_unicode.h" - }, - { - "original_line": 1, - "combined_line": 8308, - "original_file": "duk_json.h" - }, - { - "original_line": 1, - "combined_line": 8377, - "original_file": "duk_js.h" - }, - { - "original_line": 1, - "combined_line": 8477, - "original_file": "duk_numconv.h" - }, - { - "original_line": 1, - "combined_line": 8568, - "original_file": "duk_bi_protos.h" - }, - { - "original_line": 1, - "combined_line": 8638, - "original_file": "duk_selftest.h" - }, - { - "original_line": 78, - "combined_line": 8651, - "original_file": "duk_internal.h" - }, - { - "original_line": 1, - "combined_line": 8654, - "original_file": "duk_replacements.c" - }, - { - "original_line": 1, - "combined_line": 8737, - "original_file": "duk_strings.c" - }, - { - "original_line": 1, - "combined_line": 8853, - "original_file": "duk_debug_macros.c" - }, - { - "original_line": 1, - "combined_line": 8998, - "original_file": "duk_builtins.c" - }, - { - "original_line": 1, - "combined_line": 9774, - "original_file": "duk_error_macros.c" - }, - { - "original_line": 1, - "combined_line": 9936, - "original_file": "duk_unicode_support.c" - }, - { - "original_line": 1, - "combined_line": 11110, - "original_file": "duk_util_misc.c" - }, - { - "original_line": 1, - "combined_line": 11333, - "original_file": "duk_util_hashprime.c" - }, - { - "original_line": 1, - "combined_line": 11411, - "original_file": "duk_hobject_class.c" - }, - { - "original_line": 1, - "combined_line": 11544, - "original_file": "duk_alloc_default.c" - }, - { - "original_line": 1, - "combined_line": 11579, - "original_file": "duk_api_buffer.c" - }, - { - "original_line": 1, - "combined_line": 11653, - "original_file": "duk_api_bytecode.c" - }, - { - "original_line": 1, - "combined_line": 12381, - "original_file": "duk_api_call.c" - }, - { - "original_line": 1, - "combined_line": 12917, - "original_file": "duk_api_codec.c" - }, - { - "original_line": 1, - "combined_line": 13556, - "original_file": "duk_api_compile.c" - }, - { - "original_line": 1, - "combined_line": 13751, - "original_file": "duk_api_debug.c" - }, - { - "original_line": 1, - "combined_line": 14015, - "original_file": "duk_api_heap.c" - }, - { - "original_line": 1, - "combined_line": 14150, - "original_file": "duk_api_logging.c" - }, - { - "original_line": 1, - "combined_line": 14203, - "original_file": "duk_api_memory.c" - }, - { - "original_line": 1, - "combined_line": 14307, - "original_file": "duk_api_object.c" - }, - { - "original_line": 1, - "combined_line": 14909, - "original_file": "duk_api_stack.c" - }, - { - "original_line": 1, - "combined_line": 19568, - "original_file": "duk_api_string.c" - }, - { - "original_line": 1, - "combined_line": 19900, - "original_file": "duk_api_var.c" - }, - { - "original_line": 1, - "combined_line": 19987, - "original_file": "duk_bi_array.c" - }, - { - "original_line": 1, - "combined_line": 21433, - "original_file": "duk_bi_boolean.c" - }, - { - "original_line": 1, - "combined_line": 21502, - "original_file": "duk_bi_buffer.c" - }, - { - "original_line": 1, - "combined_line": 24385, - "original_file": "duk_bi_date.c" - }, - { - "original_line": 1, - "combined_line": 26114, - "original_file": "duk_bi_date_unix.c" - }, - { - "original_line": 1, - "combined_line": 26424, - "original_file": "duk_bi_date_windows.c" - }, - { - "original_line": 1, - "combined_line": 26523, - "original_file": "duk_bi_duktape.c" - }, - { - "original_line": 1, - "combined_line": 26841, - "original_file": "duk_bi_error.c" - }, - { - "original_line": 1, - "combined_line": 27225, - "original_file": "duk_bi_function.c" - }, - { - "original_line": 1, - "combined_line": 27572, - "original_file": "duk_bi_global.c" - }, - { - "original_line": 1, - "combined_line": 28861, - "original_file": "duk_bi_json.c" - }, - { - "original_line": 1, - "combined_line": 31997, - "original_file": "duk_bi_logger.c" - }, - { - "original_line": 1, - "combined_line": 32298, - "original_file": "duk_bi_math.c" - }, - { - "original_line": 1, - "combined_line": 32647, - "original_file": "duk_bi_number.c" - }, - { - "original_line": 1, - "combined_line": 32888, - "original_file": "duk_bi_object.c" - }, - { - "original_line": 1, - "combined_line": 33466, - "original_file": "duk_bi_pointer.c" - }, - { - "original_line": 1, - "combined_line": 33541, - "original_file": "duk_bi_proxy.c" - }, - { - "original_line": 1, - "combined_line": 33608, - "original_file": "duk_bi_regexp.c" - }, - { - "original_line": 1, - "combined_line": 33818, - "original_file": "duk_bi_string.c" - }, - { - "original_line": 1, - "combined_line": 35133, - "original_file": "duk_bi_thread.c" - }, - { - "original_line": 1, - "combined_line": 35439, - "original_file": "duk_bi_thrower.c" - }, - { - "original_line": 1, - "combined_line": 35450, - "original_file": "duk_debug_fixedbuffer.c" - }, - { - "original_line": 1, - "combined_line": 35520, - "original_file": "duk_debug_heap.c" - }, - { - "original_line": 1, - "combined_line": 35768, - "original_file": "duk_debug_vsnprintf.c" - }, - { - "original_line": 1, - "combined_line": 36818, - "original_file": "duk_debugger.c" - }, - { - "original_line": 1, - "combined_line": 39592, - "original_file": "duk_error_augment.c" - }, - { - "original_line": 1, - "combined_line": 40160, - "original_file": "duk_error_longjmp.c" - }, - { - "original_line": 1, - "combined_line": 40206, - "original_file": "duk_error_misc.c" - }, - { - "original_line": 1, - "combined_line": 40339, - "original_file": "duk_error_throw.c" - }, - { - "original_line": 1, - "combined_line": 40521, - "original_file": "duk_hbuffer_alloc.c" - }, - { - "original_line": 1, - "combined_line": 40654, - "original_file": "duk_hbuffer_ops.c" - }, - { - "original_line": 2, - "combined_line": 40738, - "original_file": "duk_hbufferobject_misc.c" - }, - { - "original_line": 1, - "combined_line": 40758, - "original_file": "duk_heap_alloc.c" - }, - { - "original_line": 1, - "combined_line": 41801, - "original_file": "duk_heap_hashstring.c" - }, - { - "original_line": 1, - "combined_line": 41922, - "original_file": "duk_heap_markandsweep.c" - }, - { - "original_line": 1, - "combined_line": 43336, - "original_file": "duk_heap_memory.c" - }, - { - "original_line": 1, - "combined_line": 43721, - "original_file": "duk_heap_misc.c" - }, - { - "original_line": 1, - "combined_line": 43801, - "original_file": "duk_heap_refcount.c" - }, - { - "original_line": 1, - "combined_line": 44413, - "original_file": "duk_heap_stringcache.c" - }, - { - "original_line": 1, - "combined_line": 44712, - "original_file": "duk_heap_stringtable.c" - }, - { - "original_line": 1, - "combined_line": 45867, - "original_file": "duk_hobject_alloc.c" - }, - { - "original_line": 1, - "combined_line": 46060, - "original_file": "duk_hobject_enum.c" - }, - { - "original_line": 1, - "combined_line": 46687, - "original_file": "duk_hobject_finalizer.c" - }, - { - "original_line": 1, - "combined_line": 46798, - "original_file": "duk_hobject_misc.c" - }, - { - "original_line": 1, - "combined_line": 46846, - "original_file": "duk_hobject_pc2line.c" - }, - { - "original_line": 1, - "combined_line": 47097, - "original_file": "duk_hobject_props.c" - }, - { - "original_line": 1, - "combined_line": 53076, - "original_file": "duk_hstring_misc.c" - }, - { - "original_line": 1, - "combined_line": 53122, - "original_file": "duk_hthread_alloc.c" - }, - { - "original_line": 1, - "combined_line": 53218, - "original_file": "duk_hthread_builtins.c" - }, - { - "original_line": 1, - "combined_line": 54055, - "original_file": "duk_hthread_misc.c" - }, - { - "original_line": 1, - "combined_line": 54164, - "original_file": "duk_hthread_stacks.c" - }, - { - "original_line": 1, - "combined_line": 54641, - "original_file": "duk_js_call.c" - }, - { - "original_line": 1, - "combined_line": 57369, - "original_file": "duk_js_compiler.c" - }, - { - "original_line": 1, - "combined_line": 65166, - "original_file": "duk_js_executor.c" - }, - { - "original_line": 1, - "combined_line": 69674, - "original_file": "duk_js_ops.c" - }, - { - "original_line": 1, - "combined_line": 71045, - "original_file": "duk_js_var.c" - }, - { - "original_line": 1, - "combined_line": 72862, - "original_file": "duk_lexer.c" - }, - { - "original_line": 1, - "combined_line": 74930, - "original_file": "duk_numconv.c" - }, - { - "original_line": 1, - "combined_line": 77197, - "original_file": "duk_regexp_compiler.c" - }, - { - "original_line": 1, - "combined_line": 78270, - "original_file": "duk_regexp_executor.c" - }, - { - "original_line": 1, - "combined_line": 79274, - "original_file": "duk_selftest.c" - }, - { - "original_line": 2, - "combined_line": 79649, - "original_file": "duk_tval.c" - }, - { - "original_line": 1, - "combined_line": 79787, - "original_file": "duk_unicode_tables.c" - }, - { - "original_line": 1, - "combined_line": 85907, - "original_file": "duk_util_bitdecoder.c" - }, - { - "original_line": 1, - "combined_line": 85978, - "original_file": "duk_util_bitencoder.c" - }, - { - "original_line": 1, - "combined_line": 86022, - "original_file": "duk_util_bufwriter.c" - }, - { - "original_line": 1, - "combined_line": 86383, - "original_file": "duk_util_hashbytes.c" - }, - { - "original_line": 1, - "combined_line": 86441, - "original_file": "duk_util_tinyrandom.c" - } - ] -} \ No newline at end of file diff --git a/t/api/base64.t b/t/api/base64.t index a84f93e..aca5dea 100644 --- a/t/api/base64.t +++ b/t/api/base64.t @@ -23,7 +23,7 @@ sub test_decode { $duk->push_string("dGVzdCBzdHJpbmc="); $duk->push_int(321); # dummy */ $duk->base64_decode(-2); # buffer */ - printf("base64 decode: %s\n", $duk->to_string(-2)); + printf("base64 decode: %s\n", $duk->buffer_to_string(-2)); printf("top after: %ld\n", $duk->get_top()); # value + dummy */ $duk->set_top(0); return 0; diff --git a/t/api/c-constructor.t b/t/api/c-constructor.t index 6e31633..b65618a 100644 --- a/t/api/c-constructor.t +++ b/t/api/c-constructor.t @@ -9,6 +9,7 @@ require './t/helper.pl'; my $js = JavaScript::Duktape->new(); my $duk = $js->duk; +SET_PRINT_METHOD($duk); sub my_constructor { return 0; @@ -25,6 +26,7 @@ sub test1 { $duk->pop(); $duk->eval_string("var obj = new MyConstructor(); print(obj.inherited);"); + # $duk->dump(); $duk->pop(); printf("top at end: %ld\n", $duk->get_top()); diff --git a/t/api/call-prop.t b/t/api/call-prop.t index bf0844e..34f08f6 100644 --- a/t/api/call-prop.t +++ b/t/api/call-prop.t @@ -6,10 +6,10 @@ use Data::Dumper; require './t/helper.pl'; -my $js = JavaScript::Duktape->new(); +my $js = JavaScript::Duktape->new(); my $duk = $js->duk; - +SET_PRINT_METHOD($duk); sub test_1 { my $duk = shift; @@ -34,7 +34,7 @@ sub test_2 { my $duk = shift; # $duk->require_string(-2); $duk->set_top(0); - $duk->eval_string("({ myfunc: function(x,y,z) { print(this); throw new Error('my error'); } })"); + $duk->eval_string("({ myfunc: function(x,y,z) { print(this); throw(new Error('my error')); } })"); $duk->push_string("myfunc"); $duk->push_int(10); $duk->push_int(11); diff --git a/t/api/compile.t b/t/api/compile.t index f160666..ccf0a2e 100644 --- a/t/api/compile.t +++ b/t/api/compile.t @@ -9,6 +9,7 @@ require './t/helper.pl'; my $js = JavaScript::Duktape->new(); my $duk = $js->duk; +SET_PRINT_METHOD($duk); sub test_1 { $duk->set_top(0); diff --git a/t/api/dev-cfunc-name.t b/t/api/dev-cfunc-name.t index af1eb55..3f5cf8d 100644 --- a/t/api/dev-cfunc-name.t +++ b/t/api/dev-cfunc-name.t @@ -11,7 +11,7 @@ my $NONEXISTENT_FILE = '/this/file/doesnt/exist'; my $js = JavaScript::Duktape->new(); my $duk = $js->duk; - +SET_PRINT_METHOD($duk); sub my_func { # die; $duk->push_current_function(); @@ -19,7 +19,7 @@ sub my_func { printf("my name is: '%s'\n", $duk->safe_to_string(-1)); $duk->pop_2(); - return -106; + return -7; } sub test_without_name { @@ -39,8 +39,9 @@ sub test_without_name { sub test_with_name { $duk->get_global_string("MyFunc"); + $duk->push_string("name"); $duk->push_string("my_func"); - $duk->put_prop_string(-2, "name"); + $duk->def_prop(-3, DUK_DEFPROP_HAVE_VALUE); $duk->pop(); $duk->eval_string_noresult( @@ -69,14 +70,14 @@ test_stdout(); __DATA__ *** test_without_name (duk_safe_call) my name is: '' -URIError: uri error (rc -106) +URIError: error (rc -7) at [anon] () native strict preventsyield at forEach () native strict preventsyield at eval XXX preventsyield ==> rc=0, result='undefined' *** test_with_name (duk_safe_call) my name is: 'my_func' -URIError: uri error (rc -106) +URIError: error (rc -7) at my_func () native strict preventsyield at forEach () native strict preventsyield at eval XXX preventsyield diff --git a/t/api/dup.t b/t/api/dup.t index bf4231d..3852417 100644 --- a/t/api/dup.t +++ b/t/api/dup.t @@ -91,10 +91,10 @@ __DATA__ final top: 4 ==> rc=0, result='undefined' *** test_2a (duk_safe_call) -==> rc=1, result='Error: invalid stack index -3' +==> rc=1, result='RangeError: invalid stack index -3' *** test_2b (duk_safe_call) -==> rc=1, result='Error: invalid stack index 2' +==> rc=1, result='RangeError: invalid stack index 2' *** test_2c (duk_safe_call) -==> rc=1, result='Error: invalid stack index -2147483648' +==> rc=1, result='RangeError: invalid stack index -2147483648' *** test_3a (duk_safe_call) -==> rc=1, result='Error: invalid stack index -1' +==> rc=1, result='RangeError: invalid stack index -1' diff --git a/t/api/eval-string.t b/t/api/eval-string.t index 03626f1..c66c702 100644 --- a/t/api/eval-string.t +++ b/t/api/eval-string.t @@ -9,6 +9,7 @@ require './t/helper.pl'; my $js = JavaScript::Duktape->new(); my $duk = $js->duk; +SET_PRINT_METHOD($duk); sub test_string { my $rc; diff --git a/t/api/hex.t b/t/api/hex.t index 285e56e..fc5163d 100644 --- a/t/api/hex.t +++ b/t/api/hex.t @@ -23,7 +23,7 @@ sub test_decode { $duk->push_string("7465737420737472696e67"); $duk->push_int(321); # dummy */ $duk->hex_decode(-2); # buffer */ - printf("hex decode: %s\n", $duk->to_string(-2)); + printf("hex decode: %s\n", $duk->buffer_to_string(-2)); printf("top after: %ld\n", $duk->get_top()); # value + dummy */ $duk->set_top(0); return 0; @@ -34,7 +34,7 @@ sub test_decode_odd_length { $duk->push_string("7465737420737472696e6"); # odd length */ $duk->push_int(321); # dummy */ $duk->hex_decode(-2); # buffer */ - printf("hex decode: %s\n", $duk->to_string(-2)); + printf("hex decode: %s\n", $duk->buffer_to_string(-2)); printf("top after: %ld\n", $duk->get_top()); # value + dummy */ $duk->set_top(0); return 0; @@ -45,7 +45,7 @@ sub test_decode_invalid_char { $duk->push_string("7465737420737g72696e67"); # invalid char */ $duk->push_int(321); # dummy */ $duk->hex_decode(-2); # buffer */ - printf("hex decode: %s\n", $duk->to_string(-2)); + printf("hex decode: %s\n", $duk->buffer_to_string(-2)); printf("top after: %ld\n", $duk->get_top()); # value + dummy */ $duk->set_top(0); return 0; diff --git a/t/api/internal-property-basics.t b/t/api/internal-property-basics.t index 0f7f70c..7b4bf6b 100644 --- a/t/api/internal-property-basics.t +++ b/t/api/internal-property-basics.t @@ -6,12 +6,10 @@ use Data::Dumper; require './t/helper.pl'; - -my $NONEXISTENT_FILE = '/this/file/doesnt/exist'; - my $js = JavaScript::Duktape->new(); my $duk = $js->duk; +SET_PRINT_METHOD($duk); sub test_1 { $duk->eval_string("(function (x) { print(Duktape.enc('jx', x)); })"); diff --git a/t/api/pcall-method.t b/t/api/pcall-method.t index ca8c544..7ff974f 100644 --- a/t/api/pcall-method.t +++ b/t/api/pcall-method.t @@ -9,6 +9,7 @@ require './t/helper.pl'; my $js = JavaScript::Duktape->new(); my $duk = $js->duk; +SET_PRINT_METHOD($duk); #basic success case, non-strict target function (this gets coerced) */ $duk->eval_string("(function (x,y) { print(typeof this, this); return x+y; })"); diff --git a/t/api/pcall-perl-function.t b/t/api/pcall-perl-function.t index 24b6d6c..6d73786 100644 --- a/t/api/pcall-perl-function.t +++ b/t/api/pcall-perl-function.t @@ -25,5 +25,5 @@ $duk->dump('3'); test_stdout(); __DATA__ -1 (top=1): function () {"native"} +1 (top=1): function () { [native code] } 3 (top=1): TypeError: string required, found undefined (stack index 0) diff --git a/t/api/pcall-prop.t b/t/api/pcall-prop.t index 73ab513..30df07c 100644 --- a/t/api/pcall-prop.t +++ b/t/api/pcall-prop.t @@ -9,6 +9,8 @@ require './t/helper.pl'; my $js = JavaScript::Duktape->new(); my $duk = $js->duk; +SET_PRINT_METHOD($duk); + sub test_1 { # basic success case: own property $duk->eval_string("({ name: 'me', foo: function (x,y) { print(this.name); return x+y; } })"); # idx 1 @@ -195,11 +197,11 @@ rc=1, result='TypeError: cannot read property 'foo' of undefined' rc=1, result='RangeError: getter error' ==> rc=0, result='undefined' *** test_7 (duk_safe_call) -rc=1, result='Error: invalid stack index -6' +rc=1, result='RangeError: invalid stack index -6' ==> rc=0, result='undefined' *** test_8 (duk_safe_call) rc=1, result='TypeError: undefined not callable' ==> rc=0, result='undefined' *** test_9 (duk_safe_call) -==> rc=1, result='Error: invalid call args' +==> rc=1, result='TypeError: invalid args' final top: 0 diff --git a/t/api/pcompile-nofile.t b/t/api/pcompile-nofile.t index dcb7e18..8d25d71 100644 --- a/t/api/pcompile-nofile.t +++ b/t/api/pcompile-nofile.t @@ -5,7 +5,7 @@ use JavaScript::Duktape; use Data::Dumper; require './t/helper.pl'; - +use Test::More skip_all => 'duktape v2.0 does not support file/io functions'; my $NONEXISTENT_FILE = '/this/file/doesnt/exist'; diff --git a/t/api/push_this.t b/t/api/push_this.t index c2e7307..81c25c6 100644 --- a/t/api/push_this.t +++ b/t/api/push_this.t @@ -50,5 +50,5 @@ this binding: type=4, value='123.456' this binding: type=5, value='foo' this binding: type=6, value='[object Object]' this binding: type=6, value='' -this binding: type=7, value='' +this binding: type=7, value='[object Uint8Array]' #skip - this binding: type=8, value='DEADBEEF' diff --git a/t/buffer.t b/t/buffer.t index c9205b2..87d5388 100644 --- a/t/buffer.t +++ b/t/buffer.t @@ -14,7 +14,7 @@ subtest 'incoming buffer with raw data' => sub { my $str = 'как дела'; my $bytes = Encode::encode('UTF-8', $str ); - $js->set( load=>sub{ + $js->set( load => sub { return bless( \$bytes => 'JavaScript::Duktape::Buffer' ); } ); @@ -30,7 +30,7 @@ subtest 'return buffer with raw data' => sub { my $bytes = "\0\1\2"; - $js->set( load=>sub{ + $js->set( load => sub{ return bless( \$bytes => 'JavaScript::Duktape::Buffer' ); } ); @@ -65,9 +65,9 @@ subtest 'return buffer with utf8 data' => sub { my $str = 'как дела'; my $bytes = Encode::encode('UTF-8', $str ); - $js->set( load=>sub{ + $js->set( load => sub{ return bless( \$bytes => 'JavaScript::Duktape::Buffer' ); - } ); + }); my $ret = $js->eval( q{ var buf = load(); @@ -81,10 +81,10 @@ subtest 'return buffer with utf8 data' => sub { subtest 'return undef buffer' => sub { my $js = JavaScript::Duktape->new; - $js->set( load=>sub{ + $js->set( load => sub{ my $var; return bless( \$var => 'JavaScript::Duktape::Buffer' ); - } ); + }); my $ret = $js->eval( q{ var buf = load(); @@ -97,10 +97,10 @@ subtest 'return undef buffer' => sub { subtest 'return buffer with a zero' => sub { my $js = JavaScript::Duktape->new; - $js->set( load=>sub{ + $js->set( load => sub{ my $var = '0'; return bless( \$var => 'JavaScript::Duktape::Buffer' ); - } ); + }); my $ret = $js->eval( q{ var buf = load(); @@ -110,7 +110,4 @@ subtest 'return buffer with a zero' => sub { is $ret, '0'; }; - - - done_testing; diff --git a/t/circular.t b/t/circular.t index cc9ced5..eec34e1 100644 --- a/t/circular.t +++ b/t/circular.t @@ -30,4 +30,4 @@ $duk->eval_string(qq~ my $t = $duk->to_perl(-1); is $t->{test}->{hi}->{abc}, 'Hello'; is $t->{circular}->{abc}, 'Hello'; -done_testing(); +done_testing(2); diff --git a/t/deep_objects.t b/t/deep_objects.t index 9bdfc2b..1c7f04a 100644 --- a/t/deep_objects.t +++ b/t/deep_objects.t @@ -43,4 +43,4 @@ $duk->eval_string('process.test.perl'); $duk->push_perl($object); $duk->call(1); -done_testing(); +done_testing(1); diff --git a/t/dll.c b/t/dll.c index cc50bad..bb9128f 100644 --- a/t/dll.c +++ b/t/dll.c @@ -1,4 +1,4 @@ -#include "como.h" +#include "duk_perl.h" #include static int add_number(duk_context *ctx) { diff --git a/t/dll.t b/t/dll.t index 9145a77..2d8f7ad 100644 --- a/t/dll.t +++ b/t/dll.t @@ -10,14 +10,12 @@ use Test::More; my $js = JavaScript::Duktape->new(); my $duk = $js->duk; -my $duktapePath = JavaScript::Duktape::C::libPath::getPath('../C'); -my $duktape = JavaScript::Duktape::C::libPath::getPath('duktape.c'); +my $path = JavaScript::Duktape::C::libPath::getPath('../C'); +my $duktape = JavaScript::Duktape::C::libPath::getPath('lib/duktape.c'); -my $build = "gcc -Wall -I$duktapePath $duktape ./t/dll.c -shared -fPIC -o dll.shared"; +my $build = "gcc -Wall -I$path $duktape ./t/dll.c -shared -fPIC -o dll.shared"; system($build) && plan skip_all => "Can't compile shared library using gcc compiler"; -# print Dumper $build; - my $dll = $duk->duktape_dlOpen("./dll.shared"); my $fn = $duk->to_perl(-1); @@ -25,7 +23,6 @@ my $ret = $fn->{add_number}->(5,5); is ($ret, 10); - ok $duk->duktape_dlClose($dll); unlink 'dll.shared' or fail $!; diff --git a/t/eval-function.t b/t/eval-function.t index 317285e..a18bb7e 100644 --- a/t/eval-function.t +++ b/t/eval-function.t @@ -47,7 +47,6 @@ $duk->peval_string(qq~ perlfail(); } catch (e){ perlok(); - print('got error'); throw(e); } perlfail(); @@ -56,7 +55,6 @@ $duk->peval_string(qq~ my $top = $duk->get_top(); is($top, 2); - my $string = $duk->get_string(-1); is($string, "Error String", $string); diff --git a/t/helper.pl b/t/helper.pl index 00357fd..4f486be 100644 --- a/t/helper.pl +++ b/t/helper.pl @@ -2,6 +2,21 @@ use Carp; use Test::More; +sub SET_PRINT_METHOD { + my $duk = shift; + $duk->push_perl(sub { + my $top = $duk->get_top(); + my @str = (); + for (my $i = 0; $i < $top; $i++){ + push @str, $duk->safe_to_string($i); + } + my $str = join " ", @str; + print $str; + print "\n"; + }); + $duk->put_global_string('print'); +} + sub TEST_SAFE_CALL { my $duk = shift; my $sub = shift; diff --git a/t/objects/this.t b/t/objects/this.t index 79607db..ede4d68 100644 --- a/t/objects/this.t +++ b/t/objects/this.t @@ -11,6 +11,12 @@ my $duk = $js->duk; my @refs; +$js->set( print => sub { + my $str = shift; + print $str || "undefined", "\n"; +}); + + $duk->eval_string(qq~ var tt = {}; tt.all = test; @@ -33,7 +39,6 @@ $duk->eval_string(qq~ }); print(obj.lastname('Mehyar2')); print(obj.fullname); - test; ~); diff --git a/t/perl-data.t b/t/perl-data.t index 054f79d..9b77629 100644 --- a/t/perl-data.t +++ b/t/perl-data.t @@ -48,7 +48,7 @@ my $data = { $js->set('perl', $data); $duk->peval_string(qq~ - print(JSON.stringify(perl)); + //print(JSON.stringify(perl)); if (perl.str === 'Hello') perlok(); if (typeof perl.un === 'undefined') perlok(); if (perl.n === null) perlok(); diff --git a/t/safe-call.t b/t/safe-call.t index 992af4e..4fd73ea 100644 --- a/t/safe-call.t +++ b/t/safe-call.t @@ -11,10 +11,10 @@ my $js = JavaScript::Duktape->new(); my $duk = $js->duk; sub safe_fn { - my $self = shift; + my $arg = shift; eval {}; - eval {die "Hi This is Some Fake Error";}; + eval {die "$arg This is Some Fake Error";}; ok($@ =~ /^Hi This is Some Fake Error/); my $top = $duk->get_top; @@ -37,7 +37,7 @@ is($top,1); ##error thrown from perl, must be an error object my $errcode = $duk->get_error_code(0); -is($errcode, 100); +is($errcode, 1); my $errorstr = $duk->to_string(0); ok($errorstr =~ /Error: From Perl at (.*?)safe-call\.t line 26\./, $errorstr); diff --git a/t/typescript.t b/t/typescript.t index 111294c..53b9e71 100644 --- a/t/typescript.t +++ b/t/typescript.t @@ -2,18 +2,28 @@ use lib './lib'; use strict; use warnings; use JavaScript::Duktape; +use Data::Dumper; use Test::More; use FindBin '$Bin'; my $ts_path = "$Bin/data/typescript.js"; + subtest 'typescript compile' => sub { my $js = JavaScript::Duktape->new; - $js->set( load=>sub{ _load_ts(); } ); + $js->set( load => sub { _load_ts(); } ); + + $js->eval(q{ + var module = {}; + var exports = module.exports = {}; + function require(){ + eval(load()); + return module.exports; + } + }); my $ts = $js->eval( q{ - Duktape.modSearch = function(){ return load() }; var ts = require('ts'); ts; } ); @@ -26,8 +36,16 @@ subtest 'typescript transpile' => sub { $js->set( load=>sub{ _load_ts(); } ); + $js->eval(q{ + var module = {}; + var exports = module.exports = {}; + function require(){ + eval(load()); + return module.exports; + } + }); + my $code = $js->eval( q{ - Duktape.modSearch = function(){ return load() }; var ts = require('ts'); var code = ts.transpile('class Foo { bar: string; constructor(){ this.bar="baz" }; };'); code; diff --git a/t/uncaught.t b/t/uncaught.t index 926df82..82275e7 100644 --- a/t/uncaught.t +++ b/t/uncaught.t @@ -45,9 +45,6 @@ $duk->put_global_string("perlFn"); }; ok ($@, $@); is($count, 1, "called once"); - - my $top = $duk->get_top(); - is($top, 0, "Error on Top"); } { #peval with try/catch @@ -66,11 +63,9 @@ $duk->put_global_string("perlFn"); }; - ok (!$@, $@); + ok (!$@, 'Eval Error'); is($count, 1, "called once"); - - my $top = $duk->get_top(); - is($top, 1, "Error is on top"); + ok($duk->is_error(-1), "Error is on top"); $duk->pop(); } @@ -88,9 +83,8 @@ $duk->put_global_string("perlFn"); ok (!$@, $@); is($count, 1, "called once"); - my $top = $duk->get_top(); - is($top, 1, "Error is on top"); - my $err_str = $duk->to_string(0); + ok($duk->is_error(-1), "Error is on top"); + my $err_str = $duk->to_string(-1); ok($err_str =~ /^Error: Died at/, $err_str); } @@ -110,7 +104,7 @@ $duk->put_global_string("perlFn"); $duk->call(0); }; - ok ($@ =~ /^duktape uncaught error/, $@); + ok ($@ =~ /^uncaught/, $@); $duk->eval_string("perlFn"); eval { @@ -118,8 +112,8 @@ $duk->put_global_string("perlFn"); }; ok (!$@); - my $str = $duk->to_string(0); + my $str = $duk->to_string(-1); is($str, "TypeError: string required, found none (stack index 99)"); } -done_testing(15); +done_testing(14);