From d68fa6d2e74f8e266f5562931517412ec4e16fa8 Mon Sep 17 00:00:00 2001 From: Ahmad Alhashemi Date: Tue, 13 Jun 2017 00:25:21 -0400 Subject: [PATCH] Add test suite from reference implementation --- .gitignore | 2 + test.py | 1050 ++++++++ test/assignment/associativity.lox | 9 + test/assignment/global.lox | 8 + test/assignment/grouping.lox | 2 + test/assignment/infix_operator.lox | 3 + test/assignment/local.lox | 10 + test/assignment/prefix_operator.lox | 2 + test/assignment/syntax.lox | 5 + test/assignment/to_this.lox | 7 + test/assignment/undefined.lox | 1 + test/benchmark/binary_trees.lox | 71 + test/benchmark/equality.lox | 34 + test/benchmark/fib.lox | 8 + test/benchmark/invocation.lox | 73 + test/benchmark/method_call.lox | 69 + test/benchmark/properties.lox | 106 + test/benchmark/string_equality.lox | 219 ++ test/block/empty.lox | 7 + test/block/scope.lox | 8 + test/bool/equality.lox | 23 + test/bool/not.lox | 3 + test/call/bool.lox | 1 + test/call/nil.lox | 1 + test/call/num.lox | 1 + test/call/object.lox | 4 + test/call/string.lox | 1 + test/class/empty.lox | 3 + test/class/inherited_method.lox | 22 + test/class/local_reference_self.lox | 7 + test/class/reference_self.lox | 9 + test/closure/assign_to_closure.lox | 27 + test/closure/assign_to_shadowed_later.lox | 13 + .../closure/close_over_function_parameter.lox | 11 + test/closure/close_over_later_variable.lox | 15 + test/closure/close_over_method_parameter.lox | 13 + test/closure/closed_closure_in_function.lox | 11 + test/closure/nested_closure.lox | 25 + test/closure/open_closure_in_function.lox | 7 + .../reference_closure_multiple_times.lox | 14 + test/closure/reuse_closure_slot.lox | 16 + test/closure/shadow_closure_with_local.lox | 12 + test/closure/unused_closure.lox | 13 + test/closure/unused_later_closure.wren | 19 + test/comments/line_at_eof.lox | 2 + test/comments/only_line_comment.lox | 1 + test/comments/only_line_comment_and_line.lox | 1 + test/comments/unicode.lox | 9 + test/constructor/arguments.lox | 11 + test/constructor/call_init_explicitly.lox | 15 + test/constructor/default.lox | 4 + test/constructor/default_arguments.lox | 4 + test/constructor/early_return.lox | 10 + test/constructor/extra_arguments.lox | 11 + test/constructor/missing_arguments.lox | 5 + .../constructor/return_in_nested_function.lox | 10 + test/constructor/return_value.lox | 5 + test/empty_file.lox | 0 test/expressions/evaluate.lox | 4 + test/expressions/parse.lox | 3 + test/field/call_function_field.lox | 10 + test/field/call_nonfunction_field.lox | 6 + test/field/get_on_bool.lox | 1 + test/field/get_on_class.lox | 2 + test/field/get_on_function.lox | 3 + test/field/get_on_nil.lox | 1 + test/field/get_on_num.lox | 1 + test/field/get_on_string.lox | 1 + test/field/many.lox | 162 ++ test/field/method.lox | 9 + test/field/method_binds_this.lox | 16 + test/field/on_instance.lox | 9 + test/field/set_on_bool.lox | 1 + test/field/set_on_class.lox | 2 + test/field/set_on_function.lox | 3 + test/field/set_on_nil.lox | 1 + test/field/set_on_num.lox | 1 + test/field/set_on_string.lox | 1 + test/field/undefined.lox | 4 + test/for/class_in_body.lox | 2 + test/for/closure_in_body.lox | 16 + test/for/fun_in_body.lox | 2 + test/for/return_closure.lox | 10 + test/for/return_inside.lox | 9 + test/for/scope.lox | 26 + test/for/statement_condition.lox | 3 + test/for/statement_increment.lox | 2 + test/for/statement_initializer.lox | 3 + test/for/syntax.lox | 50 + test/for/var_in_body.lox | 2 + test/function/body_must_be_block.lox | 3 + test/function/empty_body.lox | 2 + test/function/extra_arguments.lox | 6 + test/function/local_mutual_recursion.lox | 12 + test/function/local_recursion.lox | 8 + test/function/missing_arguments.lox | 3 + test/function/missing_comma_in_parameters.lox | 3 + test/function/mutual_recursion.lox | 11 + test/function/parameters.lox | 26 + test/function/recursion.lox | 6 + test/function/too_many_arguments.lox | 1 + test/function/too_many_parameters.lox | 2 + test/if/class_in_else.lox | 2 + test/if/class_in_then.lox | 2 + test/if/dangling_else.lox | 3 + test/if/else.lox | 6 + test/if/fun_in_else.lox | 2 + test/if/fun_in_then.lox | 2 + test/if/if.lox | 10 + test/if/truth.lox | 8 + test/if/var_in_else.lox | 2 + test/if/var_in_then.lox | 2 + test/inheritance/inherit_from_function.lox | 3 + test/inheritance/inherit_from_nil.lox | 2 + test/inheritance/inherit_from_number.lox | 2 + test/inheritance/inherit_methods.lox | 14 + test/inheritance/parenthesized_superclass.lox | 4 + .../set_fields_from_base_class.lox | 38 + test/limit/loop_too_large.lox | 2351 +++++++++++++++++ test/limit/reuse_constants.lox | 38 + test/limit/stack_overflow.lox | 21 + test/limit/too_many_constants.lox | 36 + test/limit/too_many_locals.lox | 53 + test/limit/too_many_upvalues.lox | 105 + test/logical_operator/and.lox | 19 + test/logical_operator/and_truth.lox | 8 + test/logical_operator/or.lox | 19 + test/logical_operator/or_truth.lox | 8 + test/method/arity.lox | 22 + test/method/empty_block.lox | 5 + test/method/extra_arguments.lox | 8 + test/method/missing_arguments.lox | 5 + test/method/not_found.lox | 3 + test/method/refer_to_name.lox | 7 + test/method/too_many_arguments.lox | 1 + test/method/too_many_parameters.lox | 4 + test/nil/literal.lox | 1 + test/number/decimal_point_at_eof.lox | 2 + test/number/leading_dot.lox | 2 + test/number/literals.lox | 7 + test/number/trailing_dot.lox | 2 + test/operator/add.lox | 2 + test/operator/add_bool_nil.lox | 1 + test/operator/add_bool_num.lox | 1 + test/operator/add_bool_string.lox | 1 + test/operator/add_nil_nil.lox | 1 + test/operator/add_num_nil.lox | 1 + test/operator/add_string_nil.lox | 1 + test/operator/comparison.lox | 25 + test/operator/divide.lox | 2 + test/operator/divide_nonnum_num.lox | 1 + test/operator/divide_num_nonnum.lox | 1 + test/operator/equals.lox | 14 + test/operator/equals_class.lox | 13 + test/operator/greater_nonnum_num.lox | 1 + test/operator/greater_num_nonnum.lox | 1 + test/operator/greater_or_equal_nonnum_num.lox | 1 + test/operator/greater_or_equal_num_nonnum.lox | 1 + test/operator/less_nonnum_num.lox | 1 + test/operator/less_num_nonnum.lox | 1 + test/operator/less_or_equal_nonnum_num.lox | 1 + test/operator/less_or_equal_num_nonnum.lox | 1 + test/operator/multiply.lox | 2 + test/operator/multiply_nonnum_num.lox | 1 + test/operator/multiply_num_nonnum.lox | 1 + test/operator/negate.lox | 3 + test/operator/negate_nonnum.lox | 1 + test/operator/not.lox | 13 + test/operator/not_class.lox | 3 + test/operator/not_equals.lox | 14 + test/operator/subtract.lox | 2 + test/operator/subtract_nonnum_num.lox | 1 + test/operator/subtract_num_nonnum.lox | 1 + test/precedence.lox | 32 + test/print/missing_argument.lox | 2 + test/regression/40.lox | 22 + test/return/after_else.lox | 5 + test/return/after_if.lox | 5 + test/return/after_while.lox | 5 + test/return/at_top_level.lox | 1 + test/return/in_function.lox | 6 + test/return/in_method.lox | 8 + test/return/return_nil_if_no_value.lox | 6 + test/scanning/identifiers.lox | 12 + test/scanning/keywords.lox | 18 + test/scanning/numbers.lox | 12 + test/scanning/punctuators.lox | 21 + test/scanning/strings.lox | 6 + test/scanning/whitespace.lox | 12 + test/string/error_after_multiline.lox | 7 + test/string/literals.lox | 5 + test/string/multiline.lox | 7 + test/string/unterminated.lox | 2 + test/super/bound_method.lox | 19 + test/super/call_other_method.lox | 16 + test/super/call_same_method.lox | 16 + test/super/closure.lox | 17 + test/super/constructor.lox | 16 + test/super/extra_arguments.lox | 16 + test/super/indirectly_inherited.lox | 18 + test/super/missing_arguments.lox | 13 + test/super/no_superclass_bind.lox | 7 + test/super/no_superclass_call.lox | 7 + test/super/no_superclass_method.lox | 9 + test/super/parenthesized.lox | 10 + test/super/reassign_superclass.lox | 22 + test/super/super_at_top_level.lox | 2 + .../super_in_closure_in_inherited_method.lox | 26 + test/super/super_in_inherited_method.lox | 23 + test/super/super_in_top_level_function.lox | 3 + test/super/super_without_dot.lox | 8 + test/super/super_without_name.lox | 7 + test/super/this_in_superclass_method.lox | 16 + test/this/closure.lox | 13 + test/this/nested_class.lox | 20 + test/this/nested_closure.lox | 19 + test/this/this_at_top_level.lox | 1 + test/this/this_in_method.lox | 6 + test/this/this_in_top_level_function.lox | 3 + test/unexpected_character.lox | 3 + test/variable/collide_with_parameter.lox | 3 + test/variable/duplicate_local.lox | 4 + test/variable/duplicate_parameter.lox | 4 + test/variable/early_bound.lox | 10 + test/variable/in_middle_of_block.lox | 10 + test/variable/in_nested_block.lox | 6 + test/variable/local_from_method.lox | 9 + test/variable/redeclare_global.lox | 3 + test/variable/redefine_global.lox | 3 + .../scope_reuse_in_different_blocks.lox | 9 + test/variable/shadow_and_local.lox | 8 + test/variable/shadow_global.lox | 6 + test/variable/shadow_local.lox | 8 + test/variable/undefined_global.lox | 1 + test/variable/undefined_local.lox | 3 + test/variable/uninitialized.lox | 2 + test/variable/unreached_undefined.lox | 5 + test/variable/use_false_as_var.lox | 2 + test/variable/use_global_in_initializer.lox | 3 + test/variable/use_local_in_initializer.lox | 4 + test/variable/use_nil_as_var.lox | 2 + test/variable/use_this_as_var.lox | 2 + test/while/class_in_body.lox | 2 + test/while/closure_in_body.lox | 19 + test/while/fun_in_body.lox | 2 + test/while/return_closure.lox | 10 + test/while/return_inside.lox | 9 + test/while/syntax.lox | 21 + test/while/var_in_body.lox | 2 + test_swift.py | 41 + 250 files changed, 6188 insertions(+) create mode 100644 test.py create mode 100755 test/assignment/associativity.lox create mode 100755 test/assignment/global.lox create mode 100755 test/assignment/grouping.lox create mode 100755 test/assignment/infix_operator.lox create mode 100755 test/assignment/local.lox create mode 100755 test/assignment/prefix_operator.lox create mode 100755 test/assignment/syntax.lox create mode 100755 test/assignment/to_this.lox create mode 100755 test/assignment/undefined.lox create mode 100755 test/benchmark/binary_trees.lox create mode 100755 test/benchmark/equality.lox create mode 100755 test/benchmark/fib.lox create mode 100755 test/benchmark/invocation.lox create mode 100755 test/benchmark/method_call.lox create mode 100755 test/benchmark/properties.lox create mode 100755 test/benchmark/string_equality.lox create mode 100755 test/block/empty.lox create mode 100755 test/block/scope.lox create mode 100755 test/bool/equality.lox create mode 100755 test/bool/not.lox create mode 100755 test/call/bool.lox create mode 100755 test/call/nil.lox create mode 100755 test/call/num.lox create mode 100755 test/call/object.lox create mode 100755 test/call/string.lox create mode 100755 test/class/empty.lox create mode 100755 test/class/inherited_method.lox create mode 100755 test/class/local_reference_self.lox create mode 100755 test/class/reference_self.lox create mode 100755 test/closure/assign_to_closure.lox create mode 100755 test/closure/assign_to_shadowed_later.lox create mode 100755 test/closure/close_over_function_parameter.lox create mode 100755 test/closure/close_over_later_variable.lox create mode 100755 test/closure/close_over_method_parameter.lox create mode 100755 test/closure/closed_closure_in_function.lox create mode 100755 test/closure/nested_closure.lox create mode 100755 test/closure/open_closure_in_function.lox create mode 100755 test/closure/reference_closure_multiple_times.lox create mode 100755 test/closure/reuse_closure_slot.lox create mode 100755 test/closure/shadow_closure_with_local.lox create mode 100755 test/closure/unused_closure.lox create mode 100755 test/closure/unused_later_closure.wren create mode 100755 test/comments/line_at_eof.lox create mode 100755 test/comments/only_line_comment.lox create mode 100755 test/comments/only_line_comment_and_line.lox create mode 100755 test/comments/unicode.lox create mode 100755 test/constructor/arguments.lox create mode 100755 test/constructor/call_init_explicitly.lox create mode 100755 test/constructor/default.lox create mode 100755 test/constructor/default_arguments.lox create mode 100755 test/constructor/early_return.lox create mode 100755 test/constructor/extra_arguments.lox create mode 100755 test/constructor/missing_arguments.lox create mode 100755 test/constructor/return_in_nested_function.lox create mode 100755 test/constructor/return_value.lox create mode 100755 test/empty_file.lox create mode 100755 test/expressions/evaluate.lox create mode 100755 test/expressions/parse.lox create mode 100755 test/field/call_function_field.lox create mode 100755 test/field/call_nonfunction_field.lox create mode 100755 test/field/get_on_bool.lox create mode 100755 test/field/get_on_class.lox create mode 100755 test/field/get_on_function.lox create mode 100755 test/field/get_on_nil.lox create mode 100755 test/field/get_on_num.lox create mode 100755 test/field/get_on_string.lox create mode 100755 test/field/many.lox create mode 100755 test/field/method.lox create mode 100755 test/field/method_binds_this.lox create mode 100755 test/field/on_instance.lox create mode 100755 test/field/set_on_bool.lox create mode 100755 test/field/set_on_class.lox create mode 100755 test/field/set_on_function.lox create mode 100755 test/field/set_on_nil.lox create mode 100755 test/field/set_on_num.lox create mode 100755 test/field/set_on_string.lox create mode 100755 test/field/undefined.lox create mode 100755 test/for/class_in_body.lox create mode 100755 test/for/closure_in_body.lox create mode 100755 test/for/fun_in_body.lox create mode 100755 test/for/return_closure.lox create mode 100755 test/for/return_inside.lox create mode 100755 test/for/scope.lox create mode 100755 test/for/statement_condition.lox create mode 100755 test/for/statement_increment.lox create mode 100755 test/for/statement_initializer.lox create mode 100755 test/for/syntax.lox create mode 100755 test/for/var_in_body.lox create mode 100755 test/function/body_must_be_block.lox create mode 100755 test/function/empty_body.lox create mode 100755 test/function/extra_arguments.lox create mode 100755 test/function/local_mutual_recursion.lox create mode 100755 test/function/local_recursion.lox create mode 100755 test/function/missing_arguments.lox create mode 100755 test/function/missing_comma_in_parameters.lox create mode 100755 test/function/mutual_recursion.lox create mode 100755 test/function/parameters.lox create mode 100755 test/function/recursion.lox create mode 100755 test/function/too_many_arguments.lox create mode 100755 test/function/too_many_parameters.lox create mode 100755 test/if/class_in_else.lox create mode 100755 test/if/class_in_then.lox create mode 100755 test/if/dangling_else.lox create mode 100755 test/if/else.lox create mode 100755 test/if/fun_in_else.lox create mode 100755 test/if/fun_in_then.lox create mode 100755 test/if/if.lox create mode 100755 test/if/truth.lox create mode 100755 test/if/var_in_else.lox create mode 100755 test/if/var_in_then.lox create mode 100755 test/inheritance/inherit_from_function.lox create mode 100755 test/inheritance/inherit_from_nil.lox create mode 100755 test/inheritance/inherit_from_number.lox create mode 100755 test/inheritance/inherit_methods.lox create mode 100755 test/inheritance/parenthesized_superclass.lox create mode 100755 test/inheritance/set_fields_from_base_class.lox create mode 100755 test/limit/loop_too_large.lox create mode 100755 test/limit/reuse_constants.lox create mode 100755 test/limit/stack_overflow.lox create mode 100755 test/limit/too_many_constants.lox create mode 100755 test/limit/too_many_locals.lox create mode 100755 test/limit/too_many_upvalues.lox create mode 100755 test/logical_operator/and.lox create mode 100755 test/logical_operator/and_truth.lox create mode 100755 test/logical_operator/or.lox create mode 100755 test/logical_operator/or_truth.lox create mode 100755 test/method/arity.lox create mode 100755 test/method/empty_block.lox create mode 100755 test/method/extra_arguments.lox create mode 100755 test/method/missing_arguments.lox create mode 100755 test/method/not_found.lox create mode 100755 test/method/refer_to_name.lox create mode 100755 test/method/too_many_arguments.lox create mode 100755 test/method/too_many_parameters.lox create mode 100755 test/nil/literal.lox create mode 100755 test/number/decimal_point_at_eof.lox create mode 100755 test/number/leading_dot.lox create mode 100755 test/number/literals.lox create mode 100755 test/number/trailing_dot.lox create mode 100755 test/operator/add.lox create mode 100755 test/operator/add_bool_nil.lox create mode 100755 test/operator/add_bool_num.lox create mode 100755 test/operator/add_bool_string.lox create mode 100755 test/operator/add_nil_nil.lox create mode 100755 test/operator/add_num_nil.lox create mode 100755 test/operator/add_string_nil.lox create mode 100755 test/operator/comparison.lox create mode 100755 test/operator/divide.lox create mode 100755 test/operator/divide_nonnum_num.lox create mode 100755 test/operator/divide_num_nonnum.lox create mode 100755 test/operator/equals.lox create mode 100755 test/operator/equals_class.lox create mode 100755 test/operator/greater_nonnum_num.lox create mode 100755 test/operator/greater_num_nonnum.lox create mode 100755 test/operator/greater_or_equal_nonnum_num.lox create mode 100755 test/operator/greater_or_equal_num_nonnum.lox create mode 100755 test/operator/less_nonnum_num.lox create mode 100755 test/operator/less_num_nonnum.lox create mode 100755 test/operator/less_or_equal_nonnum_num.lox create mode 100755 test/operator/less_or_equal_num_nonnum.lox create mode 100755 test/operator/multiply.lox create mode 100755 test/operator/multiply_nonnum_num.lox create mode 100755 test/operator/multiply_num_nonnum.lox create mode 100755 test/operator/negate.lox create mode 100755 test/operator/negate_nonnum.lox create mode 100755 test/operator/not.lox create mode 100755 test/operator/not_class.lox create mode 100755 test/operator/not_equals.lox create mode 100755 test/operator/subtract.lox create mode 100755 test/operator/subtract_nonnum_num.lox create mode 100755 test/operator/subtract_num_nonnum.lox create mode 100755 test/precedence.lox create mode 100755 test/print/missing_argument.lox create mode 100755 test/regression/40.lox create mode 100755 test/return/after_else.lox create mode 100755 test/return/after_if.lox create mode 100755 test/return/after_while.lox create mode 100755 test/return/at_top_level.lox create mode 100755 test/return/in_function.lox create mode 100755 test/return/in_method.lox create mode 100755 test/return/return_nil_if_no_value.lox create mode 100755 test/scanning/identifiers.lox create mode 100755 test/scanning/keywords.lox create mode 100755 test/scanning/numbers.lox create mode 100755 test/scanning/punctuators.lox create mode 100755 test/scanning/strings.lox create mode 100755 test/scanning/whitespace.lox create mode 100755 test/string/error_after_multiline.lox create mode 100755 test/string/literals.lox create mode 100755 test/string/multiline.lox create mode 100755 test/string/unterminated.lox create mode 100755 test/super/bound_method.lox create mode 100755 test/super/call_other_method.lox create mode 100755 test/super/call_same_method.lox create mode 100755 test/super/closure.lox create mode 100755 test/super/constructor.lox create mode 100755 test/super/extra_arguments.lox create mode 100755 test/super/indirectly_inherited.lox create mode 100755 test/super/missing_arguments.lox create mode 100755 test/super/no_superclass_bind.lox create mode 100755 test/super/no_superclass_call.lox create mode 100755 test/super/no_superclass_method.lox create mode 100755 test/super/parenthesized.lox create mode 100755 test/super/reassign_superclass.lox create mode 100755 test/super/super_at_top_level.lox create mode 100755 test/super/super_in_closure_in_inherited_method.lox create mode 100755 test/super/super_in_inherited_method.lox create mode 100755 test/super/super_in_top_level_function.lox create mode 100755 test/super/super_without_dot.lox create mode 100755 test/super/super_without_name.lox create mode 100755 test/super/this_in_superclass_method.lox create mode 100755 test/this/closure.lox create mode 100755 test/this/nested_class.lox create mode 100755 test/this/nested_closure.lox create mode 100755 test/this/this_at_top_level.lox create mode 100755 test/this/this_in_method.lox create mode 100755 test/this/this_in_top_level_function.lox create mode 100755 test/unexpected_character.lox create mode 100755 test/variable/collide_with_parameter.lox create mode 100755 test/variable/duplicate_local.lox create mode 100755 test/variable/duplicate_parameter.lox create mode 100755 test/variable/early_bound.lox create mode 100755 test/variable/in_middle_of_block.lox create mode 100755 test/variable/in_nested_block.lox create mode 100755 test/variable/local_from_method.lox create mode 100755 test/variable/redeclare_global.lox create mode 100755 test/variable/redefine_global.lox create mode 100755 test/variable/scope_reuse_in_different_blocks.lox create mode 100755 test/variable/shadow_and_local.lox create mode 100755 test/variable/shadow_global.lox create mode 100755 test/variable/shadow_local.lox create mode 100755 test/variable/undefined_global.lox create mode 100755 test/variable/undefined_local.lox create mode 100755 test/variable/uninitialized.lox create mode 100755 test/variable/unreached_undefined.lox create mode 100755 test/variable/use_false_as_var.lox create mode 100755 test/variable/use_global_in_initializer.lox create mode 100755 test/variable/use_local_in_initializer.lox create mode 100755 test/variable/use_nil_as_var.lox create mode 100755 test/variable/use_this_as_var.lox create mode 100755 test/while/class_in_body.lox create mode 100755 test/while/closure_in_body.lox create mode 100755 test/while/fun_in_body.lox create mode 100755 test/while/return_closure.lox create mode 100755 test/while/return_inside.lox create mode 100755 test/while/syntax.lox create mode 100755 test/while/var_in_body.lox create mode 100644 test_swift.py diff --git a/.gitignore b/.gitignore index 6bfa0e8..cfa2f0a 100644 --- a/.gitignore +++ b/.gitignore @@ -110,3 +110,5 @@ fastlane/test_output ## Other # End of https://www.gitignore.io/api/xcode,swift,osx + +__pycache__ \ No newline at end of file diff --git a/test.py b/test.py new file mode 100644 index 0000000..2682124 --- /dev/null +++ b/test.py @@ -0,0 +1,1050 @@ +#!/usr/bin/env python3 + +from __future__ import print_function + +from collections import defaultdict +from os import listdir +from os.path import abspath, basename, dirname, isdir, isfile, join, realpath, relpath, splitext +import re +from subprocess import Popen, PIPE +import sys + +# Runs the tests. +REPO_DIR = dirname(dirname(realpath(__file__))) + +OUTPUT_EXPECT = re.compile(r'// expect: ?(.*)') +ERROR_EXPECT = re.compile(r'// (Error.*)') +ERROR_LINE_EXPECT = re.compile(r'// \[((java|c) )?line (\d+)\] (Error.*)') +RUNTIME_ERROR_EXPECT = re.compile(r'// expect runtime error: (.+)') +SYNTAX_ERROR_RE = re.compile(r'\[.*line (\d+)\] (Error.+)') +STACK_TRACE_RE = re.compile(r'\[line (\d+)\]') +NONTEST_RE = re.compile(r'// nontest') + +passed = 0 +failed = 0 +num_skipped = 0 +expectations = 0 + +interpreter = None +filter_path = None + +INTERPRETERS = {} +C_SUITES = [] +JAVA_SUITES = [] + + +class Interpreter: + def __init__(self, name, language, args, tests): + self.name = name + self.language = language + self.args = args + self.tests = tests + + +def c_interpreter(name, tests): + if name == 'clox': + path = 'build/cloxd' + else: + path = 'build/' + name + + INTERPRETERS[name] = Interpreter(name, 'c', [path], tests) + C_SUITES.append(name) + + +def java_interpreter(name, tests): + if name == 'jlox': + dir = 'build/java' + else: + dir = 'build/gen/' + name + + INTERPRETERS[name] = Interpreter(name, 'java', + ['java', '-cp', dir, 'com.craftinginterpreters.lox.Lox'], tests) + JAVA_SUITES.append(name) + + +java_interpreter('jlox', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', + + # No hardcoded limits in jlox. + 'test/limit/loop_too_large.lox': 'skip', + 'test/limit/too_many_constants.lox': 'skip', + 'test/limit/too_many_locals.lox': 'skip', + 'test/limit/too_many_upvalues.lox': 'skip', + + # Rely on JVM for stack overflow checking. + 'test/limit/stack_overflow.lox': 'skip', +}) + +java_interpreter('chap04_scanning', { + # No interpreter yet. + 'test': 'skip', + + 'test/scanning': 'pass' +}) + +# No test for chapter 5. It just has a hardcoded main() in AstPrinter. + +java_interpreter('chap06_parsing', { + # No real interpreter yet. + 'test': 'skip', + + 'test/expressions/parse.lox': 'pass' +}) + +java_interpreter('chap07_evaluating', { + # No real interpreter yet. + 'test': 'skip', + + 'test/expressions/evaluate.lox': 'pass' +}) + +java_interpreter('chap08_statements', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', + + # No hardcoded limits in jlox. + 'test/limit/loop_too_large.lox': 'skip', + 'test/limit/reuse_constants.lox': 'skip', + 'test/limit/too_many_constants.lox': 'skip', + 'test/limit/too_many_locals.lox': 'skip', + 'test/limit/too_many_upvalues.lox': 'skip', + + # Rely on JVM for stack overflow checking. + 'test/limit/stack_overflow.lox': 'skip', + + # No control flow. + 'test/block/empty.lox': 'skip', + 'test/for': 'skip', + 'test/if': 'skip', + 'test/logical_operator': 'skip', + 'test/while': 'skip', + 'test/variable/unreached_undefined.lox': 'skip', + + # No functions. + 'test/call': 'skip', + 'test/closure': 'skip', + 'test/function': 'skip', + 'test/operator/not.lox': 'skip', + 'test/regression/40.lox': 'skip', + 'test/return': 'skip', + 'test/unexpected_character.lox': 'skip', + + # Broken because we haven't fixed it yet by detecting the error. + 'test/return/at_top_level.lox': 'skip', + 'test/variable/use_local_in_initializer.lox': 'skip', + + # No resolution. + 'test/closure/assign_to_shadowed_later.lox': 'skip', + 'test/function/local_mutual_recursion.lox': 'skip', + 'test/variable/collide_with_parameter.lox': 'skip', + 'test/variable/duplicate_local.lox': 'skip', + 'test/variable/duplicate_parameter.lox': 'skip', + 'test/variable/early_bound.lox': 'skip', + + # No classes. + 'test/assignment/to_this.lox': 'skip', + 'test/call/object.lox': 'skip', + 'test/class': 'skip', + 'test/closure/close_over_method_parameter.lox': 'skip', + 'test/constructor': 'skip', + 'test/field': 'skip', + 'test/inheritance': 'skip', + 'test/method': 'skip', + 'test/number/decimal_point_at_eof.lox': 'skip', + 'test/number/trailing_dot.lox': 'skip', + 'test/operator/equals_class.lox': 'skip', + 'test/operator/not_class.lox': 'skip', + 'test/super': 'skip', + 'test/this': 'skip', + 'test/return/in_method.lox': 'skip', + 'test/variable/local_from_method.lox': 'skip', +}) + +java_interpreter('chap09_control', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', + + # No hardcoded limits in jlox. + 'test/limit/loop_too_large.lox': 'skip', + 'test/limit/reuse_constants.lox': 'skip', + 'test/limit/too_many_constants.lox': 'skip', + 'test/limit/too_many_locals.lox': 'skip', + 'test/limit/too_many_upvalues.lox': 'skip', + + # Rely on JVM for stack overflow checking. + 'test/limit/stack_overflow.lox': 'skip', + + # No functions. + 'test/call': 'skip', + 'test/closure': 'skip', + 'test/for/closure_in_body.lox': 'skip', + 'test/for/return_closure.lox': 'skip', + 'test/for/return_inside.lox': 'skip', + 'test/for/syntax.lox': 'skip', + 'test/function': 'skip', + 'test/operator/not.lox': 'skip', + 'test/regression/40.lox': 'skip', + 'test/return': 'skip', + 'test/unexpected_character.lox': 'skip', + 'test/while/closure_in_body.lox': 'skip', + 'test/while/return_closure.lox': 'skip', + 'test/while/return_inside.lox': 'skip', + + # Broken because we haven't fixed it yet by detecting the error. + 'test/return/at_top_level.lox': 'skip', + 'test/variable/use_local_in_initializer.lox': 'skip', + + # No resolution. + 'test/closure/assign_to_shadowed_later.lox': 'skip', + 'test/function/local_mutual_recursion.lox': 'skip', + 'test/variable/collide_with_parameter.lox': 'skip', + 'test/variable/duplicate_local.lox': 'skip', + 'test/variable/duplicate_parameter.lox': 'skip', + 'test/variable/early_bound.lox': 'skip', + + # No classes. + 'test/assignment/to_this.lox': 'skip', + 'test/call/object.lox': 'skip', + 'test/class': 'skip', + 'test/closure/close_over_method_parameter.lox': 'skip', + 'test/constructor': 'skip', + 'test/field': 'skip', + 'test/inheritance': 'skip', + 'test/method': 'skip', + 'test/number/decimal_point_at_eof.lox': 'skip', + 'test/number/trailing_dot.lox': 'skip', + 'test/operator/equals_class.lox': 'skip', + 'test/operator/not_class.lox': 'skip', + 'test/super': 'skip', + 'test/this': 'skip', + 'test/return/in_method.lox': 'skip', + 'test/variable/local_from_method.lox': 'skip', +}) + +java_interpreter('chap10_functions', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', + + # No hardcoded limits in jlox. + 'test/limit/loop_too_large.lox': 'skip', + 'test/limit/too_many_constants.lox': 'skip', + 'test/limit/too_many_locals.lox': 'skip', + 'test/limit/too_many_upvalues.lox': 'skip', + + # Rely on JVM for stack overflow checking. + 'test/limit/stack_overflow.lox': 'skip', + + # Broken because we haven't fixed it yet by detecting the error. + 'test/return/at_top_level.lox': 'skip', + 'test/variable/use_local_in_initializer.lox': 'skip', + + # No resolution. + 'test/closure/assign_to_shadowed_later.lox': 'skip', + 'test/function/local_mutual_recursion.lox': 'skip', + 'test/variable/collide_with_parameter.lox': 'skip', + 'test/variable/duplicate_local.lox': 'skip', + 'test/variable/duplicate_parameter.lox': 'skip', + 'test/variable/early_bound.lox': 'skip', + + # No classes. + 'test/assignment/to_this.lox': 'skip', + 'test/call/object.lox': 'skip', + 'test/class': 'skip', + 'test/closure/close_over_method_parameter.lox': 'skip', + 'test/constructor': 'skip', + 'test/field': 'skip', + 'test/inheritance': 'skip', + 'test/method': 'skip', + 'test/number/decimal_point_at_eof.lox': 'skip', + 'test/number/trailing_dot.lox': 'skip', + 'test/operator/equals_class.lox': 'skip', + 'test/operator/not_class.lox': 'skip', + 'test/super': 'skip', + 'test/this': 'skip', + 'test/return/in_method.lox': 'skip', + 'test/variable/local_from_method.lox': 'skip', +}) + +java_interpreter('chap11_resolving', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', + + # No hardcoded limits in jlox. + 'test/limit/loop_too_large.lox': 'skip', + 'test/limit/too_many_constants.lox': 'skip', + 'test/limit/too_many_locals.lox': 'skip', + 'test/limit/too_many_upvalues.lox': 'skip', + + # Rely on JVM for stack overflow checking. + 'test/limit/stack_overflow.lox': 'skip', + + # No classes. + 'test/assignment/to_this.lox': 'skip', + 'test/call/object.lox': 'skip', + 'test/class': 'skip', + 'test/closure/close_over_method_parameter.lox': 'skip', + 'test/constructor': 'skip', + 'test/field': 'skip', + 'test/inheritance': 'skip', + 'test/method': 'skip', + 'test/number/decimal_point_at_eof.lox': 'skip', + 'test/number/trailing_dot.lox': 'skip', + 'test/operator/equals_class.lox': 'skip', + 'test/operator/not_class.lox': 'skip', + 'test/super': 'skip', + 'test/this': 'skip', + 'test/return/in_method.lox': 'skip', + 'test/variable/local_from_method.lox': 'skip', +}) + +java_interpreter('chap12_classes', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', + + # No hardcoded limits in jlox. + 'test/limit/loop_too_large.lox': 'skip', + 'test/limit/too_many_constants.lox': 'skip', + 'test/limit/too_many_locals.lox': 'skip', + 'test/limit/too_many_upvalues.lox': 'skip', + + # Rely on JVM for stack overflow checking. + 'test/limit/stack_overflow.lox': 'skip', + + # No inheritance. + 'test/class/inherited_method.lox': 'skip', + 'test/inheritance': 'skip', + 'test/super': 'skip', +}) + +java_interpreter('chap13_inheritance', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', + + # No hardcoded limits in jlox. + 'test/limit/loop_too_large.lox': 'skip', + 'test/limit/too_many_constants.lox': 'skip', + 'test/limit/too_many_locals.lox': 'skip', + 'test/limit/too_many_upvalues.lox': 'skip', + + # Rely on JVM for stack overflow checking. + 'test/limit/stack_overflow.lox': 'skip', +}) + +c_interpreter('clox', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip' +}) + +# TODO: Other chapters. + +c_interpreter('chap21_global', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', + + # No control flow. + 'test/block/empty.lox': 'skip', + 'test/for': 'skip', + 'test/if': 'skip', + 'test/limit/loop_too_large.lox': 'skip', + 'test/logical_operator': 'skip', + 'test/variable/unreached_undefined.lox': 'skip', + 'test/while': 'skip', + + # No blocks. + 'test/assignment/local.lox': 'skip', + 'test/variable/in_middle_of_block.lox': 'skip', + 'test/variable/in_nested_block.lox': 'skip', + 'test/variable/scope_reuse_in_different_blocks.lox': 'skip', + 'test/variable/shadow_and_local.lox': 'skip', + 'test/variable/undefined_local.lox': 'skip', + + # No local variables. + 'test/block/scope.lox': 'skip', + 'test/variable/duplicate_local.lox': 'skip', + 'test/variable/shadow_global.lox': 'skip', + 'test/variable/shadow_local.lox': 'skip', + 'test/variable/use_local_in_initializer.lox': 'skip', + + # No functions. + 'test/call': 'skip', + 'test/closure': 'skip', + 'test/function': 'skip', + 'test/limit/reuse_constants.lox': 'skip', + 'test/limit/stack_overflow.lox': 'skip', + 'test/limit/too_many_constants.lox': 'skip', + 'test/limit/too_many_locals.lox': 'skip', + 'test/limit/too_many_upvalues.lox': 'skip', + 'test/regression/40.lox': 'skip', + 'test/return': 'skip', + 'test/unexpected_character.lox': 'skip', + 'test/variable/collide_with_parameter.lox': 'skip', + 'test/variable/duplicate_parameter.lox': 'skip', + 'test/variable/early_bound.lox': 'skip', + + # No classes. + 'test/assignment/to_this.lox': 'skip', + 'test/class': 'skip', + 'test/constructor': 'skip', + 'test/field': 'skip', + 'test/inheritance': 'skip', + 'test/method': 'skip', + 'test/number/decimal_point_at_eof.lox': 'skip', + 'test/number/trailing_dot.lox': 'skip', + 'test/operator/equals_class.lox': 'skip', + 'test/operator/not.lox': 'skip', + 'test/operator/not_class.lox': 'skip', + 'test/super': 'skip', + 'test/this': 'skip', + 'test/variable/local_from_method.lox': 'skip', +}) + +c_interpreter('chap22_local', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', + + # No control flow. + 'test/block/empty.lox': 'skip', + 'test/for': 'skip', + 'test/if': 'skip', + 'test/limit/loop_too_large.lox': 'skip', + 'test/logical_operator': 'skip', + 'test/variable/unreached_undefined.lox': 'skip', + 'test/while': 'skip', + + # No functions. + 'test/call': 'skip', + 'test/closure': 'skip', + 'test/function': 'skip', + 'test/limit/reuse_constants.lox': 'skip', + 'test/limit/stack_overflow.lox': 'skip', + 'test/limit/too_many_constants.lox': 'skip', + 'test/limit/too_many_locals.lox': 'skip', + 'test/limit/too_many_upvalues.lox': 'skip', + 'test/regression/40.lox': 'skip', + 'test/return': 'skip', + 'test/unexpected_character.lox': 'skip', + 'test/variable/collide_with_parameter.lox': 'skip', + 'test/variable/duplicate_parameter.lox': 'skip', + 'test/variable/early_bound.lox': 'skip', + + # No classes. + 'test/assignment/to_this.lox': 'skip', + 'test/class': 'skip', + 'test/constructor': 'skip', + 'test/field': 'skip', + 'test/inheritance': 'skip', + 'test/method': 'skip', + 'test/number/decimal_point_at_eof.lox': 'skip', + 'test/number/trailing_dot.lox': 'skip', + 'test/operator/equals_class.lox': 'skip', + 'test/operator/not.lox': 'skip', + 'test/operator/not_class.lox': 'skip', + 'test/super': 'skip', + 'test/this': 'skip', + 'test/variable/local_from_method.lox': 'skip', +}) + +c_interpreter('chap23_jumping', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', + + # No functions. + 'test/call': 'skip', + 'test/closure': 'skip', + 'test/for/closure_in_body.lox': 'skip', + 'test/for/return_closure.lox': 'skip', + 'test/for/return_inside.lox': 'skip', + 'test/for/syntax.lox': 'skip', + 'test/function': 'skip', + 'test/limit/reuse_constants.lox': 'skip', + 'test/limit/stack_overflow.lox': 'skip', + 'test/limit/too_many_constants.lox': 'skip', + 'test/limit/too_many_locals.lox': 'skip', + 'test/limit/too_many_upvalues.lox': 'skip', + 'test/regression/40.lox': 'skip', + 'test/return': 'skip', + 'test/unexpected_character.lox': 'skip', + 'test/variable/collide_with_parameter.lox': 'skip', + 'test/variable/duplicate_parameter.lox': 'skip', + 'test/variable/early_bound.lox': 'skip', + 'test/while/closure_in_body.lox': 'skip', + 'test/while/return_closure.lox': 'skip', + 'test/while/return_inside.lox': 'skip', + + # No classes. + 'test/assignment/to_this.lox': 'skip', + 'test/class': 'skip', + 'test/constructor': 'skip', + 'test/field': 'skip', + 'test/inheritance': 'skip', + 'test/method': 'skip', + 'test/number/decimal_point_at_eof.lox': 'skip', + 'test/number/trailing_dot.lox': 'skip', + 'test/operator/equals_class.lox': 'skip', + 'test/operator/not.lox': 'skip', + 'test/operator/not_class.lox': 'skip', + 'test/super': 'skip', + 'test/this': 'skip', + 'test/variable/local_from_method.lox': 'skip', +}) + +c_interpreter('chap24_calls', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', + + # No closures. + 'test/closure': 'skip', + 'test/for/closure_in_body.lox': 'skip', + 'test/for/return_closure.lox': 'skip', + 'test/function/local_recursion.lox': 'skip', + 'test/limit/too_many_upvalues.lox': 'skip', + 'test/regression/40.lox': 'skip', + 'test/while/closure_in_body.lox': 'skip', + 'test/while/return_closure.lox': 'skip', + + # No classes. + 'test/assignment/to_this.lox': 'skip', + 'test/call/object.lox': 'skip', + 'test/class': 'skip', + 'test/constructor': 'skip', + 'test/field': 'skip', + 'test/inheritance': 'skip', + 'test/method': 'skip', + 'test/number/decimal_point_at_eof.lox': 'skip', + 'test/number/trailing_dot.lox': 'skip', + 'test/operator/equals_class.lox': 'skip', + 'test/operator/not.lox': 'skip', + 'test/operator/not_class.lox': 'skip', + 'test/return/in_method.lox': 'skip', + 'test/super': 'skip', + 'test/this': 'skip', + 'test/variable/local_from_method.lox': 'skip', +}) + +c_interpreter('chap25_closures', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', + + # No classes. + 'test/assignment/to_this.lox': 'skip', + 'test/call/object.lox': 'skip', + 'test/class': 'skip', + 'test/closure/close_over_method_parameter.lox': 'skip', + 'test/constructor': 'skip', + 'test/field': 'skip', + 'test/inheritance': 'skip', + 'test/method': 'skip', + 'test/number/decimal_point_at_eof.lox': 'skip', + 'test/number/trailing_dot.lox': 'skip', + 'test/operator/equals_class.lox': 'skip', + 'test/operator/not.lox': 'skip', + 'test/operator/not_class.lox': 'skip', + 'test/return/in_method.lox': 'skip', + 'test/super': 'skip', + 'test/this': 'skip', + 'test/variable/local_from_method.lox': 'skip', +}) + +c_interpreter('chap26_garbage', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', + + # No classes. + 'test/assignment/to_this.lox': 'skip', + 'test/call/object.lox': 'skip', + 'test/class': 'skip', + 'test/closure/close_over_method_parameter.lox': 'skip', + 'test/constructor': 'skip', + 'test/field': 'skip', + 'test/inheritance': 'skip', + 'test/method': 'skip', + 'test/number/decimal_point_at_eof.lox': 'skip', + 'test/number/trailing_dot.lox': 'skip', + 'test/operator/equals_class.lox': 'skip', + 'test/operator/not.lox': 'skip', + 'test/operator/not_class.lox': 'skip', + 'test/return/in_method.lox': 'skip', + 'test/super': 'skip', + 'test/this': 'skip', + 'test/variable/local_from_method.lox': 'skip', +}) + +c_interpreter('chap27_classes', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', + + # No inheritance. + 'test/class/inherited_method.lox': 'skip', + 'test/inheritance': 'skip', + 'test/super': 'skip', + + # No methods. + 'test/assignment/to_this.lox': 'skip', + 'test/class/local_reference_self.lox': 'skip', + 'test/class/reference_self.lox': 'skip', + 'test/closure/close_over_method_parameter.lox': 'skip', + 'test/constructor': 'skip', + 'test/field/method.lox': 'skip', + 'test/field/method_binds_this.lox': 'skip', + 'test/method': 'skip', + 'test/operator/equals_class.lox': 'skip', + 'test/return/in_method.lox': 'skip', + 'test/this': 'skip', + 'test/variable/local_from_method.lox': 'skip', +}) + +c_interpreter('chap28_methods', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', + + # No inheritance. + 'test/class/inherited_method.lox': 'skip', + 'test/inheritance': 'skip', + 'test/super': 'skip', +}) + +c_interpreter('chap29_superclasses', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', +}) + +c_interpreter('chap30_optimization', { + 'test': 'pass', + + # These are just for earlier chapters. + 'test/scanning': 'skip', + 'test/expressions': 'skip', +}) + +class Test: + def __init__(self, path): + self.path = path + self.output = [] + self.compile_errors = set() + self.runtime_error_line = 0 + self.runtime_error_message = None + self.exit_code = 0 + self.failures = [] + + + def parse(self): + global num_skipped + global expectations + + # Get the path components. + parts = self.path.split('/') + subpath = "" + state = None + + # Figure out the state of the test. We don't break out of this loop because + # we want lines for more specific paths to override more general ones. + for part in parts: + if subpath: subpath += '/' + subpath += part + + if subpath in interpreter.tests: + state = interpreter.tests[subpath] + + if not state: + print('Unknown test state for "{}".'.format(self.path)) + if state == 'skip': + num_skipped += 1 + return False + # TODO: State for tests that should be run but are expected to fail? + + line_num = 1 + with open(self.path, 'r') as file: + for line in file: + match = OUTPUT_EXPECT.search(line) + if match: + self.output.append((match.group(1), line_num)) + expectations += 1 + + match = ERROR_EXPECT.search(line) + if match: + self.compile_errors.add("[{0}] {1}".format(line_num, match.group(1))) + + # If we expect a compile error, it should exit with EX_DATAERR. + self.exit_code = 65 + expectations += 1 + + match = ERROR_LINE_EXPECT.search(line) + if match: + # The two interpreters are slightly different in terms of which + # cascaded errors may appear after an initial compile error because + # their panic mode recovery is a little different. To handle that, + # the tests can indicate if an error line should only appear for a + # certain interpreter. + language = match.group(2) + if not language or language == interpreter.language: + self.compile_errors.add("[{0}] {1}".format( + match.group(3), match.group(4))) + + # If we expect a compile error, it should exit with EX_DATAERR. + self.exit_code = 65 + expectations += 1 + + match = RUNTIME_ERROR_EXPECT.search(line) + if match: + self.runtime_error_line = line_num + self.runtime_error_message = match.group(1) + # If we expect a runtime error, it should exit with EX_SOFTWARE. + self.exit_code = 70 + expectations += 1 + + match = NONTEST_RE.search(line) + if match: + # Not a test file at all, so ignore it. + return False + + line_num += 1 + + + # If we got here, it's a valid test. + return True + + + def run(self): + # Invoke the interpreter and run the test. + args = interpreter.args[:] + args.append(self.path) + proc = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) + + out, err = proc.communicate() + self.validate(proc.returncode, out, err) + + + def validate(self, exit_code, out, err): + if self.compile_errors and self.runtime_error_message: + self.fail("Test error: Cannot expect both compile and runtime errors.") + return + + try: + out = out.decode("utf-8").replace('\r\n', '\n') + err = err.decode("utf-8").replace('\r\n', '\n') + except: + self.fail('Error decoding output.') + + error_lines = err.split('\n') + + # Validate that an expected runtime error occurred. + if self.runtime_error_message: + self.validate_runtime_error(error_lines) + else: + self.validate_compile_errors(error_lines) + + self.validate_exit_code(exit_code, error_lines) + self.validate_output(out) + + + def validate_runtime_error(self, error_lines): + if len(error_lines) < 2: + self.fail('Expected runtime error "{0}" and got none.', + self.runtime_error_message) + return + + # Skip any compile errors. This can happen if there is a compile error in + # a module loaded by the module being tested. + line = 0 + while SYNTAX_ERROR_RE.search(error_lines[line]): + line += 1 + + if error_lines[line] != self.runtime_error_message: + self.fail('Expected runtime error "{0}" and got:', + self.runtime_error_message) + self.fail(error_lines[line]) + + # Make sure the stack trace has the right line. Skip over any lines that + # come from builtin libraries. + match = False + stack_lines = error_lines[line + 1:] + for stack_line in stack_lines: + match = STACK_TRACE_RE.search(stack_line) + if match: break + + if not match: + self.fail('Expected stack trace and got:') + for stack_line in stack_lines: + self.fail(stack_line) + else: + stack_line = int(match.group(1)) + if stack_line != self.runtime_error_line: + self.fail('Expected runtime error on line {0} but was on line {1}.', + self.runtime_error_line, stack_line) + + + def validate_compile_errors(self, error_lines): + # Validate that every compile error was expected. + found_errors = set() + num_unexpected = 0 + for line in error_lines: + match = SYNTAX_ERROR_RE.search(line) + if match: + error = "[{0}] {1}".format(match.group(1), match.group(2)) + if error in self.compile_errors: + found_errors.add(error) + else: + if num_unexpected < 10: + self.fail('Unexpected error:') + self.fail(line) + num_unexpected += 1 + elif line != '': + if num_unexpected < 10: + self.fail('Unexpected output on stderr:') + self.fail(line) + num_unexpected += 1 + + if num_unexpected > 10: + self.fail('(truncated ' + str(num_unexpected - 10) + ' more...)') + + # Validate that every expected error occurred. + for error in self.compile_errors - found_errors: + self.fail('Missing expected error: {0}', error) + + + def validate_exit_code(self, exit_code, error_lines): + if exit_code == self.exit_code: return + + if len(error_lines) > 10: + error_lines = error_lines[0:10] + error_lines.append('(truncated...)') + self.fail('Expected return code {0} and got {1}. Stderr:', + self.exit_code, exit_code) + self.failures += error_lines + + + def validate_output(self, out): + # Remove the trailing last empty line. + out_lines = out.split('\n') + if out_lines[-1] == '': + del out_lines[-1] + + index = 0 + for line in out_lines: + if sys.version_info < (3, 0): + line = line.encode('utf-8') + + if index >= len(self.output): + self.fail('Got output "{0}" when none was expected.', line) + elif self.output[index][0] != line: + self.fail('Expected output "{0}" on line {1} and got "{2}".', + self.output[index][0], self.output[index][1], line) + index += 1 + + while index < len(self.output): + self.fail('Missing expected output "{0}" on line {1}.', + self.output[index][0], self.output[index][1]) + index += 1 + + + def fail(self, message, *args): + if args: + message = message.format(*args) + self.failures.append(message) + + +def color_text(text, color): + """Converts text to a string and wraps it in the ANSI escape sequence for + color, if supported.""" + + # No ANSI escapes on Windows. + if sys.platform == 'win32': + return str(text) + + return color + str(text) + '\033[0m' + + +def green(text): return color_text(text, '\033[32m') +def pink(text): return color_text(text, '\033[91m') +def red(text): return color_text(text, '\033[31m') +def yellow(text): return color_text(text, '\033[33m') +def gray(text): return color_text(text, '\033[1;30m') + + +def walk(dir, callback): + """ + Walks [dir], and executes [callback] on each file. + """ + + dir = abspath(dir) + for file in listdir(dir): + nfile = join(dir, file) + if isdir(nfile): + walk(nfile, callback) + else: + callback(nfile) + + +def print_line(line=None): + # Erase the line. + print('\033[2K', end='') + # Move the cursor to the beginning. + print('\r', end='') + if line: + print(line, end='') + sys.stdout.flush() + + +def run_script(path): + if "benchmark" in path: return + + global passed + global failed + global num_skipped + + if (splitext(path)[1] != '.lox'): + return + + # Check if we are just running a subset of the tests. + if filter_path: + this_test = relpath(path, join(REPO_DIR, 'test')) + if not this_test.startswith(filter_path): + return + + # Make a nice short path relative to the working directory. + + # Normalize it to use "/" since, among other things, the interpreters expect + # the argument to use that. + path = relpath(path).replace("\\", "/") + + # Update the status line. + print_line('Passed: ' + green(passed) + + ' Failed: ' + red(failed) + + ' Skipped: ' + yellow(num_skipped) + + gray(' (' + path + ')')) + + # Read the test and parse out the expectations. + test = Test(path) + + if not test.parse(): + # It's a skipped or non-test file. + return + + test.run() + + # Display the results. + if len(test.failures) == 0: + passed += 1 + else: + failed += 1 + print_line(red('FAIL') + ': ' + path) + print('') + for failure in test.failures: + print(' ' + pink(failure)) + print('') + + +def run_suite(name): + global interpreter + global passed + global failed + global num_skipped + global expectations + + interpreter = INTERPRETERS[name] + + passed = 0 + failed = 0 + num_skipped = 0 + expectations = 0 + + walk(join(REPO_DIR, 'test'), run_script) + print_line() + + if failed == 0: + print('All ' + green(passed) + ' tests passed (' + str(expectations) + + ' expectations).') + else: + print(green(passed) + ' tests passed. ' + red(failed) + ' tests failed.') + + return failed == 0 + + +def run_suites(names): + any_failed = False + for name in names: + print('=== {} ==='.format(name)) + if not run_suite(name): + any_failed = True + + if any_failed: + sys.exit(1) + +# Original file modified by wrapping top level code in main() to +# this file importable as a module +def main(): + if len(sys.argv) < 2 or len(sys.argv) > 3: + print('Usage: test.py [filter]') + sys.exit(1) + + if len(sys.argv) == 3: + filter_path = sys.argv[2] + + if sys.argv[1] == 'all': + run_suites(sorted(INTERPRETERS.keys())) + elif sys.argv[1] == 'c': + run_suites(C_SUITES) + elif sys.argv[1] == 'java': + run_suites(JAVA_SUITES) + elif sys.argv[1] not in INTERPRETERS: + print('Unknown interpreter "{}"'.format(sys.argv[1])) + sys.exit(1) + + else: + if not run_suite(sys.argv[1]): + sys.exit(1) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/test/assignment/associativity.lox b/test/assignment/associativity.lox new file mode 100755 index 0000000..1b9d93e --- /dev/null +++ b/test/assignment/associativity.lox @@ -0,0 +1,9 @@ +var a = "a"; +var b = "b"; +var c = "c"; + +// Assignment is right-associative. +a = b = c; +print a; // expect: c +print b; // expect: c +print c; // expect: c diff --git a/test/assignment/global.lox b/test/assignment/global.lox new file mode 100755 index 0000000..48fb485 --- /dev/null +++ b/test/assignment/global.lox @@ -0,0 +1,8 @@ +var a = "before"; +print a; // expect: before + +a = "after"; +print a; // expect: after + +print a = "arg"; // expect: arg +print a; // expect: arg diff --git a/test/assignment/grouping.lox b/test/assignment/grouping.lox new file mode 100755 index 0000000..dc6e79f --- /dev/null +++ b/test/assignment/grouping.lox @@ -0,0 +1,2 @@ +var a = "a"; +(a) = "value"; // Error at '=': Invalid assignment target. diff --git a/test/assignment/infix_operator.lox b/test/assignment/infix_operator.lox new file mode 100755 index 0000000..fa55c47 --- /dev/null +++ b/test/assignment/infix_operator.lox @@ -0,0 +1,3 @@ +var a = "a"; +var b = "b"; +a + b = "value"; // Error at '=': Invalid assignment target. diff --git a/test/assignment/local.lox b/test/assignment/local.lox new file mode 100755 index 0000000..2aaaf6d --- /dev/null +++ b/test/assignment/local.lox @@ -0,0 +1,10 @@ +{ + var a = "before"; + print a; // expect: before + + a = "after"; + print a; // expect: after + + print a = "arg"; // expect: arg + print a; // expect: arg +} diff --git a/test/assignment/prefix_operator.lox b/test/assignment/prefix_operator.lox new file mode 100755 index 0000000..fdd143c --- /dev/null +++ b/test/assignment/prefix_operator.lox @@ -0,0 +1,2 @@ +var a = "a"; +!a = "value"; // Error at '=': Invalid assignment target. diff --git a/test/assignment/syntax.lox b/test/assignment/syntax.lox new file mode 100755 index 0000000..d688ac7 --- /dev/null +++ b/test/assignment/syntax.lox @@ -0,0 +1,5 @@ +// Assignment on RHS of variable. +var a = "before"; +var c = a = "var"; +print a; // expect: var +print c; // expect: var diff --git a/test/assignment/to_this.lox b/test/assignment/to_this.lox new file mode 100755 index 0000000..c1e4a6b --- /dev/null +++ b/test/assignment/to_this.lox @@ -0,0 +1,7 @@ +class Foo { + Foo() { + this = "value"; // Error at '=': Invalid assignment target. + } +} + +Foo(); diff --git a/test/assignment/undefined.lox b/test/assignment/undefined.lox new file mode 100755 index 0000000..4991be3 --- /dev/null +++ b/test/assignment/undefined.lox @@ -0,0 +1 @@ +unknown = "what"; // expect runtime error: Undefined variable 'unknown'. diff --git a/test/benchmark/binary_trees.lox b/test/benchmark/binary_trees.lox new file mode 100755 index 0000000..fea780f --- /dev/null +++ b/test/benchmark/binary_trees.lox @@ -0,0 +1,71 @@ +class Tree { + init(item, depth) { + this.item = item; + this.depth = depth; + if (depth > 0) { + var item2 = item + item; + depth = depth - 1; + this.left = Tree(item2 - 1, depth); + this.right = Tree(item2, depth); + } else { + this.left = nil; + this.right = nil; + } + } + + check() { + if (this.left == nil) { + return this.item; + } + + return this.item + this.left.check() - this.right.check(); + } +} + +var minDepth = 4; +var maxDepth = 12; +var stretchDepth = maxDepth + 1; + +var start = clock(); + +print "stretch tree of depth:"; +print stretchDepth; +print "check:"; +print Tree(0, stretchDepth).check(); + +var longLivedTree = Tree(0, maxDepth); + +// iterations = 2 ** maxDepth +var iterations = 1; +var d = 0; +while (d < maxDepth) { + iterations = iterations * 2; + d = d + 1; +} + +var depth = minDepth; +while (depth < stretchDepth) { + var check = 0; + var i = 1; + while (i <= iterations) { + check = check + Tree(i, depth).check() + Tree(-i, depth).check(); + i = i + 1; + } + + print "num trees:"; + print iterations * 2; + print "depth:"; + print depth; + print "check:"; + print check; + + iterations = iterations / 4; + depth = depth + 2; +} + +print "long lived tree of depth:"; +print maxDepth; +print "check:"; +print longLivedTree.check(); +print "elapsed:"; +print clock() - start; diff --git a/test/benchmark/equality.lox b/test/benchmark/equality.lox new file mode 100755 index 0000000..e40fcc2 --- /dev/null +++ b/test/benchmark/equality.lox @@ -0,0 +1,34 @@ +var i = 0; + +var loopStart = clock(); + +while (i < 10000000) { + i = i + 1; + + 1; 1; 1; 2; 1; nil; 1; "str"; 1; true; + nil; nil; nil; 1; nil; "str"; nil; true; + true; true; true; 1; true; false; true; "str"; true; nil; + "str"; "str"; "str"; "stru"; "str"; 1; "str"; nil; "str"; true; +} + +var loopTime = clock() - loopStart; + +var start = clock(); + +i = 0; +while (i < 10000000) { + i = i + 1; + + 1 == 1; 1 == 2; 1 == nil; 1 == "str"; 1 == true; + nil == nil; nil == 1; nil == "str"; nil == true; + true == true; true == 1; true == false; true == "str"; true == nil; + "str" == "str"; "str" == "stru"; "str" == 1; "str" == nil; "str" == true; +} + +var elapsed = clock() - start; +print "loop"; +print loopTime; +print "elapsed"; +print elapsed; +print "equals"; +print elapsed - loopTime; diff --git a/test/benchmark/fib.lox b/test/benchmark/fib.lox new file mode 100755 index 0000000..5563102 --- /dev/null +++ b/test/benchmark/fib.lox @@ -0,0 +1,8 @@ +fun fib(n) { + if (n < 2) return n; + return fib(n - 2) + fib(n - 1); +} + +var start = clock(); +print fib(30) == 832040; +print clock() - start; diff --git a/test/benchmark/invocation.lox b/test/benchmark/invocation.lox new file mode 100755 index 0000000..40b3b8a --- /dev/null +++ b/test/benchmark/invocation.lox @@ -0,0 +1,73 @@ +// This benchmark stresses just method invocation. + +class Foo { + method0() {} + method1() {} + method2() {} + method3() {} + method4() {} + method5() {} + method6() {} + method7() {} + method8() {} + method9() {} + method10() {} + method11() {} + method12() {} + method13() {} + method14() {} + method15() {} + method16() {} + method17() {} + method18() {} + method19() {} + method20() {} + method21() {} + method22() {} + method23() {} + method24() {} + method25() {} + method26() {} + method27() {} + method28() {} + method29() {} +} + +var foo = Foo(); +var start = clock(); +var i = 0; +while (i < 500000) { + foo.method0(); + foo.method1(); + foo.method2(); + foo.method3(); + foo.method4(); + foo.method5(); + foo.method6(); + foo.method7(); + foo.method8(); + foo.method9(); + foo.method10(); + foo.method11(); + foo.method12(); + foo.method13(); + foo.method14(); + foo.method15(); + foo.method16(); + foo.method17(); + foo.method18(); + foo.method19(); + foo.method20(); + foo.method21(); + foo.method22(); + foo.method23(); + foo.method24(); + foo.method25(); + foo.method26(); + foo.method27(); + foo.method28(); + foo.method29(); + i = i + 1; +} + +print clock() - start; diff --git a/test/benchmark/method_call.lox b/test/benchmark/method_call.lox new file mode 100755 index 0000000..57cb0a9 --- /dev/null +++ b/test/benchmark/method_call.lox @@ -0,0 +1,69 @@ +class Toggle { + init(startState) { + this.state = startState; + } + + value() { return this.state; } + + activate() { + this.state = !this.state; + return this; + } +} + +class NthToggle < Toggle { + init(startState, maxCounter) { + super.init(startState); + this.countMax = maxCounter; + this.count = 0; + } + + activate() { + this.count = this.count + 1; + if (this.count >= this.countMax) { + super.activate(); + this.count = 0; + } + + return this; + } +} + +var start = clock(); +var n = 100000; +var val = true; +var toggle = Toggle(val); + +for (var i = 0; i < n; i = i + 1) { + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); +} + +print toggle.value(); + +val = true; +var ntoggle = NthToggle(val, 3); + +for (var i = 0; i < n; i = i + 1) { + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); +} + +print ntoggle.value(); +print clock() - start; diff --git a/test/benchmark/properties.lox b/test/benchmark/properties.lox new file mode 100755 index 0000000..6131d5a --- /dev/null +++ b/test/benchmark/properties.lox @@ -0,0 +1,106 @@ +// This benchmark stresses both field and method lookup. + +class Foo { + init() { + this.field0 = 1; + this.field1 = 1; + this.field2 = 1; + this.field3 = 1; + this.field4 = 1; + this.field5 = 1; + this.field6 = 1; + this.field7 = 1; + this.field8 = 1; + this.field9 = 1; + this.field10 = 1; + this.field11 = 1; + this.field12 = 1; + this.field13 = 1; + this.field14 = 1; + this.field15 = 1; + this.field16 = 1; + this.field17 = 1; + this.field18 = 1; + this.field19 = 1; + this.field20 = 1; + this.field21 = 1; + this.field22 = 1; + this.field23 = 1; + this.field24 = 1; + this.field25 = 1; + this.field26 = 1; + this.field27 = 1; + this.field28 = 1; + this.field29 = 1; + } + + method0() { return this.field0; } + method1() { return this.field1; } + method2() { return this.field2; } + method3() { return this.field3; } + method4() { return this.field4; } + method5() { return this.field5; } + method6() { return this.field6; } + method7() { return this.field7; } + method8() { return this.field8; } + method9() { return this.field9; } + method10() { return this.field10; } + method11() { return this.field11; } + method12() { return this.field12; } + method13() { return this.field13; } + method14() { return this.field14; } + method15() { return this.field15; } + method16() { return this.field16; } + method17() { return this.field17; } + method18() { return this.field18; } + method19() { return this.field19; } + method20() { return this.field20; } + method21() { return this.field21; } + method22() { return this.field22; } + method23() { return this.field23; } + method24() { return this.field24; } + method25() { return this.field25; } + method26() { return this.field26; } + method27() { return this.field27; } + method28() { return this.field28; } + method29() { return this.field29; } +} + +var foo = Foo(); +var start = clock(); +var i = 0; +while (i < 500000) { + foo.method0(); + foo.method1(); + foo.method2(); + foo.method3(); + foo.method4(); + foo.method5(); + foo.method6(); + foo.method7(); + foo.method8(); + foo.method9(); + foo.method10(); + foo.method11(); + foo.method12(); + foo.method13(); + foo.method14(); + foo.method15(); + foo.method16(); + foo.method17(); + foo.method18(); + foo.method19(); + foo.method20(); + foo.method21(); + foo.method22(); + foo.method23(); + foo.method24(); + foo.method25(); + foo.method26(); + foo.method27(); + foo.method28(); + foo.method29(); + i = i + 1; +} + +print clock() - start; diff --git a/test/benchmark/string_equality.lox b/test/benchmark/string_equality.lox new file mode 100755 index 0000000..738f38b --- /dev/null +++ b/test/benchmark/string_equality.lox @@ -0,0 +1,219 @@ +var a1 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1"; +var a2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2"; +var a3 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3"; +var a4 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4"; +var a5 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa5"; +var a6 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa6"; +var a7 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa7"; +var a8 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8"; + +var i = 0; + +var loopStart = clock(); + +while (i < 100000) { + i = i + 1; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; +} + +var loopTime = clock() - loopStart; + +var start = clock(); + +i = 0; +while (i < 100000) { + i = i + 1; + + // 1 == 1; 1 == 2; 1 == nil; 1 == "str"; 1 == true; + // nil == nil; nil == 1; nil == "str"; nil == true; + // true == true; true == 1; true == false; true == "str"; true == nil; + // "str" == "str"; "str" == "stru"; "str" == 1; "str" == nil; "str" == true; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + +} + +var elapsed = clock() - start; +print "loop"; +print loopTime; +print "elapsed"; +print elapsed; +print "equals"; +print elapsed - loopTime; diff --git a/test/block/empty.lox b/test/block/empty.lox new file mode 100755 index 0000000..982139a --- /dev/null +++ b/test/block/empty.lox @@ -0,0 +1,7 @@ +{} // By itself. + +// In a statement. +if (true) {} +if (false) {} else {} + +print "ok"; // expect: ok diff --git a/test/block/scope.lox b/test/block/scope.lox new file mode 100755 index 0000000..2ece1a7 --- /dev/null +++ b/test/block/scope.lox @@ -0,0 +1,8 @@ +var a = "outer"; + +{ + var a = "inner"; + print a; // expect: inner +} + +print a; // expect: outer diff --git a/test/bool/equality.lox b/test/bool/equality.lox new file mode 100755 index 0000000..2be86e2 --- /dev/null +++ b/test/bool/equality.lox @@ -0,0 +1,23 @@ +print true == true; // expect: true +print true == false; // expect: false +print false == true; // expect: false +print false == false; // expect: true + +// Not equal to other types. +print true == 1; // expect: false +print false == 0; // expect: false +print true == "true"; // expect: false +print false == "false"; // expect: false +print false == ""; // expect: false + +print true != true; // expect: false +print true != false; // expect: true +print false != true; // expect: true +print false != false; // expect: false + +// Not equal to other types. +print true != 1; // expect: true +print false != 0; // expect: true +print true != "true"; // expect: true +print false != "false"; // expect: true +print false != ""; // expect: true diff --git a/test/bool/not.lox b/test/bool/not.lox new file mode 100755 index 0000000..2f55405 --- /dev/null +++ b/test/bool/not.lox @@ -0,0 +1,3 @@ +print !true; // expect: false +print !false; // expect: true +print !!true; // expect: true diff --git a/test/call/bool.lox b/test/call/bool.lox new file mode 100755 index 0000000..859cd86 --- /dev/null +++ b/test/call/bool.lox @@ -0,0 +1 @@ +true(); // expect runtime error: Can only call functions and classes. diff --git a/test/call/nil.lox b/test/call/nil.lox new file mode 100755 index 0000000..7fdf584 --- /dev/null +++ b/test/call/nil.lox @@ -0,0 +1 @@ +nil(); // expect runtime error: Can only call functions and classes. diff --git a/test/call/num.lox b/test/call/num.lox new file mode 100755 index 0000000..1ed1b86 --- /dev/null +++ b/test/call/num.lox @@ -0,0 +1 @@ +123(); // expect runtime error: Can only call functions and classes. diff --git a/test/call/object.lox b/test/call/object.lox new file mode 100755 index 0000000..dce58d9 --- /dev/null +++ b/test/call/object.lox @@ -0,0 +1,4 @@ +class Foo {} + +var foo = Foo(); +foo(); // expect runtime error: Can only call functions and classes. diff --git a/test/call/string.lox b/test/call/string.lox new file mode 100755 index 0000000..91f62a0 --- /dev/null +++ b/test/call/string.lox @@ -0,0 +1 @@ +"str"(); // expect runtime error: Can only call functions and classes. diff --git a/test/class/empty.lox b/test/class/empty.lox new file mode 100755 index 0000000..dc1b7c3 --- /dev/null +++ b/test/class/empty.lox @@ -0,0 +1,3 @@ +class Foo {} + +print Foo; // expect: Foo diff --git a/test/class/inherited_method.lox b/test/class/inherited_method.lox new file mode 100755 index 0000000..8b49b53 --- /dev/null +++ b/test/class/inherited_method.lox @@ -0,0 +1,22 @@ +class Foo { + inFoo() { + print "in foo"; + } +} + +class Bar < Foo { + inBar() { + print "in bar"; + } +} + +class Baz < Bar { + inBaz() { + print "in baz"; + } +} + +var baz = Baz(); +baz.inFoo(); // expect: in foo +baz.inBar(); // expect: in bar +baz.inBaz(); // expect: in baz diff --git a/test/class/local_reference_self.lox b/test/class/local_reference_self.lox new file mode 100755 index 0000000..65c1cc7 --- /dev/null +++ b/test/class/local_reference_self.lox @@ -0,0 +1,7 @@ +class Foo { + returnSelf() { + return Foo; + } +} + +print Foo().returnSelf(); // expect: Foo diff --git a/test/class/reference_self.lox b/test/class/reference_self.lox new file mode 100755 index 0000000..009a3e8 --- /dev/null +++ b/test/class/reference_self.lox @@ -0,0 +1,9 @@ +{ + class Foo { + returnSelf() { + return Foo; + } + } + + print Foo().returnSelf(); // expect: Foo +} diff --git a/test/closure/assign_to_closure.lox b/test/closure/assign_to_closure.lox new file mode 100755 index 0000000..7f38b77 --- /dev/null +++ b/test/closure/assign_to_closure.lox @@ -0,0 +1,27 @@ +var f; +var g; + +{ + var local = "local"; + fun f_() { + print local; + local = "after f"; + print local; + } + f = f_; + + fun g_() { + print local; + local = "after g"; + print local; + } + g = g_; +} + +f(); +// expect: local +// expect: after f + +g(); +// expect: after f +// expect: after g diff --git a/test/closure/assign_to_shadowed_later.lox b/test/closure/assign_to_shadowed_later.lox new file mode 100755 index 0000000..5d22685 --- /dev/null +++ b/test/closure/assign_to_shadowed_later.lox @@ -0,0 +1,13 @@ +var a = "global"; + +{ + fun assign() { + a = "assigned"; + } + + var a = "inner"; + assign(); + print a; // expect: inner +} + +print a; // expect: assigned diff --git a/test/closure/close_over_function_parameter.lox b/test/closure/close_over_function_parameter.lox new file mode 100755 index 0000000..7163bc7 --- /dev/null +++ b/test/closure/close_over_function_parameter.lox @@ -0,0 +1,11 @@ +var f; + +fun foo(param) { + fun f_() { + print param; + } + f = f_; +} +foo("param"); + +f(); // expect: param diff --git a/test/closure/close_over_later_variable.lox b/test/closure/close_over_later_variable.lox new file mode 100755 index 0000000..16d92b8 --- /dev/null +++ b/test/closure/close_over_later_variable.lox @@ -0,0 +1,15 @@ +// This is a regression test. There was a bug where if an upvalue for an +// earlier local (here "a") was captured *after* a later one ("b"), then it +// would crash because it walked to the end of the upvalue list (correct), but +// then didn't handle not finding the variable. + +fun f() { + var a = "a"; + var b = "b"; + fun g() { + print b; // expect: b + print a; // expect: a + } + g(); +} +f(); diff --git a/test/closure/close_over_method_parameter.lox b/test/closure/close_over_method_parameter.lox new file mode 100755 index 0000000..07c3798 --- /dev/null +++ b/test/closure/close_over_method_parameter.lox @@ -0,0 +1,13 @@ +var f; + +class Foo { + method(param) { + fun f_() { + print param; + } + f = f_; + } +} + +Foo().method("param"); +f(); // expect: param diff --git a/test/closure/closed_closure_in_function.lox b/test/closure/closed_closure_in_function.lox new file mode 100755 index 0000000..e2e91b5 --- /dev/null +++ b/test/closure/closed_closure_in_function.lox @@ -0,0 +1,11 @@ +var f; + +{ + var local = "local"; + fun f_() { + print local; + } + f = f_; +} + +f(); // expect: local diff --git a/test/closure/nested_closure.lox b/test/closure/nested_closure.lox new file mode 100755 index 0000000..46aabcd --- /dev/null +++ b/test/closure/nested_closure.lox @@ -0,0 +1,25 @@ +var f; + +fun f1() { + var a = "a"; + fun f2() { + var b = "b"; + fun f3() { + var c = "c"; + fun f4() { + print a; + print b; + print c; + } + f = f4; + } + f3(); + } + f2(); +} +f1(); + +f(); +// expect: a +// expect: b +// expect: c diff --git a/test/closure/open_closure_in_function.lox b/test/closure/open_closure_in_function.lox new file mode 100755 index 0000000..ff85f2f --- /dev/null +++ b/test/closure/open_closure_in_function.lox @@ -0,0 +1,7 @@ +{ + var local = "local"; + fun f() { + print local; // expect: local + } + f(); +} diff --git a/test/closure/reference_closure_multiple_times.lox b/test/closure/reference_closure_multiple_times.lox new file mode 100755 index 0000000..bc7c73c --- /dev/null +++ b/test/closure/reference_closure_multiple_times.lox @@ -0,0 +1,14 @@ +var f; + +{ + var a = "a"; + fun f_() { + print a; + print a; + } + f = f_; +} + +f(); +// expect: a +// expect: a diff --git a/test/closure/reuse_closure_slot.lox b/test/closure/reuse_closure_slot.lox new file mode 100755 index 0000000..6086c6e --- /dev/null +++ b/test/closure/reuse_closure_slot.lox @@ -0,0 +1,16 @@ +{ + var f; + + { + var a = "a"; + fun f_() { print a; } + f = f_; + } + + { + // Since a is out of scope, the local slot will be reused by b. Make sure + // that f still closes over a. + var b = "b"; + f(); // expect: a + } +} diff --git a/test/closure/shadow_closure_with_local.lox b/test/closure/shadow_closure_with_local.lox new file mode 100755 index 0000000..7f9164a --- /dev/null +++ b/test/closure/shadow_closure_with_local.lox @@ -0,0 +1,12 @@ +{ + var foo = "closure"; + fun f() { + { + print foo; // expect: closure + var foo = "shadow"; + print foo; // expect: shadow + } + print foo; // expect: closure + } + f(); +} diff --git a/test/closure/unused_closure.lox b/test/closure/unused_closure.lox new file mode 100755 index 0000000..da7eff7 --- /dev/null +++ b/test/closure/unused_closure.lox @@ -0,0 +1,13 @@ +// This is a regression test. There was a bug where the VM would try to close +// an upvalue even if the upvalue was never created because the codepath for +// the closure was not executed. + +{ + var a = "a"; + if (false) { + fun foo() { a; } + } +} + +// If we get here, we didn't segfault when a went out of scope. +print "ok"; // expect: ok diff --git a/test/closure/unused_later_closure.wren b/test/closure/unused_later_closure.wren new file mode 100755 index 0000000..43bb58f --- /dev/null +++ b/test/closure/unused_later_closure.wren @@ -0,0 +1,19 @@ +// This is a regression test. When closing upvalues for discarded locals, it +// wouldn't make sure it discarded the upvalue for the correct stack slot. +// +// Here we create two locals that can be closed over, but only the first one +// actually is. When "b" goes out of scope, we need to make sure we don't +// prematurely close "a". +var closure + +{ + var a = "a" + + { + var b = "b" + closure = Fn.new { a } + if (false) Fn.new { b } + } + + System.print(closure.call()) // expect: a +} diff --git a/test/comments/line_at_eof.lox b/test/comments/line_at_eof.lox new file mode 100755 index 0000000..924946d --- /dev/null +++ b/test/comments/line_at_eof.lox @@ -0,0 +1,2 @@ +print "ok"; // expect: ok +// comment \ No newline at end of file diff --git a/test/comments/only_line_comment.lox b/test/comments/only_line_comment.lox new file mode 100755 index 0000000..e2c01e9 --- /dev/null +++ b/test/comments/only_line_comment.lox @@ -0,0 +1 @@ +// comment \ No newline at end of file diff --git a/test/comments/only_line_comment_and_line.lox b/test/comments/only_line_comment_and_line.lox new file mode 100755 index 0000000..fef83a9 --- /dev/null +++ b/test/comments/only_line_comment_and_line.lox @@ -0,0 +1 @@ +// comment diff --git a/test/comments/unicode.lox b/test/comments/unicode.lox new file mode 100755 index 0000000..be4f6fc --- /dev/null +++ b/test/comments/unicode.lox @@ -0,0 +1,9 @@ +// Unicode characters are allowed in comments. +// +// Latin 1 Supplement: £§¶ÜÞ +// Latin Extended-A: ĐĦŋœ +// Latin Extended-B: ƂƢƩǁ +// Other stuff: ឃᢆ᯽₪ℜ↩⊗┺░ +// Emoji: ☃☺♣ + +print "ok"; // expect: ok diff --git a/test/constructor/arguments.lox b/test/constructor/arguments.lox new file mode 100755 index 0000000..36881e3 --- /dev/null +++ b/test/constructor/arguments.lox @@ -0,0 +1,11 @@ +class Foo { + init(a, b) { + print "init"; // expect: init + this.a = a; + this.b = b; + } +} + +var foo = Foo(1, 2); +print foo.a; // expect: 1 +print foo.b; // expect: 2 diff --git a/test/constructor/call_init_explicitly.lox b/test/constructor/call_init_explicitly.lox new file mode 100755 index 0000000..b2deded --- /dev/null +++ b/test/constructor/call_init_explicitly.lox @@ -0,0 +1,15 @@ +class Foo { + init(arg) { + print "Foo.init(" + arg + ")"; + this.field = "init"; + } +} + +var foo = Foo("one"); // expect: Foo.init(one) +foo.field = "field"; + +var foo2 = foo.init("two"); // expect: Foo.init(two) +print foo2; // expect: Foo instance + +// Make sure init() doesn't create a fresh instance. +print foo.field; // expect: init diff --git a/test/constructor/default.lox b/test/constructor/default.lox new file mode 100755 index 0000000..8b383b9 --- /dev/null +++ b/test/constructor/default.lox @@ -0,0 +1,4 @@ +class Foo {} + +var foo = Foo(); +print foo; // expect: Foo instance diff --git a/test/constructor/default_arguments.lox b/test/constructor/default_arguments.lox new file mode 100755 index 0000000..9b24d12 --- /dev/null +++ b/test/constructor/default_arguments.lox @@ -0,0 +1,4 @@ +class Foo {} + +var foo = Foo(1, 2, 3); +print foo; // expect: Foo instance diff --git a/test/constructor/early_return.lox b/test/constructor/early_return.lox new file mode 100755 index 0000000..4ee17ed --- /dev/null +++ b/test/constructor/early_return.lox @@ -0,0 +1,10 @@ +class Foo { + init() { + print "init"; + return; + print "nope"; + } +} + +var foo = Foo(); // expect: init +print foo; // expect: Foo instance diff --git a/test/constructor/extra_arguments.lox b/test/constructor/extra_arguments.lox new file mode 100755 index 0000000..4d5f2c9 --- /dev/null +++ b/test/constructor/extra_arguments.lox @@ -0,0 +1,11 @@ +class Foo { + init(a, b) { + print "init"; // expect: init + this.a = a; + this.b = b; + } +} + +var foo = Foo(1, 2, 3, 4); +print foo.a; // expect: 1 +print foo.b; // expect: 2 diff --git a/test/constructor/missing_arguments.lox b/test/constructor/missing_arguments.lox new file mode 100755 index 0000000..29ddd15 --- /dev/null +++ b/test/constructor/missing_arguments.lox @@ -0,0 +1,5 @@ +class Foo { + init(a, b) {} +} + +var foo = Foo(1); // expect runtime error: Not enough arguments. diff --git a/test/constructor/return_in_nested_function.lox b/test/constructor/return_in_nested_function.lox new file mode 100755 index 0000000..8580f14 --- /dev/null +++ b/test/constructor/return_in_nested_function.lox @@ -0,0 +1,10 @@ +class Foo { + init() { + fun init() { + return "bar"; + } + print init(); // expect: bar + } +} + +print Foo(); // expect: Foo instance diff --git a/test/constructor/return_value.lox b/test/constructor/return_value.lox new file mode 100755 index 0000000..2627f73 --- /dev/null +++ b/test/constructor/return_value.lox @@ -0,0 +1,5 @@ +class Foo { + init() { + return "result"; // Error at 'return': Cannot return a value from an initializer. + } +} diff --git a/test/empty_file.lox b/test/empty_file.lox new file mode 100755 index 0000000..e69de29 diff --git a/test/expressions/evaluate.lox b/test/expressions/evaluate.lox new file mode 100755 index 0000000..a1d1895 --- /dev/null +++ b/test/expressions/evaluate.lox @@ -0,0 +1,4 @@ +// Note: This is just for the expression evaluating chapter which evaluates an +// expression directly. +(5 - (3 - 1)) + -1 +// expect: 2 diff --git a/test/expressions/parse.lox b/test/expressions/parse.lox new file mode 100755 index 0000000..0a9e61b --- /dev/null +++ b/test/expressions/parse.lox @@ -0,0 +1,3 @@ +// Note: This is just for the expression parsing chapter which prints the AST. +(5 - (3 - 1)) + -1 +// expect: (+ (group (- 5.0 (group (- 3.0 1.0)))) (- 1.0)) diff --git a/test/field/call_function_field.lox b/test/field/call_function_field.lox new file mode 100755 index 0000000..1c21600 --- /dev/null +++ b/test/field/call_function_field.lox @@ -0,0 +1,10 @@ +class Foo {} + +fun bar() { + print "bar"; +} + +var foo = Foo(); +foo.bar = bar; + +foo.bar(); // expect: bar diff --git a/test/field/call_nonfunction_field.lox b/test/field/call_nonfunction_field.lox new file mode 100755 index 0000000..cf43899 --- /dev/null +++ b/test/field/call_nonfunction_field.lox @@ -0,0 +1,6 @@ +class Foo {} + +var foo = Foo(); +foo.bar = "not fn"; + +foo.bar(); // expect runtime error: Can only call functions and classes. diff --git a/test/field/get_on_bool.lox b/test/field/get_on_bool.lox new file mode 100755 index 0000000..d8e1793 --- /dev/null +++ b/test/field/get_on_bool.lox @@ -0,0 +1 @@ +true.foo; // expect runtime error: Only instances have properties. diff --git a/test/field/get_on_class.lox b/test/field/get_on_class.lox new file mode 100755 index 0000000..068b6f9 --- /dev/null +++ b/test/field/get_on_class.lox @@ -0,0 +1,2 @@ +class Foo {} +Foo.bar; // expect runtime error: Only instances have properties. diff --git a/test/field/get_on_function.lox b/test/field/get_on_function.lox new file mode 100755 index 0000000..87c3845 --- /dev/null +++ b/test/field/get_on_function.lox @@ -0,0 +1,3 @@ +fun foo() {} + +foo.bar; // expect runtime error: Only instances have properties. diff --git a/test/field/get_on_nil.lox b/test/field/get_on_nil.lox new file mode 100755 index 0000000..829bb1a --- /dev/null +++ b/test/field/get_on_nil.lox @@ -0,0 +1 @@ +nil.foo; // expect runtime error: Only instances have properties. diff --git a/test/field/get_on_num.lox b/test/field/get_on_num.lox new file mode 100755 index 0000000..287f422 --- /dev/null +++ b/test/field/get_on_num.lox @@ -0,0 +1 @@ +123.foo; // expect runtime error: Only instances have properties. diff --git a/test/field/get_on_string.lox b/test/field/get_on_string.lox new file mode 100755 index 0000000..8a56dad --- /dev/null +++ b/test/field/get_on_string.lox @@ -0,0 +1 @@ +"str".foo; // expect runtime error: Only instances have properties. diff --git a/test/field/many.lox b/test/field/many.lox new file mode 100755 index 0000000..e11f0ac --- /dev/null +++ b/test/field/many.lox @@ -0,0 +1,162 @@ +class Foo {} + +var foo = Foo(); +foo.bilberry = "bilberry"; +foo.lime = "lime"; +foo.elderberry = "elderberry"; +foo.raspberry = "raspberry"; +foo.gooseberry = "gooseberry"; +foo.longan = "longan"; +foo.mandarine = "mandarine"; +foo.kiwifruit = "kiwifruit"; +foo.orange = "orange"; +foo.pomegranate = "pomegranate"; +foo.tomato = "tomato"; +foo.banana = "banana"; +foo.juniper = "juniper"; +foo.damson = "damson"; +foo.blackcurrant = "blackcurrant"; +foo.peach = "peach"; +foo.grape = "grape"; +foo.mango = "mango"; +foo.redcurrant = "redcurrant"; +foo.watermelon = "watermelon"; +foo.plumcot = "plumcot"; +foo.papaya = "papaya"; +foo.cloudberry = "cloudberry"; +foo.rambutan = "rambutan"; +foo.salak = "salak"; +foo.physalis = "physalis"; +foo.huckleberry = "huckleberry"; +foo.coconut = "coconut"; +foo.date = "date"; +foo.tamarind = "tamarind"; +foo.lychee = "lychee"; +foo.raisin = "raisin"; +foo.apple = "apple"; +foo.avocado = "avocado"; +foo.nectarine = "nectarine"; +foo.pomelo = "pomelo"; +foo.melon = "melon"; +foo.currant = "currant"; +foo.plum = "plum"; +foo.persimmon = "persimmon"; +foo.olive = "olive"; +foo.cranberry = "cranberry"; +foo.boysenberry = "boysenberry"; +foo.blackberry = "blackberry"; +foo.passionfruit = "passionfruit"; +foo.mulberry = "mulberry"; +foo.marionberry = "marionberry"; +foo.plantain = "plantain"; +foo.lemon = "lemon"; +foo.yuzu = "yuzu"; +foo.loquat = "loquat"; +foo.kumquat = "kumquat"; +foo.salmonberry = "salmonberry"; +foo.tangerine = "tangerine"; +foo.durian = "durian"; +foo.pear = "pear"; +foo.cantaloupe = "cantaloupe"; +foo.quince = "quince"; +foo.guava = "guava"; +foo.strawberry = "strawberry"; +foo.nance = "nance"; +foo.apricot = "apricot"; +foo.jambul = "jambul"; +foo.grapefruit = "grapefruit"; +foo.clementine = "clementine"; +foo.jujube = "jujube"; +foo.cherry = "cherry"; +foo.feijoa = "feijoa"; +foo.jackfruit = "jackfruit"; +foo.fig = "fig"; +foo.cherimoya = "cherimoya"; +foo.pineapple = "pineapple"; +foo.blueberry = "blueberry"; +foo.jabuticaba = "jabuticaba"; +foo.miracle = "miracle"; +foo.dragonfruit = "dragonfruit"; +foo.satsuma = "satsuma"; +foo.tamarillo = "tamarillo"; +foo.honeydew = "honeydew"; + +print foo.apple; // expect: apple +print foo.apricot; // expect: apricot +print foo.avocado; // expect: avocado +print foo.banana; // expect: banana +print foo.bilberry; // expect: bilberry +print foo.blackberry; // expect: blackberry +print foo.blackcurrant; // expect: blackcurrant +print foo.blueberry; // expect: blueberry +print foo.boysenberry; // expect: boysenberry +print foo.cantaloupe; // expect: cantaloupe +print foo.cherimoya; // expect: cherimoya +print foo.cherry; // expect: cherry +print foo.clementine; // expect: clementine +print foo.cloudberry; // expect: cloudberry +print foo.coconut; // expect: coconut +print foo.cranberry; // expect: cranberry +print foo.currant; // expect: currant +print foo.damson; // expect: damson +print foo.date; // expect: date +print foo.dragonfruit; // expect: dragonfruit +print foo.durian; // expect: durian +print foo.elderberry; // expect: elderberry +print foo.feijoa; // expect: feijoa +print foo.fig; // expect: fig +print foo.gooseberry; // expect: gooseberry +print foo.grape; // expect: grape +print foo.grapefruit; // expect: grapefruit +print foo.guava; // expect: guava +print foo.honeydew; // expect: honeydew +print foo.huckleberry; // expect: huckleberry +print foo.jabuticaba; // expect: jabuticaba +print foo.jackfruit; // expect: jackfruit +print foo.jambul; // expect: jambul +print foo.jujube; // expect: jujube +print foo.juniper; // expect: juniper +print foo.kiwifruit; // expect: kiwifruit +print foo.kumquat; // expect: kumquat +print foo.lemon; // expect: lemon +print foo.lime; // expect: lime +print foo.longan; // expect: longan +print foo.loquat; // expect: loquat +print foo.lychee; // expect: lychee +print foo.mandarine; // expect: mandarine +print foo.mango; // expect: mango +print foo.marionberry; // expect: marionberry +print foo.melon; // expect: melon +print foo.miracle; // expect: miracle +print foo.mulberry; // expect: mulberry +print foo.nance; // expect: nance +print foo.nectarine; // expect: nectarine +print foo.olive; // expect: olive +print foo.orange; // expect: orange +print foo.papaya; // expect: papaya +print foo.passionfruit; // expect: passionfruit +print foo.peach; // expect: peach +print foo.pear; // expect: pear +print foo.persimmon; // expect: persimmon +print foo.physalis; // expect: physalis +print foo.pineapple; // expect: pineapple +print foo.plantain; // expect: plantain +print foo.plum; // expect: plum +print foo.plumcot; // expect: plumcot +print foo.pomegranate; // expect: pomegranate +print foo.pomelo; // expect: pomelo +print foo.quince; // expect: quince +print foo.raisin; // expect: raisin +print foo.rambutan; // expect: rambutan +print foo.raspberry; // expect: raspberry +print foo.redcurrant; // expect: redcurrant +print foo.salak; // expect: salak +print foo.salmonberry; // expect: salmonberry +print foo.satsuma; // expect: satsuma +print foo.strawberry; // expect: strawberry +print foo.tamarillo; // expect: tamarillo +print foo.tamarind; // expect: tamarind +print foo.tangerine; // expect: tangerine +print foo.tomato; // expect: tomato +print foo.watermelon; // expect: watermelon +print foo.yuzu; // expect: yuzu diff --git a/test/field/method.lox b/test/field/method.lox new file mode 100755 index 0000000..8410dbd --- /dev/null +++ b/test/field/method.lox @@ -0,0 +1,9 @@ +class Foo { + bar(arg) { + print arg; + } +} + +var bar = Foo().bar; +print "got method"; // expect: got method +bar("arg"); // expect: arg diff --git a/test/field/method_binds_this.lox b/test/field/method_binds_this.lox new file mode 100755 index 0000000..8af91b7 --- /dev/null +++ b/test/field/method_binds_this.lox @@ -0,0 +1,16 @@ +class Foo { + sayName() { + print this.name; + } +} + +var foo1 = Foo(); +foo1.name = "foo1"; + +var foo2 = Foo(); +foo2.name = "foo2"; + +// Store the method reference on another object. +foo2.fn = foo1.sayName; +// Still retains original receiver. +foo2.fn(); // expect: foo1 diff --git a/test/field/on_instance.lox b/test/field/on_instance.lox new file mode 100755 index 0000000..b3c5511 --- /dev/null +++ b/test/field/on_instance.lox @@ -0,0 +1,9 @@ +class Foo {} + +var foo = Foo(); + +print foo.bar = "bar value"; // expect: bar value +print foo.baz = "baz value"; // expect: baz value + +print foo.bar; // expect: bar value +print foo.baz; // expect: baz value diff --git a/test/field/set_on_bool.lox b/test/field/set_on_bool.lox new file mode 100755 index 0000000..eb9fb3a --- /dev/null +++ b/test/field/set_on_bool.lox @@ -0,0 +1 @@ +true.foo = "value"; // expect runtime error: Only instances have fields. diff --git a/test/field/set_on_class.lox b/test/field/set_on_class.lox new file mode 100755 index 0000000..a7700ec --- /dev/null +++ b/test/field/set_on_class.lox @@ -0,0 +1,2 @@ +class Foo {} +Foo.bar = "value"; // expect runtime error: Only instances have fields. diff --git a/test/field/set_on_function.lox b/test/field/set_on_function.lox new file mode 100755 index 0000000..d28c193 --- /dev/null +++ b/test/field/set_on_function.lox @@ -0,0 +1,3 @@ +fun foo() {} + +foo.bar = "value"; // expect runtime error: Only instances have fields. diff --git a/test/field/set_on_nil.lox b/test/field/set_on_nil.lox new file mode 100755 index 0000000..560dded --- /dev/null +++ b/test/field/set_on_nil.lox @@ -0,0 +1 @@ +nil.foo = "value"; // expect runtime error: Only instances have fields. diff --git a/test/field/set_on_num.lox b/test/field/set_on_num.lox new file mode 100755 index 0000000..cd66c9b --- /dev/null +++ b/test/field/set_on_num.lox @@ -0,0 +1 @@ +123.foo = "value"; // expect runtime error: Only instances have fields. diff --git a/test/field/set_on_string.lox b/test/field/set_on_string.lox new file mode 100755 index 0000000..c0fdb3b --- /dev/null +++ b/test/field/set_on_string.lox @@ -0,0 +1 @@ +"str".foo = "value"; // expect runtime error: Only instances have fields. diff --git a/test/field/undefined.lox b/test/field/undefined.lox new file mode 100755 index 0000000..b6b6297 --- /dev/null +++ b/test/field/undefined.lox @@ -0,0 +1,4 @@ +class Foo {} +var foo = Foo(); + +foo.bar; // expect runtime error: Undefined property 'bar'. diff --git a/test/for/class_in_body.lox b/test/for/class_in_body.lox new file mode 100755 index 0000000..86e76b3 --- /dev/null +++ b/test/for/class_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'class': Expect expression. +for (;;) class Foo {} diff --git a/test/for/closure_in_body.lox b/test/for/closure_in_body.lox new file mode 100755 index 0000000..e8efa69 --- /dev/null +++ b/test/for/closure_in_body.lox @@ -0,0 +1,16 @@ +var f1; +var f2; +var f3; + +for (var i = 1; i < 4; i = i + 1) { + var j = i; + fun f() { print j; } + + if (j == 1) f1 = f; + else if (j == 2) f2 = f; + else f3 = f; +} + +f1(); // expect: 1 +f2(); // expect: 2 +f3(); // expect: 3 diff --git a/test/for/fun_in_body.lox b/test/for/fun_in_body.lox new file mode 100755 index 0000000..fd5c5d0 --- /dev/null +++ b/test/for/fun_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'fun': Expect expression. +for (;;) fun foo() {} diff --git a/test/for/return_closure.lox b/test/for/return_closure.lox new file mode 100755 index 0000000..e6eafc2 --- /dev/null +++ b/test/for/return_closure.lox @@ -0,0 +1,10 @@ +fun f() { + for (;;) { + var i = "i"; + fun g() { print i; } + return g; + } +} + +var h = f(); +h(); // expect: i diff --git a/test/for/return_inside.lox b/test/for/return_inside.lox new file mode 100755 index 0000000..9ed886d --- /dev/null +++ b/test/for/return_inside.lox @@ -0,0 +1,9 @@ +fun f() { + for (;;) { + var i = "i"; + return i; + } +} + +print f(); +// expect: i diff --git a/test/for/scope.lox b/test/for/scope.lox new file mode 100755 index 0000000..9f38925 --- /dev/null +++ b/test/for/scope.lox @@ -0,0 +1,26 @@ +{ + var i = "before"; + + // New variable is in inner scope. + for (var i = 0; i < 1; i = i + 1) { + print i; // expect: 0 + + // Loop body is in second inner scope. + var i = -1; + print i; // expect: -1 + } +} + +{ + // New variable shadows outer variable. + for (var i = 0; i > 0; i = i + 1) {} + + // Goes out of scope after loop. + var i = "after"; + print i; // expect: after + + // Can reuse an existing variable. + for (i = 0; i < 1; i = i + 1) { + print i; // expect: 0 + } +} diff --git a/test/for/statement_condition.lox b/test/for/statement_condition.lox new file mode 100755 index 0000000..a068c2e --- /dev/null +++ b/test/for/statement_condition.lox @@ -0,0 +1,3 @@ +// [line 3] Error at '{': Expect expression. +// [line 3] Error at ')': Expect ';' after expression. +for (var a = 1; {}; a = a + 1) {} diff --git a/test/for/statement_increment.lox b/test/for/statement_increment.lox new file mode 100755 index 0000000..4f47d1d --- /dev/null +++ b/test/for/statement_increment.lox @@ -0,0 +1,2 @@ +// [line 2] Error at '{': Expect expression. +for (var a = 1; a < 2; {}) {} diff --git a/test/for/statement_initializer.lox b/test/for/statement_initializer.lox new file mode 100755 index 0000000..9618e21 --- /dev/null +++ b/test/for/statement_initializer.lox @@ -0,0 +1,3 @@ +// [line 3] Error at '{': Expect expression. +// [line 3] Error at ')': Expect ';' after expression. +for ({}; a < 2; a = a + 1) {} diff --git a/test/for/syntax.lox b/test/for/syntax.lox new file mode 100755 index 0000000..91be593 --- /dev/null +++ b/test/for/syntax.lox @@ -0,0 +1,50 @@ +// Single-expression body. +for (var c = 0; c < 3;) print c = c + 1; +// expect: 1 +// expect: 2 +// expect: 3 + +// Block body. +for (var a = 0; a < 3; a = a + 1) { + print a; +} +// expect: 0 +// expect: 1 +// expect: 2 + +// No clauses. +fun foo() { + for (;;) return "done"; +} +print foo(); // expect: done + +// No variable. +var i = 0; +for (; i < 2; i = i + 1) print i; +// expect: 0 +// expect: 1 + +// No condition. +fun bar() { + for (var i = 0;; i = i + 1) { + print i; + if (i >= 2) return; + } +} +bar(); +// expect: 0 +// expect: 1 +// expect: 2 + +// No increment. +for (var i = 0; i < 2;) { + print i; + i = i + 1; +} +// expect: 0 +// expect: 1 + +// Statement bodies. +for (; false;) if (true) 1; else 2; +for (; false;) while (true) 1; +for (; false;) for (;;) 1; diff --git a/test/for/var_in_body.lox b/test/for/var_in_body.lox new file mode 100755 index 0000000..66d2257 --- /dev/null +++ b/test/for/var_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'var': Expect expression. +for (;;) var foo; diff --git a/test/function/body_must_be_block.lox b/test/function/body_must_be_block.lox new file mode 100755 index 0000000..57552bc --- /dev/null +++ b/test/function/body_must_be_block.lox @@ -0,0 +1,3 @@ +// [line 3] Error at '123': Expect '{' before function body. +// [c line 4] Error at end: Expect '}' after block. +fun f() 123; diff --git a/test/function/empty_body.lox b/test/function/empty_body.lox new file mode 100755 index 0000000..7d732e1 --- /dev/null +++ b/test/function/empty_body.lox @@ -0,0 +1,2 @@ +fun f() {} +print f(); // expect: nil diff --git a/test/function/extra_arguments.lox b/test/function/extra_arguments.lox new file mode 100755 index 0000000..83291d8 --- /dev/null +++ b/test/function/extra_arguments.lox @@ -0,0 +1,6 @@ +fun f(a, b) { + print a; // expect: 1 + print b; // expect: 2 +} + +f(1, 2, 3, 4); diff --git a/test/function/local_mutual_recursion.lox b/test/function/local_mutual_recursion.lox new file mode 100755 index 0000000..1af6e03 --- /dev/null +++ b/test/function/local_mutual_recursion.lox @@ -0,0 +1,12 @@ +{ + fun isEven(n) { + if (n == 0) return true; + return isOdd(n - 1); // expect runtime error: Undefined variable 'isOdd'. + } + + fun isOdd(n) { + return isEven(n - 1); + } + + isEven(4); +} \ No newline at end of file diff --git a/test/function/local_recursion.lox b/test/function/local_recursion.lox new file mode 100755 index 0000000..7b02898 --- /dev/null +++ b/test/function/local_recursion.lox @@ -0,0 +1,8 @@ +{ + fun fib(n) { + if (n < 2) return n; + return fib(n - 1) + fib(n - 2); + } + + print fib(8); // expect: 21 +} diff --git a/test/function/missing_arguments.lox b/test/function/missing_arguments.lox new file mode 100755 index 0000000..802970f --- /dev/null +++ b/test/function/missing_arguments.lox @@ -0,0 +1,3 @@ +fun f(a, b) {} + +f(1); // expect runtime error: Not enough arguments. diff --git a/test/function/missing_comma_in_parameters.lox b/test/function/missing_comma_in_parameters.lox new file mode 100755 index 0000000..eeb2d49 --- /dev/null +++ b/test/function/missing_comma_in_parameters.lox @@ -0,0 +1,3 @@ +// [line 3] Error at 'c': Expect ')' after parameters. +// [c line 4] Error at end: Expect '}' after block. +fun foo(a, b c, d, e, f) {} diff --git a/test/function/mutual_recursion.lox b/test/function/mutual_recursion.lox new file mode 100755 index 0000000..4bb8a23 --- /dev/null +++ b/test/function/mutual_recursion.lox @@ -0,0 +1,11 @@ +fun isEven(n) { + if (n == 0) return true; + return isOdd(n - 1); +} + +fun isOdd(n) { + return isEven(n - 1); +} + +print isEven(4); // expect: true +print isOdd(3); // expect: true diff --git a/test/function/parameters.lox b/test/function/parameters.lox new file mode 100755 index 0000000..8f5f2bd --- /dev/null +++ b/test/function/parameters.lox @@ -0,0 +1,26 @@ +fun f0() { return 0; } +print f0(); // expect: 0 + +fun f1(a) { return a; } +print f1(1); // expect: 1 + +fun f2(a, b) { return a + b; } +print f2(1, 2); // expect: 3 + +fun f3(a, b, c) { return a + b + c; } +print f3(1, 2, 3); // expect: 6 + +fun f4(a, b, c, d) { return a + b + c + d; } +print f4(1, 2, 3, 4); // expect: 10 + +fun f5(a, b, c, d, e) { return a + b + c + d + e; } +print f5(1, 2, 3, 4, 5); // expect: 15 + +fun f6(a, b, c, d, e, f) { return a + b + c + d + e + f; } +print f6(1, 2, 3, 4, 5, 6); // expect: 21 + +fun f7(a, b, c, d, e, f, g) { return a + b + c + d + e + f + g; } +print f7(1, 2, 3, 4, 5, 6, 7); // expect: 28 + +fun f8(a, b, c, d, e, f, g, h) { return a + b + c + d + e + f + g + h; } +print f8(1, 2, 3, 4, 5, 6, 7, 8); // expect: 36 diff --git a/test/function/recursion.lox b/test/function/recursion.lox new file mode 100755 index 0000000..56d3fbb --- /dev/null +++ b/test/function/recursion.lox @@ -0,0 +1,6 @@ +fun fib(n) { + if (n < 2) return n; + return fib(n - 1) + fib(n - 2); +} + +print fib(8); // expect: 21 diff --git a/test/function/too_many_arguments.lox b/test/function/too_many_arguments.lox new file mode 100755 index 0000000..fa0c7cf --- /dev/null +++ b/test/function/too_many_arguments.lox @@ -0,0 +1 @@ +foo(1, 2, 3, 4, 5, 6, 7, 8, 9); // Error at '9': Cannot have more than 8 arguments. diff --git a/test/function/too_many_parameters.lox b/test/function/too_many_parameters.lox new file mode 100755 index 0000000..2a4e383 --- /dev/null +++ b/test/function/too_many_parameters.lox @@ -0,0 +1,2 @@ +// 9 parameters. +fun f(a, b, c, d, e, f, g, h, i) {} // Error at 'i': Cannot have more than 8 parameters. diff --git a/test/if/class_in_else.lox b/test/if/class_in_else.lox new file mode 100755 index 0000000..8308434 --- /dev/null +++ b/test/if/class_in_else.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'class': Expect expression. +if (true) "ok"; else class Foo {} diff --git a/test/if/class_in_then.lox b/test/if/class_in_then.lox new file mode 100755 index 0000000..f59f471 --- /dev/null +++ b/test/if/class_in_then.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'class': Expect expression. +if (true) class Foo {} diff --git a/test/if/dangling_else.lox b/test/if/dangling_else.lox new file mode 100755 index 0000000..05e99d6 --- /dev/null +++ b/test/if/dangling_else.lox @@ -0,0 +1,3 @@ +// A dangling else binds to the right-most if. +if (true) if (false) print "bad"; else print "good"; // expect: good +if (false) if (true) print "bad"; else print "bad"; diff --git a/test/if/else.lox b/test/if/else.lox new file mode 100755 index 0000000..326e1c5 --- /dev/null +++ b/test/if/else.lox @@ -0,0 +1,6 @@ +// Evaluate the 'else' expression if the condition is false. +if (true) print "good"; else print "bad"; // expect: good +if (false) print "bad"; else print "good"; // expect: good + +// Allow block body. +if (false) nil; else { print "block"; } // expect: block diff --git a/test/if/fun_in_else.lox b/test/if/fun_in_else.lox new file mode 100755 index 0000000..694d1e8 --- /dev/null +++ b/test/if/fun_in_else.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'fun': Expect expression. +if (true) "ok"; else fun foo() {} diff --git a/test/if/fun_in_then.lox b/test/if/fun_in_then.lox new file mode 100755 index 0000000..75421d8 --- /dev/null +++ b/test/if/fun_in_then.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'fun': Expect expression. +if (true) fun foo() {} diff --git a/test/if/if.lox b/test/if/if.lox new file mode 100755 index 0000000..7f46c98 --- /dev/null +++ b/test/if/if.lox @@ -0,0 +1,10 @@ +// Evaluate the 'then' expression if the condition is true. +if (true) print "good"; // expect: good +if (false) print "bad"; + +// Allow block body. +if (true) { print "block"; } // expect: block + +// Assignment in if condition. +var a = false; +if (a = true) print a; // expect: true diff --git a/test/if/truth.lox b/test/if/truth.lox new file mode 100755 index 0000000..97d302a --- /dev/null +++ b/test/if/truth.lox @@ -0,0 +1,8 @@ +// False and nil are false. +if (false) print "bad"; else print "false"; // expect: false +if (nil) print "bad"; else print "nil"; // expect: nil + +// Everything else is true. +if (true) print true; // expect: true +if (0) print 0; // expect: 0 +if ("") print "empty"; // expect: empty diff --git a/test/if/var_in_else.lox b/test/if/var_in_else.lox new file mode 100755 index 0000000..59cff3d --- /dev/null +++ b/test/if/var_in_else.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'var': Expect expression. +if (true) "ok"; else var foo; diff --git a/test/if/var_in_then.lox b/test/if/var_in_then.lox new file mode 100755 index 0000000..a8b111b --- /dev/null +++ b/test/if/var_in_then.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'var': Expect expression. +if (true) var foo; diff --git a/test/inheritance/inherit_from_function.lox b/test/inheritance/inherit_from_function.lox new file mode 100755 index 0000000..0d3ce48 --- /dev/null +++ b/test/inheritance/inherit_from_function.lox @@ -0,0 +1,3 @@ +fun foo() {} + +class Subclass < foo {} // expect runtime error: Superclass must be a class. diff --git a/test/inheritance/inherit_from_nil.lox b/test/inheritance/inherit_from_nil.lox new file mode 100755 index 0000000..72cf8ed --- /dev/null +++ b/test/inheritance/inherit_from_nil.lox @@ -0,0 +1,2 @@ +var Nil = nil; +class Foo < Nil {} // expect runtime error: Superclass must be a class. diff --git a/test/inheritance/inherit_from_number.lox b/test/inheritance/inherit_from_number.lox new file mode 100755 index 0000000..ab1539a --- /dev/null +++ b/test/inheritance/inherit_from_number.lox @@ -0,0 +1,2 @@ +var Number = 123; +class Foo < Number {} // expect runtime error: Superclass must be a class. diff --git a/test/inheritance/inherit_methods.lox b/test/inheritance/inherit_methods.lox new file mode 100755 index 0000000..e11ccc1 --- /dev/null +++ b/test/inheritance/inherit_methods.lox @@ -0,0 +1,14 @@ +class Foo { + methodOnFoo() { print "foo"; } + override() { print "foo"; } +} + +class Bar < Foo { + methodOnBar() { print "bar"; } + override() { print "bar"; } +} + +var bar = Bar(); +bar.methodOnFoo(); // expect: foo +bar.methodOnBar(); // expect: bar +bar.override(); // expect: bar diff --git a/test/inheritance/parenthesized_superclass.lox b/test/inheritance/parenthesized_superclass.lox new file mode 100755 index 0000000..4b59836 --- /dev/null +++ b/test/inheritance/parenthesized_superclass.lox @@ -0,0 +1,4 @@ +class Foo {} + +// [line 4] Error at '(': Expect superclass name. +class Bar < (Foo) {} diff --git a/test/inheritance/set_fields_from_base_class.lox b/test/inheritance/set_fields_from_base_class.lox new file mode 100755 index 0000000..de02bdd --- /dev/null +++ b/test/inheritance/set_fields_from_base_class.lox @@ -0,0 +1,38 @@ +class Foo { + foo(a, b) { + this.field1 = a; + this.field2 = b; + } + + fooPrint() { + print this.field1; + print this.field2; + } +} + +class Bar < Foo { + bar(a, b) { + this.field1 = a; + this.field2 = b; + } + + barPrint() { + print this.field1; + print this.field2; + } +} + +var bar = Bar(); +bar.foo("foo 1", "foo 2"); +bar.fooPrint(); +// expect: foo 1 +// expect: foo 2 + +bar.bar("bar 1", "bar 2"); +bar.barPrint(); +// expect: bar 1 +// expect: bar 2 + +bar.fooPrint(); +// expect: bar 1 +// expect: bar 2 diff --git a/test/limit/loop_too_large.lox b/test/limit/loop_too_large.lox new file mode 100755 index 0000000..79d696c --- /dev/null +++ b/test/limit/loop_too_large.lox @@ -0,0 +1,2351 @@ +var a = 0; +while (false) { + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; +} // Error at '}': Loop body too large. diff --git a/test/limit/reuse_constants.lox b/test/limit/reuse_constants.lox new file mode 100755 index 0000000..66deaa0 --- /dev/null +++ b/test/limit/reuse_constants.lox @@ -0,0 +1,38 @@ +fun f() { + 0; 1; 2; 3; 4; 5; 6; 7; + 8; 9; 10; 11; 12; 13; 14; 15; + 16; 17; 18; 19; 20; 21; 22; 23; + 24; 25; 26; 27; 28; 29; 30; 31; + 32; 33; 34; 35; 36; 37; 38; 39; + 40; 41; 42; 43; 44; 45; 46; 47; + 48; 49; 50; 51; 52; 53; 54; 55; + 56; 57; 58; 59; 60; 61; 62; 63; + 64; 65; 66; 67; 68; 69; 70; 71; + 72; 73; 74; 75; 76; 77; 78; 79; + 80; 81; 82; 83; 84; 85; 86; 87; + 88; 89; 90; 91; 92; 93; 94; 95; + 96; 97; 98; 99; 100; 101; 102; 103; + 104; 105; 106; 107; 108; 109; 110; 111; + 112; 113; 114; 115; 116; 117; 118; 119; + 120; 121; 122; 123; 124; 125; 126; 127; + 128; 129; 130; 131; 132; 133; 134; 135; + 136; 137; 138; 139; 140; 141; 142; 143; + 144; 145; 146; 147; 148; 149; 150; 151; + 152; 153; 154; 155; 156; 157; 158; 159; + 160; 161; 162; 163; 164; 165; 166; 167; + 168; 169; 170; 171; 172; 173; 174; 175; + 176; 177; 178; 179; 180; 181; 182; 183; + 184; 185; 186; 187; 188; 189; 190; 191; + 192; 193; 194; 195; 196; 197; 198; 199; + 200; 201; 202; 203; 204; 205; 206; 207; + 208; 209; 210; 211; 212; 213; 214; 215; + 216; 217; 218; 219; 220; 221; 222; 223; + 224; 225; 226; 227; 228; 229; 230; 231; + 232; 233; 234; 235; 236; 237; 238; 239; + 240; 241; 242; 243; 244; 245; 246; 247; + 248; 249; 250; 251; 252; 253; 254; 255; + + 1; 2; 3; 4; // ok +} + +print "ok"; // expect: ok \ No newline at end of file diff --git a/test/limit/stack_overflow.lox b/test/limit/stack_overflow.lox new file mode 100755 index 0000000..e98284b --- /dev/null +++ b/test/limit/stack_overflow.lox @@ -0,0 +1,21 @@ +fun foo() { + var a1; + var a2; + var a3; + var a4; + var a5; + var a6; + var a7; + var a8; + var a9; + var a10; + var a11; + var a12; + var a13; + var a14; + var a15; + var a16; + foo(); // expect runtime error: Stack overflow. +} + +foo(); diff --git a/test/limit/too_many_constants.lox b/test/limit/too_many_constants.lox new file mode 100755 index 0000000..df73c80 --- /dev/null +++ b/test/limit/too_many_constants.lox @@ -0,0 +1,36 @@ +fun f() { + 0; 1; 2; 3; 4; 5; 6; 7; + 8; 9; 10; 11; 12; 13; 14; 15; + 16; 17; 18; 19; 20; 21; 22; 23; + 24; 25; 26; 27; 28; 29; 30; 31; + 32; 33; 34; 35; 36; 37; 38; 39; + 40; 41; 42; 43; 44; 45; 46; 47; + 48; 49; 50; 51; 52; 53; 54; 55; + 56; 57; 58; 59; 60; 61; 62; 63; + 64; 65; 66; 67; 68; 69; 70; 71; + 72; 73; 74; 75; 76; 77; 78; 79; + 80; 81; 82; 83; 84; 85; 86; 87; + 88; 89; 90; 91; 92; 93; 94; 95; + 96; 97; 98; 99; 100; 101; 102; 103; + 104; 105; 106; 107; 108; 109; 110; 111; + 112; 113; 114; 115; 116; 117; 118; 119; + 120; 121; 122; 123; 124; 125; 126; 127; + 128; 129; 130; 131; 132; 133; 134; 135; + 136; 137; 138; 139; 140; 141; 142; 143; + 144; 145; 146; 147; 148; 149; 150; 151; + 152; 153; 154; 155; 156; 157; 158; 159; + 160; 161; 162; 163; 164; 165; 166; 167; + 168; 169; 170; 171; 172; 173; 174; 175; + 176; 177; 178; 179; 180; 181; 182; 183; + 184; 185; 186; 187; 188; 189; 190; 191; + 192; 193; 194; 195; 196; 197; 198; 199; + 200; 201; 202; 203; 204; 205; 206; 207; + 208; 209; 210; 211; 212; 213; 214; 215; + 216; 217; 218; 219; 220; 221; 222; 223; + 224; 225; 226; 227; 228; 229; 230; 231; + 232; 233; 234; 235; 236; 237; 238; 239; + 240; 241; 242; 243; 244; 245; 246; 247; + 248; 249; 250; 251; 252; 253; 254; 255; + + "oops"; // Error at '"oops"': Too many constants in one chunk. +} diff --git a/test/limit/too_many_locals.lox b/test/limit/too_many_locals.lox new file mode 100755 index 0000000..fdf5482 --- /dev/null +++ b/test/limit/too_many_locals.lox @@ -0,0 +1,53 @@ +fun f() { + // var v00; First slot already taken. + + var v01; var v02; var v03; var v04; var v05; var v06; var v07; + var v08; var v09; var v0a; var v0b; var v0c; var v0d; var v0e; var v0f; + + var v10; var v11; var v12; var v13; var v14; var v15; var v16; var v17; + var v18; var v19; var v1a; var v1b; var v1c; var v1d; var v1e; var v1f; + + var v20; var v21; var v22; var v23; var v24; var v25; var v26; var v27; + var v28; var v29; var v2a; var v2b; var v2c; var v2d; var v2e; var v2f; + + var v30; var v31; var v32; var v33; var v34; var v35; var v36; var v37; + var v38; var v39; var v3a; var v3b; var v3c; var v3d; var v3e; var v3f; + + var v40; var v41; var v42; var v43; var v44; var v45; var v46; var v47; + var v48; var v49; var v4a; var v4b; var v4c; var v4d; var v4e; var v4f; + + var v50; var v51; var v52; var v53; var v54; var v55; var v56; var v57; + var v58; var v59; var v5a; var v5b; var v5c; var v5d; var v5e; var v5f; + + var v60; var v61; var v62; var v63; var v64; var v65; var v66; var v67; + var v68; var v69; var v6a; var v6b; var v6c; var v6d; var v6e; var v6f; + + var v70; var v71; var v72; var v73; var v74; var v75; var v76; var v77; + var v78; var v79; var v7a; var v7b; var v7c; var v7d; var v7e; var v7f; + + var v80; var v81; var v82; var v83; var v84; var v85; var v86; var v87; + var v88; var v89; var v8a; var v8b; var v8c; var v8d; var v8e; var v8f; + + var v90; var v91; var v92; var v93; var v94; var v95; var v96; var v97; + var v98; var v99; var v9a; var v9b; var v9c; var v9d; var v9e; var v9f; + + var va0; var va1; var va2; var va3; var va4; var va5; var va6; var va7; + var va8; var va9; var vaa; var vab; var vac; var vad; var vae; var vaf; + + var vb0; var vb1; var vb2; var vb3; var vb4; var vb5; var vb6; var vb7; + var vb8; var vb9; var vba; var vbb; var vbc; var vbd; var vbe; var vbf; + + var vc0; var vc1; var vc2; var vc3; var vc4; var vc5; var vc6; var vc7; + var vc8; var vc9; var vca; var vcb; var vcc; var vcd; var vce; var vcf; + + var vd0; var vd1; var vd2; var vd3; var vd4; var vd5; var vd6; var vd7; + var vd8; var vd9; var vda; var vdb; var vdc; var vdd; var vde; var vdf; + + var ve0; var ve1; var ve2; var ve3; var ve4; var ve5; var ve6; var ve7; + var ve8; var ve9; var vea; var veb; var vec; var ved; var vee; var vef; + + var vf0; var vf1; var vf2; var vf3; var vf4; var vf5; var vf6; var vf7; + var vf8; var vf9; var vfa; var vfb; var vfc; var vfd; var vfe; var vff; + + var oops; // Error at 'oops': Too many local variables in function. +} diff --git a/test/limit/too_many_upvalues.lox b/test/limit/too_many_upvalues.lox new file mode 100755 index 0000000..325448c --- /dev/null +++ b/test/limit/too_many_upvalues.lox @@ -0,0 +1,105 @@ +fun f() { + var v00; var v01; var v02; var v03; var v04; var v05; var v06; var v07; + var v08; var v09; var v0a; var v0b; var v0c; var v0d; var v0e; var v0f; + + var v10; var v11; var v12; var v13; var v14; var v15; var v16; var v17; + var v18; var v19; var v1a; var v1b; var v1c; var v1d; var v1e; var v1f; + + var v20; var v21; var v22; var v23; var v24; var v25; var v26; var v27; + var v28; var v29; var v2a; var v2b; var v2c; var v2d; var v2e; var v2f; + + var v30; var v31; var v32; var v33; var v34; var v35; var v36; var v37; + var v38; var v39; var v3a; var v3b; var v3c; var v3d; var v3e; var v3f; + + var v40; var v41; var v42; var v43; var v44; var v45; var v46; var v47; + var v48; var v49; var v4a; var v4b; var v4c; var v4d; var v4e; var v4f; + + var v50; var v51; var v52; var v53; var v54; var v55; var v56; var v57; + var v58; var v59; var v5a; var v5b; var v5c; var v5d; var v5e; var v5f; + + var v60; var v61; var v62; var v63; var v64; var v65; var v66; var v67; + var v68; var v69; var v6a; var v6b; var v6c; var v6d; var v6e; var v6f; + + var v70; var v71; var v72; var v73; var v74; var v75; var v76; var v77; + var v78; var v79; var v7a; var v7b; var v7c; var v7d; var v7e; var v7f; + + fun g() { + var v80; var v81; var v82; var v83; var v84; var v85; var v86; var v87; + var v88; var v89; var v8a; var v8b; var v8c; var v8d; var v8e; var v8f; + + var v90; var v91; var v92; var v93; var v94; var v95; var v96; var v97; + var v98; var v99; var v9a; var v9b; var v9c; var v9d; var v9e; var v9f; + + var va0; var va1; var va2; var va3; var va4; var va5; var va6; var va7; + var va8; var va9; var vaa; var vab; var vac; var vad; var vae; var vaf; + + var vb0; var vb1; var vb2; var vb3; var vb4; var vb5; var vb6; var vb7; + var vb8; var vb9; var vba; var vbb; var vbc; var vbd; var vbe; var vbf; + + var vc0; var vc1; var vc2; var vc3; var vc4; var vc5; var vc6; var vc7; + var vc8; var vc9; var vca; var vcb; var vcc; var vcd; var vce; var vcf; + + var vd0; var vd1; var vd2; var vd3; var vd4; var vd5; var vd6; var vd7; + var vd8; var vd9; var vda; var vdb; var vdc; var vdd; var vde; var vdf; + + var ve0; var ve1; var ve2; var ve3; var ve4; var ve5; var ve6; var ve7; + var ve8; var ve9; var vea; var veb; var vec; var ved; var vee; var vef; + + var vf0; var vf1; var vf2; var vf3; var vf4; var vf5; var vf6; var vf7; + var vf8; var vf9; var vfa; var vfb; var vfc; var vfd; var vfe; var vff; + + var oops; + + fun h() { + v00; v01; v02; v03; v04; v05; v06; v07; + v08; v09; v0a; v0b; v0c; v0d; v0e; v0f; + + v10; v11; v12; v13; v14; v15; v16; v17; + v18; v19; v1a; v1b; v1c; v1d; v1e; v1f; + + v20; v21; v22; v23; v24; v25; v26; v27; + v28; v29; v2a; v2b; v2c; v2d; v2e; v2f; + + v30; v31; v32; v33; v34; v35; v36; v37; + v38; v39; v3a; v3b; v3c; v3d; v3e; v3f; + + v40; v41; v42; v43; v44; v45; v46; v47; + v48; v49; v4a; v4b; v4c; v4d; v4e; v4f; + + v50; v51; v52; v53; v54; v55; v56; v57; + v58; v59; v5a; v5b; v5c; v5d; v5e; v5f; + + v60; v61; v62; v63; v64; v65; v66; v67; + v68; v69; v6a; v6b; v6c; v6d; v6e; v6f; + + v70; v71; v72; v73; v74; v75; v76; v77; + v78; v79; v7a; v7b; v7c; v7d; v7e; v7f; + + v80; v81; v82; v83; v84; v85; v86; v87; + v88; v89; v8a; v8b; v8c; v8d; v8e; v8f; + + v90; v91; v92; v93; v94; v95; v96; v97; + v98; v99; v9a; v9b; v9c; v9d; v9e; v9f; + + va0; va1; va2; va3; va4; va5; va6; va7; + va8; va9; vaa; vab; vac; vad; vae; vaf; + + vb0; vb1; vb2; vb3; vb4; vb5; vb6; vb7; + vb8; vb9; vba; vbb; vbc; vbd; vbe; vbf; + + vc0; vc1; vc2; vc3; vc4; vc5; vc6; vc7; + vc8; vc9; vca; vcb; vcc; vcd; vce; vcf; + + vd0; vd1; vd2; vd3; vd4; vd5; vd6; vd7; + vd8; vd9; vda; vdb; vdc; vdd; vde; vdf; + + ve0; ve1; ve2; ve3; ve4; ve5; ve6; ve7; + ve8; ve9; vea; veb; vec; ved; vee; vef; + + vf0; vf1; vf2; vf3; vf4; vf5; vf6; vf7; + vf8; vf9; vfa; vfb; vfc; vfd; vfe; vff; + + oops; // Error at 'oops': Too many closure variables in function. + } + } +} diff --git a/test/logical_operator/and.lox b/test/logical_operator/and.lox new file mode 100755 index 0000000..9f2dc9a --- /dev/null +++ b/test/logical_operator/and.lox @@ -0,0 +1,19 @@ +// Note: These tests implicitly depend on ints being truthy. + +// Return the first non-true argument. +print false and 1; // expect: false +print true and 1; // expect: 1 +print 1 and 2 and false; // expect: false + +// Return the last argument if all are true. +print 1 and true; // expect: true +print 1 and 2 and 3; // expect: 3 + +// Short-circuit at the first false argument. +var a = "before"; +var b = "before"; +(a = true) and + (b = false) and + (a = "bad"); +print a; // expect: true +print b; // expect: false diff --git a/test/logical_operator/and_truth.lox b/test/logical_operator/and_truth.lox new file mode 100755 index 0000000..dcb08cf --- /dev/null +++ b/test/logical_operator/and_truth.lox @@ -0,0 +1,8 @@ +// False and nil are false. +print false and "bad"; // expect: false +print nil and "bad"; // expect: nil + +// Everything else is true. +print true and "ok"; // expect: ok +print 0 and "ok"; // expect: ok +print "" and "ok"; // expect: ok diff --git a/test/logical_operator/or.lox b/test/logical_operator/or.lox new file mode 100755 index 0000000..941eac4 --- /dev/null +++ b/test/logical_operator/or.lox @@ -0,0 +1,19 @@ +// Note: These tests implicitly depend on ints being truthy. + +// Return the first true argument. +print 1 or true; // expect: 1 +print false or 1; // expect: 1 +print false or false or true; // expect: true + +// Return the last argument if all are false. +print false or false; // expect: false +print false or false or false; // expect: false + +// Short-circuit at the first true argument. +var a = "before"; +var b = "before"; +(a = false) or + (b = true) or + (a = "bad"); +print a; // expect: false +print b; // expect: true diff --git a/test/logical_operator/or_truth.lox b/test/logical_operator/or_truth.lox new file mode 100755 index 0000000..7ed1a8a --- /dev/null +++ b/test/logical_operator/or_truth.lox @@ -0,0 +1,8 @@ +// False and nil are false. +print false or "ok"; // expect: ok +print nil or "ok"; // expect: ok + +// Everything else is true. +print true or "ok"; // expect: true +print 0 or "ok"; // expect: 0 +print "s" or "ok"; // expect: s diff --git a/test/method/arity.lox b/test/method/arity.lox new file mode 100755 index 0000000..594963e --- /dev/null +++ b/test/method/arity.lox @@ -0,0 +1,22 @@ +class Foo { + method0() { return "no args"; } + method1(a) { return a; } + method2(a, b) { return a + b; } + method3(a, b, c) { return a + b + c; } + method4(a, b, c, d) { return a + b + c + d; } + method5(a, b, c, d, e) { return a + b + c + d + e; } + method6(a, b, c, d, e, f) { return a + b + c + d + e + f; } + method7(a, b, c, d, e, f, g) { return a + b + c + d + e + f + g; } + method8(a, b, c, d, e, f, g, h) { return a + b + c + d + e + f + g + h; } +} + +var foo = Foo(); +print foo.method0(); // expect: no args +print foo.method1(1); // expect: 1 +print foo.method2(1, 2); // expect: 3 +print foo.method3(1, 2, 3); // expect: 6 +print foo.method4(1, 2, 3, 4); // expect: 10 +print foo.method5(1, 2, 3, 4, 5); // expect: 15 +print foo.method6(1, 2, 3, 4, 5, 6); // expect: 21 +print foo.method7(1, 2, 3, 4, 5, 6, 7); // expect: 28 +print foo.method8(1, 2, 3, 4, 5, 6, 7, 8); // expect: 36 diff --git a/test/method/empty_block.lox b/test/method/empty_block.lox new file mode 100755 index 0000000..3825223 --- /dev/null +++ b/test/method/empty_block.lox @@ -0,0 +1,5 @@ +class Foo { + bar() {} +} + +print Foo().bar(); // expect: nil diff --git a/test/method/extra_arguments.lox b/test/method/extra_arguments.lox new file mode 100755 index 0000000..1cc70f4 --- /dev/null +++ b/test/method/extra_arguments.lox @@ -0,0 +1,8 @@ +class Foo { + method(a, b) { + print a; // expect: 1 + print b; // expect: 2 + } +} + +Foo().method(1, 2, 3, 4); diff --git a/test/method/missing_arguments.lox b/test/method/missing_arguments.lox new file mode 100755 index 0000000..97405f0 --- /dev/null +++ b/test/method/missing_arguments.lox @@ -0,0 +1,5 @@ +class Foo { + method(a, b) {} +} + +Foo().method(1); // expect runtime error: Not enough arguments. diff --git a/test/method/not_found.lox b/test/method/not_found.lox new file mode 100755 index 0000000..bbac99b --- /dev/null +++ b/test/method/not_found.lox @@ -0,0 +1,3 @@ +class Foo {} + +Foo().unknown(); // expect runtime error: Undefined property 'unknown'. diff --git a/test/method/refer_to_name.lox b/test/method/refer_to_name.lox new file mode 100755 index 0000000..df59d42 --- /dev/null +++ b/test/method/refer_to_name.lox @@ -0,0 +1,7 @@ +class Foo { + method() { + print method; // expect runtime error: Undefined variable 'method'. + } +} + +Foo().method(); diff --git a/test/method/too_many_arguments.lox b/test/method/too_many_arguments.lox new file mode 100755 index 0000000..300efa3 --- /dev/null +++ b/test/method/too_many_arguments.lox @@ -0,0 +1 @@ +true.method(1, 2, 3, 4, 5, 6, 7, 8, 9); // Error at '9': Cannot have more than 8 arguments. diff --git a/test/method/too_many_parameters.lox b/test/method/too_many_parameters.lox new file mode 100755 index 0000000..fce6e49 --- /dev/null +++ b/test/method/too_many_parameters.lox @@ -0,0 +1,4 @@ +class Foo { + // 9 parameters. + method(a, b, c, d, e, f, g, h, i) {} // Error at 'i': Cannot have more than 8 parameters. +} diff --git a/test/nil/literal.lox b/test/nil/literal.lox new file mode 100755 index 0000000..8546de9 --- /dev/null +++ b/test/nil/literal.lox @@ -0,0 +1 @@ +print nil; // expect: nil diff --git a/test/number/decimal_point_at_eof.lox b/test/number/decimal_point_at_eof.lox new file mode 100755 index 0000000..9181925 --- /dev/null +++ b/test/number/decimal_point_at_eof.lox @@ -0,0 +1,2 @@ +// [line 2] Error at end: Expect property name after '.'. +123. \ No newline at end of file diff --git a/test/number/leading_dot.lox b/test/number/leading_dot.lox new file mode 100755 index 0000000..93345a5 --- /dev/null +++ b/test/number/leading_dot.lox @@ -0,0 +1,2 @@ +// [line 2] Error at '.': Expect expression. +.123; diff --git a/test/number/literals.lox b/test/number/literals.lox new file mode 100755 index 0000000..4fcdb4f --- /dev/null +++ b/test/number/literals.lox @@ -0,0 +1,7 @@ +print 123; // expect: 123 +print 987654; // expect: 987654 +print 0; // expect: 0 +print -0; // expect: -0 + +print 123.456; // expect: 123.456 +print -0.001; // expect: -0.001 diff --git a/test/number/trailing_dot.lox b/test/number/trailing_dot.lox new file mode 100755 index 0000000..1af7dea --- /dev/null +++ b/test/number/trailing_dot.lox @@ -0,0 +1,2 @@ +// [line 2] Error at ';': Expect property name after '.'. +123.; diff --git a/test/operator/add.lox b/test/operator/add.lox new file mode 100755 index 0000000..e28c5d4 --- /dev/null +++ b/test/operator/add.lox @@ -0,0 +1,2 @@ +print 123 + 456; // expect: 579 +print "str" + "ing"; // expect: string diff --git a/test/operator/add_bool_nil.lox b/test/operator/add_bool_nil.lox new file mode 100755 index 0000000..6c4d7fd --- /dev/null +++ b/test/operator/add_bool_nil.lox @@ -0,0 +1 @@ +true + nil; // expect runtime error: Operands must be two numbers or two strings. diff --git a/test/operator/add_bool_num.lox b/test/operator/add_bool_num.lox new file mode 100755 index 0000000..308245a --- /dev/null +++ b/test/operator/add_bool_num.lox @@ -0,0 +1 @@ +true + 123; // expect runtime error: Operands must be two numbers or two strings. diff --git a/test/operator/add_bool_string.lox b/test/operator/add_bool_string.lox new file mode 100755 index 0000000..04739d5 --- /dev/null +++ b/test/operator/add_bool_string.lox @@ -0,0 +1 @@ +true + "s"; // expect runtime error: Operands must be two numbers or two strings. diff --git a/test/operator/add_nil_nil.lox b/test/operator/add_nil_nil.lox new file mode 100755 index 0000000..b8371ab --- /dev/null +++ b/test/operator/add_nil_nil.lox @@ -0,0 +1 @@ +nil + nil; // expect runtime error: Operands must be two numbers or two strings. diff --git a/test/operator/add_num_nil.lox b/test/operator/add_num_nil.lox new file mode 100755 index 0000000..1ce8fb7 --- /dev/null +++ b/test/operator/add_num_nil.lox @@ -0,0 +1 @@ +1 + nil; // expect runtime error: Operands must be two numbers or two strings. diff --git a/test/operator/add_string_nil.lox b/test/operator/add_string_nil.lox new file mode 100755 index 0000000..5949630 --- /dev/null +++ b/test/operator/add_string_nil.lox @@ -0,0 +1 @@ +"s" + nil; // expect runtime error: Operands must be two numbers or two strings. diff --git a/test/operator/comparison.lox b/test/operator/comparison.lox new file mode 100755 index 0000000..76e4e72 --- /dev/null +++ b/test/operator/comparison.lox @@ -0,0 +1,25 @@ +print 1 < 2; // expect: true +print 2 < 2; // expect: false +print 2 < 1; // expect: false + +print 1 <= 2; // expect: true +print 2 <= 2; // expect: true +print 2 <= 1; // expect: false + +print 1 > 2; // expect: false +print 2 > 2; // expect: false +print 2 > 1; // expect: true + +print 1 >= 2; // expect: false +print 2 >= 2; // expect: true +print 2 >= 1; // expect: true + +// Zero and negative zero compare the same. +print 0 < -0; // expect: false +print -0 < 0; // expect: false +print 0 > -0; // expect: false +print -0 > 0; // expect: false +print 0 <= -0; // expect: true +print -0 <= 0; // expect: true +print 0 >= -0; // expect: true +print -0 >= 0; // expect: true diff --git a/test/operator/divide.lox b/test/operator/divide.lox new file mode 100755 index 0000000..771e93a --- /dev/null +++ b/test/operator/divide.lox @@ -0,0 +1,2 @@ +print 8 / 2; // expect: 4 +print 12.34 / 12.34; // expect: 1 diff --git a/test/operator/divide_nonnum_num.lox b/test/operator/divide_nonnum_num.lox new file mode 100755 index 0000000..e406498 --- /dev/null +++ b/test/operator/divide_nonnum_num.lox @@ -0,0 +1 @@ +"1" / 1; // expect runtime error: Operands must be numbers. diff --git a/test/operator/divide_num_nonnum.lox b/test/operator/divide_num_nonnum.lox new file mode 100755 index 0000000..9596cc6 --- /dev/null +++ b/test/operator/divide_num_nonnum.lox @@ -0,0 +1 @@ +1 / "1"; // expect runtime error: Operands must be numbers. diff --git a/test/operator/equals.lox b/test/operator/equals.lox new file mode 100755 index 0000000..3497062 --- /dev/null +++ b/test/operator/equals.lox @@ -0,0 +1,14 @@ +print nil == nil; // expect: true + +print true == true; // expect: true +print true == false; // expect: false + +print 1 == 1; // expect: true +print 1 == 2; // expect: false + +print "str" == "str"; // expect: true +print "str" == "ing"; // expect: false + +print nil == false; // expect: false +print false == 0; // expect: false +print 0 == "0"; // expect: false diff --git a/test/operator/equals_class.lox b/test/operator/equals_class.lox new file mode 100755 index 0000000..31a7f9e --- /dev/null +++ b/test/operator/equals_class.lox @@ -0,0 +1,13 @@ +// Bound methods have identity equality. +class Foo { + method() {} +} + +var foo = Foo(); +var fooMethod = foo.method; + +// Same bound method. +print fooMethod == fooMethod; // expect: true + +// Different closurizations. +print foo.method == foo.method; // expect: false diff --git a/test/operator/greater_nonnum_num.lox b/test/operator/greater_nonnum_num.lox new file mode 100755 index 0000000..4746c03 --- /dev/null +++ b/test/operator/greater_nonnum_num.lox @@ -0,0 +1 @@ +"1" > 1; // expect runtime error: Operands must be numbers. diff --git a/test/operator/greater_num_nonnum.lox b/test/operator/greater_num_nonnum.lox new file mode 100755 index 0000000..e06f67d --- /dev/null +++ b/test/operator/greater_num_nonnum.lox @@ -0,0 +1 @@ +1 > "1"; // expect runtime error: Operands must be numbers. diff --git a/test/operator/greater_or_equal_nonnum_num.lox b/test/operator/greater_or_equal_nonnum_num.lox new file mode 100755 index 0000000..67994c6 --- /dev/null +++ b/test/operator/greater_or_equal_nonnum_num.lox @@ -0,0 +1 @@ +"1" >= 1; // expect runtime error: Operands must be numbers. diff --git a/test/operator/greater_or_equal_num_nonnum.lox b/test/operator/greater_or_equal_num_nonnum.lox new file mode 100755 index 0000000..592eab4 --- /dev/null +++ b/test/operator/greater_or_equal_num_nonnum.lox @@ -0,0 +1 @@ +1 >= "1"; // expect runtime error: Operands must be numbers. diff --git a/test/operator/less_nonnum_num.lox b/test/operator/less_nonnum_num.lox new file mode 100755 index 0000000..38a75db --- /dev/null +++ b/test/operator/less_nonnum_num.lox @@ -0,0 +1 @@ +"1" < 1; // expect runtime error: Operands must be numbers. diff --git a/test/operator/less_num_nonnum.lox b/test/operator/less_num_nonnum.lox new file mode 100755 index 0000000..3abfe24 --- /dev/null +++ b/test/operator/less_num_nonnum.lox @@ -0,0 +1 @@ +1 < "1"; // expect runtime error: Operands must be numbers. diff --git a/test/operator/less_or_equal_nonnum_num.lox b/test/operator/less_or_equal_nonnum_num.lox new file mode 100755 index 0000000..2bad506 --- /dev/null +++ b/test/operator/less_or_equal_nonnum_num.lox @@ -0,0 +1 @@ +"1" <= 1; // expect runtime error: Operands must be numbers. diff --git a/test/operator/less_or_equal_num_nonnum.lox b/test/operator/less_or_equal_num_nonnum.lox new file mode 100755 index 0000000..c5daf7b --- /dev/null +++ b/test/operator/less_or_equal_num_nonnum.lox @@ -0,0 +1 @@ +1 <= "1"; // expect runtime error: Operands must be numbers. diff --git a/test/operator/multiply.lox b/test/operator/multiply.lox new file mode 100755 index 0000000..ff459f3 --- /dev/null +++ b/test/operator/multiply.lox @@ -0,0 +1,2 @@ +print 5 * 3; // expect: 15 +print 12.34 * 0.3; // expect: 3.702 diff --git a/test/operator/multiply_nonnum_num.lox b/test/operator/multiply_nonnum_num.lox new file mode 100755 index 0000000..fdeeb96 --- /dev/null +++ b/test/operator/multiply_nonnum_num.lox @@ -0,0 +1 @@ +"1" * 1; // expect runtime error: Operands must be numbers. diff --git a/test/operator/multiply_num_nonnum.lox b/test/operator/multiply_num_nonnum.lox new file mode 100755 index 0000000..58fb3ae --- /dev/null +++ b/test/operator/multiply_num_nonnum.lox @@ -0,0 +1 @@ +1 * "1"; // expect runtime error: Operands must be numbers. diff --git a/test/operator/negate.lox b/test/operator/negate.lox new file mode 100755 index 0000000..ea5d247 --- /dev/null +++ b/test/operator/negate.lox @@ -0,0 +1,3 @@ +print -(3); // expect: -3 +print --(3); // expect: 3 +print ---(3); // expect: -3 diff --git a/test/operator/negate_nonnum.lox b/test/operator/negate_nonnum.lox new file mode 100755 index 0000000..e76792f --- /dev/null +++ b/test/operator/negate_nonnum.lox @@ -0,0 +1 @@ +-"s"; // expect runtime error: Operand must be a number. diff --git a/test/operator/not.lox b/test/operator/not.lox new file mode 100755 index 0000000..869e06e --- /dev/null +++ b/test/operator/not.lox @@ -0,0 +1,13 @@ +print !true; // expect: false +print !false; // expect: true +print !!true; // expect: true + +print !123; // expect: false +print !0; // expect: false + +print !nil; // expect: true + +print !""; // expect: false + +fun foo() {} +print !foo; // expect: false diff --git a/test/operator/not_class.lox b/test/operator/not_class.lox new file mode 100755 index 0000000..d76acec --- /dev/null +++ b/test/operator/not_class.lox @@ -0,0 +1,3 @@ +class Bar {} +print !Bar; // expect: false +print !Bar(); // expect: false diff --git a/test/operator/not_equals.lox b/test/operator/not_equals.lox new file mode 100755 index 0000000..e0c24ea --- /dev/null +++ b/test/operator/not_equals.lox @@ -0,0 +1,14 @@ +print nil != nil; // expect: false + +print true != true; // expect: false +print true != false; // expect: true + +print 1 != 1; // expect: false +print 1 != 2; // expect: true + +print "str" != "str"; // expect: false +print "str" != "ing"; // expect: true + +print nil != false; // expect: true +print false != 0; // expect: true +print 0 != "0"; // expect: true diff --git a/test/operator/subtract.lox b/test/operator/subtract.lox new file mode 100755 index 0000000..234bb8c --- /dev/null +++ b/test/operator/subtract.lox @@ -0,0 +1,2 @@ +print 4 - 3; // expect: 1 +print 1.2 - 1.2; // expect: 0 diff --git a/test/operator/subtract_nonnum_num.lox b/test/operator/subtract_nonnum_num.lox new file mode 100755 index 0000000..2accd9f --- /dev/null +++ b/test/operator/subtract_nonnum_num.lox @@ -0,0 +1 @@ +"1" - 1; // expect runtime error: Operands must be numbers. diff --git a/test/operator/subtract_num_nonnum.lox b/test/operator/subtract_num_nonnum.lox new file mode 100755 index 0000000..c7a4d68 --- /dev/null +++ b/test/operator/subtract_num_nonnum.lox @@ -0,0 +1 @@ +1 - "1"; // expect runtime error: Operands must be numbers. diff --git a/test/precedence.lox b/test/precedence.lox new file mode 100755 index 0000000..f4d7a35 --- /dev/null +++ b/test/precedence.lox @@ -0,0 +1,32 @@ +// * has higher precedence than +. +print 2 + 3 * 4; // expect: 14 + +// * has higher precedence than -. +print 20 - 3 * 4; // expect: 8 + +// / has higher precedence than +. +print 2 + 6 / 3; // expect: 4 + +// / has higher precedence than -. +print 2 - 6 / 3; // expect: 0 + +// < has higher precedence than ==. +print false == 2 < 1; // expect: true + +// > has higher precedence than ==. +print false == 1 > 2; // expect: true + +// <= has higher precedence than ==. +print false == 2 <= 1; // expect: true + +// >= has higher precedence than ==. +print false == 1 >= 2; // expect: true + +// 1 - 1 is not space-sensitive. +print 1 - 1; // expect: 0 +print 1 -1; // expect: 0 +print 1- 1; // expect: 0 +print 1-1; // expect: 0 + +// Using () for grouping. +print (2 * (6 - (2 + 2))); // expect: 4 diff --git a/test/print/missing_argument.lox b/test/print/missing_argument.lox new file mode 100755 index 0000000..78bf2c1 --- /dev/null +++ b/test/print/missing_argument.lox @@ -0,0 +1,2 @@ +// [line 2] Error at ';': Expect expression. +print; diff --git a/test/regression/40.lox b/test/regression/40.lox new file mode 100755 index 0000000..37e0166 --- /dev/null +++ b/test/regression/40.lox @@ -0,0 +1,22 @@ +fun caller(g) { + g(); + // g should be a function, not nil. + print g == nil; // expect: false +} + +fun callCaller() { + var capturedVar = "before"; + var a = "a"; + + fun f() { + // Commenting the next line out prevents the bug! + capturedVar = "after"; + + // Returning anything also fixes it, even nil: + //return nil; + } + + caller(f); +} + +callCaller(); diff --git a/test/return/after_else.lox b/test/return/after_else.lox new file mode 100755 index 0000000..115b112 --- /dev/null +++ b/test/return/after_else.lox @@ -0,0 +1,5 @@ +fun f() { + if (false) "no"; else return "ok"; +} + +print f(); // expect: ok diff --git a/test/return/after_if.lox b/test/return/after_if.lox new file mode 100755 index 0000000..773ade6 --- /dev/null +++ b/test/return/after_if.lox @@ -0,0 +1,5 @@ +fun f() { + if (true) return "ok"; +} + +print f(); // expect: ok diff --git a/test/return/after_while.lox b/test/return/after_while.lox new file mode 100755 index 0000000..1c8d715 --- /dev/null +++ b/test/return/after_while.lox @@ -0,0 +1,5 @@ +fun f() { + while (true) return "ok"; +} + +print f(); // expect: ok diff --git a/test/return/at_top_level.lox b/test/return/at_top_level.lox new file mode 100755 index 0000000..67c65ca --- /dev/null +++ b/test/return/at_top_level.lox @@ -0,0 +1 @@ +return "wat"; // Error at 'return': Cannot return from top-level code. diff --git a/test/return/in_function.lox b/test/return/in_function.lox new file mode 100755 index 0000000..2379c7d --- /dev/null +++ b/test/return/in_function.lox @@ -0,0 +1,6 @@ +fun f() { + return "ok"; + print "bad"; +} + +print f(); // expect: ok diff --git a/test/return/in_method.lox b/test/return/in_method.lox new file mode 100755 index 0000000..13e6d28 --- /dev/null +++ b/test/return/in_method.lox @@ -0,0 +1,8 @@ +class Foo { + method() { + return "ok"; + print "bad"; + } +} + +print Foo().method(); // expect: ok diff --git a/test/return/return_nil_if_no_value.lox b/test/return/return_nil_if_no_value.lox new file mode 100755 index 0000000..df88075 --- /dev/null +++ b/test/return/return_nil_if_no_value.lox @@ -0,0 +1,6 @@ +fun f() { + return; + print "bad"; +} + +print f(); // expect: nil diff --git a/test/scanning/identifiers.lox b/test/scanning/identifiers.lox new file mode 100755 index 0000000..ef8c098 --- /dev/null +++ b/test/scanning/identifiers.lox @@ -0,0 +1,12 @@ +andy formless fo _ _123 _abc ab123 +abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_ + +// expect: IDENTIFIER andy null +// expect: IDENTIFIER formless null +// expect: IDENTIFIER fo null +// expect: IDENTIFIER _ null +// expect: IDENTIFIER _123 null +// expect: IDENTIFIER _abc null +// expect: IDENTIFIER ab123 null +// expect: IDENTIFIER abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_ null +// expect: EOF null diff --git a/test/scanning/keywords.lox b/test/scanning/keywords.lox new file mode 100755 index 0000000..e56d32e --- /dev/null +++ b/test/scanning/keywords.lox @@ -0,0 +1,18 @@ +and class else false for fun if nil or return super this true var while + +// expect: AND and null +// expect: CLASS class null +// expect: ELSE else null +// expect: FALSE false null +// expect: FOR for null +// expect: FUN fun null +// expect: IF if null +// expect: NIL nil null +// expect: OR or null +// expect: RETURN return null +// expect: SUPER super null +// expect: THIS this null +// expect: TRUE true null +// expect: VAR var null +// expect: WHILE while null +// expect: EOF null diff --git a/test/scanning/numbers.lox b/test/scanning/numbers.lox new file mode 100755 index 0000000..185b5d0 --- /dev/null +++ b/test/scanning/numbers.lox @@ -0,0 +1,12 @@ +123 +123.456 +.456 +123. + +// expect: NUMBER 123 123.0 +// expect: NUMBER 123.456 123.456 +// expect: DOT . null +// expect: NUMBER 456 456.0 +// expect: NUMBER 123 123.0 +// expect: DOT . null +// expect: EOF null diff --git a/test/scanning/punctuators.lox b/test/scanning/punctuators.lox new file mode 100755 index 0000000..824ec9a --- /dev/null +++ b/test/scanning/punctuators.lox @@ -0,0 +1,21 @@ +(){};,+-*!===<=>=!=<>/. + +// expect: LEFT_PAREN ( null +// expect: RIGHT_PAREN ) null +// expect: LEFT_BRACE { null +// expect: RIGHT_BRACE } null +// expect: SEMICOLON ; null +// expect: COMMA , null +// expect: PLUS + null +// expect: MINUS - null +// expect: STAR * null +// expect: BANG_EQUAL != null +// expect: EQUAL_EQUAL == null +// expect: LESS_EQUAL <= null +// expect: GREATER_EQUAL >= null +// expect: BANG_EQUAL != null +// expect: LESS < null +// expect: GREATER > null +// expect: SLASH / null +// expect: DOT . null +// expect: EOF null diff --git a/test/scanning/strings.lox b/test/scanning/strings.lox new file mode 100755 index 0000000..55adfd1 --- /dev/null +++ b/test/scanning/strings.lox @@ -0,0 +1,6 @@ +"" +"string" + +// expect: STRING "" +// expect: STRING "string" string +// expect: EOF null \ No newline at end of file diff --git a/test/scanning/whitespace.lox b/test/scanning/whitespace.lox new file mode 100755 index 0000000..27ac396 --- /dev/null +++ b/test/scanning/whitespace.lox @@ -0,0 +1,12 @@ +space tabs newlines + + + + +end + +// expect: IDENTIFIER space null +// expect: IDENTIFIER tabs null +// expect: IDENTIFIER newlines null +// expect: IDENTIFIER end null +// expect: EOF null diff --git a/test/string/error_after_multiline.lox b/test/string/error_after_multiline.lox new file mode 100755 index 0000000..59bcbdf --- /dev/null +++ b/test/string/error_after_multiline.lox @@ -0,0 +1,7 @@ +// Tests that we correctly track the line info across multiline strings. +var a = "1 +2 +3 +"; + +err; // // expect runtime error: Undefined variable 'err'. \ No newline at end of file diff --git a/test/string/literals.lox b/test/string/literals.lox new file mode 100755 index 0000000..986c6a7 --- /dev/null +++ b/test/string/literals.lox @@ -0,0 +1,5 @@ +print "(" + "" + ")"; // expect: () +print "a string"; // expect: a string + +// Non-ASCII. +print "A~¶Þॐஃ"; // expect: A~¶Þॐஃ diff --git a/test/string/multiline.lox b/test/string/multiline.lox new file mode 100755 index 0000000..373232b --- /dev/null +++ b/test/string/multiline.lox @@ -0,0 +1,7 @@ +var a = "1 +2 +3"; +print a; +// expect: 1 +// expect: 2 +// expect: 3 diff --git a/test/string/unterminated.lox b/test/string/unterminated.lox new file mode 100755 index 0000000..fd169f7 --- /dev/null +++ b/test/string/unterminated.lox @@ -0,0 +1,2 @@ +// [line 2] Error: Unterminated string. +"this string has no close quote \ No newline at end of file diff --git a/test/super/bound_method.lox b/test/super/bound_method.lox new file mode 100755 index 0000000..42b60e3 --- /dev/null +++ b/test/super/bound_method.lox @@ -0,0 +1,19 @@ +class A { + method(arg) { + print "A.method(" + arg + ")"; + } +} + +class B < A { + getClosure() { + return super.method; + } + + method(arg) { + print "B.method(" + arg + ")"; + } +} + + +var closure = B().getClosure(); +closure("arg"); // expect: A.method(arg) diff --git a/test/super/call_other_method.lox b/test/super/call_other_method.lox new file mode 100755 index 0000000..d37bfca --- /dev/null +++ b/test/super/call_other_method.lox @@ -0,0 +1,16 @@ +class Base { + foo() { + print "Base.foo()"; + } +} + +class Derived < Base { + bar() { + print "Derived.bar()"; + super.foo(); + } +} + +Derived().bar(); +// expect: Derived.bar() +// expect: Base.foo() diff --git a/test/super/call_same_method.lox b/test/super/call_same_method.lox new file mode 100755 index 0000000..dcd3cc5 --- /dev/null +++ b/test/super/call_same_method.lox @@ -0,0 +1,16 @@ +class Base { + foo() { + print "Base.foo()"; + } +} + +class Derived < Base { + foo() { + print "Derived.foo()"; + super.foo(); + } +} + +Derived().foo(); +// expect: Derived.foo() +// expect: Base.foo() diff --git a/test/super/closure.lox b/test/super/closure.lox new file mode 100755 index 0000000..6887afb --- /dev/null +++ b/test/super/closure.lox @@ -0,0 +1,17 @@ +class Base { + toString() { return "Base"; } +} + +class Derived < Base { + getClosure() { + fun closure() { + return super.toString(); + } + return closure; + } + + toString() { return "Derived"; } +} + +var closure = Derived().getClosure(); +print closure(); // expect: Base diff --git a/test/super/constructor.lox b/test/super/constructor.lox new file mode 100755 index 0000000..eadacd8 --- /dev/null +++ b/test/super/constructor.lox @@ -0,0 +1,16 @@ +class Base { + init(a, b) { + print "Base.init(" + a + ", " + b + ")"; + } +} + +class Derived < Base { + init() { + print "Derived.init()"; + super.init("a", "b"); + } +} + +Derived(); +// expect: Derived.init() +// expect: Base.init(a, b) diff --git a/test/super/extra_arguments.lox b/test/super/extra_arguments.lox new file mode 100755 index 0000000..e8158a3 --- /dev/null +++ b/test/super/extra_arguments.lox @@ -0,0 +1,16 @@ +class Base { + foo(a, b) { + print "Base.foo(" + a + ", " + b + ")"; + } +} + +class Derived < Base { + foo() { + print "Derived.foo()"; + super.foo("a", "b", "c", "d"); + } +} + +Derived().foo(); +// expect: Derived.foo() +// expect: Base.foo(a, b) diff --git a/test/super/indirectly_inherited.lox b/test/super/indirectly_inherited.lox new file mode 100755 index 0000000..0a49e26 --- /dev/null +++ b/test/super/indirectly_inherited.lox @@ -0,0 +1,18 @@ +class A { + foo() { + print "A.foo()"; + } +} + +class B < A {} + +class C < B { + foo() { + print "C.foo()"; + super.foo(); + } +} + +C().foo(); +// expect: C.foo() +// expect: A.foo() diff --git a/test/super/missing_arguments.lox b/test/super/missing_arguments.lox new file mode 100755 index 0000000..ba3ac18 --- /dev/null +++ b/test/super/missing_arguments.lox @@ -0,0 +1,13 @@ +class Base { + foo(a, b) { + print "Base.foo(" + a + ", " + b + ")"; + } +} + +class Derived < Base { + foo() { + super.foo(1); // expect runtime error: Not enough arguments. + } +} + +Derived().foo(); diff --git a/test/super/no_superclass_bind.lox b/test/super/no_superclass_bind.lox new file mode 100755 index 0000000..2d6549d --- /dev/null +++ b/test/super/no_superclass_bind.lox @@ -0,0 +1,7 @@ +class Base { + foo() { + super.doesNotExist; // Error at 'super': Cannot use 'super' in a class with no superclass. + } +} + +Base().foo(); diff --git a/test/super/no_superclass_call.lox b/test/super/no_superclass_call.lox new file mode 100755 index 0000000..db4b220 --- /dev/null +++ b/test/super/no_superclass_call.lox @@ -0,0 +1,7 @@ +class Base { + foo() { + super.doesNotExist(1); // Error at 'super': Cannot use 'super' in a class with no superclass. + } +} + +Base().foo(); diff --git a/test/super/no_superclass_method.lox b/test/super/no_superclass_method.lox new file mode 100755 index 0000000..89e6b17 --- /dev/null +++ b/test/super/no_superclass_method.lox @@ -0,0 +1,9 @@ +class Base {} + +class Derived < Base { + foo() { + super.doesNotExist(1); // expect runtime error: Undefined property 'doesNotExist'. + } +} + +Derived().foo(); diff --git a/test/super/parenthesized.lox b/test/super/parenthesized.lox new file mode 100755 index 0000000..63fdc72 --- /dev/null +++ b/test/super/parenthesized.lox @@ -0,0 +1,10 @@ +class A { + method() {} +} + +class B < A { + method() { + // [line 8] Error at ')': Expect '.' after 'super'. + (super).method(); + } +} diff --git a/test/super/reassign_superclass.lox b/test/super/reassign_superclass.lox new file mode 100755 index 0000000..cd918f8 --- /dev/null +++ b/test/super/reassign_superclass.lox @@ -0,0 +1,22 @@ +class Base { + method() { + print "Base.method()"; + } +} + +class Derived < Base { + method() { + super.method(); + } +} + +class OtherBase { + method() { + print "OtherBase.method()"; + } +} + +var derived = Derived(); +derived.method(); // expect: Base.method() +Base = OtherBase; +derived.method(); // expect: Base.method() diff --git a/test/super/super_at_top_level.lox b/test/super/super_at_top_level.lox new file mode 100755 index 0000000..ecbaf68 --- /dev/null +++ b/test/super/super_at_top_level.lox @@ -0,0 +1,2 @@ +super.foo; // Error at 'super': Cannot use 'super' outside of a class. +super.foo("bar"); // Error at 'super': Cannot use 'super' outside of a class. diff --git a/test/super/super_in_closure_in_inherited_method.lox b/test/super/super_in_closure_in_inherited_method.lox new file mode 100755 index 0000000..c158895 --- /dev/null +++ b/test/super/super_in_closure_in_inherited_method.lox @@ -0,0 +1,26 @@ +class A { + say() { + print "A"; + } +} + +class B < A { + getClosure() { + fun closure() { + super.say(); + } + return closure; + } + + say() { + print "B"; + } +} + +class C < B { + say() { + print "C"; + } +} + +C().getClosure()(); // expect: A diff --git a/test/super/super_in_inherited_method.lox b/test/super/super_in_inherited_method.lox new file mode 100755 index 0000000..a90e42a --- /dev/null +++ b/test/super/super_in_inherited_method.lox @@ -0,0 +1,23 @@ +class A { + say() { + print "A"; + } +} + +class B < A { + test() { + super.say(); + } + + say() { + print "B"; + } +} + +class C < B { + say() { + print "C"; + } +} + +C().test(); // expect: A diff --git a/test/super/super_in_top_level_function.lox b/test/super/super_in_top_level_function.lox new file mode 100755 index 0000000..c234ad3 --- /dev/null +++ b/test/super/super_in_top_level_function.lox @@ -0,0 +1,3 @@ +fun foo() { + super.bar(); // Error at 'super': Cannot use 'super' outside of a class. +} diff --git a/test/super/super_without_dot.lox b/test/super/super_without_dot.lox new file mode 100755 index 0000000..3fe95a7 --- /dev/null +++ b/test/super/super_without_dot.lox @@ -0,0 +1,8 @@ +class A {} + +class B < A { + method() { + // [line 6] Error at ';': Expect '.' after 'super'. + super; + } +} diff --git a/test/super/super_without_name.lox b/test/super/super_without_name.lox new file mode 100755 index 0000000..5917031 --- /dev/null +++ b/test/super/super_without_name.lox @@ -0,0 +1,7 @@ +class A {} + +class B < A { + method() { + super.; // Error at ';': Expect superclass method name. + } +} diff --git a/test/super/this_in_superclass_method.lox b/test/super/this_in_superclass_method.lox new file mode 100755 index 0000000..57e58ab --- /dev/null +++ b/test/super/this_in_superclass_method.lox @@ -0,0 +1,16 @@ +class Base { + init(a) { + this.a = a; + } +} + +class Derived < Base { + init(a, b) { + super.init(a); + this.b = b; + } +} + +var derived = Derived("a", "b"); +print derived.a; // expect: a +print derived.b; // expect: b diff --git a/test/this/closure.lox b/test/this/closure.lox new file mode 100755 index 0000000..b850963 --- /dev/null +++ b/test/this/closure.lox @@ -0,0 +1,13 @@ +class Foo { + getClosure() { + fun closure() { + return this.toString(); + } + return closure; + } + + toString() { return "Foo"; } +} + +var closure = Foo().getClosure(); +print closure(); // expect: Foo diff --git a/test/this/nested_class.lox b/test/this/nested_class.lox new file mode 100755 index 0000000..588f101 --- /dev/null +++ b/test/this/nested_class.lox @@ -0,0 +1,20 @@ +class Outer { + method() { + print this; // expect: Outer instance + + fun f() { + print this; // expect: Outer instance + + class Inner { + method() { + print this; // expect: Inner instance + } + } + + Inner().method(); + } + f(); + } +} + +Outer().method(); diff --git a/test/this/nested_closure.lox b/test/this/nested_closure.lox new file mode 100755 index 0000000..7c0f04f --- /dev/null +++ b/test/this/nested_closure.lox @@ -0,0 +1,19 @@ +class Foo { + getClosure() { + fun f() { + fun g() { + fun h() { + return this.toString(); + } + return h; + } + return g; + } + return f; + } + + toString() { return "Foo"; } +} + +var closure = Foo().getClosure(); +print closure()()(); // expect: Foo diff --git a/test/this/this_at_top_level.lox b/test/this/this_at_top_level.lox new file mode 100755 index 0000000..0295cfe --- /dev/null +++ b/test/this/this_at_top_level.lox @@ -0,0 +1 @@ +this; // Error at 'this': Cannot use 'this' outside of a class. diff --git a/test/this/this_in_method.lox b/test/this/this_in_method.lox new file mode 100755 index 0000000..e32dbba --- /dev/null +++ b/test/this/this_in_method.lox @@ -0,0 +1,6 @@ +class Foo { + bar() { return this; } + baz() { return "baz"; } +} + +print Foo().bar().baz(); // expect: baz diff --git a/test/this/this_in_top_level_function.lox b/test/this/this_in_top_level_function.lox new file mode 100755 index 0000000..31c232a --- /dev/null +++ b/test/this/this_in_top_level_function.lox @@ -0,0 +1,3 @@ +fun foo() { + this; // Error at 'this': Cannot use 'this' outside of a class. +} diff --git a/test/unexpected_character.lox b/test/unexpected_character.lox new file mode 100755 index 0000000..5e51396 --- /dev/null +++ b/test/unexpected_character.lox @@ -0,0 +1,3 @@ +// [line 3] Error: Unexpected character. +// [java line 3] Error at 'b': Expect ')' after arguments. +foo(a | b); diff --git a/test/variable/collide_with_parameter.lox b/test/variable/collide_with_parameter.lox new file mode 100755 index 0000000..b118468 --- /dev/null +++ b/test/variable/collide_with_parameter.lox @@ -0,0 +1,3 @@ +fun foo(a) { + var a; // Error at 'a': Variable with this name already declared in this scope. +} diff --git a/test/variable/duplicate_local.lox b/test/variable/duplicate_local.lox new file mode 100755 index 0000000..9270e7f --- /dev/null +++ b/test/variable/duplicate_local.lox @@ -0,0 +1,4 @@ +{ + var a = "value"; + var a = "other"; // Error at 'a': Variable with this name already declared in this scope. +} diff --git a/test/variable/duplicate_parameter.lox b/test/variable/duplicate_parameter.lox new file mode 100755 index 0000000..4901b9e --- /dev/null +++ b/test/variable/duplicate_parameter.lox @@ -0,0 +1,4 @@ +fun foo(arg, + arg) { // Error at 'arg': Variable with this name already declared in this scope. + "body"; +} diff --git a/test/variable/early_bound.lox b/test/variable/early_bound.lox new file mode 100755 index 0000000..4da3304 --- /dev/null +++ b/test/variable/early_bound.lox @@ -0,0 +1,10 @@ +var a = "outer"; +{ + fun foo() { + print a; + } + + foo(); // expect: outer + var a = "inner"; + foo(); // expect: outer +} diff --git a/test/variable/in_middle_of_block.lox b/test/variable/in_middle_of_block.lox new file mode 100755 index 0000000..02a6ef7 --- /dev/null +++ b/test/variable/in_middle_of_block.lox @@ -0,0 +1,10 @@ +{ + var a = "a"; + print a; // expect: a + var b = a + " b"; + print b; // expect: a b + var c = a + " c"; + print c; // expect: a c + var d = b + " d"; + print d; // expect: a b d +} diff --git a/test/variable/in_nested_block.lox b/test/variable/in_nested_block.lox new file mode 100755 index 0000000..5257fbe --- /dev/null +++ b/test/variable/in_nested_block.lox @@ -0,0 +1,6 @@ +{ + var a = "outer"; + { + print a; // expect: outer + } +} \ No newline at end of file diff --git a/test/variable/local_from_method.lox b/test/variable/local_from_method.lox new file mode 100755 index 0000000..216ed54 --- /dev/null +++ b/test/variable/local_from_method.lox @@ -0,0 +1,9 @@ +var foo = "variable"; + +class Foo { + method() { + print foo; + } +} + +Foo().method(); // expect: variable diff --git a/test/variable/redeclare_global.lox b/test/variable/redeclare_global.lox new file mode 100755 index 0000000..ed6cc2c --- /dev/null +++ b/test/variable/redeclare_global.lox @@ -0,0 +1,3 @@ +var a = "1"; +var a; +print a; // expect: nil diff --git a/test/variable/redefine_global.lox b/test/variable/redefine_global.lox new file mode 100755 index 0000000..82d08c0 --- /dev/null +++ b/test/variable/redefine_global.lox @@ -0,0 +1,3 @@ +var a = "1"; +var a = "2"; +print a; // expect: 2 diff --git a/test/variable/scope_reuse_in_different_blocks.lox b/test/variable/scope_reuse_in_different_blocks.lox new file mode 100755 index 0000000..e47932f --- /dev/null +++ b/test/variable/scope_reuse_in_different_blocks.lox @@ -0,0 +1,9 @@ +{ + var a = "first"; + print a; // expect: first +} + +{ + var a = "second"; + print a; // expect: second +} diff --git a/test/variable/shadow_and_local.lox b/test/variable/shadow_and_local.lox new file mode 100755 index 0000000..6bbecbf --- /dev/null +++ b/test/variable/shadow_and_local.lox @@ -0,0 +1,8 @@ +{ + var a = "outer"; + { + print a; // expect: outer + var a = "inner"; + print a; // expect: inner + } +} \ No newline at end of file diff --git a/test/variable/shadow_global.lox b/test/variable/shadow_global.lox new file mode 100755 index 0000000..fb7d68d --- /dev/null +++ b/test/variable/shadow_global.lox @@ -0,0 +1,6 @@ +var a = "global"; +{ + var a = "shadow"; + print a; // expect: shadow +} +print a; // expect: global diff --git a/test/variable/shadow_local.lox b/test/variable/shadow_local.lox new file mode 100755 index 0000000..bdbfd10 --- /dev/null +++ b/test/variable/shadow_local.lox @@ -0,0 +1,8 @@ +{ + var a = "local"; + { + var a = "shadow"; + print a; // expect: shadow + } + print a; // expect: local +} diff --git a/test/variable/undefined_global.lox b/test/variable/undefined_global.lox new file mode 100755 index 0000000..5ac89b8 --- /dev/null +++ b/test/variable/undefined_global.lox @@ -0,0 +1 @@ +print notDefined; // expect runtime error: Undefined variable 'notDefined'. diff --git a/test/variable/undefined_local.lox b/test/variable/undefined_local.lox new file mode 100755 index 0000000..d196d59 --- /dev/null +++ b/test/variable/undefined_local.lox @@ -0,0 +1,3 @@ +{ + print notDefined; // expect runtime error: Undefined variable 'notDefined'. +} diff --git a/test/variable/uninitialized.lox b/test/variable/uninitialized.lox new file mode 100755 index 0000000..4b174bb --- /dev/null +++ b/test/variable/uninitialized.lox @@ -0,0 +1,2 @@ +var a; +print a; // expect: nil diff --git a/test/variable/unreached_undefined.lox b/test/variable/unreached_undefined.lox new file mode 100755 index 0000000..e7bf633 --- /dev/null +++ b/test/variable/unreached_undefined.lox @@ -0,0 +1,5 @@ +if (false) { + print notDefined; +} + +print "ok"; // expect: ok diff --git a/test/variable/use_false_as_var.lox b/test/variable/use_false_as_var.lox new file mode 100755 index 0000000..206d51e --- /dev/null +++ b/test/variable/use_false_as_var.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'false': Expect variable name. +var false = "value"; diff --git a/test/variable/use_global_in_initializer.lox b/test/variable/use_global_in_initializer.lox new file mode 100755 index 0000000..6e59cd5 --- /dev/null +++ b/test/variable/use_global_in_initializer.lox @@ -0,0 +1,3 @@ +var a = "value"; +var a = a; +print a; // expect: value diff --git a/test/variable/use_local_in_initializer.lox b/test/variable/use_local_in_initializer.lox new file mode 100755 index 0000000..61a4430 --- /dev/null +++ b/test/variable/use_local_in_initializer.lox @@ -0,0 +1,4 @@ +var a = "outer"; +{ + var a = a; // Error at 'a': Cannot read local variable in its own initializer. +} diff --git a/test/variable/use_nil_as_var.lox b/test/variable/use_nil_as_var.lox new file mode 100755 index 0000000..7624bce --- /dev/null +++ b/test/variable/use_nil_as_var.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'nil': Expect variable name. +var nil = "value"; diff --git a/test/variable/use_this_as_var.lox b/test/variable/use_this_as_var.lox new file mode 100755 index 0000000..233a553 --- /dev/null +++ b/test/variable/use_this_as_var.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'this': Expect variable name. +var this = "value"; diff --git a/test/while/class_in_body.lox b/test/while/class_in_body.lox new file mode 100755 index 0000000..c3cbe95 --- /dev/null +++ b/test/while/class_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'class': Expect expression. +while (true) class Foo {} diff --git a/test/while/closure_in_body.lox b/test/while/closure_in_body.lox new file mode 100755 index 0000000..ebe00fa --- /dev/null +++ b/test/while/closure_in_body.lox @@ -0,0 +1,19 @@ +var f1; +var f2; +var f3; + +var i = 1; +while (i < 4) { + var j = i; + fun f() { print j; } + + if (j == 1) f1 = f; + else if (j == 2) f2 = f; + else f3 = f; + + i = i + 1; +} + +f1(); // expect: 1 +f2(); // expect: 2 +f3(); // expect: 3 diff --git a/test/while/fun_in_body.lox b/test/while/fun_in_body.lox new file mode 100755 index 0000000..8a42a48 --- /dev/null +++ b/test/while/fun_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'fun': Expect expression. +while (true) fun foo() {} diff --git a/test/while/return_closure.lox b/test/while/return_closure.lox new file mode 100755 index 0000000..fe2ee5a --- /dev/null +++ b/test/while/return_closure.lox @@ -0,0 +1,10 @@ +fun f() { + while (true) { + var i = "i"; + fun g() { print i; } + return g; + } +} + +var h = f(); +h(); // expect: i diff --git a/test/while/return_inside.lox b/test/while/return_inside.lox new file mode 100755 index 0000000..11a7488 --- /dev/null +++ b/test/while/return_inside.lox @@ -0,0 +1,9 @@ +fun f() { + while (true) { + var i = "i"; + return i; + } +} + +print f(); +// expect: i diff --git a/test/while/syntax.lox b/test/while/syntax.lox new file mode 100755 index 0000000..9f0fdeb --- /dev/null +++ b/test/while/syntax.lox @@ -0,0 +1,21 @@ +// Single-expression body. +var c = 0; +while (c < 3) print c = c + 1; +// expect: 1 +// expect: 2 +// expect: 3 + +// Block body. +var a = 0; +while (a < 3) { + print a; + a = a + 1; +} +// expect: 0 +// expect: 1 +// expect: 2 + +// Statement bodies. +while (false) if (true) 1; else 2; +while (false) while (true) 1; +while (false) for (;;) 1; diff --git a/test/while/var_in_body.lox b/test/while/var_in_body.lox new file mode 100755 index 0000000..bafc2fd --- /dev/null +++ b/test/while/var_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'var': Expect expression. +while (true) var foo; diff --git a/test_swift.py b/test_swift.py new file mode 100644 index 0000000..8df6053 --- /dev/null +++ b/test_swift.py @@ -0,0 +1,41 @@ +from os.path import dirname, realpath +import sys +from test import JAVA_SUITES, INTERPRETERS, run_suites, run_suite +import test + +test.REPO_DIR = dirname(realpath(__file__)) + +SWIFT_SUITES = JAVA_SUITES + +def java_to_swift_interpreter(interpreter): + if interpreter.language == 'java': + interpreter.language = 'swift' + interpreter.args = ['.build/debug/slox'] + return interpreter + +INTERPRETERS = {name: java_to_swift_interpreter(interpreter) for (name, interpreter) in INTERPRETERS.items()} + +def main(): + if len(sys.argv) < 2 or len(sys.argv) > 3: + print('Usage: test.py [filter]') + sys.exit(1) + + if len(sys.argv) == 3: + filter_path = sys.argv[2] + + if sys.argv[1] == 'all': + run_suites(sorted(INTERPRETERS.keys())) + elif sys.argv[1] == 'c': + run_suites(C_SUITES) + elif sys.argv[1] == 'swift': + run_suites(SWIFT_SUITES) + elif sys.argv[1] not in INTERPRETERS: + print('Unknown interpreter "{}"'.format(sys.argv[1])) + sys.exit(1) + + else: + if not run_suite(sys.argv[1]): + sys.exit(1) + +if __name__ == '__main__': + main() \ No newline at end of file